使用条件键的存储桶策略示例 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用条件键的存储桶策略示例

您可以使用访问策略语言在授予权限时指定条件。可以使用可选 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 --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountAadmin

示例 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:::amzn-s3-demo-source-bucket/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/prefix", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "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 amzn-s3-demo-source-bucket --key HappyFace.jpg --copy-source amzn-s3-demo-source-bucket/public/PublicHappyFace1.jpg --profile AccountADave
授予仅复制特定对象的权限

上述策略使用 StringNotLike 条件。要授予仅复制特定对象的权限,必须将条件从 StringNotLike 更改为 StringNotEquals,然后指定确切的对象键,如以下示例所示。要使用此示例命令,请将 user input placeholders 替换为您自己的信息。

"Condition": { "StringNotEquals": { "s3:x-amz-copy-source": "amzn-s3-demo-source-bucket/public/PublicHappyFace1.jpg" } }

示例 3:授予对特定对象版本的访问权限

假设账户 A 拥有启用版本控制的存储桶。该存储桶具有 HappyFace.jpg 对象的多个版本。账户 A 管理员现在想要向用户 Dave 授予仅获得特定对象版本的权限。账户管理员可以通过有条件地向用户 Dave 授予 s3:GetObjectVersion 权限来实现这一点,如以下示例所示。Condition 块中的键值对指定 s3:VersionId 条件键。在这种情况下,要从指定的启用版本控制的存储桶中检索对象,Dave 需要知道确切的对象版本 ID。要使用此示例策略,请将 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 amzn-s3-demo-bucket --key HappyFace.jpg OutputFile.jpg --version-id AaaHbAQitwiL_h47_44lRO2DDfLlBO5e --profile AccountADave

示例 4:基于对象标签授予权限

有关如何将对象标记条件键与 Amazon S3 操作结合使用的示例,请参阅标签和访问控制策略

示例 5:限制存储桶拥有者的 Amazon Web Services 账户 ID 的访问

可以使用 aws:ResourceAccounts3:ResourceAccount 条件键编写 IAM 或虚拟私有云(VPC)端点策略,以限制用户、角色或应用程序对特定 Amazon Web Services 账户 ID 所拥有的 Amazon S3 存储桶的访问权限。可以使用这些条件键来限制 VPC 内的客户端访问非您拥有的存储桶。

但请注意,有些 Amazon 服务依赖于访问 Amazon 托管式存储桶。因此,在 IAM 策略中使用 aws:ResourceAccounts3:ResourceAccount 键也可能会影响对这些资源的访问。有关更多信息,请参阅以下资源:

有关 aws:ResourceAccounts3: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:::amzn-s3-demo-bucket1", "arn:aws:s3:::amzn-s3-demo-bucket1/*" ], "Condition": { "NumericLessThan": { "s3:TlsVersion": 1.2 } } } ] }

以下示例存储桶策略支持 由 TLS 版本高于 1.1(例如 1.2、1.3 或更高版本)的客户端发出的 PutObject 请求:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket1", "arn:aws:s3:::amzn-s3-demo-bucket1/*" ], "Condition": { "NumericGreaterThan": { "s3:TlsVersion": 1.1 } } } ] }

示例 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 块中,IpAddressNotIpAddress 为条件,而每个条件均提供了一个键值对用于评估。此示例中的两个键值对均使用 aws:SourceIp Amazon 范围内的键。要使用此示例策略,请将 user input placeholders 替换为您自己的信息。

注意

Condition 块中指定的 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:::amzn-s3-demo-bucket/*", "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 全局条件键,仅支持某些资源类型。因此,请检查 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.jpgpublic/object2.jpg 的两个对象,则控制台会在 public 文件夹下显示这些对象。在 Amazon S3 API 中,这些是带有前缀的对象,而不是文件夹中的对象。有关使用前缀和分隔符筛选访问权限的更多信息,请参阅 使用用户策略控制对存储桶的访问

在以下场景中,存储桶拥有者和用户所属的父账户相同。因此,存储桶拥有者可以使用存储桶策略或用户策略来授予访问权限。有关可以与 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:::amzn-s3-demo-bucket", "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Condition" : { "StringNotEquals" : { "s3:prefix": "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:::amzn-s3-demo-bucket", "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/bucket-owner" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Condition" : { "StringNotEquals" : { "s3:prefix": "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 amzn-s3-demo-bucket --prefix projects --profile AccountA

示例 3:设置最大键数

可以使用 s3:max-keys 条件键来设置请求者可以在 ListObjectsV2ListObjectVersions 请求中返回的最大键数。默认情况下,这些 API 操作可返回最多 1000 个键。有关可与 s3:max-keys 一起使用的数字条件运算符的列表和相关示例,请参阅 IAM 用户指南中的数字条件运算符