使用条件键的存储桶策略示例 - Amazon Simple Storage Service

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

您可以使用访问策略语言在授予权限时指定条件。您可以使用可选 Condition 元素或 Condition 块来指定策略生效的条件。

有关使用 Amazon S3 条件键进行对象和存储桶操作的策略,请参阅以下示例。有关条件键的更多信息,请参阅 Amazon S3 的策略条件键。有关您可以在策略中指定的 Amazon S3 操作、条件键和资源的完整列表,请参阅《Service Authorization Reference》中的 Actions, resources, and condition keys for Amazon S3

示例 — 针对对象操作的 Amazon S3 条件键

本节提供示例,说明如何将特定于 Amazon S3 的条件键用于对象操作。有关您可以在策略中指定的 Amazon S3 操作、条件键和资源的完整列表,请参阅《Service Authorization Reference》中的 Actions, resources, and condition keys for Amazon S3

几个示例策略展示如何将条件键与 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 保存加密的对象。账户 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

示例 2:授予从限定复制源复制对象的 s3:PutObject 权限

在 PUT 对象请求中,如果指定了源对象,则为一个复制操作(请参阅 PUT 对象 - 复制)。因此,存储桶拥有者可以为用户授予权限以复制具有源限制的对象,例如:

  • 允许仅从 sourcebucket 存储桶复制对象。

  • 允许从源存储桶复制对象,并仅复制键名称前缀开头为 public/ 的对象(例如 sourcebucket/public/*)。

  • 仅允许从源存储桶复制特定对象(例如,sourcebucket/example.jpg)。

以下存储桶策略为用户(Dave)授予 s3:PutObject 权限。该权限允许用户仅复制满足以下条件的对象:请求包含 s3:x-amz-copy-source 标头,并且标头值指定 /awsexamplebucket1/public/* 键名称前缀。

{ "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:::awsexamplebucket1/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/folder", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "awsexamplebucket1/public/*" } } } ] }
使用 AWS CLI 测试策略

可使用 AWS CLI copy-object 命令测试此权限。可通过添加 --copy-source 参数指定源;键名称前缀必须与策略中允许的前缀相匹配。您需要使用 --profile 参数为用户 Dave 提供凭证。有关设置 AWS CLI 的更多信息,请参阅 使用 AWS CLI 进行 Amazon S3 开发

aws s3api copy-object --bucket awsexamplebucket1 --key HappyFace.jpg --copy-source examplebucket/public/PublicHappyFace1.jpg --profile AccountADave
授予仅复制特定对象的权限

上述策略使用 StringNotLike 条件。要授予仅复制特定对象的权限,您必须将条件从 StringNotLike 更改为 StringNotEquals,然后指定所示的对象键。

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

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

假设账户 A 拥有启用版本控制的存储桶。该存储桶具有 HappyFace.jpg 对象的多个版本。账户管理员现在想要授予用户 Dave 仅获得特定对象版本的权限。账户管理员可通过有条件地授予 Dave 下面所示的 s3:GetObjectVersion 权限来实现这一点。Condition 块中的键值对指定 s3:VersionId 条件键。在这种情况下,Dave 需要知道确切的对象版本 ID 才能检索该对象。

有关更多信息,请参阅 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:::examplebucketversionenabled/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg", "Condition": { "StringNotEquals": { "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e" } } } ] }
使用 AWS CLI 测试策略

可使用 AWS CLI get-object 命令以及标识特定对象版本的 --version-id 参数来测试这些权限。此命令会检索该对象,并将其保存到 OutputFile.jpg 文件。

aws s3api get-object --bucket examplebucketversionenabled --key HappyFace.jpg OutputFile.jpg --version-id AaaHbAQitwiL_h47_44lRO2DDfLlBO5e --profile AccountADave

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

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

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

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

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

有关更多信息和示例,请参阅以下资源:

示例 6:要求最低 TLS 版本

您可以使用 s3:TlsVersion 条件键来编写 IAM、Virtual Private Cloud 端点(VPCE)或存储桶策略,以根据客户端使用的 TLS 版本限制用户或应用程序对 Amazon S3 存储桶的访问。您可以使用此条件键来编写要求最低 TLS 版本的策略。

此示例存储桶策略拒绝 TLS 版本低于 1.2 的客户端(例如 1.1 或 1.0)发出的 PutObject 请求。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1", "arn:aws:s3:::DOC-EXAMPLE-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:::DOC-EXAMPLE-BUCKET1", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" ], "Condition": { "NumericGreaterThan": { "s3:TlsVersion": 1.1 } } } ] }

示例 — 针对存储桶操作的 Amazon S3 条件键

本节提供示例策略,说明如何将特定于 Amazon S3 的条件键用于存储桶操作。

示例 1:授予 s3:GetObject 权限,指定了 IP 地址的条件

如果请求源自特定 IP 地址范围(192.0.2.*),则您可以为已经过身份验证的用户授予使用 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 端点的访问

注意

对于某些 AWS 全局条件键,仅支持某些资源类型。因此,请检查 Amazon S3 是否支持您要使用的全局条件键和资源类型,或者是否需要改用 Amazon S3 特定的条件键。有关 Amazon S3 的受支持资源类型和条件键的完整列表,请参阅《Service Authorization Reference》中的 Actions, resources, and condition keys for Amazon S3

示例 2:获取存储桶中具有特定前缀的对象列表

您可以使用 s3:prefix 条件键将 GET Bucket (ListObjects) API 的响应限制为具有特定前缀的键名。如果您是存储桶拥有者,您可限定用户仅列出存储桶中特定前缀的内容。如果存储桶中的对象按键名前缀组织,此条件键非常有用。Amazon S3 控制台使用键名前缀来显示文件夹概念。只有控制台支持文件夹的概念;Amazon S3 API 仅支持存储桶和对象。有关使用前缀和分隔符筛选访问权限的更多信息,请参阅 使用用户策略控制对存储桶的访问

例如,如果您有键名为 public/object1.jpgpublic/object2.jpg 的两个对象,则该控制台会在 public 文件夹下显示这些对象。在 Amazon S3 API 中,这些是带有前缀的对象,而不是文件夹中的对象。但是,在 Amazon S3 API 中,如果使用这些前缀组织对象键,则可授予 s3:ListBucket 权限,s3:prefix 条件为允许用户获得具有这些特定前缀的键名的列表。

在该示例中,存储桶拥有者和用户所属的父账户相同。因此存储桶拥有者可使用存储桶策略或用户策略。有关可与 GET Bucket (ListObjects) API 一起使用的其他条件键的更多信息,请参阅 ListObjects

用户策略

以下用户策略授予 s3:ListBucket 权限(请参阅 GET Bucket (List Objects)),条件为要求用户在请求中指定值为 prefixprojects

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:ListBucket", "Resource":"arn:aws:s3:::awsexamplebucket1", "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::awsexamplebucket1", "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }

此条件将用户限定于列出具有 projects 前缀的对象键。添加的显式拒绝将拒绝用户列出具有其他任何前缀的键,无论该用户可能具有其他什么权限。例如,通过更新先前用户策略或通过存储桶策略,该用户有可能获得列出没有任何限制的对象键的权限。由于显式拒绝始终优先于其他任何权限,因此列出非 projects 前缀的键的用户请求会被拒绝。

存储桶策略

如果将 Principal 元素添加到上述的用户策略,标识用户,则现在您拥有了所示的存储桶策略。

{ "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:::awsexamplebucket1", "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:::awsexamplebucket1", "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }
使用 AWS CLI 测试策略

可使用以下 list-object AWS CLI 命令测试此策略。在该命令中,使用 --profile 参数提供用户凭证。有关设置和使用 AWS CLI 的更多信息,请参阅 使用 AWS CLI 进行 Amazon S3 开发

aws s3api list-objects --bucket awsexamplebucket1 --prefix examplefolder --profile AccountADave

如果该存储桶启用了版本控制,要列出该存储桶中的对象,必须在上述策略中授予 s3:ListBucketVersions 权限,而不是 s3:ListBucket 权限。此权限还支持 s3:prefix 条件键。

示例 3:设置最大键数

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