使用S3上传但不允许公共访问

The*_*aan 2 amazon-s3 amazon-web-services

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

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

客户端确认后,API 启动处理和清理。

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

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

添加日期是为了以后清理孤立文件(并且如果数量增长到需要它,可以添加小时/分钟。

除了提供唯一的上传位置之外,第一个 UUID 没有任何意义。第二个标识用户。

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

我遇到的问题是,从谷歌搜索看来,公共可写 S3 存储桶被认为是不好的做法,甚至是可怕的做法。

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

PS 是否可以控制客户端可用于从策略创建文件的实际文件名?

Jus*_*ard 5

据我了解,您的目标是:

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

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

如果您使用 PutObject API,则只需对每个文件的一个 URL 进行签名。如果您使用分段上传 API,则情况会稍微复杂一些,您需要在服务器端开始和完成上传,并将预先签名的 UploadPart URL 发送到客户端。