文章

如何在不公开存储桶的情况下分享 S3 文件

在私有存储桶中安全分享 S3 文件:预签名 URL、CloudFront 签名 URL,或带密码、到期时间和下载次数限制的分享链接。

你完全可以在不公开存储桶的情况下分享 Amazon S3 中的文件。让存储桶保持私有,保持 Block Public Access 开启,改为向他人提供对特定对象的签名访问:一次性的文件用预签名 URL;如果存储桶前面已经有 CDN,就用 CloudFront 签名 URL;或者使用一个带密码、到期日期和下载次数限制的分享链接。这三种方式在 Cloudflare R2、DigitalOcean Spaces、Wasabi 和 Backblaze B2 等兼容 S3 的服务商上同样适用(CloudFront 仅限 AWS)。

S3 安全分享方式一览

方式最适合密码下载次数限制撤销单个链接整个文件夹是否需要代码
公开对象或存储桶真正公开的资源(网站)否否否是否
预签名 URL一个文件、一次,通过 CLI 或应用否否否否CLI 或 SDK
CloudFront 签名 URL已经验证用户身份的应用否否否使用签名 Cookie是
Nubbo 分享链接经常与外部人员分享是是是是,支持 ZIP否

为什么不直接把文件设为公开

从 S3 分享文件最快的方法,是把它设为公开并发送对象 URL。这也是风险最大的方法:任何公开的内容都可以被找到或猜出地址的人获取,没有密码,没有到期时间,也没有谁拿走了它的记录。遗留的公开存储桶是数据泄露的典型来源,它们不仅暴露内容,还暴露文件名。

AWS 表示,新的存储桶、访问点和对象默认不允许公开访问。除此之外,S3 Block Public Access 有四项设置(BlockPublicAcls、IgnorePublicAcls、BlockPublicPolicy 和 RestrictPublicBuckets),会覆盖以后任何可能开放存储桶的策略或 ACL。它们可以按存储桶、按账户或为整个 AWS Organization 设置,S3 会采用限制最严格的组合。AWS 建议在账户级别开启全部四项,除非你确实要托管公开内容,例如静态网站。

请保持这个开关打开。下面介绍的所有方式在开启状态下都能使用。

方式 1:预签名 URL

预签名 URL 是在查询字符串中带有签名的对象 URL。它在过期前授予对一个对象执行一项操作(通常是下载)的权限,S3 会在每次请求时检查签名。

aws s3 presign s3://my-bucket/reports/q3.pdf --expires-in 86400

这个 URL 的有效期为 24 小时。CLI 默认为一小时,使用 IAM 用户密钥签名时最长为 604,800 秒(7 天)。如果使用临时凭据(例如所承担的角色)签名,URL 会在这些凭据过期时失效。

你能得到的:

  • 无需修改存储桶或其策略。
  • 精确控制:一个对象、一种方法、一个有效期。
  • 适用于任何支持 SigV4 预签名的服务商。

你得不到的:

  • 没有密码。持有 URL 的人在其过期前可以随意使用,次数不限。
  • 没有下载次数限制,也不能按链接撤销。要提前让 URL 失效,只能撤销签名用的密钥。
  • 不支持文件夹。你需要逐个对象签名,所以分享一个包含 300 个文件的文件夹就意味着 300 个 URL。
  • 名称的隐私。URL 会显示你的存储桶名称、对象键和访问密钥 ID。

关于其原理的深入介绍,包括上传、每个 X-Amz-* 参数和 SDK 代码,请参见 S3 预签名 URL 详解。

如果你已经通过 Amazon CloudFront 提供存储桶内容,可以在缓存行为上要求使用签名 URL 或签名 Cookie。存储桶通过源访问控制(OAC)保持私有,AWS 推荐使用它而不是旧的源访问身份:存储桶策略只允许你的分配读取对象。你在受信任的密钥组中注册公钥,并用对应的私钥签名。

  • 签名 URL 适用于单个文件。使用自定义策略时,还可以设置开始时间和 IP 范围,并用通配符让一个策略适用于多个文件。它们可以短时有效,也可以持续数年。
  • 签名 Cookie 适用于一次访问大量文件,例如视频的每个分片,而无需更改你的 URL。

当你运行一个已经验证用户身份并大规模提供内容的应用时,这是合适的工具。但如果只是把几个文件交给团队之外的人,就意味着要配置分配、管理密钥,并编写为每个请求签名的代码。

将存储桶策略限制为固定的 IP 范围是另一种原生方式,但只有在你知道接收者所在网络时才有用,而对于组织之外的人,这种情况很少见。

方式 3:使用 Nubbo 的分享链接

Nubbo 连接你的存储桶,为你提供具备预签名 URL 所缺少的控制功能的分享链接,无需编写代码。在底层,它仍然使用预签名 URL:Nubbo 先检查链接的规则,然后才签发短时有效的 URL,因此单个文件会直接从你的存储桶传到接收者的浏览器。

第 1 步:连接你的存储桶

免费注册,验证你的邮箱,然后打开存储桶并点击连接存储桶。向导会询问你的服务商(Amazon S3、Cloudflare R2、DigitalOcean Spaces、Wasabi、Backblaze B2 或自定义的兼容 S3 端点)、连接方式(使用完全访问权限密钥的自动设置,或仅限一个存储桶的密钥)、你的密钥和存储桶。它会检查密钥和存储桶,最后从你的浏览器进行一次真实上传来测试 CORS。存储桶保持私有,你的密钥使用 AES-256-GCM 加密保存。免费套餐包含 2 个连接。

第 2 步:选择文件或文件夹

在 文件浏览器 中找到该项目并选择分享。你也可以进入已分享页面,点击新建链接,然后在那里选择存储桶和文件或文件夹。

第 3 步:设置保护

三项控制都是可选的,所有套餐都可使用:

控制工作方式
密码4 到 50 个字符。连续 10 次输错后,链接会锁定 15 分钟。
过期日期默认关闭:只要文件或文件夹还在你的存储中,链接就保持有效。
最大下载次数留空表示不限。达到次数后,链接将不再提供该文件。

第 4 步:创建并发送链接

点击创建链接,复制后通过邮件、聊天或你常用的任何方式发送。接收者会打开一个简洁的下载页面,无需账户。文件夹链接可以让他们浏览文件夹、下载单个文件,或将全部内容打包为 ZIP 下载,这个 ZIP 由他们的浏览器直接从你的存储桶逐个下载文件后生成。

第 5 步:单独发送密码

把密码和链接放在同一条消息里发送就失去了意义。如果链接设置了密码,通过邮件发送密码会以一次性查看链接的形式发送:密码只显示一次,查看链接会在 24 小时、3 天或 7 天后过期,你还可以附上一段简短的说明。对方打开时你会收到通知。

第 6 步:跟踪和撤销

已分享页面列出每个链接及其状态和下载次数。你可以修改密码、过期日期或下载次数限制,停用链接(它会立即停止签发新的下载 URL),以后还可以用同一个地址重新启用。

与特定的人分享,而不是用链接

链接对任何持有它的人都有效。当你只想让指定的人访问时,Nubbo 的与人员分享(Personal 和 Pro 套餐提供)会把文件或文件夹发送到特定的邮箱地址,可设置查看或下载权限、可选的到期时间和下载上限,并记录每次访问。接收者需要一个 Nubbo 账户,并在与我分享中找到该项目。Personal 允许每个项目 10 人、共 50 个有效分享;Pro 分别为 50 和 500。

付费套餐还提供加密链接:浏览器会生成文件的加密副本,密钥只存在于链接本身,因此 Nubbo 无法读取它。

应该选择哪种方式?

  • 一个文件、一次分享,并且你已经配置好 AWS CLI:预签名 URL 是最快的方式。
  • 已经有用户登录并提供大量内容的应用:CloudFront 签名 URL 或签名 Cookie。
  • 经常与团队之外的人分享、分享整个文件夹,或任何需要密码或限制的场景:分享链接能节省时间并减少出错。

不止一个链接

两个相关功能覆盖了其他常见场景。文件请求 为你提供一个公开的上传链接,让别人可以把文件发送到你的存储桶,而看不到其中的其他内容。相册 可以把一个包含照片或视频的文件夹变成一个可浏览的页面,支持多种布局、水印,还可以设置自己的密码。免费套餐中,这两项各有 3 个,分享链接不限数量;Personal 和 Pro 则取消这些上限。如实说明一点:缩略图在 Nubbo 的服务器上生成,并存储在你自己存储桶的 .nubbo-thumbs/ 下。

常见问题

如何在不公开的情况下分享 S3 中的文件?

让存储桶保持私有,改为提供签名访问:针对单个对象的预签名 URL(通过 AWS CLI 或 SDK 生成);如果你已经通过 CloudFront 提供存储桶内容,可以使用 CloudFront 签名 URL 或签名 Cookie;或者使用 Nubbo 等工具的分享链接,它在预签名 URL 的基础上增加了密码、到期时间和下载次数限制。

用 Amazon S3 分享文件安全吗?

只要存储桶保持私有,就是安全的。新的存储桶默认不允许公开访问,S3 Block Public Access 还能阻止以后有人把它们开放。风险来自把对象设为公开,或签名链接泄露,因为任何持有链接的人在其过期前都能使用。

新的 S3 存储桶默认是私有的吗?

是的。AWS 表示,新的存储桶、访问点和对象默认不允许公开访问,四项 Block Public Access 设置会覆盖以后任何可能开放它们的策略或 ACL。

接收者需要 AWS 或 Nubbo 账户吗?

不需要。预签名 URL、CloudFront 签名 URL 和 Nubbo 分享链接都可以在任何浏览器中使用,无需账户。只有与人员分享(将项目发送给指定的人)要求对方拥有 Nubbo 账户。

分享的 S3 链接能持续多久?

使用 IAM 用户密钥签名的预签名 URL 最长 7 天,使用临时凭据时更短。CloudFront 签名 URL 的有效期取决于你的策略。Nubbo 分享链接除非你设置了过期日期,否则不会过期,因为它在每次下载时都会签发一个新的短时有效 URL。

有人通过分享链接下载时,文件会经过 Nubbo 吗?

不会:浏览器使用预签名 URL 直接从你的存储桶下载单个文件。多文件 ZIP 下载在浏览器中打包,浏览器直接从你的存储桶下载每个文件:Nubbo 从不接触文件内容。

来源

价格和限制来自以下官方页面。服务商可能会调整,请在做决定前核实。