

# Amazon S3 中的访问控制
<a name="access-management"></a>

在 Amazon 中，资源是您可使用的实体。在 Amazon Simple Storage Service（S3）中，*存储桶*和*对象*是最初的 Amazon S3 资源。每个 S3 客户可能都有包含对象的存储桶。当有新功能添加到 S3 时，则会添加额外的资源，但并非每个客户都使用这些特定于功能的资源。有关 Amazon S3 资源的更多信息，请参阅 [S3 资源](#access-management-resources)。

默认情况下，所有 Amazon S3 资源都是私有的。此外，默认情况下，创建资源的 Amazon Web Services 账户的根用户（资源拥有者）和该账户中具有必要权限的 IAM 用户可以访问他们创建的资源。资源拥有者决定还有谁可以访问该资源以及允许其他人对该资源执行哪些操作。S3 有各种访问管理工具，您可以使用这些工具向其他人授予对您的 S3 资源的访问权限。

以下各节概述了 S3 资源、可用的 S3 访问管理工具以及每种访问管理工具的最佳使用案例。这些章节中的列表力求全面，旨在包括所有 S3 资源、访问管理工具和常见的访问管理使用案例。同时，这些章节设计成目录，可引导您找到所需的技术细节。如果您对以下某些主题有很好的理解，则可以跳到适用于您的章节。

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

**主题**
+ [S3 资源](#access-management-resources)
+ [身份](#access-management-owners)
+ [访问管理工具](#access-management-tools)
+ [操作](#access-management-actions)
+ [访问管理使用案例](#access-management-usecases)
+ [访问管理故障排除](#access-management-troubleshooting)

## S3 资源
<a name="access-management-resources"></a>

原始 Amazon S3 资源是存储桶及其中包含的对象。随着向 S3 添加新功能，也会添加新的资源。以下是 S3 资源及相应功能的完整列表。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/access-management.html)

**桶**  
Amazon S3 存储桶有两种类型：*通用型存储桶* 和*目录存储桶*。
+ **通用存储桶**是最初的 S3 存储桶类型，建议用于大多数使用案例和访问模式。通用存储桶还允许跨所有存储类（S3 Express One Zone 除外）存储对象。有关 S3 存储类的更多信息，请参阅[了解和管理 Amazon S3 存储类](storage-class-intro.md)。
+ **目录存储桶**使用 S3 Express 单区存储类，如果您的应用程序注重性能，并且受益于个位数毫秒的 `PUT` 和 `GET` 延迟，则建议使用该存储类。有关更多信息，请参阅 [使用目录存储桶](directory-buckets-overview.md)、[S3 Express One Zone](directory-bucket-high-performance.md#s3-express-one-zone) 和 [使用 IAM 对区域端点 API 操作进行授权](s3-express-security-iam.md)。

**对 S3 资源进行分类**  
Amazon S3 提供了对您的 S3 资源进行分类和整理的功能。对资源进行分类不仅对整理资源很有用，还可以根据资源类别设置访问管理规则。特别是，前缀和标记是设置访问管理权限时可以使用的两个存储整理功能。

**注意**  
以下信息适用于通用型存储桶。目录存储桶不支持标记，并且有前缀限制。有关更多信息，请参阅 [使用 IAM 对区域端点 API 操作进行授权](s3-express-security-iam.md)。
+ **前缀** – Amazon S3 中的前缀是对象键名称开头的一个字符串，用于整理存储在 S3 存储桶中的对象。您可以使用分隔符 [例如正斜杠（`/`）] 来表示对象键名称中前缀的结尾。例如，您可能有以 `engineering/` 前缀开头的对象键名称或以 `marketing/campaigns/` 前缀开头的对象键名称。在前缀末尾使用分隔符（例如正斜杠字符 `/`）可以模拟文件夹和文件命名约定。但是，在 S3 中，前缀是对象键名称的一部分。在通用型 S3 存储桶中，没有实际的文件夹层次结构。

  Amazon S3 支持使用对象的前缀对于对象进行整理和分组。您还可以通过对象的前缀管理对于对象的访问权限。例如，您可以将访问权限限制为仅限名称以特定前缀开头的对象。

  有关更多信息，请参阅 [使用前缀组织对象](using-prefixes.md)。S3 控制台使用*文件夹* 的概念，在通用型存储桶中，文件夹本质上是附加在对象键名称之前的前缀。有关更多信息，请参阅 [使用文件夹在 Amazon S3 控制台中整理对象](using-folders.md)。
+ **标签** – 每个标签都是您分配给资源的键值对。例如，您可以使用标签 `topicCategory=engineering` 标记某些资源。您可以使用标记来协助进行成本分配、分类和整理以及访问控制。存储桶标记仅用于成本分配。您可以标记对象、Storage Lens 存储分析功能、任务和 S3 Access Grants，以便进行整理或实施访问控制。在 S3 Access Grants 中，您还可以使用标记进行成本分配。举个使用标签控制资源访问权限的示例，您只能共享具有特定标签或标签组合的对象。

  有关更多信息，请参阅《IAM 用户指南》**中的[使用资源标签控制对 Amazon 资源的访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html)。

## 身份
<a name="access-management-owners"></a>

在 Amazon S3 中，资源拥有者是创建资源（例如存储桶或对象）的身份。默认情况下，只有创建资源的账户的根用户和该账户中具有所需权限的 IAM 身份才能访问 S3 资源。资源拥有者可以向其它身份授予对其 S3 资源的访问权限。

不拥有资源的身份可以请求访问该资源。对资源的请求已经过身份验证或未经过身份验证。经过身份验证的请求必须包含可验证请求发送者身份的签名值，但未经身份验证的请求不需要签名。我们建议您仅向经过身份验证的用户授予访问权限。有关请求身份验证的更多信息，请参阅《Amazon S3 API 参考》**中的 [Making requests](https://docs.amazonaws.cn/AmazonS3/latest/API/MakingRequests.html)。

**重要**  
我们建议不要使用 Amazon Web Services 账户根用户凭证发起经过身份验证的请求。而应创建一个 IAM 角色并授予该角色完全访问权限。我们将具有此角色的用户称为*管理员用户*。您可以使用分配给管理员角色的用户凭证而不是 Amazon Web Services 账户 根用户凭证来与 Amazon 交互和执行任务，例如创建存储桶、创建用户以及授予权限。有关更多信息，请参阅《Amazon Web Services 一般参考》**中的 [Amazon Web Services 账户 根用户凭证和 IAM 用户凭证](https://docs.amazonaws.cn/general/latest/gr/root-vs-iam.html)，并参阅《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)。

在 Amazon S3 中访问您的数据的身份可以是以下身份之一：

**Amazon Web Services 账户拥有者**  
创建资源的 Amazon Web Services 账户。例如，创建存储桶的账户。此账户是该资源的拥有者。有关更多信息，请参阅 [Amazon 账户根用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_root-user.html)。

**与 Amazon Web Services 账户拥有者同属一个账户的 IAM 身份**  
在为需要 S3 访问权限的新团队成员设置账户时，Amazon Web Services 账户拥有者可以使用 Amazon Identity and Access Management（IAM）来创建[用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users.html)、[组](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_groups.html)和[角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)。然后，Amazon Web Services 账户拥有者可以与这些 IAM 身份共享资源。账户拥有者还可以指定要向 IAM 身份授予的权限，这些权限允许或拒绝可以对共享资源执行的操作。

IAM 身份提供了增强的功能，包括要求用户在访问共享资源之前先输入登录凭证的功能。通过使用 IAM 身份，您可以实施一种形式的 IAM 多重身份验证（MFA）来支持强大的身份基础。IAM 最佳实践是创建用于访问管理的角色，而不是向每个单独用户授予权限。您可以将各个用户分配给相应的角色。有关更多信息，请参阅 [IAM 安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)。

**其它 Amazon 账户拥有者及其 IAM 身份（跨账户存取）**  
Amazon Web Services 账户拥有者还可以向其它 Amazon 账户拥有者或属于其它 Amazon 账户的 IAM 身份授予对资源的访问权限。

**注意**  
**权限委托** – 如果某个 Amazon Web Services 账户拥有一项资源，则该账户可以将这些权限授予其它 Amazon Web Services 账户。然后，这个账户就可以将这些权限或其子集委托给同一账户中的用户。这称为权限委托。但从另一账户接收权限的账户不能“跨账户”向其它 Amazon Web Services 账户委托这些权限。

**匿名用户（公共访问权限）**  
Amazon Web Services 账户拥有者可以公开资源。从技术上讲，公开某资源会与*匿名用户* 共享该资源。除非您更改此设置，否则默认情况下，自 2023 年 4 月以来创建的存储桶会屏蔽所有公共访问权限。我们建议您将存储桶设置为屏蔽公共访问权限，并且仅向经过身份验证的用户授予访问权限。有关屏蔽公共访问权限的更多信息，请参阅[阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。

**Amazon Web Services 服务**  
资源拥有者可以向其它 Amazon 服务授予对 Amazon S3 资源的访问权限。例如，您可以向 Amazon CloudTrail 服务授予将日志文件写入存储桶的 `s3:PutObject` 权限。有关更多信息，请参阅[向 Amazon 服务提供访问权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_common-scenarios_services.html)。

**公司目录身份**  
资源拥有者可以使用 [S3 Access Grants](https://docs.amazonaws.cn/AmazonS3/latest/userguide/access-grants-get-started.html) 向公司目录中的用户或角色授予对 S3 资源的访问权限。有关将公司目录添加到 Amazon IAM Identity Center 的更多信息，请参阅 [What is IAM Identity Center?](https://docs.amazonaws.cn/singlesignon/latest/userguide/what-is.html)

### 存储桶拥有者或资源拥有者
<a name="access-management-owners-rules"></a>

用于创建存储桶和上传对象的 Amazon Web Services 账户拥有这些资源。存储桶拥有者可以向其他 Amazon Web Services 账户（或其他账户中的用户）授予上传对象的跨账户权限。

当存储桶拥有者允许其它账户向存储桶上传对象时，默认情况下，该存储桶拥有者拥有上传到其存储桶的所有对象。但是，如果*强制存储桶拥有者* 和*存储桶拥有者优先* 存储桶设置都处于关闭状态，则上传对象的 Amazon Web Services 账户将拥有这些对象，而存储桶拥有者对其它账户拥有的对象没有权限，但以下情况除外：
+ 账单由存储桶拥有者支付。存储桶拥有者可以拒绝对任何对象的访问，或删除存储桶中的任何对象，而无论它们的拥有者是谁。
+ 存储桶拥有者可以归档任何对象或还原归档的对象，而无论它们的拥有者是谁。归档是指用于存储对象的存储类。有关更多信息，请参阅 [管理对象的生命周期](object-lifecycle-mgmt.md)。

## 访问管理工具
<a name="access-management-tools"></a>

Amazon S3 提供了各种安全功能和工具。以下是这些功能和工具的完整列表。您并不需要所有这些访问管理工具，但必须使用一个或多个工具来授予对您的 Amazon S3 资源的访问权限。正确应用这些工具有助于确保只有目标用户才能访问您的资源。

最常用的访问管理工具是*访问策略*。访问策略可以是附加到 Amazon 资源的*基于资源的策略*，例如存储桶的存储桶策略。访问策略也可以是附加到 Amazon Identity and Access Management（IAM）身份（如 IAM 用户、组或角色）的*基于身份的策略*。编写访问策略来向 Amazon Web Services 账户和 IAM 用户、组和角色授予对资源执行操作的权限。例如，您可以向另一个 Amazon Web Services 账户授予 `PUT Object` 权限，以使该账户可以向您的存储桶上传对象。

访问策略描述了谁可以访问哪些内容。当 Amazon S3 收到请求时，它必须评估所有访问策略，来决定是授权还是拒绝该请求。有关 Amazon S3 如何评估这些策略的更多信息，请参阅 [Amazon S3 如何对请求授权](how-s3-evaluates-access-control.md)。

以下是 Amazon S3 中提供的访问管理工具。

### 存储桶策略
<a name="access-mgmt-bucket-policy"></a>

Amazon S3 存储桶策略是采用 JSON 格式的 [Amazon Identity and Access Management（IAM）基于资源的策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html)，该策略附加到特定的存储桶。使用存储桶策略来向其它 Amazon Web Services 账户或 IAM 身份授予对相应存储桶及其中对象的权限。使用存储桶策略可以满足许多 S3 访问管理使用案例的要求。通过存储桶策略，您可以对存储桶访问权限进行个性化设置，以协助确保只有您已批准的身份才能访问资源并在其中执行操作。有关更多信息，请参阅 [Amazon S3 的存储桶策略](bucket-policies.md)。

下面是一个示例存储桶策略。您可以使用 JSON 文件来表示存储桶策略。此示例策略向 IAM 角色授予对存储桶中所有对象的读取权限。该策略包含一条名为 `BucketLevelReadPermissions` 的语句，该语句允许对名为 `amzn-s3-demo-bucket1` 的存储桶中的对象执行 `s3:GetObject` 操作（读取权限）。通过将 IAM 角色指定为 `Principal`，此策略向具有该角色的任何 IAM 用户授予访问权限。要使用此示例策略，请将 `user input placeholders` 替换为您自己的信息。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid":"BucketLevelReadPermissions",
      "Effect":"Allow",
      "Principal": {
	    "AWS": "arn:aws:iam::123456789101:role/s3-role"
      },
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::amzn-s3-demo-bucket/*"]
    }]
  }
```

------

**注意**  
创建策略时，请避免在 `Principal` 元素中使用通配符（`*`），因为使用通配符将允许任何人访问您的 Amazon S3 资源。而是应显式列出允许访问存储桶的用户或组，或者使用策略中的条件子句列出必须满足的条件。此外，在适用的情况下，向用户或组授予特定的权限，而不是包含通配符来让用户或组执行操作。

### 基于身份的策略
<a name="access-mgmt-id-policy"></a>

基于身份的策略或 IAM 用户策略是一种 [Amazon Identity and Access Management（IAM）策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html)。基于身份的策略是采用 JSON 格式的策略，该策略附加到您的 Amazon 账户中的 IAM 用户、组或角色。您可以使用基于身份的策略，来向 IAM 身份授予对您的存储桶或对象的访问权限。您可以在您的账户中创建 IAM 用户、组和角色，并为其附加访问策略。然后，您可以授予对 Amazon 资源（包括 Amazon S3 资源）的访问权限。有关更多信息，请参阅 [Amazon S3 基于身份的策略](security_iam_id-based-policy-examples.md)。

下面是基于身份的策略的示例。此示例策略允许关联的 IAM 角色对存储桶及其中的对象执行六种不同的 Amazon S3 操作（权限）。如果您将此策略附加到您账户中的 IAM 角色，并将该角色分配给您的某些 IAM 用户，则具有此角色的用户将能够对在策略中指定的资源（存储桶）执行这些操作。要使用此示例策略，请将 `user input placeholders` 替换为您自己的信息。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
  {
    "Sid": "AssignARoleActions",
    "Effect": "Allow",
    "Action": [
	  "s3:PutObject",
	  "s3:GetObject",
	  "s3:ListBucket",
	  "s3:DeleteObject",
	  "s3:GetBucketLocation"
    ],
    "Resource": [
	  "arn:aws:s3:::amzn-s3-demo-bucket/*",
	  "arn:aws:s3:::amzn-s3-demo-bucket"
    ]
    },
  {
    "Sid": "AssignARoleActions2",
    "Effect": "Allow",
    "Action": "s3:ListAllMyBuckets",
    "Resource": "*"
  }
  ]
}
```

------

### S3 访问权限管控
<a name="access-mgmt-s3ag"></a>

使用 S3 Access Grants 为企业身份目录（例如 Active Directory）中的身份以及 Amazon Identity and Access Management（IAM）身份创建对您的 Amazon S3 数据的访问授权。S3 Access Grants 可协助您大规模管理数据权限。此外，S3 Access Grants 还会记录最终用户身份以及用于访问 Amazon CloudTrail 中 S3 数据的应用程序。这提供了详细的审计历史记录，细至与 S3 存储桶中数据的所有访问权限对应的最终用户身份。有关更多信息，请参阅 [使用 S3 Access Grants 管理访问权限](access-grants.md)。

### 接入点
<a name="access-mgmt-ap"></a>

对于使用 S3 上的共享数据集的应用程序，Amazon S3 接入点可简化大规模管理数据访问的事宜。接入点是附加到存储桶的命名网络端点。您可以使用接入点来大规模执行 S3 对象操作，例如上传和检索对象。一个存储桶最多可附加 10000 个接入点，对于每个接入点，您可以强制实施不同的权限和网络控制，从而让您可以详细控制对于 S3 对象的访问权限。S3 接入点可以与同一个账户或其它可信账户中的存储桶相关联。接入点策略是与底层存储桶策略一起进行评估的基于资源的策略。有关更多信息，请参阅 [通过接入点管理对共享数据集的访问](access-points.md)。

### 访问控制列表 (ACL)
<a name="access-mgmt-acl"></a>

ACL 是用于确定被授权者和所授予权限的授权列表。ACL 向其它 Amazon Web Services 账户授予基本的读取或写入权限。ACL 使用特定于 Amazon S3 的 XML 架构。ACL 是一种 [Amazon Identity and Access Management（IAM）策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html)。对象 ACL 用于管理对于对象的访问权限，而存储桶 ACL 用于管理对存储桶的访问权限。使用存储桶策略，整个存储桶只有单个策略，但可以为每个对象指定对象 ACL。我们建议您将 ACL 保持为关闭状态，除非有必须单独控制每个对象的访问权限的情况。有关 ACL 的更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

**警告**  
Amazon S3 中的大多数现代使用案例不需要使用 ACL。

下面是一个示例存储桶 ACL。ACL 中的授权显示一个具有完全控制权限的存储桶拥有者。

```
<?xml version="1.0" encoding="UTF-8"?>
	<AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
		<Owner>
			<ID>Owner-Canonical-User-ID</ID>
		</Owner>
	<AccessControlList>
		<Grant>
			<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Canonical User">
				<ID>Owner-Canonical-User-ID</ID>
			</Grantee>
			<Permission>FULL_CONTROL</Permission>
		</Grant>
	</AccessControlList>
</AccessControlPolicy>
```

### 对象所有权
<a name="access-mgmt-obj-ownership"></a>

要管理对于对象的访问权限，您必须是该对象的拥有者。您可以使用对象所有权存储桶级别设置，来控制上传到存储桶的对象的所有权。此外，使用对象所有权来开启 ACL。默认情况下，对象所有权设为*强制存储桶拥有者设置*，并且所有 ACL 均处于关闭状态。关闭 ACL 后，存储桶拥有者拥有存储桶中的所有对象，并独占管理对数据的访问权限。为了管理访问权限，存储桶拥有者使用策略或其它访问管理工具（ACL 除外）。有关更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

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

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

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

**其他最佳实践**  
考虑使用以下存储桶设置和工具来协助保护传输中数据和静态数据，这两者对于保持数据的完整性和可访问性至关重要：
+ **屏蔽公共访问权限** - 请勿关闭默认的存储桶级别设置*屏蔽公共访问权限*。默认情况下，此设置会屏蔽对您的数据的公共访问权限。有关屏蔽公共访问权限的更多信息，请参阅[阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。
+ **S3 版本控制** – 为确保数据完整性，您可以实现 S3 版本控制存储桶设置，此设置在您进行更新时对于对象进行版本控制，而不是覆盖它们。如果需要，您可以使用 S3 版本控制功能来保留、检索和还原以前的版本。有关 S3 版本控制的信息，请参阅[使用 S3 版本控制保留对象的多个版本](Versioning.md)。
+ **S3 对象锁定** – S3 对象锁定是您可以实施来实现数据完整性的另一个设置。此功能可以实现一次写入多次读取（WORM）模式，从而以不可变的方式存储对象。有关对象锁定的信息，请参阅[使用对象锁定以锁定对象](object-lock.md)。
+ **对象加密** – Amazon S3 提供了多种对象加密选项，用于保护传输中数据和静态数据。*服务器端加密* 会在将对象保存到数据中心的磁盘上之前为对象加密，然后在下载对象时对数据进行解密。如果您验证了您的请求并且您拥有访问权限，则您访问加密对象或未加密对象的方式就没有区别。有关更多信息，请参阅 [使用服务器端加密保护数据](serv-side-encryption.md)。默认情况下，S3 会加密新上传的对象。有关更多信息，请参阅 [为 Amazon S3 存储桶设置默认服务器端加密行为](bucket-encryption.md)。*客户端加密*是在将数据发送到 Amazon S3 之前加密数据的行为。有关更多信息，请参阅 [使用客户端加密保护数据](UsingClientSideEncryption.md)。
+ **签名方法** – 签名版本 4 是将身份验证信息添加到通过 HTTP 发送的 Amazon 请求的过程。出于安全考虑，大多数 Amazon 请求都必须使用访问密钥（包括访问密钥 ID 和秘密访问密钥）进行签名。这两个密钥通常称为您的安全凭证。有关更多信息，请参阅[对请求进行身份验证（Amazon Signature Version 4）](https://docs.amazonaws.cn/AmazonS3/latest/API/sig-v4-authenticating-requests.html)和 [Signature Version 4 签名过程](https://docs.amazonaws.cn/general/latest/gr/signature-version-4.html)。

## 操作
<a name="access-management-actions"></a>

有关 S3 权限和条件键的完整列表，请参阅《服务授权参考》**中的 [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 的 Amazon Identity and Access Management（IAM）操作是可以对 S3 存储桶或对象执行的可能操作。您可以向身份授予这些操作，以便这些身份可以对您的 S3 资源执行操作。S3 操作的示例为 `s3:GetObject`（读取存储桶中的对象）和 `s3:PutObject`（将对象写入存储桶）。

**条件键**  
除操作外，IAM 条件键限制为仅在满足条件时才授予访问权限。条件键是可选的。



**注意**  
在基于资源的访问策略（例如存储桶策略）或基于身份的策略中，您可以指定以下内容：  
策略语句的 `Action` 元素中的一个操作或一系列操作。
在策略语句的 `Effect` 元素中，您可以指定 `Allow` 来授予列出的操作，也可以指定 `Deny` 来阻止列出的操作。为进一步保持最低权限的做法，访问策略的 `Effect` 元素中的 `Deny` 语句应尽可能宽泛，而 `Allow` 语句应尽可能受限。与 `s3:*` 操作配对的 `Deny` 效果是为策略条件语句中包含的身份实现选择加入最佳实践的另一个好方法。
策略语句的 `Condition` 元素中的条件键。

## 访问管理使用案例
<a name="access-management-usecases"></a>

Amazon S3 为资源拥有者提供了各种用于授予访问权限的工具。您使用的 S3 访问管理工具取决于您要共享的 S3 资源、您要授予访问权限的身份以及您想要允许或拒绝的操作。您可能希望使用一种 S3 访问管理工具或组合使用多种 S3 访问管理工具，来管理对 S3 资源的访问权限。

大多数情况下，您可以使用访问策略来管理权限。访问策略可以是基于资源的策略，此策略附加到资源（例如存储桶）或其它 Amazon S3 资源（[S3 资源](#access-management-resources)）。访问策略也可以是基于身份的策略，该策略附加到您账户中的 Amazon Identity and Access Management（IAM）用户、组或角色。您可能会发现存储桶策略更适合您的使用案例。有关更多信息，请参阅 [Amazon S3 的存储桶策略](bucket-policies.md)。或者，使用 Amazon Identity and Access Management（IAM），您可以在您的 Amazon Web Services 账户中创建 IAM 用户、组和角色，并通过基于身份的策略管理它们对存储桶和对象的访问权限。有关更多信息，请参阅 [Amazon S3 基于身份的策略](security_iam_id-based-policy-examples.md)。

为了协助您浏览这些访问管理选项，以下是常见的 Amazon S3 客户使用案例和对于每个 S3 访问管理工具的建议。

### Amazon Web Services 账户拥有者希望仅与同一账户内的用户共享存储桶
<a name="access-mgmt-use-case-1"></a>

所有访问管理工具都可以满足这个基本使用案例的要求。对于此使用案例，我们建议使用以下访问管理工具：
+ **存储桶策略** – 如果您要授予对一个存储桶或少量存储桶的访问权限，或者如果不同存储桶之间的存储桶访问权限相似，请使用存储桶策略。使用存储桶策略，您可以为每个存储桶管理一个策略。有关更多信息，请参阅 [Amazon S3 的存储桶策略](bucket-policies.md)。
+ **基于身份的策略** – 如果您有大量的存储桶，每个存储桶的访问权限不同，并且只有几个用户角色需要管理，则可以对用户、组或角色使用 IAM 策略。如果您要管理用户对其它 Amazon 资源以及 Amazon S3 资源的访问权限，IAM 策略也是一个不错的选择。有关更多信息，请参阅 [示例 1：存储桶拥有者向其用户授予存储桶权限](example-walkthroughs-managing-access-example1.md)。
+ **S3 Access Grants** – 您可以使用 S3 Access Grants 来授予对 S3 存储桶、前缀或对象的访问权限。S3 Access Grants 允许您大规模指定不同的对象级别权限，而存储桶策略的大小限制为 20 KB。有关更多信息，请参阅 [开始使用 S3 Access Grants](access-grants-get-started.md)。
+ **接入点** – 您可以使用接入点，接入点是附加到存储桶的命名网络端点。一个存储桶最多可附加 10000 个接入点，对于每个接入点，您可以强制实施不同的权限和网络控制，从而让您可以详细控制对于 S3 对象的访问权限。有关更多信息，请参阅 [通过接入点管理对共享数据集的访问](access-points.md)。

### Amazon Web Services 账户拥有者想要与其它 Amazon 账户（跨账户）的用户共享存储桶或对象
<a name="access-mgmt-use-case-2"></a>

要向其它 Amazon Web Services 账户授予权限，您必须使用存储桶策略或以下建议的访问管理工具之一。您不能对此使用案例使用基于身份的访问策略。有关授予跨账户存取权限的更多信息，请参阅[如何提供对 Amazon S3 存储桶中对象的跨账户存取权限？](https://repost.aws/knowledge-center/cross-account-access-s3)

对于此使用案例，我们建议使用以下访问管理工具：
+ **存储桶策略** - 使用存储桶策略，您可以为每个存储桶管理一个策略。有关更多信息，请参阅 [Amazon S3 的存储桶策略](bucket-policies.md)。
+ **S3 Access Grants** – 您可以使用 S3 Access Grants 来授予对 S3 存储桶、前缀或对象的跨账户权限。您可以使用 S3 Access Grants 大规模指定不同的对象级别权限，而存储桶策略的大小限制为 20 KB。有关更多信息，请参阅 [开始使用 S3 Access Grants](access-grants-get-started.md)。
+ **接入点** – 您可以使用接入点，接入点是附加到存储桶的命名网络端点。一个存储桶最多可附加 10000 个接入点，对于每个接入点，您可以强制实施不同的权限和网络控制，从而让您可以详细控制对于 S3 对象的访问权限。有关更多信息，请参阅 [通过接入点管理对共享数据集的访问](access-points.md)。

### Amazon Web Services 账户拥有者或存储桶拥有者必须授予对象级别或前缀级别的权限，这些权限因对象或前缀而异
<a name="access-mgmt-use-case-3"></a>

例如，在存储桶策略中，您可以授予对存储桶中共享特定 [key name prefix](https://docs.amazonaws.cn/general/latest/gr/glos-chap.html#keyprefix) 或具有特定标签的对象的访问权限。您可以授予对以键名称前缀 `logs/` 开头的对象的读取权限。但是，如果您的访问权限因对象而异，那么使用存储桶策略授予对各个对象的权限可能不太实际，特别是由于存储桶策略的大小限制为 20 KB。

对于此使用案例，我们建议使用以下访问管理工具：
+ **S3 Access Grants** – 您可以使用 S3 Access Grants 来管理对象级别或前缀级别的权限。与存储桶策略不同，您可以使用 S3 Access Grants 大规模指定不同的对象级别权限。存储桶策略的大小限制为 20 KB。有关更多信息，请参阅 [开始使用 S3 Access Grants](access-grants-get-started.md)。
+ **接入点** - 您可以使用接入点来管理对象级别或前缀级别的权限。接入点是附加到存储桶的命名网络端点。一个存储桶最多可附加 10000 个接入点，对于每个接入点，您可以强制实施不同的权限和网络控制，从而让您可以详细控制对于 S3 对象的访问权限。有关更多信息，请参阅 [通过接入点管理对共享数据集的访问](access-points.md)。
+ **ACL** – 我们建议不要使用访问控制列表（ACL），特别是因为 ACL 限制为每个对象 100 个授权。但是，如果您选择开启 ACL，请在存储桶设置中，将*对象所有权* 设置为*存储桶拥有者优先* 且 *ACL 已启用*。有了这个设置，用 `bucket-owner-full-control` 标准的 ACL 编写的新对象将自动归存储桶拥有者而不是对象编写者所有。然后，您可以使用对象 ACL（一个采用 XML 格式的访问策略）来向其他用户授予对于对象的访问权限。有关更多信息，请参阅 [访问控制列表 (ACL) 概述](acl-overview.md)。

### Amazon Web Services 账户拥有者或存储桶拥有者希望将存储桶访问权限限制为仅限特定的账户 ID
<a name="access-mgmt-use-case-4"></a>

对于此使用案例，我们建议使用以下访问管理工具：
+ **存储桶策略** - 使用存储桶策略，您可以为每个存储桶管理一个策略。有关更多信息，请参阅 [Amazon S3 的存储桶策略](bucket-policies.md)。
+ **接入点** – 接入点是附加到存储桶的命名网络端点。一个存储桶最多可附加 10000 个接入点，对于每个接入点，您可以强制实施不同的权限和网络控制，从而让您可以详细控制对于 S3 对象的访问权限。有关更多信息，请参阅 [通过接入点管理对共享数据集的访问](access-points.md)。

### Amazon Web Services 账户拥有者或存储桶拥有者希望每个访问其数据的用户或应用程序都使用不同的端点
<a name="access-mgmt-use-case-5"></a>

对于此使用案例，我们建议使用以下访问管理工具：
+ **接入点** – 接入点是附加到存储桶的命名网络端点。一个存储桶最多可附加 10000 个接入点，对于每个接入点，您可以强制实施不同的权限和网络控制，从而让您可以详细控制对于 S3 对象的访问权限。每个接入点强制实施自定义接入点策略，该策略与附加到底层存储桶的存储桶策略结合使用。有关更多信息，请参阅 [通过接入点管理对共享数据集的访问](access-points.md)。

### Amazon Web Services 账户拥有者或存储桶拥有者必须管理从 S3 的虚拟私有云（VPC）端点进行的访问
<a name="access-mgmt-use-case-6"></a>

Amazon S3 的虚拟私有云（VPC）端点是 VPC 内仅允许连接到 S3 的逻辑实体。对于此使用案例，我们建议使用以下访问管理工具：
+ **VPC 中的存储桶设置** – 您可以使用存储桶策略来控制允许谁访问您的存储桶，以及他们可以访问哪些 VPC 端点。有关更多信息，请参阅 [使用存储桶策略控制从 VPC 端点的访问](example-bucket-policies-vpc-endpoint.md)。
+ **接入点** - 如果您选择设置接入点，则可以使用接入点策略。您可以将任何接入点配置为仅接受来自 Virtual Private Cloud（VPC）的请求，以限制专用网络的 Amazon S3 数据访问。您还可以为每个接入点配置自定义屏蔽公共访问权限设置。有关更多信息，请参阅 [通过接入点管理对共享数据集的访问](access-points.md)。

### Amazon Web Services 账户拥有者或存储桶拥有者必须公开静态网站
<a name="access-mgmt-use-case-7"></a>

使用 S3，您可以托管静态网站，并允许任何人查看该网站的内容（托管在 S3 存储桶中）。

对于此使用案例，我们建议使用以下访问管理工具：
+ **Amazon CloudFront** – 该解决方案允许您面向公众托管 Amazon S3 静态网站，同时还继续屏蔽对存储桶内容的所有公共访问权限。如果要将所有四个“S3 屏蔽公共访问权限”设置保持为启用状态并托管 S3 静态网站，则可以使用 Amazon CloudFront 来源访问控制（OAC）。Amazon CloudFront 提供了设置安全静态网站所需的功能。此外，不使用此解决方案的 Amazon S3 静态网站只能支持 HTTP 端点。CloudFront 使用 Amazon S3 的持久存储，同时提供额外的安全标头，如 HTTPS。HTTPS 通过加密正常 HTTP 请求并防范常见的网络攻击来增强安全性。

  有关更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的[安全静态网站入门](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/getting-started-secure-static-website-cloudformation-template.html)。
+ **让 Amazon S3 存储桶可供公开访问** – 您可以配置存储桶来用作公开访问的静态网站。
**警告**  
我们建议不要使用这种方法。相反，我们建议您将 Amazon S3 静态网站用作 Amazon CloudFront 的一部分。有关更多信息，请参阅前一个选项或参阅[安全静态网站入门](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/getting-started-secure-static-website-cloudformation-template.html)。

  要在没有 Amazon CloudFront 的情况下创建 Amazon S3 静态网站，首先必须关闭所有屏蔽公共访问权限设置。在为静态网站编写存储桶策略时，请确保仅允许 `s3:GetObject` 操作，而非 `ListObject` 或 `PutObject` 权限。这有助于确保用户无法查看存储桶中的所有对象或添加其自己的内容。有关更多信息，请参阅 [设置访问网站的权限](WebsiteAccessPermissionsReqd.md)。

### Amazon Web Services 账户拥有者或存储桶拥有者想要公开存储桶的内容
<a name="access-mgmt-use-case-8"></a>

创建新的 Amazon S3 存储桶时，*屏蔽公共访问权限* 设置默认处于启用状态。有关阻止公共访问的更多信息，请参阅[阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。

我们建议不要对存储桶允许公共访问权限。但是，如果您必须针对特定使用案例允许公共访问权限，我们建议您为此使用案例使用以下访问管理工具：
+ **禁用屏蔽公共访问权限设置** - 存储桶拥有者可以允许向存储桶发送未经身份验证的请求。例如，当存储桶具有公有存储桶策略或存储桶 ACL 授予公共访问权限时，允许未经身份验证的 [PUT Object](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTObjectPUT.html) 请求。所有未经身份验证的请求均由其他任意 Amazon 用户发出，甚至是由未经身份验证的匿名用户发出。此用户在 ACL 中由特定的规范用户 ID `65a011a29cdf8ec533ec3d1ccaae921c` 表示。如果将对象上传到 `WRITE` 或 `FULL_CONTROL`，这会专门向“所有用户”组或匿名用户授予访问权限。有关公有存储桶策略和公有访问控制列表（ACL）的更多信息，请参阅 [“公有”的含义](access-control-block-public-access.md#access-control-block-public-access-policy-status)。

### Amazon Web Services 账户拥有者或存储桶拥有者已超过访问策略大小限制
<a name="access-mgmt-use-case-9"></a>

存储桶策略和基于身份的策略都有 20 KB 的大小限制。如果您的访问权限要求很复杂，则可能会超过此大小限制。

对于此使用案例，我们建议使用以下访问管理工具：
+ **接入点** – 如果接入点适用于您的使用案例，请使用接入点。对于接入点，每个存储桶都有多个命名网络端点，每个端点都有自己的接入点策略，该策略与底层存储桶策略结合使用。但是，接入点只能对于对象执行操作，而不能对存储桶执行操作，并且不支持跨区域复制。有关更多信息，请参阅 [通过接入点管理对共享数据集的访问](access-points.md)。
+ **S3 Access Grants** – 使用 S3 Access Grants，这支持大量授权来授予对存储桶、前缀或对象的访问权限。有关更多信息，请参阅 [开始使用 S3 Access Grants](access-grants-get-started.md)。

### Amazon Web Services 账户拥有者或管理员角色想要直接向公司目录中的用户或组授予存储桶、前缀或对象访问权限
<a name="access-mgmt-use-case-10"></a>

您可以将公司目录添加到 Amazon IAM Identity Center，而不必通过 Amazon Identity and Access Management（IAM）管理用户、组和角色。有关更多信息，请参阅 [What is IAM Identity Center?](https://docs.amazonaws.cn/singlesignon/latest/userguide/what-is.html)

将公司目录添加到 Amazon IAM Identity Center 后，我们建议您使用以下访问管理工具，向公司目录身份授予对 S3 资源的访问权限：
+ **S3 Access Grants** – 使用 S3 Access Grants，这支持向公司目录中的用户或角色授予访问权限。有关更多信息，请参阅 [开始使用 S3 Access Grants](access-grants-get-started.md)。

### Amazon Web Services 账户拥有者或存储桶拥有者想要向 Amazon CloudFront 服务授予访问权限，以便将 CloudFront 日志写入 S3 存储桶
<a name="access-mgmt-use-case-11"></a>

对于此使用案例，我们建议使用以下访问管理工具：
+ **存储桶 ACL** – 存储桶 ACL 的唯一建议使用案例是向某些 Amazon Web Services 服务（如 Amazon CloudFront `awslogsdelivery` 账户）授予权限。当您创建或更新分配并开启 CloudFront 日志记录时，CloudFront 会更新存储桶（ACL）来向 `awslogsdelivery` 账户授予 `FULL_CONTROL` 权限，从而将日志写入您的存储桶。有关更多信息，请参阅 *Amazon CloudFront Developer Guide*（Amazon CloudFront 开发人员指南）中的 [Permissions required to configure standard logging and to access your log files](https://docs.amazonaws.cn/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#AccessLogsBucketAndFileOwnership)（配置标准日志和访问日志文件所需的权限）。如果存储日志的存储桶对于 S3 对象所有权使用*强制存储桶拥有者*设置来关闭 ACL，则 CloudFront 无法将日志写入存储桶。有关更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

### 作为存储桶拥有者，您希望对其他用户添加到存储桶中的对象保持完全控制权
<a name="access-mgmt-use-case-12"></a>

您可以使用存储桶策略、接入点或 S3 Access Grants，来向其它账户授予将对象上传到您的存储桶的访问权限。如果您已授予对存储桶的跨账户存取权限，则可以确保上传到存储桶的任何对象均保持在您的完全控制之下。

对于此使用案例，我们建议使用以下访问管理工具：
+ **对象所有权** - 将存储桶级别的设置*对象所有权* 保留为默认的*强制存储桶拥有者* 设置。

## 访问管理故障排除
<a name="access-management-troubleshooting"></a>

以下资源有助于您排查 S3 访问管理方面的任何问题：

**排查拒绝访问（403 禁止）错误**  
如果您遇到拒绝访问问题，请检查账户级别和存储桶级别的设置。此外，请检查您用于授予访问权限的访问管理功能，来确保策略、设置或配置正确无误。有关 Amazon S3 中拒绝访问（403 禁止）错误的常见原因的更多信息，请参阅[排查 Amazon S3 中的拒绝访问（403 Forbidden）错误](troubleshoot-403-errors.md)。

**适用于 S3 的 IAM Access Analyzer**  
如果您不想公开您的任何资源，或者您想限制对资源的公共访问权限，则可以使用适用于 S3 的 IAM Access Analyzer。在 Amazon S3 控制台上，使用适用于 S3 的 IAM Access Analyzer 来查看具有存储桶访问控制列表（ACL）、存储桶策略或授予公共或共享访问权限的接入点策略的所有存储桶。如果存在已配置为允许互联网上的任何人或其他 Amazon Web Services 账户（包括组织外部的 Amazon Web Services 账户）访问的存储桶，适用于 S3 的 IAM Access Analyzer 会向您发出提醒。您会收到每个公共存储桶或共享存储桶的结果，其中报告了公共或共享访问的来源和级别。

在适用于 S3 的 IAM Access Analyzer 中，只需一个操作，即可屏蔽对存储桶的所有公共访问权限。我们建议您屏蔽所有对存储桶的公共访问权限，除非您需要公共访问权限才能支持特定使用案例。在屏蔽所有公共访问权限之前，确保您的应用程序在没有公共访问权限的情况下可以继续正常工作。有关更多信息，请参阅 [阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。

您还可以查看存储桶级别的权限设置，来配置详细的访问级别。对于需要公共或共享访问的特定和经验证的使用案例，您可以通过对存储桶的结果进行归档来确认和记录存储桶保持公开或共享的意图。您可以随时重新访问和修改这些存储桶配置。您还可以将结果下载为 CSV 格式的报告以供审计使用。

Amazon S3 控制台上提供适用于 S3 的 IAM Access Analyzer，无需额外费用。适用于 S3 的 IAM Access Analyzer 由 Amazon Identity and Access Management（IAM）IAM Access Analyzer 提供支持。要在 Amazon S3 控制台上使用适用于 S3 的 IAM Access Analyzer，您必须访问 [IAM 控制台](https://console.amazonaws.cn/iam/)，然后在 IAM Access Analyzer 中为每个单独区域创建账户级别分析器。

有关适用于 S3 的 IAM Access Analyzer 的更多信息，请参阅[使用适用于 S3 的 IAM Access Analyzer 查看存储桶访问权限](access-analyzer.md)。

**日志记录和监控**  
监控是维护 Amazon S3 解决方案的可靠性、可用性和性能的重要组成部分，以便您可以更轻松地调试访问故障。日志记录有助于您深入了解用户收到的任何错误，以及何时发出了什么样的请求。Amazon 提供了几种用于监控 Amazon S3 资源的工具，如下所示：
+ Amazon CloudTrail
+ Amazon S3 访问日志
+ Amazon Trusted Advisor
+ Amazon CloudWatch

有关更多信息，请参阅 [Amazon S3 中的日志记录和监控](monitoring-overview.md)。