【问题标题】:How to change user 'role' per request in Amazon AWS S3 bucket?如何更改 Amazon AWS S3 存储桶中每个请求的用户“角色”?
【发布时间】:2020-02-23 08:58:48
【问题描述】:

我不确定这是否是合适的用例,所以如果我对如何执行此操作的假设不正确,请告诉我要查找的内容。

我正在尝试做的事情:

我有一个 s3 存储桶,其中包含用户可以下载的不同“包”。购买后,他们将在 Wordpress 中获得用户角色。我有一个通过 php 设置的 S3 浏览器,它向存储桶发出信息请求。

根据他们的“角色”,它只会显示匹配前缀的文件(整包用户看到所有,单个产品的人只能看到单个产品前缀)。

这样,服务器将代表用户发送文件,并根据用户的权限级别更改 IAM 角色。我必须这样设置吗?我可以只分析 WP 角色并指定记录允许的前缀的端点或查询吗?

打包用户见/ 个人用户见/--prefix/ 如果有道理

提前致谢!我从未使用过 AWS,所以这对我来说是全新的。 :)

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-iam


    【解决方案1】:

    这听起来太复杂了。可以使用 AWS STS,但它会非常脆弱。

    我认为您正在向最终用户隐藏实际的 S3 存储桶并通过您的 php 应用程序进行流式传输?如果是这样,那么在 php 应用程序中进行任何基于角色的过滤会更有意义,因为那里有更多可用的逻辑 - IAM 是细粒度的,但 S3 中对资源的限制将会很时髦,而且你总有机会'会出错并暴露不正确的下载。

    宁可在您的应用程序中执行此操作:

    1. 建立您授予的角色
    2. 发出按角色过滤的 S3 ls 命令 - 即如果角色只允许 --prefix,发出 ls 命令以便它只列出匹配 --prefix 的文件
    3. 不要在全局范围内公开存储桶中的文件 - 只有您的应用才能访问 S3 存储桶 - 这样人们在下载包后也无法共享链接。

    这有一个额外的好处,即不在 IAM 中编码您的 S3 存储桶结构,并使您的决策逻辑与代码隔离。

    【讨论】:

    • 所以,基本上我为服务器授予根 IAM 配置文件,然后通过角色访问级别对存储桶的查询过滤掉?存储桶也是私有的,只能通过 PHP 服务器访问。我想通过 api 列出来自 s3 的对象,当用户单击它时,它会通过 s3 存储桶建立下载。希望将其构建为 s3(可能通过 EC2)创建文件结构,以将文件打包到一个下载中以服务于客户端。
    • 是的,这听起来是最容易实现和支持的想法
    【解决方案2】:

    基本上可以通过三种方式授予对 Amazon S3 中私有内容的访问权限。

    选项 1:IAM 凭证

    您可以向 IAM 用户添加策略,以便他们可以访问私有内容。但是,此类凭据只能由您自己组织中的员工使用。它不应用于授予应用程序用户访问权限。

    选项 2:通过 STS 的临时凭证

    您的应用程序可以通过 AWS Security Token Service 生成临时凭证。这些凭证可以被赋予特定的权限,并且在有限的时间段内有效。这是授予移动应用程序访问 Amazon S3 的理想选择,因为它们可以直接与 S3 通信,而无需通过后端应用程序。凭据只会被授予访问他们被允许使用的资源的权限。

    这些类型的凭证也可以由 Web 应用程序使用,其中 Web 应用程序直接调用 AWS 服务(例如从浏览器中的 Node/JavaScript)。但是,这似乎不适合您的 WordPress 情况。

    选项 3:预签名 URL

    想象一个照片共享应用程序,用户可以在其中访问他们的私人照片,并且用户还可以与其他用户共享照片。当用户请求访问特定照片时(或当后端应用程序正在创建使用照片的 HTML 页面时),应用程序可以生成 预签名 URL,授予对 Amazon S3 对象的临时访问权限。

    每个预签名的 URL 只允许访问单个 S3 对象,并且只能在选定的时间段(例如 5 分钟)内访问。这意味着用户是否有权访问文件的所有权限逻辑都可以在后端应用程序中执行。当后端应用程序向用户的浏览器提供预签名 URL 时,用户可以直接从 Amazon S3 访问内容,而无需通过后端。

    见:Amazon S3 pre-signed URLs

    您的情况听起来适合选项 #3。一旦您确定允许用户访问 S3 中的特定文件,它就可以生成预签名 URL 并将其作为链接包含(甚至在 <img src=...> 标签中)。然后用户可以下载该文件。在此过程中无需使用 IAM 角色

    【讨论】:

    • 我遇到的问题是在 GetObjects/ListObjects 方法中列出“多个”前缀。有些人购买了不止一个“包”插件(用前缀表示)。所以有些人需要访问 /root/pack1/plugins/plugin.zzz 以及 /root/pack2/plugins/pluginX.zzz 的所有内容我只需要为每个 GetIterator 创建一个数组作为前缀,然后就可以了附加前缀并删除重复项?有没有办法在 GetIterator 中列出多个前缀?似乎只接受一个字符串,而不是一个字符串数组......
    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 2016-08-05
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多