使用S3进行上传但不允许公众访问

时间:2019-01-14 08:48:21

标签: amazon-web-services amazon-s3

我的想法是创建一个S3存储桶,以允许用户上传二进制对象。下一步将是确认上传,然后API将启动文件处理。

为了使其更加安全,客户端将首先请求上传位置。然后,API在S3上分配并预创建一个用于此上载的一次性使用目录,并在该目录上设置访问策略,以允许将文件转储到该目录中(但最好不要读取甚至覆盖)。

在客户端确认后,API会开始处理和清理。

我面临的问题是身份验证和授权。最简单的方法是允许带有难以猜测的存储桶目录的公共写入,例如

s3://存储桶/年/月/日/ UUID / UUID /文件名

添加日期的位置,以便以后对孤立文件进行清理(并且如果容量增加,则需要增加几小时/分钟。

第一个UUID除了提供唯一的上载位置外没有其他意义。第二个标识用户。

整个路径由API创建。然后,该API允许用户访问权限写入该最终目录。 (不应允许用户创建此目录)。

我遇到的问题是,通过谷歌搜索,似乎公共可写的S3存储桶被认为是不好的做法,甚至太可怕了。

我有什么选择? a)向客户端提供某种访问令牌? b)为每个上传者创建一个IAM帐户(我不想这样与Amazon绑定) c)还有其他选择吗?

P.S并且可以控制客户端可用于根据策略创建文件的实际文件名吗?

1 个答案:

答案 0 :(得分:0)

据我了解,您的目标是:

  • 安全地允许用户上载特定文件到S3存储桶
  • 通过阻止用户读取或写入其他文件
  • 限制访问权限
  • 理想情况下,将文件直接上传到S3 ,而无需通过服务器

您可以通过在服务器端生成presigned PUT URLs并将这些URL返回给客户端来实现。客户端可以使用这些URL直接上传到S3。客户端仅限于您在签名URL时指定的文件名。仅限于PUT。您将AWS访问密钥保持在服务器上的安全状态,并且永远不要将其发送给客户端。

如果使用的是PutObject API,则只需为每个文件签名一个URL。如果您使用的是多部分上传API,则要复杂一些,您需要启动和完成上传服务器端,并将预先签名的UploadPart URL发送到客户端。