我正在为将在S3上存储文件的应用程序创建客户端和服务器。这些文件由我的应用程序生成并加密,因此只能由我的应用程序打开。在下载之前,他们将在商店购买。为了保证文件不会在下载时传递,每个文件都会被解密并再次加密,只能由该用户的凭据打开(这是在客户端完成的)。
我已经在EC2上运行了一台服务器,其中包含本地文件系统中的所有文件。服务器检查RDS数据库以查看用户是否在将文件发送给他之前购买了文件。我想将文件存储从EC2移到S3,并且由于传输成本要便宜得多,所以从S3直接到客户端。
因此,我需要用户访问特定文件(仅限他们购买的文件)。
我现在正在测试它的方式是让一个AWS用户可以从S3存储桶下载对象,并让客户端配置该用户的访问密钥和密钥。这意味着AWS用户的凭据存储在我的应用程序的代码中。这是安全的吗?由于客户端将直接从S3下载,因此S3存储桶应允许来自任何IP的连接。这意味着任何设法从我的代码获取凭据的人都可以下载所有案例(在S3中将加密以与任何用户一起使用,因此可以重新分发)。
另一种选择是定期更改此“仅下载”用户的凭据,而不是在客户端的代码中修复它,每次都将EC2服务器的凭据发送给用户(连接使用SSL加密)。
另一种选择是为每个应用程序用户创建一个aws用户,并基于每个对象设置他的权限。凭证应该是随机的,并且每次都会发送给客户端。这样,如果用户以某种方式获取凭据,他只能下载并重新分发他购买的案例。
有没有人遇到过类似的问题?哪个是最好的解决方案? 谢谢!
答案 0 :(得分:2)
首先,您需要停止在代码中对您的AWS凭证进行硬编码,并使用分配给您的EC2服务器的IAM角色。
每当用户需要下载文件时,您应该在EC2服务器上生成短暂的S3 pre-signed URL,并将其发送到用户的浏览器。用户将能够使用预签名URL下载文件,而无需将AWS凭证推送到浏览器。预签名URL仅在有限时间内(您指定)有效,因此如果用户尝试共享该URL,则无效。