Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

在策略中指定条件

访问策略语言可使您在授予权限时指定条件。在 Condition 元素 (或 Condition 块) 中,可以指定策略生效的条件。在可选的 Condition 元素中,您创建的表达式应使用布尔值运算符 (等于、小于等),以使您指定的条件与请求中的值相匹配。例如,当授予用户上传对象的权限时,存储桶拥有者可通过添加 StringEquals 条件要求此对象可公开读取,如下所示:

Copy
{ "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 块指定应用于指定的键值对 "s3:x-amz-acl":["public-read"]StringEquals 条件。有一组预定义键可用于表达条件。此示例使用 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:sourceVpceaws:sourceVpc 在 VPC 终端节点的存储桶策略中使用。有关使用这些条件键的示例,请参阅 Amazon S3 的 VPC 终端节点的示例存储桶策略

    以下示例存储桶策略允许当请求来自特定 IP 地址范围 (192.168.143.*) 时,经过身份验证的用户有权使用 s3:GetObject 操作,除非此 IP 地址为 192.168.143.188。在条件块中,IpAddressNotIpAddress 为条件,每个条件均提供一个键-值对用于评估。此示例中的两个键-值对均使用 aws:SourceIp AWS 范围内的键。

    注意

    请注意,在条件中指定的 IPAddressNotIpAddress 键值使用 RFC 4632 中描述的 CIDR 表示法。有关详细信息,请转到 http://www.rfc-editor.org/rfc/rfc4632.txt

    Copy
    { "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>

     

    例如,如果请求包含可使对象公开可读的 x-amz-acl 标头,则以下存储桶策略允许两个 AWS 账户具有 s3:PutObject 权限。

    Copy
    { "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 Object API 支持的 x-amz-acl 请求标头的行为。

    • 条件键 s3:VersionId 可用于对 s3:GetObjectVersion 权限授予条件权限,它定义您在 GET Object 请求中设置的查询参数 versionId 的行为。

许可 适用的条件键 (或关键字) 描述

s3:PutObject

  • s3:x-amz-acl (针对标准 ACL 权限)

  • s3:x-amz-grant-permission (针对显式权限),其中 permission 可以是:

    read, write,​ read-acp,​ write​-acp,​ ​full​-control

PUT Object 操作允许在授予基于 ACL 的权限时可使用的访问控制列表 (ACL) 特定标头。通过使用这些键,存储桶拥有者可设置条件,要求用户上传对象时需具有特定访问权限。

有关策略示例,请参阅示例 1:授予 s3:PutObject 权限,指定了要求存储桶拥有者获得完全控制的条件

有关 ACL 的更多信息,请参阅 访问控制列表 (ACL) 概述

s3:x-amz-copy-source

要复制对象,请使用 PUT Object API (请参阅 PUT Object) 并使用 x-amz-copy-source 标头指定源。通过使用此键,存储桶拥有者可将复制源限定到特定存储桶、存储桶中的特定文件夹,或者存储桶中的特定对象。

有关策略示例,请参阅示例 3:授予从限定复制源复制对象的 s3:PutObject 权限

s3:x-amz-server-side-encryption

上传对象时,可以使用 x-amz-server-side-encryption 标头请求 Amazon S3 在保存对象时使用 AWS 密钥管理服务 (KMS) 或 Amazon S3 托管的信封加密密钥加密对象 (请参阅使用服务器端加密保护数据)。

当授予 s3:PutObject 权限时,存储桶拥有者可使用此键添加条件,要求用户在请求中指定此标头。存储桶拥有者可通过授予此类条件权限,确保在保存用户上传的对象时进行加密。

有关策略示例,请参阅示例 1:授予 s3:PutObject 权限,指定了要求存储桶拥有者获得完全控制的条件

s3:x-amz-server-side-encryption-aws-kms-key-id

在上传对象时,可以使用 x-amz-server-side-encryption-aws-kms-key-id 标头请求 Amazon S3 使用指定的 AWS KMS 密钥加密对象 (参阅使用具有 AWS KMS 托管密钥的服务器端加密 (SSE-KMS) 保护数据)。

在授予 s3:PutObject 权限时,存储桶拥有者可以使用此键添加一个条件,将用于对象加密的 AWS KMS 密钥 ID 限制为特定值。

存储桶拥有者可通过授予此类条件权限,确保在保存用户上传的对象时使用特定密钥进行加密。

您在策略中指定的 KMS 密钥必须使用以下格式:

arn:aws-cn:kms:region:acct-id:key/key-id

s3:x-amz-metadata-directive

在使用 PUT Object API 复制对象时 (请参阅 PUT Object),可以选择添加 x-amz-metadata-directive 标头,以便指定您是要从源对象复制对象元数据,还是要将该对象元数据替换为在请求中提供的元数据。

通过使用此键值存储桶,拥有者可添加在上传对象时将执行某种行为的条件。

有效值:COPY | REPLACE。默认为 COPY

s3:x-amz-storage-class

默认情况下,s3:PutObject 使用 STANDARD 存储类存储对象,但您可以使用 x-amz-storage-class 请求标头指定其他存储类。

在授予 s3:PutObject 权限时,您可以使用 s3:x-amz-storage-class 条件键限制存储上传对象时使用的存储类。有关存储类的更多信息,请参阅存储类

有关策略示例,请参阅示例 5:将上传对象限制为具有特定存储类的对象

有效值:STANDARD | STANDARD_IA | REDUCED_REDUNDANCY。默认为 STANDARD

  • s3:RequestObjectTagKeys

  • s3:RequestObjectTag/<tag-key>

通过使用此条件键,您可以通过限制请求中允许使用的对象标签来限制s3:PutObject 操作的权限。有关使用这些条件键的示例,请参阅 对象标签和访问控制策略

s3:PutObjectAcl

  • s3:x-amz-acl (针对标准 ACL 权限)

  • s3:x-amz-grant-permission (针对显式权限),其中 permission 可以是:

    read, write,​ read-acp,​ write​-acp,​ ​grant-full​-control

PUT Object ACL API 在特定对象上设置访问控制列表 (ACL)。此操作支持与 ACL 相关的标头。当授予此权限时,存储桶拥有者可使用这些键添加将要求某些权限的条件。有关 ACL 的更多信息,请参阅 访问控制列表 (ACL) 概述

例如,无论谁应有此对象,存储桶拥有者都可能需要保持对此对象的控制。要实现这一点,存储桶拥有者可使用其中一个键添加条件,要求用户包含对存储桶拥有者的特定权限。

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将s3:PutObjectAcl 的操作权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:PutObjectTagging

  • s3:RequestObjectTagKeys

  • s3:RequestObjectTag/<tag-key>

通过使用此条件键,您可以通过限制请求中允许使用的对象标签来限制 s3:PutObjectTagging 操作的权限。有关使用这些条件键的示例,请参阅 对象标签和访问控制策略

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:PutObjectVersionTagging

  • s3:RequestObjectTagKeys

  • s3:RequestObjectTag/<tag-key>

通过使用此条件键,您可以通过限制请求中允许使用的对象标签来限制 s3:PutObjectVersionTagging 操作的权限。有关使用这些条件键的示例,请参阅 对象标签和访问控制策略

s3:VersionId

通过使用此条件键,您可以将s3:PutObjectVersionTagging 的操作权限限制在特定对象版本上。有关策略示例,请参阅示例 4:授予对特定对象版本的访问权限

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:GetObjectVersion

s3:VersionId

该 Amazon S3 权限使用户能够执行一组 Amazon S3 API 操作 (请参阅对象操作的 Amazon S3 权限)。对于启用了版本控制的存储桶,可指定检索数据所针对的对象版本。

通过使用此键添加条件,存储桶拥有者可将用户限定于仅访问特定对象版本的数据。有关策略示例,请参阅示例 4:授予对特定对象版本的访问权限

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:GetObject

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:GetObjectAcl

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:GetObjectVersionAcl

s3:VersionId

您可以使用 GET Object acl API 来检索特定对象版本的访问控制列表 (ACL)。用户必须具有执行 s3:GetObjectVersionAcl 操作的权限。对于启用了版本控制的存储桶,该 Amazon S3 权限使用户能够获得针对特定对象版本的 ACL。

存储桶拥有者可使用此键值添加条件,将用户限定于对象的特定版本。

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:PutObjectVersionAcl

s3:VersionId

对于启用了版本控制的存储桶,可在 PUT Object acl 请求中指定对象版本,以针对特定对象版本设置 ACL。通过使用此条件,存储桶拥有者可将用户限定于仅针对特定对象版本设置 ACL。

  • s3:x-amz-acl (针对标准 ACL 权限)

  • s3:x-amz-grant-permission (针对显式权限),其中 permission 可以是:

    read, write,​ read-acp,​ write​-acp,​ ​grant-full​-control

对于启用了版本控制的存储桶,此 Amazon S3 权限使您能够针对特定对象版本设置 ACL。

有关这些条件键的描述,请参阅本表中的 s3:PutObjectACL 权限。

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:DeleteObjectVersion

s3:VersionId

对于启用了版本控制的存储桶,该 Amazon S3 权限使用户能够删除对象的特定版本。

存储桶拥有者可使用此键值添加条件,限制用户仅删除对象的特定版本的能力。

有关使用此条件键的示例,请参阅示例 4:授予对特定对象版本的访问权限。该示例授权 s3:GetObjectVersion 操作,但是,该策略演示此条件键的使用。

s3:DeleteObjectTagging

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:DeleteObjectVersionTagging

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:VersionId

通过使用此条件键,您可以将 s3:DeleteObjectVersionTagging 操作的权限限制在特定对象版本上。有关策略示例,请参阅示例 4:授予对特定对象版本的访问权限

s3:GetObjectTagging

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:GetObjectVersionTagging

s3:ExistingObjectTag/<tag-key>

通过使用此条件键,您可以将权限限制在有特定标签键和值的对象上。有关示例,请参阅 对象标签和访问控制策略

s3:VersionId

通过使用此条件键,您可以将 s3:GetObjectVersionTagging 操作的权限限制在特定对象版本上。有关策略示例,请参阅示例 4:授予对特定对象版本的访问权限

示例 1:授予 s3:PutObject 权限,指定了要求存储桶拥有者获得完全控制的条件

假设账户 A 拥有一个存储桶,而账户管理员想要授予账户 B 中的用户 Dave 上传对象的权限。默认情况下,Dave 上传的对象由账户 B 拥有,而账户 A 对这些对象没有权限。由于存储桶拥有者要支付账单,需要对 Dave 上传的对象具有全部权限。要实现这一点,账户 A 管理员可向 Dave 授予 s3:PutObject 权限,指定的条件要求请求包含 ACL 特定标头以及显式授予全部权限或使用标准 ACL (请参阅 PUT Object)。

  • 要求在请求中具有 x-amz-full-control 标头,授予存储桶拥有者完全控制权限。

    以下存储桶策略向用户 Dave 授予 s3:PutObject 权限,使用 s3:x-amz-grant-full-control 条件键指定了条件,要求此请求包含 x-amz-full-control 标头。

    Copy
    { "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 的请求没有包含必要标头向存储桶拥有者授予全部权限,则我们显式拒绝他的上传权限。显式拒绝始终取代授予的其他任何权限。以下是修订的访问策略示例。

    Copy
    { "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 CLI 测试此策略。使用 Dave 的凭证附加此策略,通过以下 AWS CLI put-object 命令测试权限。通过添加 --profile 参数提供 Dave 的凭证。通过添加 --grant-full-control 参数可向存储桶拥有者授予完全控制权限。有关设置和使用 AWS CLI 的更多信息,请参阅 设置用于示例演练的工具

    Copy
    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 条件键,如下所示。

    Copy
    "Condition": { "StringNotEquals": { "s3:x-amz-acl": "bucket-owner-full-control" }

    要使用 AWS CLI 测试权限,则指定 --acl 参数。然后 AWS CLI 在其发送此请求时添加 x-amz-acl 标头。

    Copy
    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 键。

Copy
"Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" }

当使用 AWS CLI 测试此权限时,需要使用 --server-side-encryption 参数添加所需的参数。

Copy
aws s3api put-object --bucket example1bucket --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountBadmin

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

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

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

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

  • 允许从 sourcebucket 仅复制特定对象。例如:sourcebucket/example.jpg

以下存储桶策略授予用户 Dave s3:PutObject 权限,此权限要求他复制对象时需满足以下条件:请求中包含 s3:x-amz-copy-source 标头且标头值指定 /examplebucket/public/* 键名称前缀。

Copy
{ "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 的更多信息,请参阅设置用于示例演练的工具

Copy
aws s3api copy-object --bucket examplebucket --key HappyFace.jpg --copy-source examplebucket/public/PublicHappyFace1.jpg --profile AccountADave

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

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

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

假设账户 A 拥有启用版本控制的存储桶。该存储桶具有 HappyFace.jpg 对象的多个版本。账户管理员现在想要授予用户 (Dave) 仅获得特定对象版本的权限。账户管理员可通过有条件地授予 Dave 所示的 s3:GetObjectVersion 权限来实现这一点。Condition 块中的键值对指定 s3:VersionId 条件键。

Copy
{ "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 文件。

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

示例 5:将上传对象限制为具有特定存储类的对象

假设账户 A 拥有一个存储桶,而账户管理员想要限制 Dave (账户 A 中的一名用户) 只能将使用 STANDARD_IA 存储类存储的对象上传到此存储桶。账户 A 管理员可以借助 s3:x-amz-storage-class 条件键达到这一目的,如下面的示例存储桶策略所示。

Copy
{ "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 条件键

下表显示了可在策略中授予的存储桶操作特定权限列表,并且对于其中的每个权限,该表还显示了可用于指定条件的可用键。

许可 适用的条件键 描述

s3:CreateBucket

  • s3:x-amz-acl (针对标准 ACL 权限)

  • s3:x-amz-grant-permission (针对显式权限),其中 permission 可以是:

    read, write,​ read-acp,​ write​-acp,​ ​full​-control

创建存储桶 API (请参阅 PUT Bucket) 支持 ACL 特定的标头。通过使用这些条件键,可要求用户在授予特定权限的请求中设置这些标头。

s3:LocationConstraint

通过使用此条件键,可将用户限定于在特定区域创建存储桶。有关策略示例,请参阅示例 1:允许用户创建存储桶,但仅在特定区域内创建

s3:ListBucket

s3:prefix

通过使用此条件键,可将 Get Bucket (列出对象) API 的响应 (请参阅 GET Bucket (列出对象) ) 限定于具有特定前缀的键名称。

Get Bucket (列出对象) API 会返回指定存储桶中的对象键列表。此 API 支持 prefix 标头,仅检索具有特定前缀的对象键。此条件键与 prefix 标头相关。

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

有关策略示例,请参阅示例 2:允许用户根据特定前缀获取存储桶中的对象的列表

s3:delimiter

如果使用前缀和分隔符组织对象键名称,则可使用此条件键来要求用户在 Get Bucket (列出对象) 请求中指定 delimiter 参数。在这种情况下,Amazon S3 响应返回的对象键列表将按通用前缀分组。有关使用前缀和分隔符的示例,请参阅 Get Bucket (列出对象)

s3:max-keys

通过使用此条件,要求用户指定 max-keys 参数可限制 Amazon S3 响应 Get Bucket (List Objects) 请求所返回的键数。默认情况下,API 返回最多 1000 个键名称。

有关可使用的数字条件的列表,请参阅 IAM 用户指南 中的数字条件运算符

s3:ListBucketVersions

s3:prefix

如果您的存储桶启用了版本控制,则可使用 GET Bucket Object versions API (请参阅 GET Bucket Object versions) 来检索所有对象版本的元数据。对于此 API,存储桶拥有者必须在策略中授予 s3:ListBucketVersions 权限。

使用此条件键,可要求用户在请求中指定具有特定值的 prefix 参数,将 API 的响应限定于具有特定前缀的键名称。

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

有关策略示例,请参阅示例 2:允许用户根据特定前缀获取存储桶中的对象的列表

s3:delimiter

如果使用前缀和分隔符组织对象键名称,则可使用此条件键要求用户在 GET Bucket Object versions 请求中指定 delimiter 参数。在这种情况下,Amazon S3 响应返回的对象键列表将按通用前缀分组。

s3:max-keys

通过使用此条件,要求用户指定 max-keys 参数,可限制 Amazon S3 响应 GET Bucket Object versions 请求所返回的键数。默认情况下,API 返回最多 1000 个键名称。有关可使用的数字条件的列表,请参阅 IAM 用户指南 中的数字条件运算符

s3:PutBucketAcl

  • s3:x-amz-acl (针对标准 ACL 权限)

  • s3:x-amz-grant-permission (针对显式权限),其中 permission 可以是:

    read, write,​ read-acp,​ write​-acp,​ ​full​-control

PUT Bucket acl API (请参阅 PUT Bucket) 支持 ACL 特定的标头。可使用这些条件键来要求用户在请求中设置这些标头。

示例 1:允许用户创建存储桶,但仅在特定区域内创建

假定 AWS 账户管理员想要授予其用户 (Dave) 仅在 南美洲(圣保罗) 区域创建存储桶的权限。账户管理员可附加以下用户策略,授予附带条件的 s3:CreateBucket 权限,如下所示。Condition 块中的键值对指定 s3:LocationConstraint 键,以 sa-east-1 区域作为值。

注意

在该示例中,存储桶拥有者为其用户之一授予权限,因此可以使用存储桶策略或用户策略。此示例显示了用户策略。

有关 Amazon S3 区域的列表,请参阅 Amazon Web Services 一般参考 中的区域和终端节点

Copy
{ "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 区域创建存储桶。但有可能别的策略授予了此用户在其他区域创建存储桶的权限。例如,如果用户属于一个组,该组可能被附加了一个策略,使得该组中的所有用户都有权在其他某个区域创建存储桶。要确保此用户不会获得在其他任何区域创建存储桶的权限,可在该策略中添加一个显式拒绝语句。

Copy
{ "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 的更多信息,请参阅 设置用于示例演练的工具

Copy
aws s3api create-bucket --bucket examplebucket --profile AccountADave --create-bucket-configuration file://c:/Users/someUser/bucketconfig.txt

bucketconfig.txt 文件指定配置,如下所示

Copy
{"LocationConstraint": "sa-east-1"}

示例 2:允许用户根据特定前缀获取存储桶中的对象的列表

存储桶拥有者可限定用户仅列出存储桶中特定文件夹的内容。如果存储桶中的对象按键名称前缀组织,这非常有用,Amazon S3 控制台可使用这些前缀显示文件夹的层级结构 (仅控制台支持文件夹概念;Amazon S3 API 仅支持存储桶和对象)。

在该示例中,存储桶拥有者和用户所属的父账户相同。因此存储桶拥有者可使用存储桶策略或用户策略。首先,我们显示用户策略。

以下用户策略授予 s3:ListBucket 权限 (请参阅 GET Bucket (列出对象) ),条件为要求用户在请求中指定值为 projectsprefix

Copy
{ "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 元素添加到该策略,从而标识用户,则现在您拥有了所示的存储桶策略。

Copy
{ "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 的更多信息,请参阅 设置用于示例演练的工具

Copy
aws s3api list-objects --bucket examplebucket --prefix examplefolder --profile AccountADave

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