使用预签名 URL 下载和上传对象 - Amazon Simple Storage Service

使用预签名 URL 下载和上传对象

您可以使用预签名 URL 授予对 Amazon S3 中对象的限时访问权限,而不更新存储桶策略。可以在浏览器中输入预签名 URL,或者程序使用预签名 URL 来下载对象。预签名 URL 使用的凭证是生成该 URL 的 AWS 用户的凭证。

还可以使用预签名 URL 来允许他人将特定对象上传到您的 Amazon S3 存储桶。这允许在不要求另一方拥有 AWS 安全凭证或权限的情况下进行上传。如果具有相同键的对象已存在于在预签名 URL 中指定的存储桶中,则 Amazon S3 将现有对象替换为上传的对象。

在到期日期和时间之前,可以多次使用预签名 URL。

创建预签名 URL 时,必须提供您的安全凭证,然后指定以下内容:

  • 一个 Amazon S3 存储桶

  • 对象键(如果将在您的 Amazon S3 存储桶中下载此对象,则一旦上传,这就是要上传的文件名)

  • HTTP 方法(GET 用于下载对象,或 PUT 用于上传)

  • 过期时间间隔

目前,Amazon S3 预签名 URL 不支持在上传对象时使用以下数据完整性校验和算法(CRC32、CRC32C、SHA-1、SHA-256)。要在上传后验证对象的完整性,您可以在使用预签名 URL 上传对象时提供对象的 MD5 摘要。有关对象完整性的更多信息,请参阅检查对象完整性

谁可以创建预签名 URL

具有有效安全凭证的任何人都可以创建预签名 URL。但对于成功地访问对象的人来说,必须由拥有执行预签名 URL 所基于的操作权限的人创建预签名 URL。

以下各个类型的凭证可用于创建预签名 URL:

  • IAM 实例配置文件 – 有效期最长 6 小时。

  • AWS Security Token Service – 有效期为最长 36 小时(使用长期安全凭证进行签名时),或为临时凭证的持续时间,以先到者为准。

  • IAM 用户 – 使用 AWS 签名版本 4 时,有效期最长 7 天。

    要创建有效期最长为 7 天的预签名 URL,请首先将 IAM 用户凭证(访问密钥和私有密钥)委托给用于创建预签名 URL 的方法。

注意

如果您使用临时凭证创建了预签名 URL,则此 URL 将在凭证过期时过期。通常,当您用于创建预签名 URL 的凭证被撤销、删除或停用时,预签名 URL 就会到期。即使创建的 URL 的过期时间更晚,也是如此。有关临时安全凭证生命周期,请参阅《IAM 用户指南》中的比较 AWS STS API 操作

预签名 URL 的到期时间

预签名 URL 在生成 URL 时指定的时间段内保持有效。如果使用 Amazon S3 控制台创建预签名 URL,过期时间可设置为 1 分钟到 12 小时之间。如果您使用 AWS CLI 或 AWS SDK,则过期时间可设置为多达 7 天。

如果您使用临时令牌创建了预签名 URL,则此 URL 将在该令牌到期时到期。通常,当您用于创建预签名 URL 的凭证被撤销、删除或停用时,预签名 URL 就会到期。即使创建的 URL 的过期时间更晚,也是如此。有关您使用的凭证如何影响到期时间的更多信息,请参阅谁可以创建预签名 URL

在发出 HTTP 请求时,Simple Storage Service (Amazon S3) 会检查签名 URL 的到期日期和时间。例如,如果客户端刚好在到期时间之前开始下载某个大型文件,即使在下载过程中超过到期时间,下载也会继续进行。但如果连接断开,在客户端试图在超过到期时间后重新开始下载,则下载将会失败。

限制预签名 URL 功能

预签名 URL 的功能受创建它的用户的权限所限制。预签名 URL 实质上是一种不记名令牌,向持有相关 URL 的人授予了访问权限。因此,我们建议您适当地保护它们。以下是一些可用来限制使用预签名 URL 的方法。

AWS 签名版本 4(SigV4)

使用 AWS 签名版本 4(SigV4)对预签名 URL 请求进行身份认证时要强制执行特定的行为,您可以在存储桶策略和接入点策略中使用条件键。例如,以下存储桶策略使用 s3:signatureAge 条件,当相关签名的存在时间超过 10 分钟时,拒绝对于 amzn-s3-demo-bucket 存储桶中对象的任何 Amazon S3 预签名 URL 请求。要使用此示例,请将 user input placeholders 替换为您自己的信息。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Deny a presigned URL request if the signature is more than 10 min old", "Effect": "Deny", "Principal": {"AWS":"*"}, "Action": "s3:*", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition": { "NumericGreaterThan": { "s3:signatureAge": 600000 } } } ] }

有关策略键相关的 AWS 签名版本 4 的更多信息,请参阅《Amazon Simple Storage Service API 参考》中的 AWS 签名版本 4 身份认证

网络路径限制

如果您想限制使用预签名 URL 和 Amazon S3 对特定网络路径的所有访问权限,则可以编写 AWS Identity and Access Management(IAM)策略。您可以在进行调用的 IAM 主体、Amazon S3 存储桶或两者上设置这些策略。

对 IAM 主体实施网络路径限制后,要求拥有这些凭证的用户从指定的网络发出请求。对存储桶或接入点实施限制后,要求对该资源的所有请求都必须来自指定的网络。这些限制也适用于预签名 URL 以外的场景。

您使用的 IAM 全局条件键取决于端点的类型。如果您正在对 Amazon S3 使用公有端点,请使用 aws:SourceIp。如果您正在使用虚拟私有云(VPC)端点访问 Amazon S3 存储桶,请使用 aws:SourceVpcaws:SourceVpce

以下 IAM 策略语句要求主体仅从指定的网络范围访问。AWS使用此策略语句时,所有访问都必须来自该范围。这包括有人对于 Amazon S3 使用预签名 URL 的情况。要使用此示例,请将 user input placeholders 替换为您自己的信息。

{ "Sid": "NetworkRestrictionForIAMPrincipal", "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "NotIpAddressIfExists": {"aws:SourceIp": "IP-address-range"}, "BoolIfExists": {"aws:ViaAWSService": "false"} } }