使用预签名 URL 下载和上传对象
您可以使用预签名 URL 授予对 Amazon S3 中对象的限时访问权限,而不更新存储桶策略。可以在浏览器中输入预签名 URL,或者程序使用预签名 URL 来下载对象。预签名 URL 使用的凭证是生成该 URL 的 Amazon Identity and Access Management(IAM)主体的凭证。
还可以使用预签名 URL 来允许他人将特定对象上传到您的 Amazon S3 存储桶。这允许在不要求另一方拥有 Amazon 安全凭证或权限的情况下进行上传。如果具有相同键的对象已存在于在预签名 URL 中指定的存储桶中,则 Amazon S3 将现有对象替换为上传的对象。
在到期日期和时间之前,可以多次使用预签名 URL。
创建预签名 URL 时,必须提供您的安全凭证,然后指定以下内容:
-
一个 Amazon S3 存储桶
-
对象键(如果将在您的 Amazon S3 存储桶中下载此对象,则一旦上传,这就是要上传的文件名)
-
HTTP 方法(
GET用于下载对象、PUT用于上传、HEAD用于读取对象元数据等) -
过期时间间隔
使用预签名 URL 上传对象时,您可以使用校验和来验证对象完整性。尽管使用 Amazon 签名版本 2 创建的预签名 URL 仅支持 MD5 校验和,但使用 Amazon 签名版本 4 创建的预签名 URL 支持其它校验和算法,包括 CRC-64/NVME、CRC32、CRC32C、SHA-1 和 SHA-256。要使用这些其它校验和算法,请确保您使用的是 Amazon 签名版本 4,并在上传请求中包含相应的校验和标头。有关对象完整性的更多信息,请参阅在 Amazon S3 中检查对象完整性。
谁可以创建预签名 URL
具有有效安全凭证的任何人都可以创建预签名 URL。但对于成功地访问对象的人来说,必须由拥有执行预签名 URL 所基于的操作权限的人创建预签名 URL。
以下各个类型的凭证可用于创建预签名 URL:
-
IAM 用户 – 使用 Amazon 签名版本 4 时,有效期最长 7 天。
要创建有效期最长为 7 天的预签名 URL,请首先将 IAM 用户凭证(访问密钥和私有密钥)委托给用于创建预签名 URL 的方法。
-
临时安全凭证:有效期不能超过凭证本身。这些凭证包括:
-
IAM 角色凭证:当角色会话到期时,预签名 URL 也会到期,即使您指定更长的到期时间也是如此。
-
Amazon EC2 实例使用的 IAM 角色凭证:在角色凭证的有效期内有效(通常为 6 小时)。
-
Amazon Security Token Service 凭证:仅在临时凭证的有效期内有效。
-
注意
如果您使用临时凭证创建了预签名 URL,则此 URL 将在凭证过期时过期。通常,当您用于创建预签名 URL 的凭证被撤销、删除或停用时,预签名 URL 就会到期。即使创建的 URL 的过期时间更晚,也是如此。有关临时安全凭证生命周期,请参阅《IAM 用户指南》中的比较 Amazon STS API 操作。
预签名 URL 的到期时间
预签名 URL 在生成 URL 时指定的时间段内保持有效。如果使用 Amazon S3 控制台创建预签名 URL,过期时间可设置为 1 分钟到 12 小时之间。如果您使用 Amazon CLI 或 Amazon SDK,则过期时间可设置为多达 7 天。
如果您使用临时令牌创建了预签名 URL,则此 URL 将在该令牌到期时到期。通常,当您用于创建预签名 URL 的凭证被撤销、删除或停用时,预签名 URL 就会到期。即使创建的 URL 的过期时间更晚,也是如此。有关您使用的凭证如何影响到期时间的更多信息,请参阅谁可以创建预签名 URL。
在发出 HTTP 请求时,Simple Storage Service (Amazon S3) 会检查签名 URL 的到期日期和时间。例如,如果客户端刚好在到期时间之前开始下载某个大型文件,即使在下载过程中超过到期时间,下载也会继续进行。但如果连接断开,在客户端试图在超过到期时间后重新开始下载,则下载将会失败。
限制预签名 URL 功能
预签名 URL 的功能受创建它的用户的权限所限制。预签名 URL 实质上是一种不记名令牌,向持有相关 URL 的人授予了访问权限。因此,我们建议您适当地保护它们。以下是一些可用来限制使用预签名 URL 的方法。
Amazon 签名版本 4(SigV4)
使用 Amazon 签名版本 4(SigV4)对预签名 URL 请求进行身份认证时要强制执行特定的行为,您可以在存储桶策略和接入点策略中使用条件键。例如,以下存储桶策略使用 s3:signatureAge 条件,当相关签名的存在时间超过 10 分钟时,将拒绝对于 amzn-s3-demo-bucket 存储桶中对象的任何 Amazon S3 预签名 URL 请求。要使用此示例,请将 替换为您自己的信息。user input
placeholders
有关策略键相关的 Amazon 签名版本 4 的更多信息,请参阅《Amazon Simple Storage Service API 参考》中的 Amazon 签名版本 4 身份认证。
网络路径限制
如果您想限制使用预签名 URL 和 Amazon S3 对特定网络路径的所有访问权限,则可以编写 Amazon Identity and Access Management(IAM)策略。您可以在进行调用的 IAM 主体、Amazon S3 存储桶或两者上设置这些策略。
对 IAM 主体实施网络路径限制后,要求拥有这些凭证的用户从指定的网络发出请求。对存储桶或接入点实施限制后,要求对该资源的所有请求都必须来自指定的网络。这些限制也适用于预签名 URL 以外的场景。
您使用的 IAM 全局条件键取决于端点的类型。如果您正在对 Amazon S3 使用公有端点,请使用 aws:SourceIp。如果您正在使用虚拟私有云(VPC)端点访问 Amazon S3 存储桶,请使用 aws:SourceVpc 或 aws:SourceVpce。
以下 IAM 策略语句要求主体仅从指定的网络范围访问。Amazon使用此策略语句时,所有访问都必须来自该范围。这包括有人对于 Amazon S3 使用预签名 URL 的情况。要使用此示例,请将 替换为您自己的信息。user input
placeholders
{ "Sid": "NetworkRestrictionForIAMPrincipal", "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "NotIpAddressIfExists": {"aws:SourceIp": "IP-address-range"}, "BoolIfExists": {"aws:ViaAWSService": "false"} } }
预签名 URL 的常见问题
问:为什么我的预签名 URL 的到期时间早于配置的到期时间?
预签名 URL 只有在其基础凭证有效时才保持有效。预签名 URL 在其配置的到期时间或其关联凭证到期时(以先发生者为准)到期。对于 Amazon Elastic Container Service 任务或容器,角色凭证通常每 1-6 小时轮换一次。使用 Amazon Security Token Service(Amazon STS)AssumeRole 时,预签名 URL 将在角色会话结束时到期,默认为 1 小时。对于 Amazon EC2 实例配置文件,元数据凭证会定期轮换,最长有效期约为 6 小时。
问:当我访问预签名 URL 时,为何收到 403 Forbidden 错误?
在生成预签名 URL 之前,请验证您配置了正确的权限。生成 URL 的 IAM 用户或角色必须具有执行特定操作所需的权限,例如 s3:GetObject。此外,请检查 Amazon S3 存储桶策略是否未显式拒绝访问该对象。
问:我遇到了 SignatureDoesNotMatch 错误。如果修复此问题?
如果您在使用 Amazon S3 预签名 URL 时遇到 SignatureDoesNotMatch 错误,请考虑几个常见原因。首先,请确保系统时钟与网络时间协议(NTP)服务器同步,因为即使是很小的时间偏差也会使签名失效。接下来,请注意,某些公司代理可能会修改标头或查询字符串,从而可能导致签名不匹配。要排除故障,请尝试在没有代理的情况下进行测试。最后,验证所有请求参数(包括 HTTP 方法、标头和查询字符串)在 URL 生成和使用之间是否完全匹配。解决这些问题通常可以解决 SignatureDoesNotMatch 错误。
问:我遇到了 ExpiredToken 错误。我应该怎么办?
如果您在使用预签名 URL 时收到 ExpiredToken 错误,这表示用于生成 URL 的 Amazon 凭证不再有效。要解决此问题,请先刷新您的 Amazon 凭证,然后生成新的预签名 URL。对于长时间运行的应用程序,我们建议实施凭证刷新逻辑以保持持续访问。在适当情况下,您可以使用寿命更长的凭证或实施令牌刷新机制。如果您使用的是 Amazon Security Token Service(Amazon STS)AssumeRole,请验证配置的会话持续时间是否符合使用案例要求。请记住,预签名 URL 仅在其基础凭证的有效期内有效,因此实施适当的凭证管理至关重要。