Amazon S3 条件键 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon S3 条件键

访问策略语言使您可以在授予权限时指定条件。要指定策略生效时的条件,您可以使用可选 Condition 元素或 Condition 块来指定策略生效时的条件。您可以使用预定义的 Amazon 范围内的键和特定于 Amazon S3 的键来指定 Amazon S3 访问策略中的条件。

Condition 元素中,您可构建表达式并使用布尔运算符(等于、小于等)将条件与请求中的值进行匹配。例如,当授予用户上传对象的权限时,存储桶拥有者可通过添加 StringEquals 条件要求此对象可公开读取,如下所示:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::awsexamplebucket1/*" ], "Condition": { "StringEquals": { "s3:x-amz-acl": "public-read" } } } ] }

在本例中,Condition 块指定应用于指定的键值对 StringEquals"s3:x-amz-acl":["public-read"] 条件。有一组预定义键可用于表达条件。此示例使用 s3:x-amz-acl 条件键。此条件要求用户包含 x-amz-acl 标头,并且值 public-read 位于每个 PUT 对象请求中。

Amazon 范围的条件键

Amazon 提供一组常用键,所有支持策略的 Amazon 服务均支持这些键。这些键称为 Amazon 范围的键并使用前缀 aws:。有关 Amazon 范围的条件键的完整列表,请参阅《IAM 用户指南》中的可用的 Amazon 条件键

您可以在 Amazon S3 中使用 Amazon 范围的条件键。如果请求源自特定 IP 地址范围 (192.0.2.0.*),则以下示例存储桶策略可使已经过身份验证的用户具有使用 s3:GetObject 操作的权限,除非此 IP 地址为 192.0.2.188。在条件块中,IpAddressNotIpAddress 为条件,每个条件均提供了一个键值对用于评估。此示例中的两个键-值对均使用 aws:SourceIp Amazon 范围内的键。

注意

请注意,在条件中指定的 IPAddressNotIpAddress 键值使用 RFC 4632 中描述的 CIDR 表示法。有关详细信息,请参阅 http://www.rfc-editor.org/rfc/rfc4632.txt

{ "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": "*", "Action":"s3:GetObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition" : { "IpAddress" : { "aws:SourceIp": "192.0.2.0/24" }, "NotIpAddress" : { "aws:SourceIp": "192.0.2.188/32" } } } ] }

您还可以在 Amazon S3 策略中使用其他 Amazon 范围的条件键。例如,您可以在适用于 VPC 终端节点的存储桶策略中指定 aws:SourceVpceaws:SourceVpc 条件键。有关示例,请参阅 使用存储桶策略控制从 VPC 终端节点的访问

特定于 Amazon S3 的条件键

您可以将 Amazon S3 条件键与特定的 Amazon S3 操作一起使用。每个条件键均映射到可设置条件的 API 所允许的相同名称请求标头。特定于 Amazon S3 的条件键指定同名请求标头的行为。有关特定于 Amazon S3 的条件键的完整列表,请参阅Amazon S3 的操作、资源和条件键

例如,条件键 s3:x-amz-acl 可用于对 s3:PutObject 权限授予条件权限,它定义 PUT 对象 API 支持的 x-amz-acl 请求标头的行为。条件键 s3:VersionId 可用于对 s3:GetObjectVersion 权限授予条件权限,它定义您在 GET Object 请求中设置的查询参数 versionId 的行为。

如果请求包含可使对象公开可读的 x-amz-acl 标头,则以下存储桶策略授予两个 Amazon Web Services 账户 具有 s3:PutObject 权限。Condition 块使用 StringEquals 条件,并且提供键值对 "s3:x-amz-acl":["public-read",以进行评估。在该键值对中,s3:x-amz-acl 是特定于 Amazon S3 的键,如前缀 s3: 所示。

{ "Version":"2012-10-17", "Statement": [ { "Sid":"AddCannedAcl", "Effect":"Allow", "Principal": { "AWS": [ "arn:aws:iam::Account1-ID:root", "arn:aws:iam::Account2-ID:root" ] }, "Action":"s3:PutObject", "Resource": ["arn:aws:s3:::awsexamplebucket1/*"], "Condition": { "StringEquals": { "s3:x-amz-acl":["public-read"] } } } ] }
重要

并非所有条件对所有操作都有意义。例如,在授予 s3:LocationConstraint Amazon S3 权限的策略上包含 s3:CreateBucket 条件是有意义的。但是,在授予 s3:GetObject 权限的策略中包含此条件没有意义。Amazon S3 可测试是否存在此类涉及 Amazon S3 特定条件的语义错误。但如果要创建针对 IAM 用户的策略,并且包含了语义无效的 Amazon S3 条件,则不报告错误,因为 IAM 无法验证 Amazon S3 条件。