

# 使用条件键的存储桶策略示例
<a name="amazon-s3-policy-keys"></a>

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

有关使用 Amazon S3 条件键进行对象和存储桶操作的策略，请参阅以下示例。有关条件键的更多信息，请参阅 [Amazon S3 的策略条件键](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-conditionkeys)。有关您可以在策略中指定的 Amazon S3 操作、条件键和资源的完整列表，请参阅《Service Authorization Reference》**中的 [Actions, resources, and condition keys for Amazon S3](https://docs.amazonaws.cn/service-authorization/latest/reference/list_amazons3.html)。

有关按 S3 资源类型对 S3 API 操作的权限的更多信息，请参阅 [Amazon S3 API 操作所需的权限](using-with-s3-policy-actions.md)。

## 示例：适用于对象操作的 Amazon S3 条件键
<a name="object-keys-in-amazon-s3-policies"></a>

以下示例说明如何将特定于 Amazon S3 的条件键用于对象操作。有关您可以在策略中指定的 Amazon S3 操作、条件键和资源的完整列表，请参阅《Service Authorization Reference》**中的 [Actions, resources, and condition keys for Amazon S3](https://docs.amazonaws.cn/service-authorization/latest/reference/list_amazons3.html)。

有关按 S3 资源类型对 S3 API 操作的权限的更多信息，请参阅 [Amazon S3 API 操作所需的权限](using-with-s3-policy-actions.md)。

几个示例策略展示如何将条件键与 [PUT Object](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTObjectPUT.html) 操作结合使用。PUT Object 操作允许特定于访问控制列表 (ACL) 的标头，可用于授予基于 ACL 的权限。通过使用这些条件键，您可以设置条件，来要求用户上传对象时需具有特定的访问权限。您还可以通过 PutObjectAcl 操作授予基于 ACL 的权限。有关更多信息，请参阅 *Amazon S3 Amazon Simple Storage Service API 参考*中的 [PutObjectAcl](https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutObjectAcl.html)。有关 ACL 的更多信息，请参阅 [访问控制列表 (ACL) 概述](acl-overview.md)。

**Topics**
+ [示例 1：授予要求使用服务器端加密来存储对象的 `s3:PutObject` 权限](#putobject-require-sse-2)
+ [示例 2：授予复制对象的 `s3:PutObject` 权限，但对复制源有限制](#putobject-limit-copy-source-3)
+ [示例 3：授予对特定对象版本的访问权限](#getobjectversion-limit-access-to-specific-version-3)
+ [示例 4：基于对象标签授予权限](#example-object-tagging-access-control)
+ [示例 5：限制存储桶拥有者的 Amazon Web Services 账户 ID 的访问](#example-object-resource-account)
+ [示例 6：要求最低 TLS 版本](#example-object-tls-version)
+ [示例 7：从 `Deny` 语句中排除特定主体](#example-exclude-principal-from-deny-statement)
+ [示例 8：强制客户端根据对象键名称或 ETag 有条件地上传对象](#example-conditional-writes-enforce)

### 示例 1：授予要求使用服务器端加密来存储对象的 `s3:PutObject` 权限
<a name="putobject-require-sse-2"></a>

假设账户 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` 权限，但对复制源有限制
<a name="putobject-limit-copy-source-3"></a>

在 `PUT` 对象请求中，如果指定了源对象，则请求为复制操作（请参阅 [https://docs.amazonaws.cn/AmazonS3/latest/API/RESTObjectCOPY.html](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTObjectCOPY.html)）。因此，存储桶拥有者可以为用户授予权限以复制具有源限制的对象，例如：
+ 只支持从指定的源存储桶（例如 `{{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}}` 替换为您自己的信息。

------
#### [ JSON ]

****  

```
{
    "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](https://docs.amazonaws.cn/AmazonS3/latest/API/setup-aws-cli.html)。

```
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 name="getobjectversion-limit-access-to-specific-version-3"></a>

假设账户 A 拥有启用版本控制的存储桶。该存储桶具有 `{{HappyFace.jpg}}` 对象的多个版本。账户 A 管理员现在想要向用户 `{{Dave}}` 授予仅获得特定对象版本的权限。账户管理员可以通过有条件地向用户 `{{Dave}}` 授予 `s3:GetObjectVersion` 权限来实现这一点，如以下示例所示。`Condition` 块中的键值对指定 `s3:VersionId` 条件键。在这种情况下，要从指定的启用版本控制的存储桶中检索对象，`{{Dave}}` 需要知道确切的对象版本 ID。要使用此示例策略，请将 `{{user input placeholders}}` 替换为您自己的信息。

有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_GetObject.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_GetObject.html)。

------
#### [ JSON ]

****  

```
{
    "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：基于对象标签授予权限
<a name="example-object-tagging-access-control"></a>

有关如何将对象标记条件键与 Amazon S3 操作结合使用的示例，请参阅[标签和访问控制策略](tagging-and-policies.md)。

### 示例 5：限制存储桶拥有者的 Amazon Web Services 账户 ID 的访问
<a name="example-object-resource-account"></a>

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

但请注意，有些 Amazon 服务依赖于访问 Amazon 托管式存储桶。因此，在 IAM 策略中使用 `aws:ResourceAccount` 或 `s3:ResourceAccount` 键也可能会影响对这些资源的访问。有关更多信息，请参阅以下资源：
+ 《Amazon PrivateLink Guide》**中的 [Restrict access to buckets in a specified Amazon Web Services 账户](https://docs.amazonaws.cn/vpc/latest/privatelink/vpc-endpoints-s3.html#bucket-policies-s3)
+ 《Amazon ECR Guide》**中的 [Restrict access to buckets that Amazon ECR uses](https://docs.amazonaws.cn/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-minimum-s3-perms)
+ [Amazon 指南](https://docs.amazonaws.cn/systems-manager/latest/userguide/ssm-agent-minimum-s3-permissions.html)中的*为 Amazon Systems Manager 托管式 Amazon S3 存储桶提供对 Systems Manager 的所需访问权限*

有关 `aws:ResourceAccount` 和 `s3:ResourceAccount` 条件键的更多信息以及演示如何使用它们的示例，请参阅 *Amazon 存储博客* 中的 [Limit access to Amazon S3 buckets owned by specific Amazon Web Services 账户](https://www.amazonaws.cn/blogs/storage/limit-access-to-amazon-s3-buckets-owned-by-specific-aws-accounts/)。

### 示例 6：要求最低 TLS 版本
<a name="example-object-tls-version"></a>

可以使用 `s3:TlsVersion` 条件键来编写 IAM 策略、虚拟私有云端点（VPCE）策略或存储桶策略，以便根据客户端使用的 TLS 版本，限制用户或应用程序对 Amazon S3 存储桶的访问权限。您可以使用此条件键来编写要求最低 TLS 版本的策略。

**注意**  
当 Amazon 服务代表您调用其它 Amazon 服务（服务到服务调用）时，会编辑某些特定于网络的授权上下文，包括 `s3:TlsVersion`、`aws:SecureTransport`、`aws:SourceIp` 和 `aws:VpcSourceIp`。如果策略将这些条件键与 `Deny` 语句结合使用，则 Amazon 服务主体可能会无意中受到屏蔽。要让 Amazon 服务在保持安全要求的同时正常运行，请通过添加值为 `false` 的 `aws:PrincipalIsAWSService` 条件键将服务主体排除在 `Deny` 语句之外。例如：  

```
{
  "Effect": "Deny",
  "Action": "s3:*",
  "Resource": "*",
  "Condition": {
    "Bool": {
      "aws:SecureTransport": "false",
      "aws:PrincipalIsAWSService": "false"
    }
  }
}
```
当未使用 HTTPS（`aws:SecureTransport` 为 false）时，此策略拒绝访问 S3 操作，但仅适用于非 Amazon 服务主体。这可以确保条件限制适用于除 Amazon 服务主体之外的所有主体。

**Example**  
以下示例存储桶策略*拒绝* 由 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
                }
            }
        }
    ]
}
```

**Example**  
以下示例存储桶策略*支持* 由 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` 语句中排除特定主体
<a name="example-exclude-principal-from-deny-statement"></a>

以下存储桶策略拒绝 `s3:GetObject` 访问 `{{amzn-s3-demo-bucket}}`，但账号为 {{`123456789012`}} 的主体除外。要使用此示例策略，请将 `{{user input placeholders}}` 替换为您自己的信息。

------
#### [ JSON ]

****  

```
{
  "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}}"
          ]
        }
      }
    }
  ]
}
```

------

### 示例 8：强制客户端根据对象键名称或 ETag 有条件地上传对象
<a name="example-conditional-writes-enforce"></a>

通过有条件写入，可以向 `WRITE` 请求中添加一个额外的标头，以便为 S3 操作指定前提条件。此标头指定了一个条件，如果不满足该条件，将导致 S3 操作失败。例如，在对象上传期间，可以通过验证存储桶中尚不存在具有相同键名称的对象，来防止覆盖现有数据。也可以在写入对象之前，在 Amazon S3 中检查对象的实体标签（ETag）。

有关使用存储桶策略中的条件强制执行有条件写入的存储桶策略示例，请参阅[强制对 Amazon S3 存储桶实施有条件写入](conditional-writes-enforce.md)。

## 示例：适用于存储桶操作的 Amazon S3 条件键
<a name="bucket-keys-in-amazon-s3-policies"></a>

以下示例策略显示了如何将 Amazon S3 特定的条件键用于存储桶操作。

**Topics**
+ [示例 1：授予 `s3:GetObject` 权限，但对 IP 地址指定了条件](#AvailableKeys-iamV2)
+ [示例 2：获取存储桶中具有特定前缀的对象列表](#condition-key-bucket-ops-2)
+ [示例 3：设置最大键数](#example-numeric-condition-operators)

### 示例 1：授予 `s3:GetObject` 权限，但对 IP 地址指定了条件
<a name="AvailableKeys-iamV2"></a>

如果请求源自特定的 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](http://www.rfc-editor.org/rfc/rfc4632.txt)。

------
#### [ JSON ]

****  

```
{
    "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:SourceVpce` 和 `aws:SourceVpc` 条件键。有关特定示例，请参阅[使用存储桶策略控制从 VPC 端点的访问](example-bucket-policies-vpc-endpoint.md)。

**注意**  
对于某些 Amazon 全局条件键，仅支持某些资源类型。因此，请检查 Amazon S3 是否支持您要使用的全局条件键和资源类型，或者是否需要改用 Amazon S3 特定的条件键。有关 Amazon S3 的受支持资源类型和条件键的完整列表，请参阅《Service Authorization Reference》**中的 [Actions, resources, and condition keys for Amazon S3](https://docs.amazonaws.cn/service-authorization/latest/reference/list_amazons3.html)。  
有关按 S3 资源类型对 S3 API 操作的权限的更多信息，请参阅 [Amazon S3 API 操作所需的权限](using-with-s3-policy-actions.md)。

### 示例 2：获取存储桶中具有特定前缀的对象列表
<a name="condition-key-bucket-ops-2"></a>

可以使用 `s3:prefix` 条件键将 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_ListObjectsV2.html) API 操作的响应限制为具有特定前缀的键名称。如果您是存储桶拥有者，则可以使用此条件键来限定用户仅列出存储桶中特定前缀的内容。如果存储桶中的对象是按键名称前缀整理的，则 `s3:prefix` 条件键很有用。

Amazon S3 控制台使用键名前缀来显示文件夹概念。只有控制台支持文件夹的概念；Amazon S3 API 仅支持存储桶和对象。例如，如果您有键名称为 {{`public/object1.jpg`}} 和 {{`public/object2.jpg`}} 的两个对象，则控制台会在 {{`public`}} 文件夹下显示这些对象。在 Amazon S3 API 中，这些是带有前缀的对象，而不是文件夹中的对象。有关使用前缀和分隔符筛选访问权限的更多信息，请参阅 [使用用户策略控制对存储桶的访问](walkthrough1.md)。

在以下场景中，存储桶拥有者和用户所属的父账户相同。因此，存储桶拥有者可以使用存储桶策略或用户策略来授予访问权限。有关可以与 `ListObjectsV2` API 操作结合使用的其它条件键的更多信息，请参阅 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_ListObjectsV2.html)。

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

**用户策略**  
以下用户策略通过一条 `Condition` 语句来授予 `s3:ListBucket` 权限（请参阅 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_ListObjectsV2.html)），该语句要求用户在请求中指定值为 `{{projects}}` 的前缀。要使用此示例策略，请将 `{{user input placeholders}}` 替换为您自己的信息。

------
#### [ JSON ]

****  

```
{
   "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}}` 替换为您自己的信息。

------
#### [ JSON ]

****  

```
{
   "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](https://docs.amazonaws.cn/AmazonS3/latest/API/setup-aws-cli.html)。

```
aws s3api list-objects --bucket {{{{amzn-s3-demo-bucket}}}} --prefix {{projects}} --profile {{AccountA}}
```

### 示例 3：设置最大键数
<a name="example-numeric-condition-operators"></a>

您可以使用 `s3:max-keys` 条件键来设置请求者可以在 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_ListObjectsV2.html) 或 [https://docs.amazonaws.cn//AmazonS3/latest/API/API_ListObjectVersions.html](https://docs.amazonaws.cn//AmazonS3/latest/API/API_ListObjectVersions.html) 请求中返回的最大键数。默认情况下，这些 API 操作可返回最多 1000 个键。有关可与 `s3:max-keys` 一起使用的数字条件运算符的列表和相关示例，请参阅 *IAM 用户指南*中的[数字条件运算符](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric)。