

# 禁用所有新存储桶的 ACL 并强制执行 Object Ownership
<a name="ensure-object-ownership"></a>

建议禁用 Amazon S3 存储桶上的 ACL。可以通过为 S3 对象所有权应用强制存储桶拥有者设置来实现这一点。应用此设置时，ACL 将被禁用，并且您自动拥有并完全控制存储桶中的所有对象。若要求在禁用 ACL 的情况下创建所有新存储桶，请使用 AWS Identity and Access Management（IAM）策略或 AWS Organizations 服务控制策略（SCP），如下一节所述。

要在不禁用 ACL 的情况下强制对新对象的对象所有权，您可以应用“首选存储桶拥有者”设置。当您应用此设置时，我们强烈建议您更新存储桶策略，以要求对存储桶的所有 `PUT` 请求使用 `bucket-owner-full-control` 标准 ACL。确保还更新客户端，以将 `bucket-owner-full-control` 标准 ACL 从其他账户发送至存储桶。

**Topics**
+ [禁用所有新存储桶的 ACL（强制存储桶拥有者）](#object-ownership-requiring-bucket-owner-enforced)
+ [要求 Amazon S3 `PUT` 操作使用存储桶拥有者完全控制的标准 ACL（首选存储桶拥有者）](#ensure-object-ownership-bucket-policy)

## 禁用所有新存储桶的 ACL（强制存储桶拥有者）
<a name="object-ownership-requiring-bucket-owner-enforced"></a>

下面的示例 IAM 策略拒绝特定 IAM 用户或角色的 `s3:CreateBucket` 权限，除非为对象所有权应用了强制存储桶拥有者设置。`Condition` 块中的键值对指定 `s3:x-amz-object-ownership` 为其密钥，并将 `BucketOwnerEnforced` 设为其值。换句话说，只有在 IAM 用户为对象所有权设定强制存储桶拥有者设置并禁用 ACL 时，这些用户才能创建存储桶。您还可以将此策略用作 AWS 企业的边界的 SCP。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "RequireBucketOwnerFullControl",
            "Action": "s3:CreateBucket",
            "Effect": "Deny",
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-object-ownership": "BucketOwnerEnforced"
                }
            }
        }
    ]
}
```

------

## 要求 Amazon S3 `PUT` 操作使用存储桶拥有者完全控制的标准 ACL（首选存储桶拥有者）
<a name="ensure-object-ownership-bucket-policy"></a>

通过为对象所有权使用“首选存储桶拥有者”设置，您作为存储桶拥有者，拥有并完全控制其他账户使用 `bucket-owner-full-control` 标准 ACL 向存储桶写入的新对象。但是，如果其他账户在没有 `bucket-owner-full-control` 标准 ACL 的情况下将对象写入存储桶，对象编写者将保持完全控制访问权限。作为存储桶拥有者，只有指定了 `bucket-owner-full-control` 标准的 ACL，才能实现允许写入的存储桶策略。

**注意**  
如果在应用强制存储桶拥有者设置的情况下禁用了 ACL，则作为存储桶拥有者，您将自动拥有并完全控制存储桶中的所有对象。您无需使用此部分来更新存储桶策略来强制执行存储桶拥有者的对象所有权。

以下存储桶策略指定只有当对象的 ACL 设置为 `111122223333` 时，账户 *`amzn-s3-demo-bucket`* 才能将对象上传到 *`bucket-owner-full-control`*。请务必将 *`111122223333`* 替换为您的账户，*`amzn-s3-demo-bucket`* 替换为存储桶的名称。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "OnlyAllowWritesToMyBucketWithBucketOwnerFullControl",
         "Effect": "Allow",
         "Principal": {
            "AWS": [
               "arn:aws:iam::111122223333:user/ExampleUser"
            ]
         },
         "Action": [
            "s3:PutObject"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
         "Condition": {
            "StringEquals": {
               "s3:x-amz-acl": "bucket-owner-full-control"
            }
         }
      }
   ]
}
```

------

以下是一个复制操作示例，其中包括使用 AWS Command Line Interface（AWS CLI）的 `bucket-owner-full-control` 标准 ACL。

```
aws s3 cp file.txt s3://amzn-s3-demo-bucket --acl bucket-owner-full-control
```

存储桶策略生效之后，如果客户端不包含 `bucket-owner-full-control` 标准 ACL，则操作将失败，上传者将收到以下错误：

调用 PutObject 操作时发生错误 (AccessDenied)：访问被拒绝。

**注意**  
如果客户端在上传后需要访问对象，则必须向上传账户授予其他权限。有关授予账户对资源的访问权限的信息，请参阅 [演练：使用策略管理针对 Amazon S3 资源的访问权限](example-walkthroughs-managing-access.md)。