

# 阻止对您的 Amazon S3 存储的公有访问
<a name="access-control-block-public-access"></a>

Amazon S3 屏蔽公共访问权限功能提供接入点、存储桶、账户和 Amazon Organizations 设置，帮助您管理对 Amazon S3 资源的公有访问。默认情况下，新存储桶、接入点和对象不允许公有访问。但是，用户可以修改存储桶策略、接入点策略或对象权限以允许公有访问。S3 屏蔽公共访问权限设置会覆盖这些策略和权限，以便于您可以限制这些资源的公有访问。

借助 S3 屏蔽公共访问权限，组织账户管理员、账户管理员和存储桶拥有者可以轻松设置集中控制，以控制对已实施的 Amazon S3 资源的公共访问（与资源的创建方式无关）。

您可以在多个级别管理屏蔽公共访问权限设置：组织级别（使用 Amazon Organizations）、账户级别以及存储桶和接入点级别。有关配置公有块访问的说明，请参阅[配置屏蔽公共访问权限](#configuring-block-public-access)。

当 Amazon S3 收到访问存储桶或对象的请求时，它将确定该存储桶或存储桶拥有者的账户是否应用了屏蔽公共访问权限设置。如果该账户属于具有屏蔽公共访问权限策略的 Amazon Organizations，则 Amazon S3 还会检查组织级别的设置。如果请求是通过接入点发出，则 Amazon S3 还会检查接入点的屏蔽公共访问权限设置。如果现有的屏蔽公共访问权限设置禁止请求的访问，则 Amazon S3 将拒绝该请求。

Amazon S3 屏蔽公共访问权限提供四种设置。这些设置彼此独立，可任意组合使用。每个设置都可以应用于接入点、存储桶或整个 Amazon Web Services 账户。在组织级别，所有四个设置作为统一的策略一起应用，您无法精细地选择个别设置。如果接入点、存储桶或账户的屏蔽公共访问权限设置不同，则 Amazon S3 应用接入点、存储桶和账户设置的最严格组合。账户级别的设置会自动继承组织级别的策略（如果存在），而 S3 会采用存储桶级别设置和生效的账户级别设置之间最严格的策略。例如，如果您的组织启用了屏蔽公共访问权限策略，但某个存储桶在存储桶级别禁用了屏蔽公共访问权限，则该存储桶仍将受到保护，因为 S3 应用了更严格的组织/账户级别设置。反之，如果禁用了您的组织策略，但存储桶启用了屏蔽公共访问权限，则该存储桶仍受其存储桶级别设置的保护。

当 Amazon S3 评估屏蔽公共访问权限设置是否禁止某一操作时，它将拒绝违反组织策略（这会强制实施账户 BPA 设置）或者接入点、存储桶或账户设置的任何请求。

**重要**  
通过访问控制列表（ACL）、接入点策略或存储桶策略，或者同时通过这几项向存储桶和对象授予公有访问权限。为了帮助确保您的所有 Amazon S3 接入点、存储桶和对象阻止了公有访问，我们建议为您的账户启用屏蔽公共访问权限的所有四个设置。对于管理多个账户的组织，可以考虑使用组织级别的屏蔽公共访问权限策略进行集中控制。此外，我们建议您还为每个存储桶开启所有四个设置，以符合 Amazon Security Hub 基础安全最佳实践控件 S3.8 的要求。这些设置阻止所有当前和将来的存储桶和接入点的公有访问。  
在应用这些设置之前，请确认您的应用程序在没有公有访问的情况下能够正常工作。如果您需要对存储桶或对象进行某种级别的公有访问，例如，按照 [使用 Amazon S3 托管静态网站](WebsiteHosting.md) 中所述托管静态网站，则可以自定义各个设置以符合您的存储使用案例要求。  
启用“屏蔽公共访问权限”可防止通过直接附加到 S3 资源的资源策略或访问控制列表（ACL）来授予公共访问权限，有助于保护您的资源。除了启用“屏蔽公共访问权限”之外，还要仔细检查以下策略，来确认它们不会授予公共访问权限：  
附加到关联 Amazon 主体（例如 IAM 角色）的基于身份的策略
附加到关联 Amazon 资源 [例如 Amazon Key Management Service（KMS）密钥] 的基于资源的策略

**注意**  
您只能为组织、接入点、存储桶和 Amazon Web Services 账户启用屏蔽公共访问权限设置。Amazon S3 不支持基于每个对象的屏蔽公共访问权限设置。
在将屏蔽公共访问权限设置应用于某一账户时，这些设置将应用于全球所有 Amazon Web Services 区域。这些设置可能不会立即或同时在所有区域生效，但最终会传播到所有区域。
当您应用组织级别的屏蔽公共访问权限策略时，这些策略会自动传播到选定的成员账户并覆盖账户级别的设置。

**Topics**
+ [屏蔽公共访问权限设置](#access-control-block-public-access-options)
+ [在组织级别管理屏蔽公共访问权限](#access-control-block-public-access-organization-level)
+ [在接入点上执行屏蔽公共访问权限操作](#access-control-block-public-access-examples-access-point)
+ [“公有”的含义](#access-control-block-public-access-policy-status)
+ [使用适用于 S3 的 IAM Access Analyzer 查看公有存储桶](#access-analyzer-public-info)
+ [权限](#access-control-block-public-access-permissions)
+ [配置屏蔽公共访问权限](#configuring-block-public-access)
+ [为您的账户配置屏蔽公共访问权限设置](configuring-block-public-access-account.md)
+ [为 S3 存储桶配置屏蔽公共访问权限设置](configuring-block-public-access-bucket.md)

## 屏蔽公共访问权限设置
<a name="access-control-block-public-access-options"></a>

S3 屏蔽公共访问权限提供四种设置。您可以任意组合将这些设置应用于单个接入点、存储桶或整个 Amazon Web Services 账户。在组织级别，您只能使用“全部”或“无”方法同时启用或禁用所有四个设置，无法精细地控制个别设置。如果您将某一设置应用于某个账户，则该设置将应用于该账户拥有的所有存储桶和接入点。账户级别设置会自动继承组织策略（如果存在）。同样，如果您将设置应用于某个存储桶，则该设置将应用于与该存储桶关联的所有接入点。

策略继承和实施的工作方式如下：
+ 组织级别的策略自动应用于成员账户，强制执行任何现有的账户级别设置
+ 账户级别设置继承自组织策略（如果存在），如果没有组织策略，则使用本地配置的设置
+ 存储桶级别的设置独立运行，但受强制实施的限制约束。S3 会应用所有适用级别中限制性最严格的组合，包括组织/账户级别和存储桶级别的设置。这意味着存储桶继承其账户（可能是由组织管理）的基准保护，但是 S3 强制执行存储桶设置和账户的生效设置之间限制性更严格的配置。

下表包含可用设置。


| 名称 | 描述 | 
| --- | --- | 
| BlockPublicAcls |  将此选项设置为 `TRUE` 会引发以下行为： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/access-control-block-public-access.html) 将此设置设为 `TRUE` 时，指定操作将失败（通过 REST API、Amazon CLI 或 Amazon SDK 请求的操作）。但是，不会修改用于存储桶和对象的现有策略和 ACL。此设置不仅允许您针对公有访问提供保护，还允许您审核、优化或更改存储桶或对象的现有策略和 ACL。  接入点没有与其关联的 ACL。如果您将此设置应用于接入点，则该设置将充当到底层存储桶的传递途径。如果某个接入点启用了此设置，则无论存储桶实际上是否启用了此设置，通过该接入点发出的请求表现为就像底层存储桶启用了此设置。   | 
| IgnorePublicAcls |  将此选项设置为 `TRUE` 会使 Amazon S3 忽略存储桶及其包含的任何对象上的所有公有 ACL。通过此设置，您可以安全地屏蔽由 ACL 授予的公共访问权限，同时仍支持包含公有 ACL 的 `PutObject` 调用（与 `BlockPublicAcls` 相反，后者拒绝包含公有 ACL 的 `PutObject` 调用）。启用此设置不影响任何现有 ACL 的持久性，也不会阻止设置新的公有 ACL。  接入点没有与其关联的 ACL。如果您将此设置应用于接入点，则该设置将充当到底层存储桶的传递途径。如果某个接入点启用了此设置，则无论存储桶实际上是否启用了此设置，通过该接入点发出的请求表现为就像底层存储桶启用了此设置。   | 
| BlockPublicPolicy |  针对存储桶将此选项设置为 `TRUE`，将导致 Amazon S3 在指定的存储桶策略支持公共访问权限时拒绝对 `PutBucketPolicy` 的调用。如果指定的策略支持公共访问权限，则对于存储桶将此选项设置为 `TRUE`，也会导致 Amazon S3 拒绝对存储桶的所有相同账户接入点的 `PutAccessPointPolicy` 调用。 如果（为接入点或基础存储桶）指定的策略支持公共访问权限，则对于接入点将此选项设置 `TRUE`，将导致 Amazon S3 拒绝通过该接入点对 `PutAccessPointPolicy` 和 `PutBucketPolicy` 进行的调用。 您可以使用此设置以允许用户管理接入点和存储桶策略，而不允许其公开共享存储桶或其包含的对象。启用此设置不会影响现有接入点或存储桶策略。  要有效地使用此设置，我们建议您在*账户*级别应用此设置。存储桶策略可能允许用户更改存储桶的屏蔽公共访问权限设置。因此，有权更改存储桶策略的用户可以插入允许其为存储桶禁用屏蔽公共访问权限设置的策略。如果为整个账户而非特定存储桶启用此设置，即使用户更改存储桶策略以禁用此设置，Amazon S3 仍会阻止公有策略。   | 
| RestrictPublicBuckets |  将此选项设置为 `TRUE` 会将对具有公有策略的接入点或存储桶的访问限制为该存储桶拥有者账户和接入点拥有者账户中的 Amazon 服务主体和授权用户。此设置会阻止对接入点或存储桶的所有跨账户访问（Amazon 服务主体的访问除外），但仍允许该账户内的用户管理接入点或存储桶。 启用此设置不影响现有的接入点或存储桶策略，但 Amazon S3 会阻止派生自任何公有接入点或存储桶策略的公有和跨账户访问，包括到特定账户的非公有委派。  | 

**重要**  
调用 `GetBucketAcl` 和 `GetObjectAcl` 始终返回指定存储桶或对象的已就位的有效权限。例如，假设存储桶有一个 ACL 用于授予公有访问权限，但该存储桶还启用了 `IgnorePublicAcls` 设置。在此情况下，`GetBucketAcl` 将返回可反映 Amazon S3 正在实施的访问权限的 ACL，而不是与存储桶关联的实际 ACL。
屏蔽公共访问权限设置不更改现有的策略或 ACL。因此，删除屏蔽公共访问权限设置会使具有公有策略或 ACL 的存储桶或对象再次变为可公开访问。

## 在组织级别管理屏蔽公共访问权限
<a name="access-control-block-public-access-organization-level"></a>

组织级别的屏蔽公共访问权限使用 Amazon Organizations 策略来集中管理整个组织中的 S3 公共访问控制。这些策略在启用后，会自动应用于选定的账户，并覆盖账户级别的单独设置。

有关组织级别的屏蔽公共访问权限的更多信息，请参阅《Amazon Organizations 用户指南》**中的 [S3 策略](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_s3.html)。

## 在接入点上执行屏蔽公共访问权限操作
<a name="access-control-block-public-access-examples-access-point"></a>

为了对接入点执行屏蔽公共访问权限操作，请使用 Amazon CLI 服务 `s3control`。

**重要**  
创建接入点后，无法更改接入点的屏蔽公共访问权限设置。只有在创建接入点时，才能为接入点指定屏蔽公共访问权限设置。

## “公有”的含义
<a name="access-control-block-public-access-policy-status"></a>

### ACL
<a name="public-acls"></a>

如果存储桶或对象 ACL 可向预定义的 `AllUsers` 或 `AuthenticatedUsers` 组的成员授予任何权限，则 Amazon S3 将其视为公有。有关预定义组的更多信息，请参阅 [Amazon S3 预定义的组](acl-overview.md#specifying-grantee-predefined-groups)。

### 存储桶策略
<a name="public-bucket-policies"></a>

在评估存储桶策略时，Amazon S3 先假定该策略是公有的。然后对策略进行评估，以确定它是否符合非公有条件。当存储桶策略必须仅授予针对以下一个或多个项目的固定值（不包含通配符或 [Amazon Identity and Access Management 策略变量](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_variables.html)的值）的访问权限时，才会将该策略视为非公有：
+ Amazon 主体、用户、角色或服务主体（例如 `aws:PrincipalOrgID`）
+ 一组无类别域间路由（CIDR）块，使用 `aws:SourceIp`。有关 CIDR 的更多信息，请参阅 RFC 编辑器网站上的 [RFC 4632](http://www.rfc-editor.org/rfc/rfc4632.txt)。
**注意**  
根据 `aws:SourceIp` 条件键授予访问权限且 IP 范围非常宽泛（例如 0.0.0.0/1）的存储桶策略将评估为“公有”。这包括大于 `/8`（对于 IPv4）和 `/32`（对于 IPv6，不包括 RFC1918 私有范围）的值。屏蔽公共访问权限将拒绝这些“公有”策略，并阻止跨账户访问已在使用这些“公有”策略的存储桶。
+ `aws:SourceArn`
+ `aws:SourceVpc`
+ `aws:SourceVpce`
+ `aws:SourceOwner`
+ `aws:SourceAccount`
+ `aws:userid`，在模式“”之外`AROLEID:*`
+ `s3:DataAccessPointArn`
**注意**  
在存储桶策略中使用时，只要账户 ID 已固定，此值就可以包含接入点名称的通配符，而无需将策略呈现为公有。例如，允许访问 `arn:aws:s3:us-west-2:123456789012:accesspoint/*` 也会允许访问与区域 `123456789012` 中的账户 `us-west-2` 关联的任何接入点，而无需将存储桶策略呈现为公有。此行为对于接入点策略有所不同。有关更多信息，请参阅 [接入点](#access-control-block-public-access-policy-status-access-points)。
+ `s3:DataAccessPointAccount`

有关存储桶策略的更多信息，请参阅 [Amazon S3 的存储桶策略](bucket-policies.md)。

**注意**  
使用[多值上下文键](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-single-vs-multi-valued-context-keys.html)时，必须使用 `ForAllValues` 或 `ForAnyValue` 集合运算符。

**Example ：公有存储桶策略**  
根据这些规则，以下示例策略被视为公有。  

```
{
		"Principal": "*", 
		"Resource": "*", 
		"Action": "s3:PutObject", 
		"Effect": "Allow" 
	}
```

```
{
		"Principal": "*", 
		"Resource": "*", 
		"Action": "s3:PutObject", 
		"Effect": "Allow", 
		"Condition": { "StringLike": {"aws:SourceVpc": "vpc-*"}}
	}
```
您可以通过使用固定值来包含上面所列的任何条件键将这些策略变为非公有。例如，可以通过将 `aws:SourceVpc` 设置为固定值，将上面的最后一个策略变为非公有，类似于以下内容：  

```
{
		"Principal": "*", 
		"Resource": "*", 
		"Action": "s3:PutObject", 
		"Effect": "Allow", 
		"Condition": {"StringEquals": {"aws:SourceVpc": "vpc-91237329"}}
	}
```

### Amazon S3 如何评估同时包含公有和非公有访问授权的存储桶策略
<a name="access-control-block-public-access-policy-example"></a>

此示例演示 Amazon S3 如何评估同时包含公有和非公有访问授权的存储桶策略。

假设存储桶有一个策略可向一组固定主体授予访问权限。根据前面描述的规则，此策略不是公有策略。因此，如果您启用 `RestrictPublicBuckets` 设置，该策略将按编写内容保持有效，因为 `RestrictPublicBuckets` 只应用于具有公有策略的存储桶。但是，如果您向该策略中添加公有语句，则 `RestrictPublicBuckets` 将对该存储桶生效。它仅允许存储桶拥有者账户的 Amazon 服务主体和授权用户访问该存储桶。

例如，假定“Account-1”拥有的一个存储桶包含以下内容：

1. 向 Amazon CloudTrail（它是 Amazon 服务主体）授予访问权限的语句。

1. 向账户“Account-2”授予访问权限的语句

1. 向公众授予访问权限的语句，例如通过指定 `"Principal": "*"` 且没有限制性的 `Condition`

由于第三条语句，此策略符合公有策略的条件。实施此策略并启用 `RestrictPublicBuckets` 后，Amazon S3 将仅允许 CloudTrail 进行访问。请注意，尽管语句 2 不是公有，但 Amazon S3 仍禁用“Account-2”的访问。这是因为，语句 3 将整个策略都渲染为公有，因此 `RestrictPublicBuckets` 适用。因此，即使策略向特定账户“Account-2”委派访问权限，Amazon S3 仍禁用跨账户访问。但如果您从该策略中删除语句 3，则该策略不符合公有条件，并且 `RestrictPublicBuckets` 不再适用。因此，即使将 `RestrictPublicBuckets` 保持启用状态，“Account-2”也会重获存储桶的访问权限。

### 接入点
<a name="access-control-block-public-access-policy-status-access-points"></a>

与存储桶相比，Amazon S3 评估接入点的屏蔽公共访问权限设置略有不同。Amazon S3 用于确定接入点策略何时为公用的规则对接入点和存储桶来说通常是相同的，但以下情况除外：
+ 具有 VPC 网络起源的接入点始终被视为非公有，而无论其接入点策略的内容如何。
+ 使用 `s3:DataAccessPointArn` 向一组接入点授予访问权限的接入点策略被视为公有。请注意，此行为与存储桶策略不同。例如，对于与 `s3:DataAccessPointArn` 匹配的 `arn:aws:s3:us-west-2:123456789012:accesspoint/*` 值授予访问权限的存储桶策略不会被视为公有。但是，在接入点策略中使用相同的语句会使接入点变为公有。

## 使用适用于 S3 的 IAM Access Analyzer 查看公有存储桶
<a name="access-analyzer-public-info"></a>

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

在适用于 S3 的 IAM Access Analyzer 中，只需单击一下即可屏蔽对存储桶的所有公共访问权限。您还可以向下钻取到存储桶级别权限设置，以配置精细访问。对于需要公共或共享访问的特定和经验证的使用案例，您可以通过对存储桶的结果进行归档来确认和记录存储桶保持公开或共享的意图。

在极少数情况下，适用于 S3 的 IAM 访问权限分析器和 Amazon S3 屏蔽公共访问权限评估可能会因存储桶是否为公有而有所不同。之所以出现这种情况，是因为 Amazon S3 屏蔽公共访问权限除了评估公有访问权限外，还会对操作是否存在进行验证。假设存储桶策略包含一条 `Action` 语句，它支持公众访问 Amazon S3 不支持的操作（例如 `s3:NotASupportedAction`）。在这种情况下，Amazon S3 屏蔽公共访问权限会将存储桶评估为公有，因为如果稍后该操作变成受支持的，则这样的语句可能会使存储桶变为公有的。如果 Amazon S3 屏蔽公共访问权限和适用于 S3 的 IAM 访问权限分析器的评估存在差异，我们建议您查看存储桶策略并移除任何不受支持的操作。

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

## 权限
<a name="access-control-block-public-access-permissions"></a>

要使用 Amazon S3 屏蔽公共访问权限特征，您必须拥有以下权限。


| 操作 | 所需权限 | 
| --- | --- | 
| GET 存储桶策略状态 | s3:GetBucketPolicyStatus | 
| GET 存储桶屏蔽公共访问权限设置 | s3:GetBucketPublicAccessBlock | 
| PUT 存储桶屏蔽公共访问权限设置 | s3:PutBucketPublicAccessBlock | 
| DELETE 存储桶屏蔽公共访问权限设置 | s3:PutBucketPublicAccessBlock | 
| GET 账户屏蔽公共访问权限设置 | s3:GetAccountPublicAccessBlock | 
| PUT 账户屏蔽公共访问权限设置 | s3:PutAccountPublicAccessBlock | 
| DELETE 账户屏蔽公共访问权限设置 | s3:PutAccountPublicAccessBlock | 
| PUT 接入点屏蔽公共访问权限设置 | s3:CreateAccessPoint | 

**注意**  
`DELETE` 操作所需权限与 `PUT` 操作相同。没有单独用于 `DELETE` 操作的权限。

## 配置屏蔽公共访问权限
<a name="configuring-block-public-access"></a>

有关为 Amazon Web Services 账户、Amazon S3 存储桶和接入点配置屏蔽公共访问权限的更多信息，请参阅以下主题：
+ [为您的账户配置屏蔽公共访问权限设置](configuring-block-public-access-account.md)
+ [为 S3 存储桶配置屏蔽公共访问权限设置](configuring-block-public-access-bucket.md)
+ [在接入点上执行屏蔽公共访问权限操作](#access-control-block-public-access-examples-access-point)