在策略中指定条件
访问策略语言可使您在授予权限时指定条件。在 Condition
元素 (或 Condition
块) 中,可以指定策略生效的条件。在 Condition
元素(这是可选的)中,您可构建表达式并使用布尔运算符(等于、小于等)将条件与请求中的值进行比对。例如,当授予用户上传对象的权限时,存储桶拥有者可通过添加 StringEquals
条件要求此对象可公开读取,如下所示:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws-cn:s3:::
examplebucket
/*" ], "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 对象请求中。
有关使用访问策略语言来指定条件的更多信息,请参阅 IAM 用户指南 中的条件。
以下主题描述 AWS 范围和 Amazon S3 特定的条件键并提供示例策略。
可用条件键
用于在 Amazon S3 访问策略中指定条件的预定义键可按以下方式分类:
-
AWS 范围的键 – AWS 提供一组常用键,所有支持策略的 AWS 服务均支持这些键。所有服务常用的这些键称作 AWS 范围的键,它们使用前缀
aws:
。有关 AWS 范围内的键的列表,请参阅 IAM 用户指南 中的可用的条件键。还存在特定于 Amazon S3 的键,这些键使用前缀s3:
。下一个项目符号项中将讨论特定于 Amazon S3 的键。新条件键
aws:sourceVpce
和aws:sourceVpc
在 VPC 终端节点的存储桶策略中使用。有关使用这些条件键的示例,请参阅 Amazon S3 的 VPC 终端节点的示例存储桶策略。如果请求来自特定 IP 地址范围 (192.168.143.*),则以下示例存储桶策略可使已经过身份验证的用户使用
s3:GetObject
操作,除非此 IP 地址为 192.168.143.188。在条件块中,IpAddress
和NotIpAddress
为条件,每个条件均提供了一个键值对用于评估。此示例中的两个键-值对均使用aws:SourceIp
AWS 范围内的键。注意
请注意,在条件中指定的
IPAddress
和NotIpAddress
键值使用 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-cn:s3:::
examplebucket
/*", "Condition" : { "IpAddress" : { "aws:SourceIp": "192.168.143.0/24" }, "NotIpAddress" : { "aws:SourceIp": "192.168.143.188/32" } } } ] } -
特定于 Amazon S3 的键 – 除了 AWS 范围的键之外,下面还有一些条件键,这些键仅适用于向 Amazon S3 授予特定权限的上下文。这些特定于 Amazon S3 的键使用前缀
s3:
。-
s3:x-amz-acl
-
s3:x-amz-copy-source
-
s3:x-amz-metadata-directive
-
s3:x-amz-server-side-encryption
-
s3:VersionId
-
s3:LocationConstraint
-
s3:delimiter
-
s3:max-keys
-
s3:prefix
-
s3:x-amz-server-side-encryption-aws-kms-key-id
-
s3:ExistingObjectTag/
<tag-key>
有关使用对象标签相关条件键的策略的示例,请参阅对象标签和访问控制策略。
-
s3:RequestObjectTagKeys
-
s3:RequestObjectTag/
<tag-key>
例如,如果请求包含可使对象公开可读的
s3:PutObject
标头,则以下存储桶策略允许两个 AWS 账户具有x-amz-acl
权限。{ "Version":"2012-10-17", "Statement": [ { "Sid":"AddCannedAcl", "Effect":"Allow", "Principal": { "AWS": ["arn:aws-cn:iam::
account1-ID
:root","arn:aws-cn:iam::account2-ID
:root"] }, "Action":["s3:PutObject"], "Resource": ["arn:aws-cn:s3:::examplebucket
/*"], "Condition": { "StringEquals": { "s3:x-amz-acl":["public-read"] } } } ] }Condition
块使用StringEquals
条件,并且提供键值对"s3:x-amz-acl":["public-read"
,以进行评估。在该键值对中,s3:x-amz-acl
是特定于 Amazon S3 的键,如前缀s3:
所示。 -
重要
并非所有条件对所有操作都有意义。例如,在授予 s3:CreateBucket
Amazon S3 权限的策略上包含 s3:LocationConstraint
条件是有意义的,但对于 s3:GetObject
权限没有意义。Amazon S3 可测试是否存在此类涉及 Amazon S3 特定条件的语义错误。但如果要创建针对 IAM 用户的策略,并且包含了语义无效的 Amazon
S3 条件,则不报告错误,因为 IAM 无法验证 Amazon S3 条件。
下一节介绍可用于授予针对存储桶和对象操作的条件权限的条件键。此外,还有与 Amazon S3 签名版本 4 身份验证有关的条件键。有关更多信息,请转到 Amazon Simple Storage Service API Reference 中的 Amazon S3 签名版本 4 身份验证特定的策略键。
针对对象操作的 Amazon S3 条件键
下表显示了可对哪些 Amazon S3 操作使用哪些 Amazon S3 条件。在该表之后提供有策略示例。注意下面有关下表中所述的 Amazon S3 特定条件键的内容:
-
这些条件键名的前缀为
s3:
。例如:s3:x-amz-acl
。 -
每个条件键均映射到可设置条件的 API 所允许的相同名称请求标头。即,这些条件键指定同名请求标头的行为。例如:
-
条件键
s3:x-amz-acl
可用于对s3:PutObject
权限授予条件权限,它定义 PUT 对象 API 支持的x-amz-acl
请求标头的行为。 -
条件键
s3:VersionId
可用于对s3:GetObjectVersion
权限授予条件权限,它定义您在 GET Object 请求中设置的查询参数versionId
的行为。
-
许可 | 适用的条件键 (或关键字) | 描述 |
---|---|---|
|
|
PUT 对象操作允许在授予基于 ACL 的权限时可使用的访问控制列表 (ACL) 特定标头。通过使用这些键,存储桶拥有者可设置条件,要求用户上传对象时需具有特定访问权限。 有关策略示例,请参阅示例 1:授予 s3:PutObject 权限,指定了要求存储桶拥有者获得完全控制的条件。 有关 ACL 的更多信息,请参阅 访问控制列表 (ACL) 概述。 |
|
要复制对象,请使用 PUT 对象 API(请参阅 PUT 对象)并使用 有关策略示例,请参阅示例 3:授予从限定复制源复制对象的 s3:PutObject 权限。 |
|
|
上传对象时,可以使用 当授予 有关策略示例,请参阅示例 1:授予 s3:PutObject 权限,指定了要求存储桶拥有者获得完全控制的条件。 |
|
|
在上传对象时,可以使用 在授予 存储桶拥有者可通过授予此类条件权限,确保在保存用户上传的对象时使用特定密钥进行加密。 您在策略中指定的 AWS KMS 密钥必须使用以下格式:
|
|
|
在使用 PUT 对象 API 复制对象时(请参阅 PUT 对象),可以选择添加 通过使用此键值存储桶,拥有者可添加在上传对象时将执行某种行为的条件。 有效值: |
|
|
默认情况下, 在授予 有关策略示例,请参阅示例 5:将上传对象限制为具有特定存储类的对象。 有效值: |
|
|
通过使用此条件键,您可以通过限制请求中允许使用的对象标签来限制 |
|
|
|
PUT 对象 ACL API 在特定对象上设置访问控制列表 (ACL)。此操作支持与 ACL 相关的标头。当授予此权限时,存储桶拥有者可使用这些键添加将要求某些权限的条件。有关 ACL 的更多信息,请参阅 访问控制列表 (ACL) 概述。 例如,无论谁应有此对象,存储桶拥有者都可能需要保持对此对象的控制。要实现这一点,存储桶拥有者可使用其中一个键添加条件,要求用户包含对存储桶拥有者的特定权限。 |
|
通过使用此条件键,您可以将 |
|
|
|
通过使用此条件键,您可以通过限制请求中允许使用的对象标签来限制s3:PutObjectTagging 操作的权限。有关使用这些条件键的示例,请参阅 对象标签和访问控制策略。
|
|
通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略。 |
|
|
|
通过使用此条件键,您可以通过限制请求中允许使用的对象标签来限制 |
|
通过使用此条件键,您可以将 |
|
|
通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略。 |
|
|
|
该 Amazon S3 权限使用户能够执行一组 Amazon S3 API 操作(请参阅对象操作的 Amazon S3 权限)。对于启用了版本控制的存储桶,可指定检索数据所针对的对象版本。 通过使用此键添加条件,存储桶拥有者可将用户限定于仅访问特定对象版本的数据。有关策略示例,请参阅示例 4:授予对特定对象版本的访问权限。 |
|
通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略。 |
|
|
|
通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略。 |
|
|
通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略。 |
|
|
您可以使用 GET 对象 ACL API 来检索特定对象版本的访问控制列表 (ACL)。用户必须具有执行 存储桶拥有者可使用此键值添加条件,将用户限定于对象的特定版本。 |
|
通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略。 |
|
|
|
对于启用了版本控制的存储桶,可在 PUT 对象 acl 请求中指定对象版本,以针对特定对象版本设置 ACL。通过使用此条件,存储桶拥有者可将用户限定于仅针对特定对象版本设置 ACL。 |
|
对于启用了版本控制的存储桶,此 Amazon S3 权限使您能够针对特定对象版本设置 ACL。 有关这些条件键的描述,请参阅本表中的 |
|
|
通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略。 |
|
|
|
对于启用了版本控制的存储桶,该 Amazon S3 权限使用户能够删除对象的特定版本。 存储桶拥有者可使用此键值添加条件,限制用户仅删除对象的特定版本的能力。 有关使用此条件键的示例,请参阅示例 4:授予对特定对象版本的访问权限。该示例授权 |
|
|
通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略。 |
|
|
通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略。 |
|
通过使用此条件键,您可以将 |
|
|
|
通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略。 |
|
|
通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略。 |
|
通过使用此条件键,您可以将 |
示例 1:授予 s3:PutObject 权限,指定了要求存储桶拥有者获得完全控制的条件
假设账户 A 拥有一个存储桶,而账户管理员想要授予账户 B 中的用户 Dave 上传对象的权限。默认情况下,Dave 上传的对象由账户 B 拥有,而账户 A 对这些对象没有权限。由于存储桶拥有者要支付账单,需要对
Dave 上传的对象具有全部权限。要实现这一目的,账户 A 管理员可向 Dave 授予 s3:PutObject
权限,指定的条件要求请求包含 ACL 特定标头,以及显式授予全部权限或使用标准 ACL (请参阅 PUT 对象)。
-
要求在请求中具有
x-amz-full-control
标头,授予存储桶拥有者完全控制权限。以下存储桶策略向用户 Dave 授予
s3:PutObject
权限,使用s3:x-amz-grant-full-control
条件键指定了条件,要求此请求包含x-amz-full-control
标头。{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::
AccountB-ID
:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws-cn:s3:::examplebucket
/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID
" } } } ] }注意
此示例是关于跨账户权限的。但如果将要获得此权限的 Dave 属于拥有此存储桶的 AWS 账户,则无需这种条件权限,因为 Dave 所属的父账户拥有用户上传的对象。
上述存储桶策略向账户 B 中的用户 Dave 授予条件权限。当该策略生效时,Dave 可通过其他某个策略获得没有任何条件的相同权限。例如,Dave 可属于一个组,并且您授予该组没有任何条件的
s3:PutObject
权限。为避免这些权限漏洞,可通过添加显式拒绝编写更严格的访问策略。在该示例中,如果用户 Dave 的请求没有包含必要标头向存储桶拥有者授予全部权限,则您显式拒绝他的上传权限。显式拒绝始终取代授予的其他任何权限。以下是修订的访问策略示例。{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::
AccountB-ID
:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws-cn:s3:::examplebucket
/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID
" } } }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws-cn:iam::AccountB-ID
:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws-cn:s3:::examplebucket
/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID
" } } } ] }如果您有两个 AWS 账户,则可使用 AWS Command Line Interface (AWS CLI) 测试此策略。使用 Dave 的凭证附加此策略,通过以下 AWS CLI
put-object
命令测试权限。通过添加--profile
参数提供 Dave 的凭证。通过添加--grant-full-control
参数可向存储桶拥有者授予完全控制权限。有关设置和使用 AWS CLI 的更多信息,请参阅设置用于示例演练的工具。aws s3api put-object --bucket
examplebucket
--key HappyFace.jpg --body c:\HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID
" --profile AccountBUserProfile -
要求
x-amz-acl
标头,带有向存储桶拥有者授予完全控制权限的标准 ACL。若要求在请求中包含
x-amz-acl
标头,可替换Condition
块中的键值对,并指定s3:x-amz-acl
条件键,如下所示。"Condition": { "StringNotEquals": { "s3:x-amz-acl": "bucket-owner-full-control" }
要使用 AWS CLI 测试权限,则指定
--acl
参数。然后 AWS CLI 在其发送此请求时添加x-amz-acl
标头。aws s3api put-object --bucket
examplebucket
--key HappyFace.jpg --body c:\HappyFace.jpg --acl "bucket-owner-full-control" --profile AccountBadmin
示例 2:授予要求使用服务器端加密存储对象的 s3:PutObject 权限
假设账户 A 拥有一个存储桶。账户管理员想要授予账户 A 中的用户 Jane 上传对象的权限,条件是 Jane 始终请求服务器端加密,使 Amazon S3 保存加密的对象。账户
A 管理员可使用所示的 s3:x-amz-server-side-encryption
条件键来完成。Condition
块中的键值对指定 s3:x-amz-server-side-encryption
键。
"Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" }
当使用 AWS CLI 测试此权限时,必须使用 --server-side-encryption
参数添加所需的参数。
aws s3api put-object --bucket example1bucket --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountBadmin
示例 3:授予从限定复制源复制对象的 s3:PutObject 权限
在 PUT 对象请求中,如果指定了源对象,则为一个复制操作(请参阅 PUT 对象 - 复制)。因此,存储桶拥有者可授予用户复制限定于此源上的对象的权限。例如:
-
允许仅从
sourcebucket
存储桶复制对象。 -
允许从
sourcebucket
存储桶复制对象,并仅复制键名前缀开头为public/
f 的对象。例如,sourcebucket/public/*
-
只允许从
sourcebucket
复制特定对象;例如sourcebucket/example.jpg
。
以下存储桶策略授予用户 Dave s3:PutObject
权限,此权限要求他复制对象时需满足以下条件:请求中包含 s3:x-amz-copy-source
标头且标头值指定 /examplebucket/public/*
键名前缀。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "cross-account permission to user in your own account", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::
AccountA-ID
:user/Dave" }, "Action": ["s3:PutObject"], "Resource": "arn:aws-cn:s3:::examplebucket
/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/folder", "Effect": "Deny", "Principal": { "AWS": "arn:aws-cn:iam::AccountA-ID
:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws-cn:s3:::examplebucket
/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "examplebucket
/public/*" } } } ] }
可使用 AWS CLI copy-object
命令测试此权限。可通过添加 --copy-source
参数指定源,键名前缀必须与策略中允许的前缀相匹配。您需要使用 --profile
参数为用户 Dave 提供凭证。有关设置 AWS CLI 的更多信息,请参阅设置用于示例演练的工具。
aws s3api copy-object --bucket
examplebucket
--key HappyFace.jpg --copy-sourceexamplebucket
/public/PublicHappyFace1.jpg --profile AccountADave
注意,上述策略使用 StringNotLike
条件。要授予仅复制特定对象的权限,您必须将条件从 StringNotLike
更改为 StringNotEquals
,然后指定所示的对象键。
"Condition": { "StringNotEquals": { "s3:x-amz-copy-source": "
examplebucket
/public/PublicHappyFace1.jpg" } }
示例 4:授予对特定对象版本的访问权限
假设账户 A 拥有启用版本控制的存储桶。该存储桶具有 HappyFace.jpg
对象的多个版本。账户管理员现在想要授予用户 (Dave) 仅获得特定对象版本的权限。账户管理员可通过有条件地授予 Dave 所示的 s3:GetObjectVersion
权限来实现这一点。Condition
块中的键值对指定 s3:VersionId
条件键。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::
AccountA-ID
:user/Dave" }, "Action": ["s3:GetObjectVersion"], "Resource": "arn:aws-cn:s3:::examplebucketversionenabled
/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws-cn:iam::AccountA-ID
:user/Dave" }, "Action": ["s3:GetObjectVersion"], "Resource": "arn:aws-cn:s3:::examplebucketversionenabled
/HappyFace.jpg", "Condition": { "StringNotEquals": { "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e
" } } } ] }
在这种情况下,Dave 需要知道确切的对象版本 ID 才能检索该对象。
可使用 AWS CLI get-object
命令以及标识特定对象版本的 --version-id
参数来测试这些权限。此命令会检索该对象,并将其保存到 OutputFile.jpg
文件。
aws s3api get-object --bucket
examplebucketversionenabled
--key HappyFace.jpg OutputFile.jpg --version-idAaaHbAQitwiL_h47_44lRO2DDfLlBO5e
--profile AccountADave
示例 5:将上传对象限制为具有特定存储类的对象
假设账户 A 拥有一个存储桶。账户管理员想要限制 Dave (账户 A 中的一名用户) 只能将使用 STANDARD_IA
存储类存储的对象上传到此存储桶。账户 A 管理员可以借助 s3:x-amz-storage-class
条件键达到这一目的,如下面的示例存储桶策略所示。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::
AccountA-ID
:user/Dave" }, "Action": "s3:PutObject", "Resource": [ "arn:aws-cn:s3:::examplebucket/*" ], "Condition": { "StringEquals": { "s3:x-amz-storage-class": [ "STANDARD_IA" ] } } } ] }
针对存储桶操作的 Amazon S3 条件键
下表显示了可在策略中授予的存储桶操作特定权限列表,并且对于其中的每个权限,该表还显示了可用于指定条件的可用键。
许可 | 适用的条件键 | 描述 |
---|---|---|
|
|
创建存储桶 API(请参阅 PUT Bucket)支持 ACL 特定的标头。通过使用这些条件键,可要求用户在授予特定权限的请求中设置这些标头。 |
|
通过使用此条件键,可将用户限定于在特定 AWS 区域创建存储桶。有关策略示例,请参阅示例 1:允许用户创建存储桶,但仅在特定区域内创建。 |
|
|
|
通过使用此条件键,可将 Get Bucket (列出对象) API 的响应限定于具有特定前缀的键名,请参阅 GET Bucket (列出对象)。 Get Bucket (列出对象) API 会返回指定存储桶中的对象键列表。此 API 支持 例如,Amazon S3 控制台支持使用键名前缀的文件夹概念。因此,如果您有键名为 有关策略示例,请参阅示例 2:允许用户根据特定前缀获取存储桶中的对象的列表 。 |
|
如果使用前缀和分隔符组织对象键名,则可使用此条件键来要求用户在 Get Bucket (列出对象) 请求中指定 |
|
|
通过使用此条件,要求用户指定 |
|
|
|
如果您的存储桶启用了版本控制,则可使用 使用此条件键,可要求用户在请求中指定具有特定值的 例如,Amazon S3 控制台支持使用键名前缀的文件夹概念。如果您有键名为 有关策略示例,请参阅示例 2:允许用户根据特定前缀获取存储桶中的对象的列表 。 |
|
如果使用前缀和分隔符组织对象键名,则可使用此条件键要求用户在 GET Bucket Object versions 请求中指定 |
|
|
通过使用此条件,要求用户指定 |
|
|
|
PUT Bucket
acl API(请参阅 PUT Bucket)支持 ACL 特定的标头。可使用这些条件键来要求用户在请求中设置这些标头。
|
示例 1:允许用户创建存储桶,但仅在特定区域内创建
假定 AWS 账户管理员想要授予其用户 (Dave) 仅在 南美洲(圣保罗) 区域创建存储桶的权限。账户管理员可附加以下用户策略,授予附带条件的 s3:CreateBucket
权限,如下所示。Condition
块中的键值对指定 s3:LocationConstraint
键,以 sa-east-1
区域作为值。
注意
在该示例中,存储桶拥有者为其用户之一授予权限,因此可以使用存储桶策略或用户策略。此示例显示了用户策略。
有关 Amazon S3 区域的列表,请转至 Amazon Web Services 一般参考 中的区域和终端节点。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action":[ "s3:CreateBucket" ], "Resource":[ "arn:aws-cn:s3:::*" ], "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }
此策略限制用户只能在 sa-east-1
区域创建存储桶。但有可能别的策略授予了此用户在其他区域创建存储桶的权限。例如,如果用户属于一个组,该组可能被附加了一个策略,使得该组中的所有用户都有权在其他某个区域创建存储桶。要确保此用户不会获得在其他任何区域创建存储桶的权限,可在该策略中添加一个显式拒绝语句。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action":[ "s3:CreateBucket" ], "Resource":[ "arn:aws-cn:s3:::*" ], "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } }, { "Sid":"statement2", "Effect":"Deny", "Action":[ "s3:CreateBucket" ], "Resource":[ "arn:aws-cn:s3:::*" ], "Condition": { "StringNotLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }
Deny
语句使用 StringNotLike
条件。即,如果位置约束不是 "sa-east-1",则创建存储桶的请求将被拒绝。显式拒绝不允许用户在其他任何区域创建存储桶,无论该用户获得了哪种其他权限。
可使用以下 create-bucket
AWS CLI 命令测试此策略。此示例使用 bucketconfig.txt
文件来指定位置约束。记下此 Windows 文件路径。您需要更新相应的存储桶名称和路径。必须使用 --profile
参数提供用户凭证。有关设置和使用 AWS CLI 的更多信息,请参阅设置用于示例演练的工具。
aws s3api create-bucket --bucket
examplebucket
--profile AccountADave --create-bucket-configuration file://c:/Users/someUser/bucketconfig.txt
bucketconfig.txt
文件指定配置,如下所示:
{"LocationConstraint": "sa-east-1"}
示例 2:允许用户根据特定前缀获取存储桶中的对象的列表
存储桶拥有者可限定用户仅列出存储桶中特定文件夹的内容。如果存储桶中的对象按键名前缀组织,这非常有用。Amazon S3 控制台然后使用这些前缀显示文件夹的层级结构(仅控制台支持文件夹概念;Amazon S3 API 仅支持存储桶和对象)。
在该示例中,存储桶拥有者和用户所属的父账户相同。因此存储桶拥有者可使用存储桶策略或用户策略。首先,我们显示用户策略。
以下用户策略授予 s3:ListBucket
权限(请参阅 GET Bucket(列出对象)),条件为要求用户在请求中指定值为 projects
的 prefix
。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws-cn:s3:::
examplebucket
" ], "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws-cn:s3:::examplebucket
" ], "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }
此条件将用户限定于列出具有 projects
前缀的对象键。添加的显式拒绝将拒绝用户列出具有其他任何前缀的键,无论该用户可能具有其他什么权限。例如,该用户有可能获得列出没有任何限制的对象键的权限,例如通过更新先前用户策略或通过存储桶策略。但由于显式拒绝始终会取代其他任何权限,因此列出非
project
前缀的键的用户请求会被拒绝。
上述策略为用户策略。如果将 Principal
元素添加到该策略,从而标识用户,则现在您拥有了所示的存储桶策略。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Principal": { "AWS": "arn:aws-cn:iam::
BucketOwner-accountID
:user/user-name
" }, "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws-cn:s3:::examplebucket
" ], "Condition" : { "StringEquals" : { "s3:prefix": "examplefolder" } } }, { "Sid":"statement2", "Effect":"Deny", "Principal": { "AWS": "arn:aws-cn:iam::BucketOwner-AccountID
:user/user-name
" }, "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws-cn:s3:::examplebucket
" ], "Condition" : { "StringNotEquals" : { "s3:prefix": "examplefolder" } } } ] }
可使用以下 list-object
AWS CLI 命令测试此策略。在该命令中,使用 --profile
参数提供用户凭证。有关设置和使用 AWS CLI 的更多信息,请参阅设置用于示例演练的工具。
aws s3api list-objects --bucket
examplebucket
--prefix examplefolder --profile AccountADave
现在,如果该存储桶启用了版本控制,要列出该存储桶中的对象,必须在上述策略中授予 s3:ListBucket
权限,而不是 s3:ListBucketVersions
权限。此权限还支持 s3:prefix
条件键。