使用条件键的存储桶策略示例
您可以使用访问策略语言在授予权限时指定条件。可以使用可选 Condition
元素或 Condition
块来指定策略何时生效的条件。
有关使用 Amazon S3 条件键进行对象和存储桶操作的策略,请参阅以下示例。有关条件键的更多信息,请参阅 Amazon S3 的策略条件键。有关您可以在策略中指定的 Amazon S3 操作、条件键和资源的完整列表,请参阅《Service Authorization Reference》中的 Actions, resources, and condition keys for Amazon S3。
有关按 S3 资源类型对 S3 API 操作的权限的更多信息,请参阅 Amazon S3 API 操作所需的权限。
示例:适用于对象操作的 Amazon S3 条件键
以下示例说明如何将特定于 Amazon S3 的条件键用于对象操作。有关您可以在策略中指定的 Amazon S3 操作、条件键和资源的完整列表,请参阅《Service Authorization Reference》中的 Actions, resources, and condition keys for Amazon S3。
有关按 S3 资源类型对 S3 API 操作的权限的更多信息,请参阅 Amazon S3 API 操作所需的权限。
几个示例策略展示如何将条件键与 PUT Object 操作结合使用。PUT Object 操作允许特定于访问控制列表 (ACL) 的标头,可用于授予基于 ACL 的权限。通过使用这些条件键,您可以设置条件,来要求用户上传对象时需具有特定的访问权限。您还可以通过 PutObjectAcl 操作授予基于 ACL 的权限。有关更多信息,请参阅 Amazon S3 Amazon Simple Storage Service API 参考中的 PutObjectAcl。有关 ACL 的更多信息,请参阅 访问控制列表 (ACL) 概述。
主题
示例 1:授予要求使用服务器端加密来存储对象的 s3:PutObject
权限
假设账户 A 拥有一个存储桶。账户管理员想要向账户 A 中的用户 Jane 授予上传对象的权限,条件是 Jane 始终请求具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3)。账户 A 管理员可使用所示的 s3:x-amz-server-side-encryption
条件键来指定此要求。以下 Condition
块中的键值对将 s3:x-amz-server-side-encryption
条件键和 SSE-S3 (AES256
) 指定为加密类型:
"Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" }}
使用 Amazon CLI 测试此权限时,必须使用 --server-side-encryption
参数添加所需的加密,如以下示例所示。要使用此示例命令,请将
替换为您自己的信息。user input
placeholders
aws s3api put-object --bucket
amzn-s3-demo-bucket
--keyHappyFace.jpg
--bodyc:\HappyFace.jpg
--server-side-encryption "AES256
" --profileAccountAadmin
示例 2:授予复制对象的 s3:PutObject
权限,但对复制源有限制
在 PUT
对象请求中,如果指定了源对象,则请求为复制操作(请参阅 CopyObject)。因此,存储桶拥有者可以为用户授予权限以复制具有源限制的对象,例如:
-
只支持从指定的源存储桶(例如
)复制对象。amzn-s3-demo-source-bucket
-
支持从指定的源存储桶复制对象,并仅复制其键名称前缀以特定前缀(如
)开头的对象(例如public/
)。amzn-s3-demo-source-bucket
/public/*
-
只支持从源存储桶(例如
)复制特定的对象。amzn-s3-demo-source-bucket
/example.jpg
以下存储桶策略向用户 (
) 授予 Dave
s3:PutObject
权限。此策略支持该用户仅复制满足以下条件的对象:请求包含 s3:x-amz-copy-source
标头,并且标头值指定 /
键名称前缀。要使用此示例策略,请将 amzn-s3-demo-source-bucket
/public/*
替换为您自己的信息。user
input placeholders
{ "Version": "2012-10-17", "Statement": [ { "Sid": "cross-account permission to user in your own account", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:user/Dave
" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/prefix", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::
amzn-s3-demo-source-bucket
123456789012
:user/Dave
" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "
amzn-s3-demo-source-bucket
amzn-s3-demo-source-bucket
/public/*
" } } } ] }
使用 Amazon CLI 测试策略
可使用 Amazon CLI copy-object
命令测试此权限。可通过添加 --copy-source
参数指定源;键名称前缀必须与策略中允许的前缀相匹配。您需要使用 --profile
参数为用户 Dave 提供凭证。有关设置 Amazon CLI 的更多信息,请参阅《Amazon S3 API 参考》中的 Developing with Amazon S3 using the Amazon CLI。
aws s3api copy-object --bucket
--key
amzn-s3-demo-source-bucket
HappyFace.jpg
--copy-source
amzn-s3-demo-source-bucket
/public/PublicHappyFace1.jpg
--profileAccountADave
授予仅复制特定对象的权限
上述策略使用 StringNotLike
条件。要授予仅复制特定对象的权限,必须将条件从 StringNotLike
更改为 StringNotEquals
,然后指定确切的对象键,如以下示例所示。要使用此示例命令,请将
替换为您自己的信息。user input
placeholders
"Condition": { "StringNotEquals": { "s3:x-amz-copy-source": "
amzn-s3-demo-source-bucket
/public/PublicHappyFace1.jpg
" } }
示例 3:授予对特定对象版本的访问权限
假设账户 A 拥有启用版本控制的存储桶。该存储桶具有
对象的多个版本。账户 A 管理员现在想要向用户 HappyFace.jpg
授予仅获得特定对象版本的权限。账户管理员可以通过有条件地向用户 Dave
授予 Dave
s3:GetObjectVersion
权限来实现这一点,如以下示例所示。Condition
块中的键值对指定 s3:VersionId
条件键。在这种情况下,要从指定的启用版本控制的存储桶中检索对象,
需要知道确切的对象版本 ID。要使用此示例策略,请将 Dave
替换为您自己的信息。user input
placeholders
有关更多信息,请参阅《Amazon Simple Storage Service API 参考》中的 GetObject。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:user/Dave
" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::
amzn-s3-demo-bucket
/HappyFace.jpg
" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012
:user/Dave
" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::
amzn-s3-demo-bucket
/HappyFace.jpg
", "Condition": { "StringNotEquals": { "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e
" } } } ] }
使用 Amazon CLI 测试策略
可以使用 Amazon CLI get-object
命令以及 --version-id
参数(标识要检索的特定对象版本)来测试此策略中的权限。此命令会检索该对象的指定版本,并将其保存到
文件。OutputFile.jpg
aws s3api get-object --bucket
--key
amzn-s3-demo-bucket
HappyFace.jpg
OutputFile.jpg
--version-idAaaHbAQitwiL_h47_44lRO2DDfLlBO5e
--profileAccountADave
示例 4:基于对象标签授予权限
有关如何将对象标记条件键与 Amazon S3 操作结合使用的示例,请参阅标签和访问控制策略。
示例 5:限制存储桶拥有者的 Amazon Web Services 账户 ID 的访问
可以使用 aws:ResourceAccount
或 s3:ResourceAccount
条件键编写 IAM 或虚拟私有云(VPC)端点策略,以限制用户、角色或应用程序对特定 Amazon Web Services 账户 ID 所拥有的 Amazon S3 存储桶的访问权限。可以使用这些条件键来限制 VPC 内的客户端访问非您拥有的存储桶。
但请注意,有些 Amazon 服务依赖于访问 Amazon 托管式存储桶。因此,在 IAM 策略中使用 aws:ResourceAccount
或 s3:ResourceAccount
键也可能会影响对这些资源的访问。有关更多信息,请参阅以下资源:
-
《Amazon PrivateLink 指南》中的限制对指定 Amazon Web Services 账户中存储桶的访问
-
《Amazon ECR 指南》中的限制对 Amazon ECR 使用的存储桶的访问
-
Amazon 指南中的为 Amazon Systems Manager 托管式 Amazon S3 存储桶提供对 Systems Manager 的所需访问权限
有关 aws:ResourceAccount
和 s3:ResourceAccount
条件键的更多信息以及演示如何使用它们的示例,请参阅 Amazon 存储博客 中的 Limit access to Amazon S3 buckets owned by specific Amazon Web Services 账户
示例 6:要求最低 TLS 版本
可以使用 s3:TlsVersion
条件键来编写 IAM 策略、虚拟私有云端点(VPCE)策略或存储桶策略,以便根据客户端使用的 TLS 版本,限制用户或应用程序对 Amazon S3 存储桶的访问权限。您可以使用此条件键来编写要求最低 TLS 版本的策略。
以下示例存储桶策略拒绝 由 TLS 版本低于 1.2(例如 1.1 或 1.0)的客户端发出的 PutObject
请求。要使用此示例策略,请将
替换为您自己的信息。user input placeholders
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::
", "arn:aws:s3:::
amzn-s3-demo-bucket1
/*" ], "Condition": { "NumericLessThan": { "s3:TlsVersion": 1.2 } } } ] }
amzn-s3-demo-bucket1
以下示例存储桶策略支持 由 TLS 版本高于 1.1(例如 1.2、1.3 或更高版本)的客户端发出的 PutObject
请求:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::
", "arn:aws:s3:::
amzn-s3-demo-bucket1
/*" ], "Condition": { "NumericGreaterThan": { "s3:TlsVersion": 1.1 } } } ] }
amzn-s3-demo-bucket1
示例 7:从 Deny
语句中排除特定主体
以下存储桶策略拒绝 s3:GetObject
访问
,但账号为 amzn-s3-demo-bucket
的主体除外。要使用此示例策略,请将 123456789012
替换为您自己的信息。user input
placeholders
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyAccessFromPrincipalNotInSpecificAccount", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Effect": "Deny", "Resource": [ "arn:aws:s3:::
amzn-s3-demo-bucket
/*" ], "Condition": { "StringNotEquals": { "aws:PrincipalAccount": [ "" ] } } } ] }
123456789012
示例:适用于存储桶操作的 Amazon S3 条件键
以下示例策略显示了如何将 Amazon S3 特定的条件键用于存储桶操作。
示例 1:授予 s3:GetObject
权限,但对 IP 地址指定了条件
如果请求源自特定的 IP 地址范围(例如
),则可以向经过身份验证的用户授予使用 192.0.2.*
s3:GetObject
操作的权限,除非此 IP 地址是您要排除的 IP 地址(例如
)。在 192.0.2.188
Condition
块中,IpAddress
和 NotIpAddress
为条件,而每个条件均提供了一个键值对用于评估。此示例中的两个键值对均使用 aws:SourceIp
Amazon 范围内的键。要使用此示例策略,请将
替换为您自己的信息。user input placeholders
注意
在 Condition
块中指定的 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:s3:::
/*", "Condition" : { "IpAddress" : { "aws:SourceIp": "
amzn-s3-demo-bucket
192.0.2.0/24
" }, "NotIpAddress" : { "aws:SourceIp": "192.0.2.188/32
" } } } ] }
您还可以在 Amazon S3 策略中使用其他 Amazon 范围的条件键。例如,您可以在适用于 VPC 端点的存储桶策略中指定 aws:SourceVpce
和 aws:SourceVpc
条件键。有关特定示例,请参阅使用存储桶策略控制从 VPC 端点的访问。
注意
对于某些 Amazon 全局条件键,仅支持某些资源类型。因此,请检查 Amazon S3 是否支持您要使用的全局条件键和资源类型,或者是否需要改用 Amazon S3 特定的条件键。有关 Amazon S3 的受支持资源类型和条件键的完整列表,请参阅《Service Authorization Reference》中的 Actions, resources, and condition keys for Amazon S3。
有关按 S3 资源类型对 S3 API 操作的权限的更多信息,请参阅 Amazon S3 API 操作所需的权限。
示例 2:获取存储桶中具有特定前缀的对象列表
可以使用 s3:prefix
条件键将 ListObjectsV2 API 操作的响应限制为具有特定前缀的键名称。如果您是存储桶拥有者,则可以使用此条件键来限定用户仅列出存储桶中特定前缀的内容。如果存储桶中的对象是按键名称前缀整理的,则 s3:prefix
条件键很有用。
Amazon S3 控制台使用键名前缀来显示文件夹概念。只有控制台支持文件夹的概念;Amazon S3 API 仅支持存储桶和对象。例如,如果您有键名称为
和 public/object1.jpg
的两个对象,则控制台会在 public/object2.jpg
文件夹下显示这些对象。在 Amazon S3 API 中,这些是带有前缀的对象,而不是文件夹中的对象。有关使用前缀和分隔符筛选访问权限的更多信息,请参阅 使用用户策略控制对存储桶的访问。public
在以下场景中,存储桶拥有者和用户所属的父账户相同。因此,存储桶拥有者可以使用存储桶策略或用户策略来授予访问权限。有关可以与 ListObjectsV2
API 操作结合使用的其它条件键的更多信息,请参阅 ListObjectsV2。
注意
如果该存储桶启用了版本控制,要列出该存储桶中的对象,必须在以下策略中授予 s3:ListBucketVersions
权限,而不是 s3:ListBucket
权限。s3:ListBucketVersions
权限还支持 s3:prefix
条件键。
用户策略
以下用户策略通过一条 Condition
语句来授予 s3:ListBucket
权限(请参阅 ListObjectsV2),该语句要求用户在请求中指定值为
的前缀。要使用此示例策略,请将 projects
替换为您自己的信息。user input placeholders
{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:ListBucket", "Resource":"arn:aws:s3:::
", "Condition" : { "StringEquals" : { "s3:prefix": "
amzn-s3-demo-bucket
projects
" } } }, { "Sid":"statement2", "Effect":"Deny", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::", "Condition" : { "StringNotEquals" : { "s3:prefix": "
amzn-s3-demo-bucket
projects
" } } } ] }
Condition
语句限制用户只列出带有
前缀的对象键。添加的显式 projects
Deny
语句将拒绝用户列出具有其它任何前缀的键,无论该用户可能具有哪些其它权限。例如,通过更新先前的用户策略或通过存储桶策略,该用户可能能够获得列出对象键而无任何限制的权限。由于显式 Deny
语句始终覆盖 Allow
语句,因此,如果用户尝试列出除带有
前缀的键以外的其它键,则请求将被拒绝。projects
存储桶策略
如果将 Principal
元素添加到上述的用户策略,确定用户,则现在您就拥有了存储桶策略,如以下示例所示。要使用此示例策略,请将
替换为您自己的信息。user input
placeholders
{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:user/bucket-owner
" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::", "Condition" : { "StringEquals" : { "s3:prefix": "
amzn-s3-demo-bucket
projects
" } } }, { "Sid":"statement2", "Effect":"Deny", "Principal": { "AWS": "arn:aws:iam::123456789012
:user/bucket-owner
" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::", "Condition" : { "StringNotEquals" : { "s3:prefix": "
amzn-s3-demo-bucket
projects
" } } } ] }
使用 Amazon CLI 测试策略
可使用以下 list-object
Amazon CLI 命令测试此策略。在该命令中,使用 --profile
参数提供用户凭证。有关设置和使用 Amazon CLI 的更多信息,请参阅《Amazon S3 API 参考》中的 Developing with Amazon S3 using the Amazon CLI。
aws s3api list-objects --bucket
--prefix
amzn-s3-demo-bucket
projects
--profileAccountA
示例 3:设置最大键数
可以使用 s3:max-keys
条件键来设置请求者可以在 ListObjectsV2 或 ListObjectVersions 请求中返回的最大键数。默认情况下,这些 API 操作可返回最多 1000 个键。有关可与 s3:max-keys
一起使用的数字条件运算符的列表和相关示例,请参阅 IAM 用户指南中的数字条件运算符。