

# 为您的存储桶控制对象所有权和禁用 ACL。
<a name="about-object-ownership"></a>

S3 对象所有权是 Amazon S3 存储桶级别的设置，您可以使用该设置来控制上传到存储桶的对象的所有权并禁用或启用[访问控制列表（ACL）](acl-overview.md)。默认情况下，对象所有权设为强制存储桶拥有者设置，并且所有 ACL 均处于禁用状态。禁用 ACL 后，存储桶拥有者拥有存储桶中的所有对象，并使用访问管理策略来专门管理对数据的访问权限。

Amazon S3 中的大多数现代使用案例不再需要使用 ACL，我们建议您将 ACL 保持为禁用状态，除非有必须单独控制每个对象的访问权限的情况。禁用 ACL 后，您可以使用策略来更轻松地控制对存储桶中每个对象的访问权限，无论是谁将对象上传到存储桶。

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

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

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

对于 S3 中的大多数现代使用案例，我们建议您通过应用强制存储桶拥有者设置，并根据需要使用存储桶策略与账户外的用户共享数据，来将 ACL 保持为禁用状态。这种方法可简化权限管理。您可以在新创建的存储桶和现有存储桶上禁用 ACL。对于新创建的存储桶，默认情况下 ACL 处于禁用状态。如果现有存储桶中已有对象，在禁用 ACL 后，对象和存储桶 ACL 将不再是访问评估的一部分，并且根据策略授予或拒绝访问权限。对于现有存储桶，您可以在禁用 ACL 后随时重新启用它们，并恢复原先存在的存储桶和对象 ACL。

在禁用 ACL 之前，我们建议您查看存储桶策略，以确保它涵盖了您打算在账户外授予对存储桶访问权限的所有方式。禁用 ACL 后，存储桶仅接受未指定 ACL 的 `PUT` 请求或具有存储桶拥有者完全控制 ACL 的 `PUT` 请求，例如 `bucket-owner-full-control` 标准 ACL 或以 XML 表示的此 ACL 的等效形式。支持存储桶拥有者完全控制 ACL 的现有应用程序没有影响。包含其他 ACL 的 `PUT` 请求（例如，向某些 AWS 账户的自定义授权）失败并返回带有错误代码 `AccessControlListNotSupported` 的 `400` 错误。

反之，具有首选存储桶拥有者设置的存储桶将继续接受和遵守存储桶和对象 ACL。有了这个设置，用 `bucket-owner-full-control` 标准的 ACL 编写的新对象将自动归存储桶拥有者而不是对象编写者所有。所有其他 ACL 行为都保持不变。为了要求所有 Amazon S3 `PUT` 操作都包含 `bucket-owner-full-control` 标准的 ACL，您可以[添加一个存储桶策略](ensure-object-ownership.md#ensure-object-ownership-bucket-policy)，该策略只允许使用该 ACL 上传对象。

要查看哪些对象所有权设置应用于您的存储桶，您可以使用 Amazon S3 Storage Lens 存储统计管理工具指标。S3 Storage Lens 存储统计管理工具是一项云存储分析功能，您可以使用它在整个组织范围内了解对象存储的使用情况和活动。有关更多信息，请参阅[使用 S3 Storage Lens 存储统计管理工具查找对象所有权设置](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-access-management.html?icmpid=docs_s3_user_guide_about-object-ownership.html)。

**注意**  
有关将 Amazon S3 Express One Zone 存储类与目录存储桶配合使用的更多信息，请参阅 [S3 Express One Zone](directory-bucket-high-performance.md#s3-express-one-zone) 和[使用目录存储桶](directory-buckets-overview.md)。

## 对象所有权设置
<a name="object-ownership-overview"></a>

此表显示了每个对象所有权设置对 ACL、对象、Object Ownership 和对象上传的影响。


| 设置 | 适用于 | 对 Object Ownership 的影响 | 对 ACL 的影响 | 已接受上传 | 
| --- | --- | --- | --- | --- | 
| 强制存储桶拥有者（默认） | 所有新的和现有对象 | 存储桶拥有者拥有每个对象。 |  ACL 已禁用，不再影响存储桶的访问权限。设置或更新 ACL 的请求失败。然而，我们仍然支持读取 ACL 的请求。 存储桶拥有者拥有完全所有权和控制 对象编写者不再拥有完全的所有权和控制权。  | 使用存储桶拥有者完全控制 ACL 进行上传或未指定 ACL 的上传 | 
| 首选存储桶拥有者 | 新对象 | 如果对象上传包含 bucket-owner-full-control 标准 ACL，存储桶拥有者拥有该对象。使用其他 ACL 上传的对象归写入账户所有。 |  ACL 可以更新并可以授予权限。 如果对象上传包含 `bucket-owner-full-control` 标准 ACL，存储桶拥有者具有完全控制权限，对象编写者不再具有完全控制权限。  | 所有上传项 | 
| 对象编写者 | 新对象 | 对象编写者拥有该对象。 |  ACL 可以更新并可以授予权限。 对象编写者具有完全控制权限。  | 所有上传项 | 

## 通过禁用 ACL 引起的更改
<a name="object-ownership-changes"></a>

当应用对象所有权的强制存储桶拥有者设置时，将禁用 ACL，并且您将自动拥有并完全控制存储桶中的每个对象，而无需执行任何其他操作。强制存储桶拥有者是所有新创建的存储桶的默认设置。应用强制存储桶拥有者设置后，您将看到三个变化：
+ 所有存储桶 ACL 和对象 ACL 都被禁用，这将为您提供作为存储桶拥有者的完全访问权限。当您对存储桶或对象执行读取 ACL 请求时，您将看到仅向存储桶拥有者授予完全访问权限。
+ 作为存储桶拥有者，您自动拥有并完全控制存储桶中的每个对象。
+ ACL 不再影响存储桶的访问权限。因此，您数据的访问控制是基于策略执行的，例如 AWS Identity and Access Management（IAM）[基于身份的策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security_iam_id-based-policy-examples.html)、Amazon S3 [存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)、VPC 端点策略以及 Organizations [服务控制策略（SCP）](https://docs.aws.amazon.com//organizations/latest/userguide/orgs_manage_policies_scps.html)或[资源控制策略（RCP）](https://docs.aws.amazon.com//organizations/latest/userguide/orgs_manage_policies_rcps.html)。

![\[显示当您应用强制存储桶拥有者设置禁用 ACL 时会发生什么情况的图表。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/bucket-owner-enforced.png)


如果您使用 S3 版本控制，则存储桶拥有者拥有并完全控制存储桶中的所有对象版本。应用强制存储桶拥有者设置不会添加对象的新版本。

只有在新对象使用存储桶拥有者完全控制 ACL 或未指定 ACL 时，才能将新对象上传到存储桶。如果指定任何其他 ACL，对象上传将失败。有关更多信息，请参阅 [问题排查](object-ownership-error-responses.md)。

因为以下示例中使用 AWS Command Line Interface（AWS CLI）的 `PutObject` 操作包含 `bucket-owner-full-control` 固有的 ACL，所以目标可以上传至 ACL 禁用的存储桶中。

```
aws s3api put-object --bucket amzn-s3-demo-bucket --key key-name --body path-to-file --acl bucket-owner-full-control
```

因为以下 `PutObject` 操作没有指定 ACL，对于禁用 ACL 的存储桶，它也会成功。

```
aws s3api put-object --bucket amzn-s3-demo-bucket --key key-name --body path-to-file
```

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

**重新启用 ACL**  
您可以随时从强制存储桶拥有者设置更改为另一个对象所有权设置来重新启用 ACL。如果在应用强制存储桶拥有者设置之前使用了对象 ACL 进行权限管理，并且您没有将这些对象 ACL 权限迁移到存储桶策略中，则在重新启用 ACL 后，这些权限将恢复。此外，在应用强制存储桶拥有者设置时写入存储桶的对象仍然归存储桶拥有者所有。

例如，如果您从强制存储桶拥有者设置更改回对象编写者设置，则作为存储桶拥有者，您将不再拥有和完全控制以前由其他 AWS 账户拥有的对象。反之，上传账户将再次拥有这些对象。其他账户拥有的对象使用 ACL 获取权限，因此您不能使用策略向这些对象授予权限。但是，您作为存储桶拥有者，在应用强制存储桶拥有者设置时，仍然拥有写入存储桶的任何对象。这些对象不归对象编写者所有，即使您重新启用 ACL 也是如此。

有关使用 AWS 管理控制台、AWS Command Line Interface（CLI)、REST API 或 AWS SDK 启用和管理 ACL 的说明，请参阅[配置 ACL](managing-acls.md)。

## 禁用 ACL 的先决条件
<a name="object-ownership-considerations"></a>

在为现有存储桶禁用 ACL 之前，请先完成以下先决条件。
+ [查看存储桶和对象 ACL 并迁移 ACL 权限](object-ownership-migrating-acls-prerequisites.md#object-ownership-acl-permissions)

  
+ [识别需要 ACL 进行授权的请求](object-ownership-migrating-acls-prerequisites.md#object-ownership-acl-identify)

  
+ [查看和更新使用 ACL 相关条件密钥的存储桶策略](object-ownership-migrating-acls-prerequisites.md#object-ownership-bucket-policies)

  

## Object Ownership 权限
<a name="object-ownership-permissions"></a>

要应用、更新或删除存储桶的对象所有权设置，您需要 `s3:PutBucketOwnershipControls` 权限。要返回存储桶的对象所有权设置，您需要 `s3:GetBucketOwnershipControls` 权限。有关更多信息，请参阅 [在创建存储桶时设置对象所有权](object-ownership-new-bucket.md) 和 [查看 S3 存储桶的对象所有权设置](object-ownership-retrieving.md)。

## 禁用所有新存储桶的 ACL
<a name="requiring-bucket-owner-enforced"></a>

默认情况下，所有新存储桶都是在应用强制存储桶拥有者设置的情况下创建的，且 ACL 处于禁用状态。我们建议将 ACL 保持为禁用状态。作为一般规则，我们建议您使用基于 S3 资源的策略（存储桶策略和接入点策略）或 IAM 策略进行访问控制，而不是 ACL。策略是一种经过简化，且更灵活的访问控制选项。借助存储桶策略和接入点策略，您可以定义广泛适用于针对 Amazon S3 资源的所有请求的规则。

## 复制和 Object Ownership
<a name="object-ownership-replication"></a>

当您使用 S3 复制，并且源存储桶和目标存储桶由不同的 AWS 账户拥有时，您可以禁用 ACL（对于对象所有权应用强制存储桶拥有者设置），以将副本拥有权更改为拥有目标存储桶的 AWS 账户。此设置模拟现有的所有者覆盖行为，而无需 `s3:ObjectOwnerOverrideToBucketOwner` 权限。在采用强制存储桶拥有者设置的情况下复制到目标存储桶的所有对象都归目标存储桶拥有者所有。有关复制配置的所有者覆盖选项的更多信息，请参阅 [更改副本拥有者](replication-change-owner.md)。

## 设置对象所有权
<a name="object-ownership-setting"></a>

您可以使用 Amazon S3 控制台、AWS CLI、AWS SDK、Amazon S3 REST API 或 AWS CloudFormation 应用对象所有权设置。以下 REST API 和 AWS CLI 命令支持 Object Ownership：


| REST API | AWS CLI | 说明 | 
| --- | --- | --- | 
| [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketOwnershipControls.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketOwnershipControls.html) | [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)  | 为现有 S3 存储桶创建或修改对象所有权设置。 | 
| [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)  | [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/create-bucket.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/create-bucket.html) | 使用创建存储桶 x-amz-object-ownership 请求标头以指定对象所有权设置。 | 
| [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketOwnershipControls.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketOwnershipControls.html)  | [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-ownership-controls.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-ownership-controls.html) | 检索 Amazon S3 存储桶的对象所有权设置。 | 
| [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketOwnershipControls.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketOwnershipControls.html) | [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-bucket-ownership-controls.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-bucket-ownership-controls.html) | 删除 Amazon S3 存储桶的对象所有权设置。 | 

有关应用和使用 Object Ownership 设置的更多信息，请参阅以下主题。

**Topics**
+ [对象所有权设置](#object-ownership-overview)
+ [通过禁用 ACL 引起的更改](#object-ownership-changes)
+ [禁用 ACL 的先决条件](#object-ownership-considerations)
+ [Object Ownership 权限](#object-ownership-permissions)
+ [禁用所有新存储桶的 ACL](#requiring-bucket-owner-enforced)
+ [复制和 Object Ownership](#object-ownership-replication)
+ [设置对象所有权](#object-ownership-setting)
+ [禁用 ACL 的先决条件](object-ownership-migrating-acls-prerequisites.md)
+ [在创建存储桶时设置对象所有权](object-ownership-new-bucket.md)
+ [为现有存储桶设置对象所有权](object-ownership-existing-bucket.md)
+ [查看 S3 存储桶的对象所有权设置](object-ownership-retrieving.md)
+ [禁用所有新存储桶的 ACL 并强制执行 Object Ownership](ensure-object-ownership.md)
+ [问题排查](object-ownership-error-responses.md)

# 禁用 ACL 的先决条件
<a name="object-ownership-migrating-acls-prerequisites"></a>

Amazon S3 中的存储桶访问控制列表（ACL）是一种机制，可让您为 S3 存储桶中的单个对象定义精细权限，并指定哪些 AWS 账户或组可以访问和修改这些对象。Amazon S3 中的大多数现代使用案例不再需要使用 ACL。我们建议您使用 AWS Identity and Access Management（IAM）和存储桶策略来管理访问权限，并将 ACL 保持为禁用状态，除非有需要单独控制每个对象的访问权限的情况。

如果您在存储桶上启用了 ACL，则在禁用 ACL 之前，请完成以下先决条件：

**Topics**
+ [查看存储桶和对象 ACL 并迁移 ACL 权限](#object-ownership-acl-permissions)
+ [识别需要 ACL 进行授权的请求](#object-ownership-acl-identify)
+ [查看和更新使用 ACL 相关条件密钥的存储桶策略](#object-ownership-bucket-policies)
+ [使用案例示例](#object-ownership-migrating-acls)

## 查看存储桶和对象 ACL 并迁移 ACL 权限
<a name="object-ownership-acl-permissions"></a>

禁用 ACL 时，存储桶和对象 ACL 授予的权限不再影响访问。在禁用 ACL 之前，请查看存储桶和对象 ACL。

您现有的每个存储桶和对象 ACL 在 IAM 策略中都有等效的。下面的存储桶策略示例向您演示存储桶和对象 ACL 的 `READ` 和 `WRITE` 权限如何映射到 IAM 权限。有关如何将每个 ACL 转换为 IAM 权限的更多信息，请参阅 [ACL 权限和访问策略权限的映射](acl-overview.md#acl-access-policy-permission-mapping)。

在禁用 ACL 之前：
+ 如果存储桶 ACL 授予您 AWS 账户之外的访问权限，首先必须将存储桶 ACL 权限迁移到存储桶策略中。
+ 接下来，将存储桶 ACL 重置为默认的私有 ACL。
+ 我们还建议您查看对象级 ACL 权限并将其迁移到存储桶策略中。

如果存储桶 ACL 向账户以外的其他人授予读取或写入权限，在可以禁用 ACL 之前，必须将这些权限迁移到存储桶策略。迁移这些权限后，可以将**对象所有权**设置为*强制存储桶拥有者*设置。如果您不迁移在账户之外授予读取或写入访问权限的存储桶 ACL，则应用强制存储桶拥有者设置的请求将失败，并返回 [InvalidBucketAclWithObjectOwnership](object-ownership-error-responses.md#object-ownership-error-responses-invalid-acl) 错误代码。

如果您的存储桶 ACL 授予 AWS 账户 以外的访问权限，在禁用 ACL 之前，您必须将存储桶 ACL 权限迁移到存储桶策略中，然后将存储桶 ACL 重置为默认私有 ACL。如果不迁移和重置，则应用强制存储桶拥有者设置来禁用 ACL 的请求将失败，并返回 [InvalidBucketAclWithObjectOwnership](object-ownership-error-responses.md#object-ownership-error-responses-invalid-acl) 错误代码。我们还建议您查看对象 ACL 权限并将其迁移到存储桶策略中。

要查看 ACL 权限并将其迁移至存储桶策略，请参阅以下主题。

**Topics**
+ [存储桶策略示例](#migrate-acl-permissions-bucket-policies)
+ [使用 S3 控制台查看和迁移 ACL 权限](#review-migrate-acl-console)
+ [使用 AWS CLI 查看和迁移 ACL 权限](#review-migrate-acl-cli)

### 存储桶策略示例
<a name="migrate-acl-permissions-bucket-policies"></a>

这些示例存储桶策略将为您显示如何针对第三方 AWS 账户 将 `READ` 和 `WRITE` 存储桶和对象 ACL 权限迁移至存储桶策略，对于策略，`READ_ACP` 和 `WRITE_ACP` ACL 相关性较小，这是因为其授予 ACL 相关的权限（`s3:GetBucketAcl`、`s3:GetObjectAcl`、`s3:PutBucketAcl` 和`s3:PutObjectAcl`）。

**Example – 存储桶的 `READ` ACL**  
如果您的存储桶具有 `READ` ACL 来向 AWS 账户 `111122223333` 授予列出存储桶内容的权限，则您可以编写授予对存储桶的 `s3:ListBucket`、`s3:ListBucketVersions`、`s3:ListBucketMultipartUploads` 权限的存储桶策略。    
****  

```
{
		"Version":"2012-10-17",		 	 	 
		"Statement": [
			{
				"Sid": "Permission to list the objects in a bucket",
				"Effect": "Allow",
				"Principal": {
					"AWS": [

						"arn:aws:iam::111122223333:root"
					]
				},
				"Action": [
					"s3:ListBucket",
					"s3:ListBucketVersions",
					"s3:ListBucketMultipartUploads"
				],
				"Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
			}
		]
	}
```

**Example – 存储桶中每个对象的 `READ` ACL**  
如果存储桶中的每个对象都有向 AWS 账户 `111122223333` 授予访问权限的 `READ` ACL，则您可以编写存储桶策略，以便为存储桶中的每个对象授予对此账户的 `s3:GetObject` 和 `s3:GetObjectVersion` 权限。    
****  

```
{
		"Version":"2012-10-17",		 	 	 
		"Statement": [
			{
				"Sid": "Read permission for every object in a bucket",
				"Effect": "Allow",
				"Principal": {
					"AWS": [
						"arn:aws:iam::111122223333:root"
					]
				},
				"Action": [
					"s3:GetObject",
					"s3:GetObjectVersion"
				],
				"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
			}
		]
	}
```
此示例资源元素授予对特定对象的访问权限。  

```
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/OBJECT-KEY"
```

**Example – 授予将对象写入存储桶的权限的 `WRITE` ACL**  
如果您的存储桶具有 `WRITE` ACL 以向 AWS 账户 `111122223333` 授予将对象写入存储桶的权限，则您可以编写授予对存储桶的 `s3:PutObject` 权限的存储桶策略。    
****  

```
{
		"Version":"2012-10-17",		 	 	 
		"Statement": [
			{
				"Sid": "Permission to write objects to a bucket",
				"Effect": "Allow",
				"Principal": {
					"AWS": [
						"arn:aws:iam::111122223333:root"
					]
				},
				"Action": [
					"s3:PutObject"
				],
				"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
			}
		]
	}
```

### 使用 S3 控制台查看和迁移 ACL 权限
<a name="review-migrate-acl-console"></a>

**查看存储桶的 ACL 权限**

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

1. 在 **Buckets（存储桶）**列表中，请选择存储桶名称。

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

1. 在 **Access control list（ACL）**（访问控制列表）中，查看您的存储桶 ACL 权限。

**查看对象的 ACL 权限**

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

1. 在 **Bucket**（存储桶）列表中，选择包含对象的存储桶名称。

1. 在 **Objects（对象）**列表中，请选择对象名称。

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

1. 在 **Access control list (ACL)**（访问控制列表）中，查看您的对象 ACL 权限。

**要迁移 ACL 权限并更新存储桶 ACL**

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

1. 在 **Buckets（存储桶）**列表中，请选择存储桶名称。

1. 在 **Permissions**（权限）标签页中，在 **Bucket policy**（存储桶策略）下，请选择 **Edit**（编辑）。

1. 在 **Policy**（策略）框中添加或更新存储桶策略。

   有关示例存储桶策略，请参阅 [存储桶策略示例](#migrate-acl-permissions-bucket-policies) 和 [使用案例示例](#object-ownership-migrating-acls)。

1. 选择**保存更改**。

1. [更新存储桶 ACL](managing-acls.md)以移除授予其他组或 AWS 账户 的 ACL。

1. 为对象所有权[应用**强制存储桶拥有者**设置](object-ownership-existing-bucket.md)。

### 使用 AWS CLI 查看和迁移 ACL 权限
<a name="review-migrate-acl-cli"></a>

1. 要返回存储桶的存储桶 ACL，请使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-acl.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-acl.html) AWS CLI 命令：

   ```
   aws s3api get-bucket-acl --bucket amzn-s3-demo-bucket
   ```

   例如，此存储桶 ACL 授予 `WRITE` 和 `READ` 访问第三方账户。在此 ACL 中，第三方账户由 [canonical user ID](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html#FindCanonicalId)（规范的用户 ID）识别。要应用强制存储桶拥有者设置并禁用 ACL，您必须将第三方账户的这些权限迁移到存储桶策略。

   ```
   {
   		"Owner": {
   			"ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID"
   		},
   		"Grants": [
   			{
   				"Grantee": {
   					"ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID",
   					"Type": "CanonicalUser"
   				},
   				"Permission": "FULL_CONTROL"
   			},
   			{
   				"Grantee": {
   					"ID": "72806de9d1ae8b171cca9e2494a8d1335dfced4ThirdPartyAccountCanonicalUserID",
   					"Type": "CanonicalUser"
   				},
   				"Permission": "READ"
   			},
   			{
   				"Grantee": {
   					"ID": "72806de9d1ae8b171cca9e2494a8d1335dfced4ThirdPartyAccountCanonicalUserID",
   					"Type": "CanonicalUser"
   				},
   				"Permission": "WRITE"
   			}
   		]
   	}
   ```

   有关其他示例 ACL，请参阅 [使用案例示例](#object-ownership-migrating-acls)。

1. 将存储桶 ACL 权限迁移到存储桶策略：

   此示例存储桶策略为第三方账户授予 `s3:PutObject` 和 `s3:ListBucket` 权限。在存储桶策略中，第三方账户由 AWS 账户 ID（`111122223333`）标识。

   ```
   aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://policy.json
   
   	policy.json:
   	{
   		"Version": "2012-10-17",		 	 	 
   		"Statement": [
   			{
   				"Sid": "PolicyForCrossAccountAllowUpload",
   				"Effect": "Allow",
   				"Principal": {
   					"AWS": [
   						"arn:aws:iam::111122223333:root"
   					]
   				},
   				"Action": [
   					"s3:PutObject",
   					"s3:ListBucket"
   				],
   				"Resource": [
   					"arn:aws:s3:::amzn-s3-demo-bucket",
   					"arn:aws:s3:::amzn-s3-demo-bucket/*"
   			}
   		]
   	}
   ```

   有关更多示例存储桶策略，请参阅 [存储桶策略示例](#migrate-acl-permissions-bucket-policies) 和 [使用案例示例](#object-ownership-migrating-acls)。

1. 要返回特定对象的 ACL，请使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-object-acl.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-object-acl.html) AWS CLI 命令。

   ```
   aws s3api get-object-acl --bucket amzn-s3-demo-bucket --key EXAMPLE-OBJECT-KEY
   ```

1. 如果需要，请将对象 ACL 权限迁移到存储桶策略中。

   此示例资源元素授予对存储桶策略中特定对象的访问权限。

   ```
   "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/EXAMPLE-OBJECT-KEY"
   ```

1. 将存储桶的 ACL 重置为默认的 ACL。

   ```
   aws s3api put-bucket-acl --bucket amzn-s3-demo-bucket --acl private
   ```

1. 为对象所有权[应用强制存储桶拥有者设置](object-ownership-existing-bucket.md)。

## 识别需要 ACL 进行授权的请求
<a name="object-ownership-acl-identify"></a>

要识别需要 ACL 进行授权的 Amazon S3 请求，您可以使用 Amazon S3 服务器访问日志或 AWS CloudTrail 中的 `aclRequired` 值。如果请求需要 ACL 进行授权，或者如果您具有指定 ACL 的 `PUT` 请求，则字符串为 `Yes`。如果不需要 ACL，或者您正在设置 `bucket-owner-full-control` 标准 ACL，或者如果您的存储桶策略允许请求，则 Amazon S3 服务器访问日志中的 `aclRequired` 值字符串为“`-`”，但 CloudTrail 中不存在该值字符串。有关预期 `aclRequired` 值的更多信息，请参阅[常见 Amazon S3 请求的 `aclRequired` 值](acl-overview.md#aclrequired-s3)。

如果您的 `PutBucketAcl` 或 `PutObjectAcl` 请求的标头授予基于 ACL 的权限（`bucket-owner-full-control` 标准 ACL 除外），则必须先删除这些标头，然后才能禁用 ACL。否则，您的请求将失败。

对于需要 ACL 进行授权的所有其他请求，请将这些 ACL 权限迁移到存储桶策略。然后，在启用强制存储桶拥有者设置之前，删除所有存储桶 ACL。

**注意**  
请勿删除对象 ACL。否则，依赖于对象 ACL 获取权限的应用程序将失去访问权限。

如果您发现没有请求需要 ACL 进行授权，则可以继续禁用 ACL。有关识别请求的更多信息，请参阅[使用 Amazon S3 服务器访问日志来确定请求](using-s3-access-logs-to-identify-requests.md)和[使用 CloudTrail 识别 Amazon S3 请求](cloudtrail-request-identification.md)。

## 查看和更新使用 ACL 相关条件密钥的存储桶策略
<a name="object-ownership-bucket-policies"></a>

应用强制存储桶拥有者设置以禁用 ACL 后，只有在请求使用存储桶拥有者完全控制 ACL 或未指定 ACL 的情况下，才能将新对象上传到存储桶。在禁用 ACL 之前，请查看存储桶策略以了解 ACL 相关的条件密钥。

如果您的存储桶策略使用 ACL 相关的条件密钥来要求 `bucket-owner-full-control` 储存的 ACL（例如，`s3:x-amz-acl`），您无需更新存储桶策略。以下存储桶策略使用 `s3:x-amz-acl` 以要求 `bucket-owner-full-control` 储存的 ACL 用于 S3 `PutObject` 请求。这项策略*仍旧*要求对象编写者指定 `bucket-owner-full-control` 标准的 ACL。但是，禁用 ACL 的存储桶仍然接受此 ACL，因此请求将继续成功，无需客户端更改。

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

------

但是，如果您的存储桶策略使用的是要求不同 ACL 的 ACL 相关条件密钥，则必须移除此条件密钥。此示例存储桶策略要求 `public-read` ACL 用于 S3 `PutObject` 请求，因此必须在禁用 ACL 之前进行更新。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Only allow writes to my bucket with public read access",
            "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": "public-read"
                }
            }
        }
    ]
}
```

------

## 使用案例示例
<a name="object-ownership-migrating-acls"></a>

以下示例向您演示如何针对特定使用案例将 ACL 权限迁移到存储桶策略。

**Topics**
+ [为服务器访问日志记录授予对 S3 日志传输组的访问权限](#object-ownership-server-access-logs)
+ [授予存储桶中对象的公共读取访问权限。](#object-ownership-public-read)
+ [授予 Amazon ElastiCache（Redis OSS）对 Amazon S3 存储桶的访问权限](#object-ownership-elasticache-redis)

### 为服务器访问日志记录授予对 S3 日志传输组的访问权限
<a name="object-ownership-server-access-logs"></a>

如果要应用强制存储桶拥有者设置以便对服务器访问日志记录目标存储桶（也称作*目标存储桶*）禁用 ACL，必须将 S3 日志传输组的存储桶 ACL 权限迁移到存储桶策略中的日志记录服务主体（`logging.s3.amazonaws.com`）。有关日志交付权限的更多信息，请参阅 [日志传输的权限](enable-server-access-logging.md#grant-log-delivery-permissions-general)。

此存储桶 ACL 授予 `WRITE` 和 `READ_ACP` 访问 S3 日志传输组的权限：

```
{
    "Owner": {
        "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID"
    }, 
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser", 
                "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID"
            }, 
            "Permission": "FULL_CONTROL"
        }, 
        {
            "Grantee": {
                "Type": "Group", 
                "URI": "http://acs.amazonaws.com/groups/s3/LogDelivery"
            }, 
            "Permission": "WRITE"
        }, 
        {
            "Grantee": {
                "Type": "Group", 
                "URI": "http://acs.amazonaws.com/groups/s3/LogDelivery"
            }, 
            "Permission": "READ_ACP"
        }
    ]
}
```

**将 S3 日志传输组的存储桶 ACL 权限迁移到存储桶策略中的日志录入服务主体**

1. 将以下存储桶策略添加到目标存储桶，并替换示例值。

   ```
   aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://policy.json
   
   policy.json:						{
       {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "S3ServerAccessLogsPolicy",
               "Effect": "Allow",
               "Principal": {
                   "Service": "logging.s3.amazonaws.com"
               },
               "Action": [
                   "s3:PutObject"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/EXAMPLE-LOGGING-PREFIX*",
               "Condition": {
                   "ArnLike": {
                       "aws:SourceArn": "arn:aws:s3:::SOURCE-BUCKET-NAME"
                   },
                   "StringEquals": {
                       "aws:SourceAccount": "SOURCE-AWS-ACCOUNT-ID"
                   }
               }
           }
       ]
   }
   ```

1. 将目标存储桶的 ACL 重置为默认 ACL。

   ```
   aws s3api put-bucket-acl --bucket amzn-s3-demo-bucket --acl private
   ```

1. 为目标存储桶的对象所有权[应用强制存储桶拥有者设置](object-ownership-existing-bucket.md)。

### 授予存储桶中对象的公共读取访问权限。
<a name="object-ownership-public-read"></a>

如果您的对象 ACL 授予对存储桶中所有对象的公共读取访问权限，则可以将这些 ACL 权限迁移到存储桶策略。

此对象 ACL 授予对存储桶中对象的公共读取访问权限：

```
{
    "Owner": {
        "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID"
    },
    "Grants": [
        {
            "Grantee": {
                "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        },
        {
            "Grantee": {
                "Type": "Group",
                "URI": "http://acs.amazonaws.com/groups/global/AllUsers"
            },
            "Permission": "READ"
        }
    ]
}
```

**要将公共读取 ACL 权限迁移到存储桶策略**

1. 要向存储桶中的所有对象授予公有读取权限，请添加以下存储桶策略，替换示例值。

   ```
   aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://policy.json
   
   policy.json:
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "PublicReadGetObject",
               "Effect": "Allow",
               "Principal": "*",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket/*"
               ]
           }
       ]
   }
   ```

   要授予对存储桶策略中特定对象的公共访问权限，请使用以下 `Resource` 元素的格式。

   ```
   "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/OBJECT-KEY"
   ```

   要使用特定的前缀授予对所有对象的公共访问权，请使用以下 `Resource` 元素的格式。

   ```
   "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/PREFIX/*"
   ```

1. 为对象所有权[应用强制存储桶拥有者设置](object-ownership-existing-bucket.md)。

### 授予 Amazon ElastiCache（Redis OSS）对 Amazon S3 存储桶的访问权限
<a name="object-ownership-elasticache-redis"></a>

您可以[将 ElastiCache（Redis OSS）备份导出](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/backups-exporting.html)到 S3 存储桶中，这样您就可以从 ElastiCache 外部访问备份。要将备份导出到 S3 存储桶，您必须授予 ElastiCache 权限，以便将快照复制到存储桶。如果您已在存储桶 ACL 中授予了对 ElastiCache 的权限，则必须在应用强制存储桶拥有者设置以禁用 ACL 之前将这些权限迁移到存储桶策略。有关更多信息，请参阅 *Amazon ElastiCache User Guide*（Amazon ElastiCache 用户指南）中的 [Grant ElastiCache access to your Amazon S3 存储桶](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/backups-exporting.html#backups-exporting-grant-access)（授予 ElastiCache 访问 Amazon S3 存储桶的权限）。

以下示例显示了向 ElastiCache 授予权限的存储桶 ACL 权限。

```
{
    "Owner": {
        "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID"
    },
    "Grants": [
        {
            "Grantee": {
                "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        },
        {
            "Grantee": {
                "ID": "540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353",
                "Type": "CanonicalUser"
            },
            "Permission": "READ"
        },
        {
            "Grantee": {
                "ID": "540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353",
                "Type": "CanonicalUser"
            },
            "Permission": "WRITE"
        },
        {
            "Grantee": {
                "ID": "540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353",
                "Type": "CanonicalUser"
            },
            "Permission": "READ_ACP"
        }
    ]
}
```

**将用于 ElastiCache（Redis OSS）的存储桶 ACL 权限迁移到存储桶策略**

1. 将以下存储桶策略添加到存储桶，替换示例值。

   ```
   aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://policy.json
   
   policy.json:
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Stmt15399483",
               "Effect": "Allow",
               "Principal": {
                   "Service": "Region.elasticache-snapshot.amazonaws.com"
               },
               "Action": [
                   "s3:PutObject",
                   "s3:GetObject",
                   "s3:ListBucket",
                   "s3:GetBucketAcl",
                   "s3:ListMultipartUploadParts",
                   "s3:ListBucketMultipartUploads"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket",
                   "arn:aws:s3:::amzn-s3-demo-bucket/*"
               ]
           }
       ]
   }
   ```

1. 将存储桶的 ACL 重置为默认的 ACL：

   ```
   aws s3api put-bucket-acl --bucket amzn-s3-demo-bucket --acl private
   ```

1. 为对象所有权[应用强制存储桶拥有者设置](object-ownership-existing-bucket.md)。

# 在创建存储桶时设置对象所有权
<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。

# 为现有存储桶设置对象所有权
<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 写入存储桶的新对象。
+ **对象编写者**— 该 AWS 账户上传对象拥有该对象，对其拥有完全控制权，并且可以通过 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.aws.amazon.com/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. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

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

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

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

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

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

     要通过使用 IAM 或 AWS 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 上传。
   + **对象编写者**— 该 AWS 账户上传对象拥有该对象，对其拥有完全控制权，并且可以通过 ACL 授予其他用户访问该对象的权限。

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

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

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

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

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

有关 `put-bucket-ownership-controls` 的信息，请参阅《AWS 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 的 AWS SDK
<a name="object-ownership-existing-bucket-sdk-java"></a>

此示例使用 适用于 Java 的 AWS 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);
```

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

要使用 CloudFormation 以便为现有存储桶应用对象所有权设置，请参阅《AWS CloudFormation 用户指南》**中的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ownershipcontrols.html](https://docs.aws.amazon.com/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.aws.amazon.com/AmazonS3/latest/API/API_PutBucketOwnershipControls.html](https://docs.aws.amazon.com/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。

# 查看 S3 存储桶的对象所有权设置
<a name="object-ownership-retrieving"></a>

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 授予其他用户访问该对象的权限。

查看 Amazon S3 存储桶的对象所有权设置。要为新的存储桶设置对象所有权，请参阅 [在创建存储桶时设置对象所有权](object-ownership-new-bucket.md)。要为现有存储桶设置对象所有权，请参阅 [为现有存储桶设置对象所有权](object-ownership-existing-bucket.md)。

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

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

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

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

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

1. 在 **Object Ownership**（对象所有权）下方，您可以查看存储桶的对象所有权设置。

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

要检索 S3 存储桶的 S3 对象所有权设置，请使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-ownership-controls.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-ownership-controls.html) AWS CLI 命令。

```
aws s3api get-bucket-ownership-controls --bucket amzn-s3-demo-bucket
```

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

要检索 S3 存储桶的 Object Ownership 设置，请使用 `GetBucketOwnershipControls` API 操作。有关更多信息，请参阅 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketOwnershipControls.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketOwnershipControls.html)。

# 禁用所有新存储桶的 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)。

# 问题排查
<a name="object-ownership-error-responses"></a>

在应用 S3 对象所有权的强制存储桶拥有者设置时，访问控制列表（ACL）将被禁用，作为存储桶拥有者的您将自动拥有存储桶中的所有对象。ACL 不再影响存储桶中对象的权限。您可使用策略授予权限。所有 S3 `PUT` 请求都必须指定 `bucket-owner-full-control` 标准 ACL 或不指定 ACL，否则这些请求将失败。有关更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

如果指定了无效的 ACL 或存储桶 ACL 权限授予 AWS 账户 外部的访问权限，您可能会看到以下错误响应。

## AccessControlListNotSupported
<a name="object-ownership-error-responses-acl-not-supported"></a>

为对象所有权应用强制存储桶拥有者设置之后，将禁用 ACL。设置 ACL 或更新 ACL 的请求失败，并显示 `400` 错误，并返回 AccessControlListNotSupported 错误代码。仍然支持读取 ACL 的请求。读取 ACL 的请求始终返回一个响应，显示对存储桶拥有者的完全控制权。在 `PUT` 操作中，您必须指定存储桶拥有者完全控制 ACL 或不指定 ACL。否则，您的 `PUT` 操作将失败。

以下示例 `put-object` AWS CLI 命令包括 `public-read` 标准 ACL。

```
aws s3api put-object --bucket amzn-s3-demo-bucket --key object-key-name --body doc-example-body --acl public-read
```

如果存储桶使用强制存储桶拥有者设置来禁用 ACL，则此操作将失败，上传者会收到以下错误消息：

调用 PutObject 操作时发生错误（AccessControlListNotSupported）：存储桶不允许 ACL

## InvalidBucketAclWithObjectOwnership
<a name="object-ownership-error-responses-invalid-acl"></a>

如果您想应用强制存储桶拥有者设置来禁用 ACL，则存储桶 ACL 必须仅向存储桶拥有者提供完全控制权。您的存储桶 ACL 无法访问外部 AWS 账户 或任何其他团体。例如，如果您的 `CreateBucket` 请求设置强制存储桶拥有者并指定一个存储桶 ACL，用于提供对外部 AWS 账户的访问权限，您的请求会失败并显示 `400` 错误，并且返回 InvalidBucketAclWithObjectOwnership 错误代码。同样，如果您的 `PutBucketOwnershipControls` 请求对于具有存储桶 ACL（可向其他人授予权限）的存储桶设置强制存储桶拥有者，请求将失败。

**Example ：授予存储桶 ACL 公有读取访问权限。**  
例如，如果现有存储桶 ACL 授予公共读取访问权限，则在将这些 ACL 权限迁移到存储桶策略并将存储桶 ACL 重置为默认私有 ACL 之前，您无法对于对象所有权应用强制存储桶拥有者设置。有关更多信息，请参阅 [禁用 ACL 的先决条件](object-ownership-migrating-acls-prerequisites.md)。  
此示例存储桶 ACL 授予公共读取访问权限：  

```
{
    "Owner": {
        "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID"
    },
    "Grants": [
        {
            "Grantee": {
                "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        },
        {
            "Grantee": {
                "Type": "Group",
                "URI": "http://acs.amazonaws.com/groups/global/AllUsers"
            },
            "Permission": "READ"
        }
    ]
}
```
以下示例 `put-bucket-ownership-controls` AWS CLI 命令对于对象所有权应用强制存储桶拥有者设置：  

```
aws s3api put-bucket-ownership-controls --bucket amzn-s3-demo-bucket --ownership-controls Rules=[{ObjectOwnership=BucketOwnerEnforced}]
```
由于存储桶 ACL 授予公共读取访问权限，因此请求失败并返回以下错误代码：  
调用 PutBucketOwnershipControls 操作时发生错误（InvalidBucketAclWithObjectOwnership）：存储桶不能含有带有 ObjectOwnership's BucketOwnerEnforced 设置的 ACL