

# 为现有存储桶设置对象所有权
<a name="object-ownership-existing-bucket"></a>

您可以在现有 S3 存储桶上配置 S3 对象所有权。要在创建存储桶时应用对象所有权，请参阅 [在创建存储桶时设置对象所有权](object-ownership-new-bucket.md)。

S3 对象所有权是 Amazon S3 存储桶级设置，您可以使用它禁用 [access control lists（ACLs）](acl-overview.md)（访问控制列表 ACL），并获取存储桶中每个对象的所有权，从而简化了对存储在 Amazon S3 中的数据的访问管理。默认情况下，S3 对象所有权设为强制存储桶拥有者设置，并且对于新存储桶禁用 ACL。禁用 ACL 后，存储桶拥有者拥有存储桶中的每个对象，并使用访问管理策略来专门管理对数据的访问权限。我们建议您将 ACL 保持为禁用状态，除非有必须单独控制每个对象的访问权限的特殊情况。

对象所有权有三个设置，您可以使用它来控制上传到存储桶的对象的所有权，并禁用或启用 ACL：

**已禁用 ACL**
+ **强制存储桶拥有者（默认）**– ACL 已禁用，存储桶拥有者自动拥有并完全控制存储桶中的每个对象。ACL 不再影响 S3 存储桶中对数据的权限。存储桶使用策略来定义访问控制。

**已启用 ACL**
+ **Bucket owner preferred**（首选存储桶拥有者）— 存储桶拥有者拥有并完全控制其他账户使用 `bucket-owner-full-control` 标准 ACL 写入存储桶的新对象。
+ **对象编写者**— 该 Amazon Web Services 账户上传对象拥有该对象，对其拥有完全控制权，并且可以通过 ACL 授予其他用户访问该对象的权限。

**先决条件**：在应用强制存储桶拥有者设置以禁用 ACL 之前，您必须将存储桶 ACL 权限迁移到存储桶策略并将存储桶 ACL 重置为默认私有 ACL。我们还建议您将对象 ACL 权限迁移到存储桶策略，并编辑需要存储桶拥有者完全控制 ACL 以外的 ACL 的存储桶策略。有关更多信息，请参阅 [禁用 ACL 的先决条件](object-ownership-migrating-acls-prerequisites.md)。

**Permissions**（权限）：要使用此操作，您必须拥有 `s3:PutBucketOwnershipControls` 权限。有关 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)。

## 使用 S3 控制台
<a name="add-object-ownership"></a>

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在 **Buckets**（存储桶）列表中，请选择要将 S3 对象所有权设置应用到的存储桶的名称。

1. 选择 **Permissions（权限）**选项卡。

1. 在 **Object Ownership**（对象所有权）下方，请选择 **Edit**（编辑）。

1. 在 **Object Ownership**（对象所有权）下方，要禁用或启用 ACL，并控制上传到存储桶中的对象的所有权，请选择以下设置之一：

**已禁用 ACL**
   + **Bucket owner enforced**（强制存储桶拥有者）— ACL 被禁用，存储桶拥有者自动拥有并完全控制存储桶中的每个对象。ACL 不再影响 S3 存储桶中对数据的权限。存储桶使用策略来定义访问控制。

     要通过使用 IAM 或 Amazon Organizations 策略借助禁用的 ACL 要求创建所有新的存储桶，请参阅 [禁用所有新存储桶的 ACL（强制存储桶拥有者）](ensure-object-ownership.md#object-ownership-requiring-bucket-owner-enforced)。

**已启用 ACL**
   + **Bucket owner preferred**（首选存储桶拥有者）— 存储桶拥有者拥有并完全控制其他账户使用 `bucket-owner-full-control` 标准 ACL 写入存储桶的新对象。

     如果应用首选存储桶拥有者设置，以要求所有的 Amazon S3 上传都包含 `bucket-owner-full-control` 存储的 ACL，可以 [add a bucket policy](ensure-object-ownership.md#ensure-object-ownership-bucket-policy)（添加存储桶策略），该策略只允许对象使用此 ACL 上传。
   + **对象编写者**— 该 Amazon Web Services 账户上传对象拥有该对象，对其拥有完全控制权，并且可以通过 ACL 授予其他用户访问该对象的权限。

1. 请选择**保存**。

## 使用 Amazon CLI
<a name="object-ownership-existing-bucket-cli"></a>

要为现有存储桶应用 Object Ownership 设置，请使用带有 `--ownership-controls` 参数的 `put-bucket-ownership-controls` 命令。所有权的有效值为 `BucketOwnerEnforced`、`BucketOwnerPreferred` 或 `ObjectWriter`。

下面的例子使用 Amazon CLI 为现有的存储桶应用强制存储桶拥有者设置：

```
aws s3api put-bucket-ownership-controls --bucket amzn-s3-demo-bucket --ownership-controls="Rules=[{ObjectOwnership=BucketOwnerEnforced}]"
```

有关 `put-bucket-ownership-controls` 的信息，请参阅《Amazon Command Line Interface 用户指南》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-ownership-controls.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-ownership-controls.html)。

## 使用适用于 Java 的 Amazon SDK
<a name="object-ownership-existing-bucket-sdk-java"></a>

此示例使用 适用于 Java 的 Amazon SDK 对现有存储桶应用了存储桶拥有者的 `BucketOwnerEnforced` 设置：

```
         // Build the ObjectOwnership for BucketOwnerEnforced
         OwnershipControlsRule rule = OwnershipControlsRule.builder()
                .objectOwnership(ObjectOwnership.BucketOwnerEnforced)
                .build();

         OwnershipControls ownershipControls = OwnershipControls.builder()
                   .rules(rule)
                   .build()

          // Build the PutBucketOwnershipControlsRequest
          PutBucketOwnershipControlsRequest putBucketOwnershipControlsRequest =
                PutBucketOwnershipControlsRequest.builder()
                        .bucket(BUCKET_NAME)
                        .ownershipControls(ownershipControls)
                        .build();
                        
          // Send the request to Amazon S3 
          s3client.putBucketOwnershipControls(putBucketOwnershipControlsRequest);
```

## 使用 Amazon CloudFormation
<a name="object-ownership-existing-bucket-cfn"></a>

要使用 Amazon CloudFormation 以便为现有存储桶应用对象所有权设置，请参阅《Amazon CloudFormation 用户指南》**中的 [https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ownershipcontrols.html](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ownershipcontrols.html)。

## 使用 REST API
<a name="object-ownership-existing-bucket-rest-api"></a>

要使用 REST API 将 Object Ownership 设置应用于现有 S3 存储桶，请使用 `PutBucketOwnershipControls`。有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutBucketOwnershipControls.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutBucketOwnershipControls.html)。

**后续步骤**：在应用对象所有权的强制存储桶拥有者或首选存储桶拥有者设置后，您可以进一步执行以下步骤：
+ [Bucket owner enforced](ensure-object-ownership.md#object-ownership-requiring-bucket-owner-enforced)（强制存储桶拥有者）—通过使用 IAM 或企业策略借助禁用的 ACL 要求创建所有新的存储桶。
+ [Bucket owner preferred](ensure-object-ownership.md#ensure-object-ownership-bucket-policy)（首选存储桶拥有者）—添加 S3 存储桶策略，要求将所有对象上传到存储桶中都需要 `bucket-owner-full-control` 预定义 ACL。