

# 在创建存储桶时设置对象所有权
<a name="object-ownership-new-bucket"></a>

创建存储桶时，您可以配置 S3 对象所有权。要为现有存储桶设置对象所有权，请参阅 [为现有存储桶设置对象所有权](object-ownership-existing-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 写入存储桶的新对象。
+ **对象编写者**— 该 AWS 账户上传对象拥有该对象，对其拥有完全控制权，并且可以通过 ACL 授予其他用户访问该对象的权限。

**权限**：要应用 **Bucket owner enforced**（强制存储桶拥有者）设置或 **Bucket owner preferred**（首选存储桶拥有者）设置，必须有以下权限：`s3:CreateBucket` 和 `s3:PutBucketOwnershipControls`。在应用了 **Object writer**（对象编写者）设置的情况下创建存储桶时，不需要额外的权限。有关 Amazon S3 权限的更多信息，请参阅《Service Authorization Reference》**中的 [Actions, resources, and condition keys for Amazon S3](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)。

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

**重要**  
Amazon S3 中的大多数现代使用案例不再需要使用 ACL，我们建议您禁用 ACL，除非在需要单独控制每个对象的访问权限的情况下。使用对象所有权，您可以禁用 ACL 并依赖策略进行访问控制。禁用 ACL 时，您可以轻松维护具有通过不同的 AWS 账户上传的对象的存储桶。作为存储桶拥有者，您拥有存储桶中的所有对象，并可以使用策略管理对它们的访问。

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

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

1. 在页面顶部的导航栏中，选择当前所显示 AWS 区域的名称。接下来，选择要在其中创建存储桶的区域。
**注意**  
存储桶创建后，便无法再更改其区域。
要最大程度地减少延迟和成本以及满足法规要求，请选择一个靠近您的区域。在某一区域存储的对象将一直留在该区域，除非您特意将其转移到其他区域。有关 Amazon S3 AWS 区域的列表，请参阅《Amazon Web Services 一般参考》**中的 [AWS 服务 端点](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 选择**创建存储桶**。此时将打开**创建存储桶**页面。

1. 对于**存储桶名称**，请输入存储桶的名称。

   存储桶名称必须满足以下要求：
   + 在分区中是唯一的。分区是区域的分组。AWS 目前有三个分区：`aws`（商用区域）、`aws-cn`（中国区域）和 `aws-us-gov`（AWS GovCloud (US) Regions）。
   + 长度必须介于 3 到 63 个字符之间。
   + 只能由小写字母、数字、句点 (`.`) 和连字符 (`-`) 组成。为了获得最佳兼容性，我们建议您避免在存储桶名称中使用句点 (`.`)，但仅用于静态网站托管的存储桶除外。
   + 以字母或数字开头和结尾。
   + 有关存储桶命名规则的完整列表，请参阅[通用存储桶命名规则](bucketnamingrules.md)。
**重要**  
创建存储桶后，便无法更改其名称。
请勿在存储桶名称中包含敏感信息。存储桶名称会显示在指向存储桶中的对象的 URL 中。

1. （可选）在**常规配置**下，您可以选择将现有存储桶的设置复制到新存储桶。如果您不想复制现有存储桶的设置，请跳到下一步。
**注意**  
此选项：  
在 AWS CLI 中不可用，仅在 Amazon S3 控制台中可用
不会将存储桶策略从现有存储桶复制到新存储桶

    要复制现有存储桶的设置，请在**从现有存储桶复制设置**下，选择**选择存储桶**。将打开**选择存储桶**窗口。找到包含您要复制的设置的存储桶，然后选择**选择存储桶**。**选择存储桶**窗口关闭，而**创建存储桶**窗口重新打开。

   在**从现有存储桶复制设置**下，您现在将看到您选择的存储桶的名称。新存储桶的设置现在与您选择的存储桶的设置相匹配。如果要移除复制的设置，请选择**恢复默认设置**。在**创建存储桶**页面上查看其余的存储桶设置。如果您不想进行任何更改，可以跳到最后一步。

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

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

     默认情况下，ACL 处于禁用状态。Amazon S3 中的大多数现代使用案例不再需要使用 ACL。我们建议您将 ACL 保持为禁用状态，除非有必须单独控制每个对象的访问权限的情况。有关更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

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

     如果应用**首选存储桶拥有者**设置，以要求所有 Amazon S3 上传都包含 `bucket-owner-full-control` 标准 ACL，则可以[添加存储桶策略](ensure-object-ownership.md#ensure-object-ownership-bucket-policy)，该策略只允许使用此 ACL 上传对象。
   + **对象编写者**— 该 AWS 账户上传对象拥有该对象，对其拥有完全控制权，并且可以通过 ACL 授予其他用户访问该对象的权限。
**注意**  
默认设置为**强制存储桶拥有者**。要应用默认设置并将 ACL 保持为禁用状态，只需要 `s3:CreateBucket` 权限。要启用 ACL，您必须具有 `s3:PutBucketOwnershipControls` 权限。

1. 在**此存储桶的屏蔽公共访问权限设置**中，请选择要应用于存储桶的屏蔽公共访问权限设置。

   默认情况下，启用所有四个“屏蔽公共访问权限”设置。我们建议您将所有设置保持为启用状态，除非您知道您需要为您的特定使用案例关闭其中一个或多个设置。有关屏蔽公共访问权限的更多信息，请参阅[阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。
**注意**  
要启用所有“屏蔽公共访问权限”设置，只需要 `s3:CreateBucket` 权限。要关闭任何“屏蔽公共访问权限”设置，您必须拥有 `s3:PutBucketPublicAccessBlock` 权限。

1. （可选）默认情况下，**存储桶版本控制**处于禁用状态。版本控制是在相同的存储桶中保留对象的多个变量的方法。对于 存储桶中存储的每个对象，您可以使用版本控制功能来保留、检索和还原它们的各个版本。使用版本控制能够更加轻松地从用户意外操作和应用程序故障中恢复数据。有关版本控制的更多信息，请参阅[使用 S3 版本控制保留对象的多个版本](Versioning.md)。

   要在存储桶上启用版本控制，请选择**启用**。

1. （可选）在 **Tags**（标签）下，您可以选择向存储桶添加标签。利用 AWS 成本分配功能，可以使用存储桶标签来对存储桶的使用计费添加注释。一个标签即为一个键值对，用于表示用户分配给存储桶的标记。有关更多信息，请参阅 [使用成本分配 S3 存储桶标签](CostAllocTagging.md)。

   要添加存储桶标签，请输入 **Key**（键），并（可选）输入 **Value**（值），然后选择 **Add Tag**（添加标签）。

1. 要配置**默认加密**，请在**加密类型**下，选择以下选项之一：
   + **具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）**
   + **具有 AWS Key Management Service 密钥的服务器端加密（SSE-KMS）**
   + **具有 AWS Key Management Service（AWS KMS）密钥的双层服务器端加密（DSSE-KMS）**
**重要**  
如果您将 SSE-KMS 或 DSSE-KMS 选项用于默认加密配置，则您将受到 AWS KMS 的每秒请求数（RPS）配额限制。有关 AWS KMS 限额以及如何请求增加限额的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[限额](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)。

   通过将具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）用作基本加密配置级别，对存储桶和新对象进行加密。有关默认加密的更多信息，请参阅[为 Amazon S3 存储桶设置默认服务器端加密行为](bucket-encryption.md)。有关 SSE-S3 的更多信息，请参阅[使用具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）](UsingServerSideEncryption.md)。

   有关使用服务器端加密对数据进行加密的更多信息，请参阅[利用加密来保护数据](UsingEncryption.md)。

1. 如果您选择了**具有 AWS Key Management Service 密钥的服务器端加密（SSE-KMS）**或**具有 AWS Key Management Service（AWS KMS）密钥的双层服务器端加密（DSSE-KMS）**，请执行以下操作：

   1. 在 **AWS KMS 密钥**下，通过以下方式之一指定您的 KMS 密钥：
      + 要从可用的 KMS 密钥列表中进行选择，请选择**从您的 AWS KMS keys 密钥中进行选择**，并从可用密钥的列表中选择您的 **KMS 密钥**。

        AWS 托管式密钥 (`aws/s3`) 和您的客户自主管理型密钥都显示在此列表中。有关客户自主管理型密钥的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[客户密钥和 AWS 密钥](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#key-mgmt)。
      + 要输入 KMS 密钥 ARN，请选择**输入 AWS KMS key ARN**，然后在显示的字段中输入您的 KMS 密钥 ARN。
      + 要在 AWS KMS 控制台中创建新的客户自主管理型密钥，请选择**创建 KMS 密钥**。

        有关创建 AWS KMS key 的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[创建密钥](https://docs.aws.amazon.com//kms/latest/developerguide/create-keys.html)。
**重要**  
您只能使用与存储桶所在相同的 AWS 区域中可用的 KMS 密钥。Amazon S3 控制台仅列出与存储桶位于同一区域中的前 100 个 KMS 密钥。要使用未列出的 KMS 密钥，您必须输入 KMS 密钥 ARN。如果您希望使用由其它账户拥有的 KMS 密钥，则必须首先有权使用该密钥，然后必须输入相应的 KMS 密钥 ARN。有关 KMS 密钥的跨账户权限的更多信息，请参阅《AWS Key Management Service Developer Guide》**中的 [Creating KMS keys that other accounts can use](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console)。有关 SSE-KMS 的更多信息，请参阅 [使用 AWS KMS (SSE-KMS) 指定服务器端加密](specifying-kms-encryption.md)。有关 DSSE-KMS 的更多信息，请参阅[使用具有 AWS KMS 密钥的双层服务器端加密（DSSE-KMS）](UsingDSSEncryption.md)。  
在 Amazon S3 中使用 AWS KMS key 进行服务器端加密时，您必须选择对称加密 KMS 密钥。Amazon S3 仅支持对称加密 KMS 密钥，而不支持非对称 KMS 密钥。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[确定对称和非对称 KMS 密钥](https://docs.aws.amazon.com//kms/latest/developerguide/find-symm-asymm.html)。

   1. 将存储桶配置为使用 SSE-KMS 进行默认加密时，还可以使用 S3 存储桶密钥。S3 存储桶密钥可通过减少从 Amazon S3 到 AWS KMS 的请求流量，降低加密成本。有关更多信息，请参阅 [使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本](bucket-key.md)。DSSE-KMS 不支持 S3 存储桶密钥。

      默认情况下，S3 存储桶密钥在 Amazon S3 控制台中处于启用状态。我们建议将 S3 存储桶密钥保留为启用状态以降低成本。要为存储桶禁用 S3 存储桶密钥，请在**存储桶密钥**下选择**禁用**。

1. （可选）S3 对象锁定有助于保护新对象不被删除或覆盖。有关更多信息，请参阅 [使用对象锁定以锁定对象](object-lock.md)。如果要启用 S3 对象锁定，请执行以下操作：

   1. 选择**高级设置**。
**重要**  
启用对象锁定会自动为存储桶启用版本控制。启用并成功创建存储桶后，还必须在存储桶的**属性**选项卡上配置对象锁定默认保留设置和法定保留设置。

   1. 如果要启用对象锁定，请选择 **Enable**（启用），阅读出现的警告，并予以确认。
**注意**  
要创建启用了对象锁定的存储桶，您必须具有以下权限：`s3:CreateBucket`、`s3:PutBucketVersioning` 和 `s3:PutBucketObjectLockConfiguration`。

1. 选择**创建存储桶**。

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

要在创建新存储桶时设置对象所有权，请使用带有 `--object-ownership` 参数的 `create-bucket` AWS CLI 命令。

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

```
aws s3api create-bucket --bucket  amzn-s3-demo-bucket --region us-east-1 --object-ownership BucketOwnerEnforced
```

**重要**  
如果您在使用 AWS CLI 创建存储桶时未设置对象所有权，则默认设置将为 `ObjectWriter`（启用 ACL）。

## 使用适用于 Java 的 AWS 软件开发工具包
<a name="object-ownership-new-bucket-sdk-java"></a>

下面的例子使用 适用于 Java 的 AWS SDK 为新存储桶设置了强制存储桶拥有者设置：

```
    // Build the ObjectOwnership for CreateBucket
    CreateBucketRequest createBucketRequest = CreateBucketRequest.builder()
            .bucket(bucketName)
            .objectOwnership(ObjectOwnership.BucketOwnerEnforced)
            .build()

     // Send the request to Amazon S3 
     s3client.createBucket(createBucketRequest);
```

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

要在创建新存储桶时使用 `AWS::S3::Bucket` CloudFormation 资源以设置对象所有权，请参阅《AWS CloudFormation 用户指南》**中的 [AWS::S3::Bucket 中的 OwnershipControls](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-ownershipcontrols)。

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

要为 S3 对象所有权应用强制存储桶拥有者设置，请使用 `x-amz-object-ownership` 请求标头设置为 `BucketOwnerEnforced` 的 `CreateBucket` API 操作。有关信息和示例，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.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。