

# 排查 Amazon S3 中的拒绝访问（403 Forbidden）错误
<a name="troubleshoot-403-errors"></a>

当 Amazon 显式或隐式拒绝授权请求时，将显示拒绝访问（HTTP `403 Forbidden`）错误。
+ 当策略包含特定的 Amazon 操作的 `Deny` 语句时，将发生*显式拒绝*。
+ 当没有适用的 `Deny` 语句且没有适用的 `Allow` 语句时，会发生*隐式拒绝*。

由于 Amazon Identity and Access Management（IAM）策略默认情况下隐式拒绝 IAM 主体，因此该策略必须显式支持主体执行操作。否则，该策略会隐式拒绝访问。有关更多信息，请参阅《IAM 用户指南》**中的[显式拒绝和隐式拒绝之间的区别](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#AccessPolicyLanguage_Interplay)。有关确定是支持还是拒绝访问请求的策略评估逻辑的信息，请参阅《IAM 用户指南》**中的[策略评估逻辑](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

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

以下主题涵盖了 Amazon S3 中拒绝访问错误的最常见原因。

**注意**  
对于拒绝访问（HTTP `403 Forbidden`）错误，如果请求是在存储桶拥有者的个人 Amazon 账户或存储桶拥有者的 Amazon 组织外部发起的，则 S3 不会向存储桶拥有者收费。

**Topics**
+ [拒绝访问消息示例以及如何对其进行故障排除](#access-denied-message-examples)
+ [由于申请方付款设置而拒绝访问](#access-denied-requester-pays)
+ [桶策略和 IAM policy](#bucket-iam-policies)
+ [Amazon S3 ACL 设置](#troubleshoot-403-acl-settings)
+ [S3 屏蔽公共访问权限设置](#troubleshoot-403-bpa)
+ [Amazon S3 加密设置](#troubleshoot-403-encryption)
+ [S3 对象锁定设置](#troubleshoot-403-object-lock)
+ [VPC 端点策略](#troubleshoot-403-vpc)
+ [Amazon Organizations 策略](#troubleshoot-403-orgs)
+ [CloudFront 分配访问权限](#troubleshoot-403-cloudfront)
+ [接入点设置](#troubleshoot-403-access-points)
+ [其他资源](#troubleshoot-403-additional-resources)

**注意**  
如果您正在尝试对权限问题进行故障排除，请从[拒绝访问消息示例以及如何对其进行故障排除](#access-denied-message-examples)一节开始，然后转到[桶策略和 IAM policy](#bucket-iam-policies)一节。另外，请务必遵循[有关检查权限的提示](#troubleshoot-403-tips)中的指导。

## 拒绝访问消息示例以及如何对其进行故障排除
<a name="access-denied-message-examples"></a>

Amazon S3 现在对于同一 Amazon Web Services 账户或 Amazon Organizations 中同一组织内的资源发出的请求，在拒绝访问（HTTP `403 Forbidden`）错误中包含额外的上下文。这个新的上下文包括拒绝访问的策略类型、拒绝的原因，以及有关请求访问该资源的 IAM 用户或角色的信息。

此附加上下文有助于您解决访问问题，确定拒绝访问错误的根本原因，并通过更新相关策略来修复不正确的访问控制。此附加上下文也可以在 Amazon CloudTrail 日志中找到。针对同账户或同组织请求的增强拒绝访问错误消息现已在所有 Amazon Web Services 区域推出，包括 Amazon GovCloud (US) Regions和中国区域。

大多数拒绝访问的错误消息都以 `User user-arn is not authorized to perform action on "resource-arn" because context` 格式显示。在此示例中，*`user-arn`* 是未获得访问权限的用户的 [Amazon 资源名称（ARN）](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns)，*`action`* 是策略拒绝的服务操作，而 *`resource-arn`* 是策略对其执行操作的资源的 ARN。*`context`* 字段表示有关策略类型的其它上下文，用于解释策略拒绝访问的原因。

当策略因其包含 `Deny` 语句而显式拒绝访问时，拒绝访问错误消息中将包含短语 `with an explicit deny in a type policy`。当策略隐式拒绝访问时，拒绝访问错误消息中将包含短语 `because no type policy allows the action action`。

**重要**  
仅针对同账户请求或 Amazon Organizations 中同一组织内的请求才返回增强的拒绝访问消息。同一组织之外的跨账户请求会返回一条通用 `Access Denied` 消息。  
有关确定是支持还是拒绝跨账户访问请求的策略评估逻辑的信息，请参阅《IAM 用户指南》**中的[跨账户策略评估逻辑](https://docs.amazonaws.cn//IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html)。有关说明如何授予跨账户访问权限的演练，请参阅[示例 2：存储桶拥有者授予跨账户存储桶权限](example-walkthroughs-managing-access-example2.md)。
对于 Amazon Organizations 中同一组织内的请求：  
如果由于虚拟私有云（VPC）端点策略而出现拒绝，则不会返回增强的拒绝访问消息。
每当存储桶所有者和调用方账户都属于 Amazon Organizations 中的同一个组织时，就会提供增强的拒绝访问消息。尽管配置了 S3 对象所有权**存储桶拥有者优先**或**对象编写者**设置的存储桶可能包含由不同账户拥有的对象，但对象所有权不会影响增强的访问拒绝消息。只要存储桶所有者和调用方在同一个组织中，则无论谁拥有特定对象，都会针对所有对象请求返回增强的拒绝访问消息。有关对象所有权设置和配置的信息，请参阅[为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。
向目录存储桶发出的请求不会返回增强拒绝访问错误消息。目录存储桶请求会返回一条一般 `Access Denied` 消息。
如果同一策略类型的多个策略拒绝授权请求，拒绝访问错误消息不指定策略的数量。
如果多种策略类型拒绝授权请求，则错误消息仅包含其中一种策略类型。
如果由于多种原因而拒绝访问请求，则错误消息仅包含拒绝原因之一。

下面的示例展示了不同类型的拒绝访问错误消息的格式以及如何对每种类型的消息进行故障排除。

### 由于阻止的加密类型而拒绝访问
<a name="access-denied-due-to-blocked-encryption-type"></a>

要限制可在通用存储桶中使用的服务器端加密类型，您可以选择更新存储桶的默认加密配置，以此来阻止 SSE-C 写入请求。此存储桶级别的配置将阻止请求上传指定了 SSE-C 的对象。当存储桶阻止 SSE-C 时，任何指定了 SSE-C 加密的 `PutObject`、`CopyObject`、`PostObject`、分段上传或复制请求都将被拒绝，并返回 HTTP 403 `AccessDenied` 错误。

此设置是 `PutBucketEncryption` API 上的一个参数，如果您有 `s3:PutEncryptionConfiguration` 权限，也可以使用 S3 控制台、Amazon CLI 和Amazon SDK 更新此设置。有效值为 `SSE-C`（在通用存储桶上阻止 SSE-C 加密）和 `NONE`（允许在写入存储桶时使用 SSE-C）。

例如，如果因为 `BlockedEncryptionTypes` 设置阻止了指定 SSE-C 的写入请求，导致 `PutObject` 请求的访问被拒绝时，您将收到以下消息：

```
An error occurred (AccessDenied) when calling the PutObject operation:   
User: arn:aws:iam::123456789012:user/MaryMajor  is not   
authorized to perform: s3:PutObject on resource:   
"arn:aws:s3:::amzn-s3-demo-bucket1/object-name" because this   
bucket has blocked upload requests that specify   
Server Side Encryption with Customer provided keys (SSE-C).   
Please specify a different server-side encryption type
```

有关该设置的更多信息，请参阅 [对通用存储桶阻止或取消阻止 SSE-C](blocking-unblocking-s3-c-encryption-gpb.md)。

### 由于资源控制策略而拒绝访问 – 显式拒绝
<a name="access-denied-rcp-examples-explicit"></a>

1. 检查资源控制策略（RCP）中的操作是否有 `Deny` 语句。对于以下示例，操作为 `s3:GetObject`。

1. 通过删除 `Deny` 语句来更新 RCP。有关更多信息，请参阅《Amazon Organizations User Guide》**中的 [Update a resource control policy (RCP)](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_policies_update.html#update_policy-rcp)。

```
An error occurred (AccessDenied) when calling the GetObject operation: 
User: arn:aws:iam::777788889999:user/MaryMajor is not authorized to perform: 
s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1/object-name" 
with an explicit deny in a resource control policy
```

### 由于服务控制策略而拒绝访问 – 隐式拒绝
<a name="access-denied-scp-examples-implicit"></a>

1. 检查服务控制策略（SCP）中的操作是否有缺少的 `Allow` 语句。对于以下示例，操作为 `s3:GetObject`。

1. 通过添加 `Allow` 语句来更新 SCP。有关更多信息，请参阅 *Amazon Organizations 用户指南*中的[更新 SCP](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_scps_create.html#update_policy)。

```
User: arn:aws:iam::777788889999:user/MaryMajor is not authorized to perform:
s3:GetObject because no service control policy allows the s3:GetObject action
```

### 由于服务控制策略而拒绝访问 – 显式拒绝
<a name="access-denied-scp-examples-explicit"></a>

1. 检查服务控制策略（SCP）中的操作是否有 `Deny` 语句。对于以下示例，操作为 `s3:GetObject`。

1. 通过更改 `Deny` 语句以支持用户获得必要的访问权限，来更新您的 SCP。有关如何执行此操作的示例，请参阅《Amazon Organizations 用户指南》**中的 [Prevent IAM users and roles from making specified changes, with an exception for a specified admin role](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_scps_examples_general.html#example-scp-restricts-with-exception)。有关更新 SCP 的更多信息，请参阅《Amazon Organizations 用户指南》**中的 [Updating an SCP](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_scps_create.html#update_policy)。

```
User: arn:aws:iam::777788889999:user/MaryMajor is not authorized to perform: 
s3:GetObject with an explicit deny in a service control policy
```

### 由于 VPC 端点策略而拒绝访问 – 隐式拒绝
<a name="access-denied-vpc-endpoint-examples-implicit"></a>

1. 检查虚拟私有云（VPC）端点策略中的操作是否有缺失的 `Allow` 语句。对于以下示例，操作为 `s3:GetObject`。

1. 通过添加 `Allow` 语句来更新 VPC 端点策略。有关更多信息，请参阅《Amazon PrivateLink 指南》**中的[更新 VPC 端点策略](https://docs.amazonaws.cn/vpc/latest/privatelink/vpc-endpoints-access.html#update-vpc-endpoint-policy)。

```
User: arn:aws:iam::123456789012:user/MaryMajor is not authorized to perform: 
s3:GetObject because no VPC endpoint policy allows the s3:GetObject action
```

### 由于 VPC 端点策略而拒绝访问 – 显式拒绝
<a name="access-denied-vpc-endpoint-examples-explicit"></a>

1. 检查虚拟私有云（VPC）端点策略中的操作是否有显式 `Deny` 语句。对于以下示例，操作为 `s3:GetObject`。

1. 通过更改 `Deny` 语句以支持用户获得必要的访问权限，来更新 VPC 端点策略。例如，可以更新 `Deny` 语句来使用 `aws:PrincipalAccount` 条件键和 `StringNotEquals` 条件运算符，从而支持特定的主体进行访问，如[示例 7：从 `Deny` 语句中排除特定主体](amazon-s3-policy-keys.md#example-exclude-principal-from-deny-statement)中所示。有关更新 VPC 端点策略的更多信息，请参阅《Amazon PrivateLink 指南》**中的 [Update a VPC endpoint policy](https://docs.amazonaws.cn/vpc/latest/privatelink/vpc-endpoints-access.html#update-vpc-endpoint-policy)。

```
User: arn:aws:iam::123456789012:user/MaryMajor is not authorized to perform: 
s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1/object-name" with 
an explicit deny in a VPC endpoint policy
```

### 由于权限边界而拒绝访问 – 隐式拒绝
<a name="access-denied-permissions-boundary-examples-implicit"></a>

1. 检查权限边界中的操作是否有缺失的 `Allow` 语句。对于以下示例，操作为 `s3:GetObject`。

1. 通过将 `Allow` 语句添加到 IAM policy 来更新权限边界。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 实体的权限边界](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_boundaries.html)和[编辑 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)。

```
User: arn:aws:iam::123456789012:user/MaryMajor is not authorized to perform: 
s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1/object-name" 
because no permissions boundary allows the s3:GetObject action
```

### 由于权限边界而拒绝访问 – 显式拒绝
<a name="access-denied-permissions-boundary-examples-explicit"></a>

1. 检查权限边界中的操作是否有显式 `Deny` 语句。对于以下示例，操作为 `s3:GetObject`。

1. 通过更改 IAM 策略中的 `Deny` 语句以支持用户获得必要的访问权限，来更新您的权限边界。例如，可以更新 `Deny` 语句来使用 `aws:PrincipalAccount` 条件键和 `StringNotEquals` 条件运算符，从而支持特定的主体进行访问，如《IAM 用户指南》**中的 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalaccount](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalaccount) 所示。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 实体的权限边界](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_boundaries.html)和[编辑 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)。

```
User: arn:aws:iam::777788889999:user/MaryMajor is not authorized to perform: 
s3:GetObject with an explicit deny in a permissions boundary
```

### 由于会话策略而拒绝访问 – 隐式拒绝
<a name="access-denied-session-policy-examples-implicit"></a>

1. 检查会话策略中的操作是否有缺失的 `Allow` 语句。对于以下示例，操作为 `s3:GetObject`。

1. 通过添加 `Allow` 语句来更新会话策略。有关更多信息，请参阅《IAM 用户指南》**中的[会话策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies_session)和[编辑 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)。

```
User: arn:aws:iam::123456789012:user/MaryMajor is not authorized to perform: 
s3:GetObject because no session policy allows the s3:GetObject action
```

### 由于会话策略而拒绝访问 – 显式拒绝
<a name="access-denied-session-policy-examples-explicit"></a>

1. 检查会话策略中的操作是否有显式 `Deny` 语句。对于以下示例，操作为 `s3:GetObject`。

1. 通过更改 `Deny` 语句以支持用户获得必要的访问权限，来更新您的会话策略。例如，可以更新 `Deny` 语句来使用 `aws:PrincipalAccount` 条件键和 `StringNotEquals` 条件运算符，从而支持特定的主体进行访问，如[示例 7：从 `Deny` 语句中排除特定主体](amazon-s3-policy-keys.md#example-exclude-principal-from-deny-statement)中所示。有关更新会话策略的更多信息，请参阅《IAM 用户指南》**中的[会话策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies_session)和[编辑 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)。

```
User: arn:aws:iam::123456789012:user/MaryMajor is not authorized to perform: 
s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1/object-name" with 
an explicit deny in a session policy
```

### 由于基于资源的策略而拒绝访问 – 隐式拒绝
<a name="access-denied-resource-based-policy-examples-implicit"></a>

**注意**  
*基于资源的策略* 是指诸如存储桶策略和接入点策略之类的策略。

1. 检查基于资源的策略中的操作是否有缺失的 `Allow` 语句。还要检查 `IgnorePublicAcls` S3 屏蔽公共访问权限设置是否应用于存储桶、接入点或账户级。对于以下示例，操作为 `s3:GetObject`。

1. 通过添加 `Allow` 语句来更新策略。有关更多信息，请参阅《IAM 用户指南》**中的[基于资源的策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies_resource-based)和[编辑 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)。

   您可能还需要调整存储桶、接入点或账户的 `IgnorePublicAcls` 屏蔽公共访问权限设置。有关更多信息，请参阅[由于屏蔽公共访问权限设置而拒绝访问](#access-denied-bpa-examples)和[为 S3 存储桶配置屏蔽公共访问权限设置](configuring-block-public-access-bucket.md)。

```
User: arn:aws:iam::123456789012:user/MaryMajor is not authorized to perform: 
s3:GetObject because no resource-based policy allows the s3:GetObject action
```

### 由于基于资源的策略而拒绝访问 – 显式拒绝
<a name="access-denied-resource-based-policy-examples-explicit"></a>

**注意**  
*基于资源的策略* 是指诸如存储桶策略和接入点策略之类的策略。

1. 检查基于资源的策略中的操作是否有显式 `Deny` 语句。还要检查 `RestrictPublicBuckets` S3 屏蔽公共访问权限设置是否应用于存储桶、接入点或账户级。对于以下示例，操作为 `s3:GetObject`。

1. 通过更改 `Deny` 语句以支持用户获得必要的访问权限，来更新您的策略。例如，可以更新 `Deny` 语句来使用 `aws:PrincipalAccount` 条件键和 `StringNotEquals` 条件运算符，从而支持特定的主体进行访问，如[示例 7：从 `Deny` 语句中排除特定主体](amazon-s3-policy-keys.md#example-exclude-principal-from-deny-statement)中所示。有关更新基于资源的策略的更多信息，请参阅《IAM 用户指南》**中的[基于资源的策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies_resource-based)和[编辑 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)。

   您可能还需要调整存储桶、接入点或账户的 `RestrictPublicBuckets` 屏蔽公共访问权限设置。有关更多信息，请参阅[由于屏蔽公共访问权限设置而拒绝访问](#access-denied-bpa-examples)和[为 S3 存储桶配置屏蔽公共访问权限设置](configuring-block-public-access-bucket.md)。

```
User: arn:aws:iam::123456789012:user/MaryMajor is not authorized to perform: 
s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1/object-name" with 
an explicit deny in a resource-based policy
```

### 由于基于身份的策略而拒绝访问 – 隐式拒绝
<a name="access-denied-identity-based-policy-examples-implicit"></a>

1. 检查附加到身份的基于身份的策略中的操作中是否有缺失的 `Allow` 语句。对于以下示例，操作为附加到用户 `MaryMajor` 的 `s3:GetObject`。

1. 通过添加 `Allow` 语句来更新策略。有关更多信息，请参阅《IAM 用户指南》**中的[基于身份的策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies_id-based)和[编辑 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)。

```
User: arn:aws:iam::123456789012:user/MaryMajor is not authorized to perform: 
s3:GetObject because no identity-based policy allows the s3:GetObject action
```

### 由于基于身份的策略而拒绝访问 – 显式拒绝
<a name="access-denied-identity-based-policy-examples-explicit"></a>

1. 检查附加到身份的基于身份的策略中的操作中是否有显式 `Deny` 语句。对于以下示例，操作为附加到用户 `MaryMajor` 的 `s3:GetObject`。

1. 通过更改 `Deny` 语句以支持用户获得必要的访问权限，来更新您的策略。例如，可以更新 `Deny` 语句来使用 `aws:PrincipalAccount` 条件键和 `StringNotEquals` 条件运算符，从而支持特定的主体进行访问，如《IAM 用户指南》**中的 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalaccount](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalaccount) 所示。有关更多信息，请参阅《IAM 用户指南》**中的[基于身份的策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies_id-based)和[编辑 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)。

```
User: arn:aws:iam::123456789012:user/MaryMajor is not authorized to perform: 
s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1/object-name" with 
an explicit deny in an identity-based policy
```

### 由于屏蔽公共访问权限设置而拒绝访问
<a name="access-denied-bpa-examples"></a>

Amazon S3 屏蔽公共访问权限特征提供接入点、存储桶和账户设置，帮助您管理对 Amazon S3 资源的公有访问。有关 Amazon S3 如何定义“公共”的更多信息，请参阅[“公有”的含义](access-control-block-public-access.md#access-control-block-public-access-policy-status)。

默认情况下，新存储桶、接入点和对象不允许公有访问。但是，用户可以修改存储桶策略、接入点策略、IAM 用户策略、对象权限或访问控制列表（ACL）来支持公共访问权限。S3 屏蔽公共访问权限设置会覆盖这些策略、权限和 ACL。自 2023 年 4 月起，默认情况下为新存储桶启用所有屏蔽公共访问权限设置。

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

Amazon S3 屏蔽公共访问权限提供四种设置。这些设置彼此独立，可任意组合使用。每个设置都可以应用于访问点、存储桶或整个 Amazon 账户。如果接入点、存储桶或账户的屏蔽公共访问权限设置不同，则 Amazon S3 应用接入点、存储桶和账户设置的最严格组合。

当 Amazon S3 评估屏蔽公共访问权限设置是否禁止某一操作时，它将拒绝违反接入点、存储桶或账户设置的任何请求。

Amazon S3 屏蔽公共访问权限提供的四种设置如下：
+ `BlockPublicAcls` – 此设置适用于 `PutBucketAcl`、`PutObjectAcl`、`PutObject`、`CreateBucket`、`CopyObject` 和 `POST Object` 请求。`BlockPublicAcls` 设置会导致以下行为：
  + 如果指定的访问控制列表（ACL）为公有，`PutBucketAcl` 和 `PutObjectAcl` 调用将失败。
  + 如果请求包含公有 ACL，则 `PutObject` 调用失败。
  + 如果将此设置应用于某个账户，则当请求包含公有 ACL 时，`CreateBucket` 调用将失败，并返回 HTTP `400` (`Bad Request`) 响应。

  例如，当对 `CopyObject` 请求的访问因 `BlockPublicAcls` 设置而被拒绝时，您将收到以下消息：

  ```
  An error occurred (AccessDenied) when calling the CopyObject operation: 
  User: arn:aws:sts::123456789012:user/MaryMajor is not authorized to 
  perform: s3:CopyObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1/object-name" 
  because public ACLs are prevented by the BlockPublicAcls setting in S3 Block Public Access.
  ```
+ `IgnorePublicAcls` – `IgnorePublicAcls` 设置会使 Amazon S3 忽略存储桶及其包含的任何对象上的所有公有 ACL。如果您的请求的权限仅由公共 ACL 授予，则 `IgnorePublicAcls` 设置会拒绝该请求。

  由 `IgnorePublicAcls` 设置导致的任何拒绝都是隐式的。例如，如果 `IgnorePublicAcls` 因公有 ACL 而拒绝 `GetObject` 请求，您将收到以下消息：

  ```
  User: arn:aws:iam::123456789012:user/MaryMajor is not authorized to perform: 
  s3:GetObject because no resource-based policy allows the s3:GetObject action
  ```
+ `BlockPublicPolicy` – 此设置适用于 `PutBucketPolicy` 和 `PutAccessPointPolicy` 请求。

  为存储桶设置 `BlockPublicPolicy` 将导致 Amazon S3 在指定的存储桶策略支持公共访问权限时拒绝对 `PutBucketPolicy` 的调用。如果指定的策略支持公共访问权限，则此设置也会导致 Amazon S3 针对存储桶的所有相同账户接入点拒绝对 `PutAccessPointPolicy` 的调用。

  如果（为接入点或底层存储桶）指定的策略支持公共访问权限，则为接入点设置 `BlockPublicPolicy` 会导致 Amazon S3 拒绝通过该接入点对 `PutAccessPointPolicy` 和 `PutBucketPolicy` 进行的调用。

  例如，当对 `PutBucketPolicy` 请求的访问因 `BlockPublicPolicy` 设置而被拒绝时，您将收到以下消息：

  ```
  An error occurred (AccessDenied) when calling the PutBucketPolicy operation: 
  User: arn:aws:sts::123456789012:user/MaryMajor is not authorized to 
  perform: s3:PutBucketPolicy on resource: "arn:aws:s3:::amzn-s3-demo-bucket1/object-name" 
  because public policies are prevented by the BlockPublicPolicy setting in S3 Block Public Access.
  ```
+ `RestrictPublicBuckets` – `RestrictPublicBuckets` 设置会将使用公有策略对接入点或存储桶的访问权限限制为仅该存储桶拥有者账户和接入点拥有者账户中的 Amazon Web Services 服务主体和授权用户。此设置会阻止对接入点或存储桶的所有跨账户访问（Amazon Web Services 服务主体的访问除外），但仍支持该账户内的用户管理接入点或存储桶。此设置还拒绝所有匿名（或未签名的）调用。

  由 `RestrictPublicBuckets` 设置导致的任何拒绝都是显式的。例如，如果 `RestrictPublicBuckets` 因公有存储桶或接入点策略而拒绝 `GetObject` 请求，您将收到以下消息：

  ```
  User: arn:aws:iam::123456789012:user/MaryMajor is not authorized to perform: 
  s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1/object-name" with 
  an explicit deny in a resource-based policy
  ```

有关这些设置的更多信息，请参阅 [屏蔽公共访问权限设置](access-control-block-public-access.md#access-control-block-public-access-options)。要查看和更新这些设置，请参阅[配置屏蔽公共访问权限](access-control-block-public-access.md#configuring-block-public-access)。

## 由于申请方付款设置而拒绝访问
<a name="access-denied-requester-pays"></a>

如果您尝试访问的 Amazon S3 存储桶启用了申请方付款功能，则需要确保在向该存储桶发出请求时传递正确的请求参数。Amazon S3 中的申请方付款功能支持申请方（而不是存储桶拥有者）支付用于访问存储桶中对象的数据传输费用和请求费用。为存储桶启用申请方付款后，存储桶拥有者无需为其它 Amazon 账户发出的请求付费。

如果您在未传递必要参数的情况下向启用了申请方付款的存储桶发出请求，则会收到“拒绝访问（403 禁止）”错误。要访问启用了申请方付款的存储桶中的对象，必须执行以下操作：

1. 使用 Amazon CLI 发出请求时，必须包含 `--request-payer requester` 参数。例如，要将位于 `s3://amzn-s3-demo-bucket/` S3 存储桶中的密钥为 `object.txt` 的对象复制到本地计算机上的某个位置，如果此存储桶启用了申请方付款，则还必须传递参数 `--request-payer requester`。

   ```
   aws s3 cp s3://amzn-s3-demo-bucket/object.txt /local/path \
   --request-payer requester
   ```

1. 使用 Amazon SDK 发出编程请求时，请将 `x-amz-request-payer` 标头设置为值 `requester`。有关示例，请参阅[从申请方付款桶中下载对象](ObjectsinRequesterPaysBuckets.md)。

1. 确保发出请求的 IAM 用户或角色拥有访问申请方付款存储桶的必要权限，例如 `s3:GetObject` 和 `s3:ListBucket` 权限。

通过包括 `--request-payer requester` 参数或设置 `x-amz-request-payer` 标头，您就是在告知 Amazon S3，您（请求者）将支付与访问已启用申请方付款的存储桶中的对象关联的费用。这将防止“拒绝访问（403 禁止）”错误。

## 桶策略和 IAM policy
<a name="bucket-iam-policies"></a>

### 存储桶级别操作
<a name="troubleshoot-403-bucket-level-ops"></a>

如果没有存储桶策略，则存储桶会隐式支持来自存储桶拥有者账户中任何 Amazon Identity and Access Management（IAM）身份的请求。桶还隐式拒绝来自任何其他账户的任何其他 IAM 身份的请求以及匿名（未签名）请求。但是，如果没有 IAM 用户策略，则会隐式拒绝请求者（除非他们是 Amazon Web Services 账户根用户）发出任何请求。有关此评估逻辑的更多信息，请参阅《IAM 用户指南》**中的[确定是允许还是拒绝账户内的请求](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)。

### 对象级别操作
<a name="troubleshoot-403-object-level-ops"></a>

如果对象归桶拥有者账户拥有，则桶策略和 IAM 用户策略在对象级别操作中的运作方式与在桶级别操作中的运行方式相同。例如，如果没有存储桶策略，则存储桶会隐式支持来自存储桶拥有者账户中任何 IAM 身份的对象请求。桶还隐式拒绝来自任何其他账户的任何其他 IAM 身份的对象请求以及匿名（未签名）请求。但是，如果没有 IAM 用户策略，则会隐式拒绝请求者（除非他们是 Amazon Web Services 账户根用户）发出任何对象请求。

如果对象归外部账户拥有，则只能通过对象访问控制列表（ACL）授予对该对象的访问权限。桶策略和 IAM 用户策略仍可用于拒绝对象请求。

因此，为确保存储桶策略或 IAM 用户策略不会导致拒绝访问（403 禁止）错误，请确保满足以下要求：
+ 对于同账户访问，无论是在桶策略还是 IAM 用户策略中，都不得针对您尝试向其授予权限的请求者使用显式 `Deny` 语句。如果您想仅使用桶策略和 IAM 用户策略授予权限，则其中一个策略中必须至少有一条显式 `Allow` 语句。
+ 对于跨账户访问，无论是在存储桶策略还是 IAM 用户策略中，都不得针对您尝试向其授予权限的请求者使用显式 `Deny` 语句。要仅使用存储桶策略和 IAM 用户策略授予跨账户权限，请确保请求者的存储桶策略和 IAM 用户策略都包含显式 `Allow` 语句。

**注意**  
桶策略中的 `Allow` 语句仅适用于[由同一桶拥有者账户拥有](https://docs.amazonaws.cn/AmazonS3/latest/userguide/about-object-ownership.html)的对象。但是，无论对象所有权如何，桶策略中的 `Deny` 语句都适用于所有对象。

**查看或编辑您的桶策略**
**注意**  
要查看或编辑桶策略，您必须拥有 `s3:GetBucketPolicy` 权限。

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

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

1. 从**桶**列表中，选择要查看或编辑其桶策略的桶的名称。

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

1. 在 **Bucket policy（存储桶策略）**下，请选择 **Edit（编辑）**。将出现 **Edit bucket policy**（编辑存储桶策略）页面。

要使用 Amazon Command Line Interface（Amazon CLI）查看或编辑您的桶策略，请使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-policy.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-policy.html) 命令。

**注意**  
如果您因为存储桶策略不正确而被锁定在存储桶之外，[sign in to the Amazon Web Services 管理控制台 by using your Amazon Web Services 账户 root user credentials](https://docs.amazonaws.cn/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html)（请使用 Amazon 账户根用户凭证登录 Amazon 管理控制台）。要重新获得对存储桶的访问权限，请务必使用 Amazon Web Services 账户根用户凭证删除不正确的存储桶策略。

### 有关检查权限的提示
<a name="troubleshoot-403-tips"></a>

要检查请求者是否具有执行 Amazon S3 操作的适当权限，请尝试以下操作：
+ 确定请求者。如果是未签名的请求，则它是没有 IAM 用户策略的匿名请求。如果这是使用预签名 URL 的请求，则用户策略会与对请求进行签名的 IAM 用户或角色的策略相同。
+ 验证您使用的是正确的 IAM 用户或角色。您可以通过检查 Amazon Web Services 管理控制台的右上角或使用 [https://docs.amazonaws.cn/cli/latest/reference/sts/get-caller-identity.html](https://docs.amazonaws.cn/cli/latest/reference/sts/get-caller-identity.html) 命令来验证您的 IAM 用户或角色。
+ 检查与 IAM 用户或角色相关的 IAM policy。您可以使用以下方法之一：
  + [使用 IAM policy simulator 测试 IAM policy](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_testing-policies.html)。
  + 查看不同的 [IAM policy 类型](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html)。
+ 如果需要，[编辑您的 IAM 用户策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)。
+ 查看以下显式拒绝或允许访问的策略示例：
  + 显式允许 IAM 用户策略：[IAM：允许和拒绝以编程方式和在控制台中访问多个服务](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_examples_iam_multiple-services-console.html)
  + 显式允许桶策略：[授予多个账户上传对象或设置对象 ACL 以进行公共访问的权限](https://docs.amazonaws.cn/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-acl-1)
  + 显式拒绝 IAM 用户策略：[Amazon：根据请求的 Amazon Web Services 区域拒绝访问 Amazon](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_examples_aws_deny-requested-region.html)
  + 显式拒绝桶策略：[要求对写入桶的所有对象使用 SSE-KMS](https://docs.amazonaws.cn/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-encryption-1)

## Amazon S3 ACL 设置
<a name="troubleshoot-403-acl-settings"></a>

检查 ACL 设置时，请先[查看您的对象所有权设置](https://docs.amazonaws.cn/AmazonS3/latest/userguide/object-ownership-retrieving.html)，以检查桶上是否已启用 ACL。请注意，ACL 权限只能用于授予权限，而不能用于拒绝请求。对于由存储桶策略或 IAM 用户策略中的显式拒绝而被拒绝的请求者，ACL 也不能用于向他们授予访问权限。

### 对象所有权设置设为强制存储桶拥有者
<a name="troubleshoot-403-object-ownership-1"></a>

如果启用了**强制存储桶拥有者**设置，则 ACL 设置不太可能导致拒绝访问（403 禁止）错误，因为此设置会禁用应用于存储桶和对象的所有 ACL。**强制存储桶拥有者**是 Amazon S3 存储桶的默认设置，并且是建议的设置。

### 对象所有权设置设为存储桶拥有者优先或对象编写者
<a name="troubleshoot-403-object-ownership-2"></a>

使用**存储桶拥有者优先**设置或**对象编写者**设置时，ACL 权限仍然有效。ACL 有两种：桶 ACL 和对象 ACL。有关这两种类型的 ACL 之间的区别，请参阅 [ACL 权限和访问策略权限的映射](https://docs.amazonaws.cn/AmazonS3/latest/userguide/acl-overview.html#acl-access-policy-permission-mapping)。

根据被拒绝的请求的操作，[检查您的桶或对象的 ACL 权限](https://docs.amazonaws.cn/AmazonS3/latest/userguide/managing-acls.html)：
+ 如果 Amazon S3 拒绝了 `LIST`、`PUT` 对象、`GetBucketAcl` 或 `PutBucketAcl` 请求，请[查看您的桶的 ACL 权限](https://docs.amazonaws.cn/AmazonS3/latest/userguide/managing-acls.html)。
**注意**  
您无法使用存储桶 ACL 设置授予 `GET` 对象权限。
+ 如果 Amazon S3 拒绝了对 S3 对象的 `GET` 请求或拒绝了 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutObjectAcl.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutObjectAcl.html) 请求，请[查看该对象的 ACL 权限](https://docs.amazonaws.cn/AmazonS3/latest/userguide/managing-acls.html)。
**重要**  
如果拥有该对象的账户与拥有该桶的账户不同，则对该对象的访问权限不受桶策略控制。

### 排查在跨账户对象所有权期间来自 `GET` 对象请求的拒绝访问（403 禁止）错误
<a name="troubleshoot-403-object-ownership-tips"></a>

查看桶的[对象所有权设置](https://docs.amazonaws.cn/AmazonS3/latest/userguide/about-object-ownership.html#object-ownership-overview)以确定对象拥有者。如果您有权访问[对象 ACL](https://docs.amazonaws.cn/AmazonS3/latest/userguide/managing-acls.html)，则还可以检查对象拥有者的账户。（要查看对象拥有者的账户，请在 Amazon S3 控制台中查看对象 ACL 设置。） 或者，您也可以发出 `GetObjectAcl` 请求，以查找对象拥有者的[规范 ID](https://docs.amazonaws.cn/AmazonS3/latest/API/API_GetObjectAcl.html) 来验证对象拥有者账户。原定设置情况下，ACL 为对于对象拥有者账户的 `GET` 请求授予显式允许权限。

确认对象拥有者与桶拥有者不同后，根据您的使用案例和访问级别，选择以下方法之一来帮助解决拒绝访问（403 禁止）错误：
+ **禁用 ACL（推荐）** – 此方法适用于所有对象，可由桶拥有者执行。这种方法自动向桶拥有者授予对桶中每个对象的所有权和完全控制权。在实施此方法之前，请检查[禁用 ACL 的先决条件](https://docs.amazonaws.cn/AmazonS3/latest/userguide/object-ownership-migrating-acls-prerequisites.html)。有关如何将存储桶设置为**强制存储桶拥有者**（建议）模式的信息，请参阅[为现有存储桶设置对象所有权](https://docs.amazonaws.cn/AmazonS3/latest/userguide/object-ownership-existing-bucket.html)。
**重要**  
为防止拒绝访问（403 禁止）错误，请务必在禁用 ACL 之前将 ACL 权限迁移到桶策略。有关更多信息，请参阅[从 ACL 权限迁移的桶策略示例](https://docs.amazonaws.cn/AmazonS3/latest/userguide/object-ownership-migrating-acls-prerequisites.html#migrate-acl-permissions-bucket-policies)。
+ **将对象拥有者更改为桶拥有者** - 此方法可以应用于单个对象，但只有对象拥有者（或具有相应权限的用户）才能更改对象的所有权。可能会收取额外的 `PUT` 费用。（有关更多信息，请参阅 [Amazon S3 定价](https://www.amazonaws.cn/s3/pricing/)。） 此方法向桶拥有者授予对象的完全所有权，允许桶拥有者通过桶策略控制对于对象的访问权限。

  要更改对象的所有权，请执行以下操作之一：
  + 您（桶拥有者）可以[将对象复制](https://docs.amazonaws.cn/AmazonS3/latest/userguide/copy-object.html#CopyingObjectsExamples)回桶。
  + 您可以将存储桶的对象所有权设置更改为**存储桶拥有者优先**。如果禁用版本控制，则桶中的对象将被覆盖。如果启用了版本控制，则同一对象的重复版本将出现在桶中，而桶拥有者可以[将生命周期规则设置为过期](https://docs.amazonaws.cn/AmazonS3/latest/userguide/lifecycle-expire-general-considerations.html)。有关如何更改对象所有权设置的说明，请参阅[为现有存储桶设置对象所有权](object-ownership-existing-bucket.md)。
**注意**  
当您将对象所有权设置更新为**存储桶拥有者优先**时，该设置仅适用于上传到存储桶的新对象。
  + 您可以让对象拥有者使用 `bucket-owner-full-control` 标准对象 ACL 再次上传对象。
**注意**  
对于跨账户上传，您还可以在桶策略中要求使用 `bucket-owner-full-control` 标准对象 ACL。有关桶策略示例，请参阅[在授予上传对象的跨账户权限的同时，确保桶拥有者拥有完全控制权](https://docs.amazonaws.cn/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-acl-2)。
+ **将对象编写者保持为对象拥有者** - 此方法不会更改对象拥有者，但它允许您单独授予对于对象的访问权限。要授予对于对象的访问权限，您必须拥有该对象的 `PutObjectAcl` 权限。然后，要修复“拒绝访问（403 禁止）”错误，请将请求者添加为[被授予者](https://docs.amazonaws.cn/AmazonS3/latest/userguide/acl-overview.html#specifying-grantee)，以访问对象的 ACL 中的对象。有关更多信息，请参阅 [配置 ACL](managing-acls.md)。

## S3 屏蔽公共访问权限设置
<a name="troubleshoot-403-bpa"></a>

如果失败的请求涉及公共访问权限或公共策略，请检查您的账户、存储桶或接入点上的 S3 屏蔽公共访问权限设置。有关排查与 S3 屏蔽公共访问权限设置相关的拒绝访问错误的更多信息，请参阅[由于屏蔽公共访问权限设置而拒绝访问](#access-denied-bpa-examples)。

## Amazon S3 加密设置
<a name="troubleshoot-403-encryption"></a>

Amazon S3 支持对您的桶进行服务器端加密。服务器端加密是指由接收数据的应用程序或服务在目标位置对数据进行加密。Amazon S3 在将您的数据写入 Amazon 数据中心内的磁盘时会在对象级别加密这些数据，并在您访问这些数据时解密这些数据。

原定设置情况下，Amazon S3 现在应用具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3），作为 Amazon S3 中每个桶的基本加密级别。Amazon S3 还允许您在上传对象时指定服务器端加密方法。

**查看您的桶的服务器端加密状态和加密设置**

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

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

1. 从**桶**列表中，请选择要检查其加密设置的桶。

1. 选择**属性**选项卡。

1. 向下滚动到**原定设置加密**部分，并查看**加密类型**设置。

要使用 Amazon CLI 检查您的加密设置，请使用 [https://docs.amazonaws.cn/cli/latest/reference/s3api/get-bucket-encryption.html](https://docs.amazonaws.cn/cli/latest/reference/s3api/get-bucket-encryption.html) 命令。

**检查对象的加密状态**

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

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

1. 从**桶**列表中，请选择包含对象的桶的名称。

1. 从**对象**列表中，请选择要为其添加或更改加密的对象的名称。

   此时将显示对象的详细信息页面。

1. 向下滚动到**服务器端加密设置**部分，以查看对象的服务器端加密设置。

要使用 Amazon CLI 检查您的对象加密状态，请使用 [https://docs.amazonaws.cn/cli/latest/reference/s3api/head-object.html#examples](https://docs.amazonaws.cn/cli/latest/reference/s3api/head-object.html#examples) 命令。

### 加密和权限要求
<a name="troubleshoot-403-encryption-requirements"></a>

Amazon S3 支持三种类型的服务器端加密：
+ 具有 Amazon S3 托管密钥的服务器端加密（SSE-S3）
+ 具有 Amazon Key Management Service（Amazon KMS）密钥的服务器端加密（SSE-KMS）
+ 具有客户提供密钥的服务器端加密（SSE-C）

根据您的加密设置，请确保满足以下权限要求：
+ **SSE-S3** - 不需要额外的权限。
+ **SSE-KMS（使用客户自主管理型密钥）** - 要上传对象，需要针对 Amazon KMS key 的 `kms:GenerateDataKey` 权限。要下载对象和执行对象的分段上传，需要针对 KMS 密钥的 `kms:Decrypt` 权限。
+ **SSE-KMS（具有 Amazon 托管式密钥）**– 请求者必须来自拥有 `aws/s3` KMS 密钥的同一个账户。请求者还必须具有正确的 Amazon S3 权限才能访问该对象。
+ **SSE-C（具有客户提供的密钥）** - 无需其他权限。您可以配置桶策略，以[要求和限制具有客户提供的加密密钥的服务器端加密](https://docs.amazonaws.cn/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html#ssec-require-condition-key)来加密桶中的对象。

如果使用客户自主管理型密钥加密对象，请确保 KMS 密钥策略允许您执行 `kms:GenerateDataKey` 或 `kms:Decrypt` 操作。有关检查 KMS 密钥策略的说明，请参阅《Amazon Key Management Service 开发人员指南》**中的[查看密钥策略](https://docs.amazonaws.cn/kms/latest/developerguide/key-policy-viewing.html)。

## S3 对象锁定设置
<a name="troubleshoot-403-object-lock"></a>

如果存储桶启用了 [S3 对象锁定](https://docs.amazonaws.cn/AmazonS3/latest/userguide/object-lock.html)，并且该对象受[保留期](https://docs.amazonaws.cn/AmazonS3/latest/userguide/object-lock-overview.html#object-lock-retention-periods)或[法定保留](https://docs.amazonaws.cn/AmazonS3/latest/userguide/object-lock-overview.html#object-lock-legal-holds)的保护，而您尝试删除某个对象，则 Amazon S3 会返回以下响应之一，具体取决于您尝试删除该对象的方式：
+ **永久 `DELETE` 请求**：如果您发出了永久 `DELETE` 请求（指定版本 ID 的请求），则当您尝试删除对象时，Amazon S3 会返回拒绝访问 (`403 Forbidden`) 错误。
+ **简单 `DELETE` 请求**：如果您发出了简单 `DELETE` 请求（未指定版本 ID 的请求），Amazon S3 将返回 `200 OK` 响应并在存储桶中插入[删除标记](DeleteMarker.md)，该标记将成为具有新 ID 的对象的当前版本。

**检查桶是否启用了对象锁定**

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

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

1. 从**桶**列表中，请选择您想要查看的桶的名称。

1. 选择**属性**选项卡。

1. 向下滚动到**对象锁定**部分。验证**对象锁定**设置是**已启用**还是**已禁用**。

要确定该对象是受保留期保护还是受法定保留保护，请[查看对象的锁定信息](https://docs.amazonaws.cn/AmazonS3/latest/userguide/object-lock-managing.html#object-lock-managing-view)。

如果对象受保留期或法定保留保护，请检查以下各项：
+ 如果对象版本受合规性保留模式保护，则无法将其永久删除。来自任何请求者（包括 Amazon Web Services 账户根用户）的永久 `DELETE` 请求都将导致拒绝访问（403 禁止）错误。另请注意，当您对于受合规性保留模式保护的对象提交 `DELETE` 请求时，Amazon S3 会为该对象创建[删除标记](https://docs.amazonaws.cn/AmazonS3/latest/userguide/DeleteMarker.html)。
+ 如果对象版本受监管保留模式保护并且您具有 `s3:BypassGovernanceRetention` 权限，则可以绕过此保护并永久删除该版本。有关更多信息，请参阅[绕过监管模式](https://docs.amazonaws.cn/AmazonS3/latest/userguide/object-lock-managing.html#object-lock-managing-bypass)。
+ 如果对象版本受法定保留保护，则永久 `DELETE` 请求可能会导致拒绝访问（403 禁止）错误。要永久删除对象版本，必须解除对于对象版本的法定保留。要解除法定保留，您必须具有 `s3:PutObjectLegalHold` 权限。有关解除法定保留的更多信息，请参阅[配置 S3 对象锁定](object-lock-configure.md)。

## VPC 端点策略
<a name="troubleshoot-403-vpc"></a>

如果您使用虚拟私有云（VPC）端点访问 Amazon S3，请确保 VPC 端点策略不会阻止您访问 Amazon S3 资源。原定设置情况下，VPC 端点策略允许向 Amazon S3 发出的所有请求。您还可以配置 VPC 端点策略以限制某些请求。有关如何检查 VPC 端点策略的信息，请参阅以下资源：
+ [由于 VPC 端点策略而拒绝访问 – 隐式拒绝](#access-denied-vpc-endpoint-examples-implicit)
+ [由于 VPC 端点策略而拒绝访问 – 显式拒绝](#access-denied-vpc-endpoint-examples-explicit)
+ 《Amazon PrivateLink 指南》**中的 [Control access to VPC endpoints by using endpoint policies](https://docs.amazonaws.cn/vpc/latest/privatelink/vpc-endpoints-access.html)。

## Amazon Organizations 策略
<a name="troubleshoot-403-orgs"></a>

如果您的 Amazon Web Services 账户属于某个组织，则 Amazon Organizations 策略可能会阻止您访问 Amazon S3 资源。默认情况下，Amazon Organizations 策略不会阻止向 Amazon S3 发出的任何请求。但是，请确保您的 Amazon Organizations 策略尚未配置为阻止对 S3 存储桶进行访问。有关如何查看 Amazon Organizations 策略的说明，请参阅以下资源：
+ [由于服务控制策略而拒绝访问 – 隐式拒绝](#access-denied-scp-examples-implicit)
+ [由于服务控制策略而拒绝访问 – 显式拒绝](#access-denied-scp-examples-explicit)
+ [由于资源控制策略而拒绝访问 – 显式拒绝](#access-denied-rcp-examples-explicit)
+ 《Amazon Organizations 用户指南》**中的 [Listing all policies](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_info-operations.html#list-all-pols-in-org)

此外，如果您错误地将成员账户的存储桶策略配置为拒绝所有用户访问您的 S3 存储桶，则可以通过在 IAM 中为该成员账户启动特权会话来解锁存储桶。启动特权会话后，您可以删除配置错误的存储桶策略，以重新获得对存储桶的访问权限。有关更多信息，请参阅《Amazon Identity and Access Management User Guide》**中的 [Perform a privileged task on an Amazon Organizations member account](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_root-user-privileged-task.html)。

## CloudFront 分配访问权限
<a name="troubleshoot-403-cloudfront"></a>

如果您在尝试通过 CloudFront 访问 S3 静态网站时收到拒绝访问（403 禁止访问）错误，请检查以下常见问题：
+ **您的源域名格式是否正确？**
  + 确保您使用的是 S3 网站端点格式（bucket-name.s3-website-region.amazonaws.com），而不是 REST API 端点格式
  + 验证存储桶上已启用静态网站托管
+ **您的存储桶策略是否支持 CloudFront 访问权限？**
  + 确保存储桶策略包括对 CloudFront 分配的来源访问身份（OAI）或来源访问控制（OAC）的权限
  + 验证策略是否包含所需的 s3:GetObject 权限

有关其它故障排除步骤和配置，包括错误页面设置和协议设置，请参阅 Amazon Web Services re:Post 知识中心中的[为什么我在使用 Amazon S3 网站端点作为 CloudFront 分配的源时收到“403 access denied”错误？](https://repost.aws/knowledge-center/s3-website-cloudfront-error-403)

**注意**  
此错误与您直接访问 S3 时可能收到的 403 错误不同。对于特定于 CloudFront 的问题，请务必同时检查 CloudFront 分配设置和 S3 配置。

## 接入点设置
<a name="troubleshoot-403-access-points"></a>

如果您在通过 Amazon S3 接入点发出请求时收到“拒绝访问（403 禁止）”错误，则可能需要检查以下内容：
+ 接入点的配置
+ 用于接入点的 IAM 用户策略
+ 用于管理或配置跨账户接入点的桶策略

**接入点配置和策略**
+ 创建接入点时，可以选择将**互联网**或 **VPC** 指定为网络来源。如果网络来源设置为仅限 VPC，Amazon S3 将拒绝向接入点发出的任何并非源自指定 VPC 的请求。要检查接入点的网络来源，请参阅[创建限制到 Virtual Private Cloud 的接入点](access-points-vpc.md)。
+ 使用接入点，您还可以配置自定义的屏蔽公共访问权限设置，其工作原理与桶或账户级别的屏蔽公共访问权限设置类似。要查看您的自定义屏蔽公共访问权限设置，请参阅[管理对通用存储桶的接入点的公共访问权限](access-points-bpa-settings.md)。
+ 要使用接入点向 Amazon S3 发出成功的请求，请确保请求者拥有必要的 IAM 权限。有关更多信息，请参阅 [配置使用接入点的 IAM 策略](access-points-policies.md)。
+ 如果请求涉及跨账户接入点，请确保桶拥有者已更新桶策略，以授权来自接入点的请求。有关更多信息，请参阅 [授予跨账户接入点的权限](access-points-policies.md#access-points-cross-account)。

如果在检查了本主题中的所有项目后，拒绝访问（403 禁止）错误仍然存在，请[检索您的 Amazon S3 请求 ID](https://docs.amazonaws.cn/AmazonS3/latest/userguide/get-request-ids.html) 并联系 Amazon Web Services 支持 以获取更多指导。

## 其他资源
<a name="troubleshoot-403-additional-resources"></a>

有关拒绝访问（403 禁止访问）错误的更多指导，您可以查看以下资源：
+ Amazon Web Services re:Post 知识中心中的[如何对来自 Amazon S3 的“403 拒绝访问”错误进行故障排除？](https://repost.aws/knowledge-center/s3-troubleshoot-403)
+ Amazon Web Services re:Post 知识中心中的[为什么当我尝试访问 Amazon S3 存储桶或对象时，会出现“403 禁止访问”错误？](https://repost.aws/knowledge-center/s3-403-forbidden-error)
+ Amazon Web Services re:Post 知识中心中的[为什么当我尝试访问同一 Amazon Web Services 账户中的 Amazon S3 资源时，会出现“拒绝访问”错误？](https://repost.aws/knowledge-center/s3-troubleshoot-403-resource-same-account)
+ Amazon Web Services re:Post 知识中心中的[为什么当我尝试使用公共读取权限访问 Amazon S3 存储桶时，会出现“拒绝访问”错误？](https://repost.aws/knowledge-center/s3-troubleshoot-403-public-read)
+ Amazon Web Services re:Post 知识中心中的[为什么当我尝试使用预签名的 URL 将对象上传到 Amazon S3 时，会出现“签名不匹配”错误？](https://repost.aws/knowledge-center/s3-presigned-url-signature-mismatch)
+ Amazon Web Services re:Post 知识中心中的[当我在 Amazon S3 存储桶上运行 sync 命令时，为什么会收到 ListObjectsV2 访问被拒绝错误？](https://repost.aws/knowledge-center/s3-access-denied-listobjects-sync)
+ Amazon Web Services re:Post 知识中心中的[为什么我在使用 Amazon S3 网站端点作为 CloudFront 分配的源时收到“403 access denied”错误？](https://repost.aws/knowledge-center/s3-website-cloudfront-error-403)