如何管理对 AWS S3 资源的访问

How to manage access to AWS S3 resources

我正在为将文件存储在 S3 上的应用程序制作客户端和服务器。这些文件由我的应用程序生成并经过加密,因此只能由我的应用程序打开。它们将在下载前在商店购买。为了保证文件在下载时不会四处传播,每个文件都会再次解密和加密,以便仅通过该用户的凭据打开(这是在客户端完成的)。

我已经在 EC2 上获得了一个服务器 运行,所有文件都在本地文件系统中。服务器检查 RDS 数据库以查看用户是否在将文件发送给他之前购买了文件。我想将文件存储从 EC2 移动到 S3,因为传输成本要便宜得多,所以直接从 S3 到客户端。

因此,我需要用户有权访问特定文件(仅限他们购买的文件)。

我现在正在测试的方法是让 AWS 用户可以从 S3 存储桶下载对象,并为客户端配置该用户的访问密钥和密码。这意味着 AWS 用户的凭证存储在我的应用程序的代码中。这样做安全吗?由于客户端将直接从 S3 下载,因此 S3 存储桶应允许来自任何 IP 的连接。这意味着任何设法从我的代码中获取凭据的人都将能够下载所有案例(在 S3 中,这些案例将被加密以与任何用户一起使用,因此它们可以被重新分发)。

另一种选择是定期更改此 "download only" 用户的凭据,而不是将其固定在客户端代码中,每次都将凭据从 EC2 服务器发送给用户(连接使用 SSL 加密)。

另一种选择是为每个应用程序用户创建一个 aws 用户,并在每个对象的基础上设置他的权限。凭据应该是随机的,并且每次都发送给客户端。这样,如果用户以某种方式获得凭据,他只能下载和重新分发他购买的案例。

有没有人遇到过类似的问题?哪个是最好的解决方案? 谢谢!

首先,您需要停止在代码中对 AWS 凭证进行硬编码,而是使用分配给您的 EC2 服务器的 IAM 角色。

每当用户需要下载文件时,您都应该在 EC2 服务器上生成一个短暂的 S3 pre-signed URL,并将其发送到用户的浏览器。用户将能够使用预签名 URL 下载文件,而无需将 AWS 凭证推送到浏览器。预签名的 URL 仅在有限的时间内(您指定的)有效,因此如果用户尝试共享 URL 它不会起作用。