Amazon S3 条件键 - Amazon Simple Storage Service

Amazon S3 条件键

访问策略语言使您可以在授予权限时指定条件。要指定策略生效时的条件,您可以使用可选 Condition 元素或 Condition 块来指定策略生效时的条件。您可以使用预定义的 AWS 范围内的键和特定于 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 块指定应用于指定的键值对 "s3:x-amz-acl":["public-read"]StringEquals 条件。有一组预定义键可用于表达条件。此示例使用 s3:x-amz-acl 条件键。此条件要求用户包含 x-amz-acl 标头,并且值 public-read 位于每个 PUT 对象请求中。

AWS 范围的条件键

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

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

注意

请注意,在条件中指定的 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 策略中使用其他 AWS 范围的条件键。例如,您可以在适用于 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 标头,则以下存储桶策略向两个 AWS 账户授予 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:CreateBucket Amazon S3 权限的策略上包含 s3:LocationConstraint 条件是有意义的。但是,在授予 s3:GetObject 权限的策略中包含此条件没有意义。Amazon S3 可测试是否存在此类涉及 Amazon S3 特定条件的语义错误。但如果要创建针对 IAM 用户的策略,并且包含了语义无效的 Amazon S3 条件,则不报告错误,因为 IAM 无法验证 Amazon S3 条件。