

# 排查访问被拒绝错误消息
<a name="troubleshoot_access-denied"></a>

以下信息可以帮助您识别、诊断和解决 AWS Identity and Access Management 访问被拒绝错误。当 AWS 显式或隐式拒绝授权请求时，将显示拒绝访问错误讯息。
+ 当策略包含特定的 AWS 操作的 `Deny` 语句时，将发生*显式拒绝*。
+ 当没有适用的 `Deny` 语句且没有适用的 `Allow` 语句时，会发生*隐式拒绝*。由于 IAM policy 默认拒绝 IAM 主体，因此该策略必须显式允许主体执行操作。否则，该策略会隐式拒绝访问。有关更多信息，请参阅 [显式拒绝和隐式拒绝之间的区别](reference_policies_evaluation-logic_AccessPolicyLanguage_Interplay.md)。

当您向服务或资源发出请求时，可能会有多个策略适用于该请求。除了错误消息中指定的策略外，还要查看所有适用的策略。
+ 如果同一策略类型的多个策略拒绝某个请求，则访问被拒绝错误消息不会指定评估的策略数量。
+ 如果授权请求被多种策略类型拒绝，则 AWS 仅在错误消息中包含其中一种策略类型。

**重要**  
**登录 AWS 时遇到问题？** 请确保使用的是适合您用户类型的 [AWS 登录页面](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html)。如果您是 AWS 账户根用户（账户拥有者），则可以使用您在创建 AWS 账户 时设置的凭证登录 AWS。如果您是 IAM 用户，则您的账户管理员可以向您提供 AWS 登录凭证。如果您需要请求支持，则请不要使用此页面上的反馈链接。表格由 AWS 文档团队接收，而不是 支持。请在[联系我们](https://aws.amazon.com/contact-us/)页面上选择**仍然无法登录 AWS 账户**，然后选择一个可用的支持选项。

## 当我向某个 AWS 服务发送请求时，收到了“访问被拒绝”
<a name="troubleshoot_general_access-denied-service"></a>
+ 检查错误消息是否包含负责拒绝访问的策略类型和 [Amazon 资源名称（ARN）](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns)。如果是这种情况，请检查指定策略中是否有针对该操作的拒绝语句。如果提供了策略类型但没有策略 ARN，则重点解决该策略类型的问题：检查指定类型的策略中是否有针对该操作的拒绝语句。如果错误消息没有提到与拒绝访问有关的策略类型，请使用本部分中的其余指南进一步排除故障。
+ 验证您是否具有调用您请求的操作和资源的基于身份的策略权限。如果设置了任何条件，您还必须在发送请求时满足这些条件。有关查看或修改用于 IAM 用户、组或角色的策略的信息，请参阅 [管理 IAM 策略](access_policies_manage.md)。
+ 如果 AWS 管理控制台 返回消息称您无权执行某个操作，则必须联系您的管理员寻求帮助。您的管理员为您提供了登录凭证或登录链接。

  当 `mateojackson` IAM 用户尝试使用控制台查看有关虚构 `{{my-example-widget}}` 资源的详细信息，但不具有虚构 `widgets:{{GetWidget}}` 权限时，会发生以下示例错误。

  ```
  User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: widgets:{{GetWidget}} on resource: {{my-example-widget}}
  ```

  在这种情况下，Mateo 必须请求他的管理员更新其策略，以允许他使用 `widgets:{{GetWidget}}` 操作访问 `{{my-example-widget}}` 资源。
+ 您是否尝试访问支持[基于资源的策略](access_policies_identity-vs-resource.md)（如 Amazon S3、Amazon SNS 或 Amazon SQS）的服务？ 如果是，请确认策略将您指定为主体并为您授予访问权限。如果您在您的账户中向服务发出请求，基于身份的策略或基于资源的策略将向您授予相应的权限。如果您在不同的账户中向服务发出请求，则基于身份的策略和基于资源的策略这两者都必须向您授予权限。要查看哪些服务支持基于资源的策略，请参阅[使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md)。
+ 如果您的策略包含的条件具有键值对，请仔细检查。示例包括 [`aws:RequestTag/{{tag-key}}`](reference_policies_condition-keys.md) 全局条件密钥、 AWS KMS [kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context](kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context) 和多个服务支持的 `ResourceTag/{{tag-key}}` 条件键。确保键名称不与多个结果匹配。由于条件键名称不区分大小写，因为检查名为 `foo` 的键的条件将与 `foo`、`Foo` 或 `FOO` 匹配。如果您的请求包含多个键值对，其中的键名称只是大小写形式不同，则您的访问可能会被意外拒绝。有关更多信息，请参阅 [IAM JSON 策略元素：Condition](reference_policies_elements_condition.md)。
+ 如果您具有[权限边界](access_policies_boundaries.md)，请验证用于权限边界的策略是否允许您的请求。如果基于身份的策略允许请求，但权限边界不允许，则会拒绝请求。权限边界控制 IAM 主体（用户或角色）可以拥有的最大权限。基于资源的策略不受权限边界限制。权限边界不常用。有关 AWS 如何评估这些策略的更多信息，请参阅 [策略评估逻辑](reference_policies_evaluation-logic.md)。
+ 如果您手动签署请求（不使用 [AWS SDK](https://aws.amazon.com/developer/tools/)），请验证您已正确[签署请求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)。
+ 如果您使用的是 [Amazon VPC 端点策略](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-access.html)，但出现了 AWS CloudTrail 未记录的拒绝访问错误，则可能是因为 VPC 端点所有者账户与调用账户或目标角色账户不一致所致。

## 当我使用临时安全凭证发送请求时，收到了“访问被拒绝”
<a name="troubleshoot_general_access-denied-temp-creds"></a>
+ 首先，请确保您未因与您的临时凭证无关的原因而被拒绝访问。有关更多信息，请参阅 [当我向某个 AWS 服务发送请求时，收到了“访问被拒绝”](#troubleshoot_general_access-denied-service)。
+ 要验证服务是否接受临时安全凭证，请参阅[使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md)。
+ 验证您的请求是否采用了正确的签名和适当的格式。有关详细信息，请参阅[工具包](https://aws.amazon.com/developer/tools/)文档或 [将临时凭证用于 AWS 资源](id_credentials_temp_use-resources.md)。
+ 验证您的临时安全凭证没有过期。有关更多信息，请参阅 [IAM 临时安全凭证](id_credentials_temp.md)。
+ 验证 IAM 用户或角色拥有正确的权限。临时安全凭证的权限派生自 IAM 用户或角色。因此，权限限于向您已担任其临时凭证的角色授予的权限。有关如何确定临时安全凭证的权限的更多信息，请参阅 [临时安全凭证的权限](id_credentials_temp_control-access.md)。
+ 如果您担任一个角色，您的角色会话可能受会话策略的限制。以编程方式使用 AWS STS [请求临时安全凭证](id_credentials_temp_request.md)时，您可以选择传递内联或托管[会话策略](access_policies.md#policies_session)。会话策略是高级策略，在以编程方式为角色创建临时凭证会话时，这些策略将作为参数进行传递。您可以使用 `Policy` 参数传递单个 JSON 内联会话策略文档。您可以使用 `PolicyArns` 参数指定最多 10 个托管会话策略。生成的会话的权限是角色的基于身份的策略与会话策略的交集。或者，如果您的管理员或自定义程序为您提供临时凭证，它们可能已包含会话策略以限制您的访问。
+ 如果您是 AWS STS 联合用户主体，您的会话可能受会话策略的限制。您以 IAM 用户身份登录到 AWS，然后请求联合令牌，以创建联合用户。有关更多信息，请参阅 [通过自定义身份凭证代理程序请求凭证](id_credentials_temp_request.md#api_getfederationtoken)。在请求联合令牌时，如果您或您的身份代理传递了会话策略，则您的会话受这些策略的限制。生成的会话的权限是您的 IAM 用户的基于身份的策略与会话策略的交集。有关会话策略的更多信息，请参阅[会话策略](access_policies.md#policies_session)。
+ 如果您使用角色访问具有基于资源的策略的资源，则验证策略已授予该角色权限。例如，以下策略允许 `MyRole` 从账户 `111122223333` 访问 `amzn-s3-demo-bucket`。

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

****  

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

------

## 拒绝访问错误消息示例
<a name="access-denied-error-examples"></a>

大多数拒绝访问的错误消息都以 `User {{user}} is not authorized to perform {{action}} on {{resource}} because {{context}}` 格式显示。在此示例中，{{用户}}是被拒绝访问的主体的 ARN，{{操作}}是策略拒绝的服务操作，而{{资源}}是策略对其执行操作的资源的 ARN。{{上下文}}字段提供有关拒绝访问的策略类型的其他上下文。在某些情况下，它还包含拒绝访问策略的 ARN。

当策略因包含 `Deny` 语句而显式拒绝访问时，AWS 将在拒绝访问错误消息中包含短语 `with an explicit deny in a {{type}} policy`。此短语还可以指定策略的 ARN，如下所示：`with an explicit deny in a {{type}} policy: {{policy ARN}}`。

当策略隐式拒绝访问时，AWS 将在拒绝访问错误消息中包含短语 `because no {{type}} policy allows the {{action}} action`。

**注意**  
某些 AWS 服务不支持这种拒绝访问的错误消息格式。拒绝访问错误消息的内容可能因发出授权请求的服务而异。

下面的示例展示了不同类型的拒绝访问错误消息的格式。

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

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

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

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: codecommit:ListRepositories
because no service control policy allows the codecommit:ListRepositories action
```

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

1. 如果错误消息中提供了策略 ARN，请查看指定服务控制策略（SCP）中操作的 `Deny` 语句。在下面的示例中，操作为 `codecommit:ListRepositories`。

1. 如果错误消息中未提供策略 ARN，请查看 SCP 中操作的 `Deny` 语句。

1. 通过删除 `Deny` 语句来更新 SCP。有关更多信息，请参阅《AWS Organizations User Guide》**中的 [Update a service control policy (SCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_policies_update.html#update_policy)。

包含策略 ARN 的错误消息：

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: codecommit:ListRepositories
with an explicit deny in a service control policy: arn:aws:organizations::777788889999:policy/o-exampleorgid/service_control_policy/p-examplepolicyid123
```

不包含策略 ARN 的错误消息：

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: codecommit:ListRepositories
with an explicit deny in a service control policy
```

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

1. 如果错误消息中提供了策略 ARN，请查看指定资源控制策略（RCP）中操作的 `Deny` 语句。在下面的示例中，操作为 `secretsmanager:GetSecretValue`。

1. 如果错误消息中未提供策略 ARN，请查看 RCP 中操作的 `Deny` 语句。

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

包含策略 ARN 的错误消息：

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: secretsmanager:GetSecretValue
on resource: arn:aws:secretsmanager:us-east-1:123456789012:secret:*
with an explicit deny in a resource control policy: arn:aws:organizations::777788889999:policy/o-exampleorgid/resource_control_policy/p-examplepolicyid456
```

不包含策略 ARN 的错误消息：

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: secretsmanager:GetSecretValue
on resource: arn:aws:secretsmanager:us-east-1:123456789012:secret:*
with an explicit deny in a resource control policy
```

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

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

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

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: codecommit:ListRepositories
because no VPC endpoint policy allows the codecommit:ListRepositories action
```

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

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

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

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: codedeploy:ListDeployments
on resource: arn:aws:codedeploy:us-east-1:123456789012:deploymentgroup:*
with an explicit deny in a VPC endpoint policy
```

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

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

1. 通过将 `Allow` 语句添加到 IAM policy 来更新权限边界。有关更多信息，请参阅[IAM 实体的权限边界](access_policies_boundaries.md)和[编辑 IAM 策略](access_policies_manage-edit.md)。

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: codedeploy:ListDeployments
on resource: arn:aws:codedeploy:us-east-1:123456789012:deploymentgroup:*
because no permissions boundary allows the codedeploy:ListDeployments action
```

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

1. 如果错误消息中提供了策略 ARN，请查看指定权限边界中操作的 `Deny` 语句。在下面的示例中，操作为 `sagemaker:ListModels`。

1. 如果错误消息中提供了策略 ARN，请查看附加到主体的权限边界中操作的 `Deny` 语句。

1. 通过从 IAM policy 删除 `Deny` 语句来更新权限边界。有关更多信息，请参阅[IAM 实体的权限边界](access_policies_boundaries.md)和[编辑 IAM 策略](access_policies_manage-edit.md)。

包含策略 ARN 的错误消息：

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: sagemaker:ListModels
with an explicit deny in a permissions boundary: arn:aws:iam::123456789012:policy/DeveloperPermissionBoundary
```

不包含策略 ARN 的错误消息：

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: sagemaker:ListModels
with an explicit deny in a permissions boundary
```

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

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

1. 通过添加 `Allow` 语句来更新会话策略。有关更多信息，请参阅[会话策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)和 [编辑 IAM 策略](access_policies_manage-edit.md)。

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: codecommit:ListRepositories
because no session policy allows the codecommit:ListRepositories action
```

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

1. 如果错误消息中提供了策略 ARN，请查看指定会话策略中操作的 `Deny` 语句。在下面的示例中，操作为 `codedeploy:ListDeployments`。

1. 如果错误消息中未提供策略 ARN，请查看会话策略中操作的 `Deny` 语句。

1. 通过删除 `Deny` 语句来更新会话策略。有关更多信息，请参阅[会话策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)和 [编辑 IAM 策略](access_policies_manage-edit.md)。

包含策略 ARN 的错误消息：

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: codedeploy:ListDeployments
on resource: arn:aws:codedeploy:us-east-1:123456789012:deploymentgroup:*
with an explicit deny in a session policy: arn:aws:iam::123456789012:policy/DeveloperSessionPolicy
```

不包含策略 ARN 的错误消息：

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: codedeploy:ListDeployments
on resource: arn:aws:codedeploy:us-east-1:123456789012:deploymentgroup:*
with an explicit deny in a session policy
```

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

1. 检查基于资源的策略中的操作是否有缺失的 `Allow` 语句。对于以下示例，操作为 `secretsmanager:GetSecretValue`。

1. 通过添加 `Allow` 语句来更新策略。有关更多信息，请参阅[基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_resource-based)和 [编辑 IAM 策略](access_policies_manage-edit.md)。

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: secretsmanager:GetSecretValue
because no resource-based policy allows the secretsmanager:GetSecretValue action
```

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

1. 检查基于资源的策略中的操作是否有显式 `Deny` 语句。对于以下示例，操作为 `secretsmanager:GetSecretValue`。

1. 通过删除 `Deny` 语句来更新策略。有关更多信息，请参阅[基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_resource-based)和 [编辑 IAM 策略](access_policies_manage-edit.md)。

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: secretsmanager:GetSecretValue
on resource: arn:aws:secretsmanager:us-east-1:123456789012:secret:*
with an explicit deny in a resource-based policy
```

### 由于角色信任策略而拒绝访问 – 隐式拒绝
<a name="access-denied-role-trust-policy-examples-implicit"></a>

1. 检查角色信任策略中的操作是否有缺失的 `Allow` 语句。对于以下示例，操作为 `sts:AssumeRole`。

1. 通过添加 `Allow` 语句来更新策略。有关更多信息，请参阅[基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_resource-based)和 [编辑 IAM 策略](access_policies_manage-edit.md)。

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: sts:AssumeRole
because no role trust policy allows the sts:AssumeRole action
```

### 由于角色信任策略而拒绝访问 – 显式拒绝
<a name="access-denied-role-trust-policy-examples-explicit"></a>

1. 检查角色信任策略中的操作是否有显式 `Deny` 语句。对于以下示例，操作为 `sts:AssumeRole`。

1. 通过删除 `Deny` 语句来更新策略。有关更多信息，请参阅[基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_resource-based)和 [编辑 IAM 策略](access_policies_manage-edit.md)。

```
User: arn:aws:iam::123456789012:user/John is not authorized to perform: sts:AssumeRole
with an explicit deny in the role trust policy
```

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

1. 检查附加到身份的基于身份的策略中的操作中是否有缺失的 `Allow` 语句。对于以下示例，操作为附加到角色 `HR` 的 `codecommit:ListRepositories`。

1. 通过添加 `Allow` 语句来更新策略。有关更多信息，请参阅[基于身份的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_id-based)和 [编辑 IAM 策略](access_policies_manage-edit.md)。

```
User: arn:aws:iam::123456789012:role/HR is not authorized to perform: codecommit:ListRepositories
because no identity-based policy allows the codecommit:ListRepositories action
```

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

1. 如果错误消息中提供了策略 ARN，请查看指定策略中操作的 `Deny` 语句。在下面的示例中，操作为 `codedeploy:ListDeployments`。

1. 如果错误消息中未提供策略 ARN，请查看附加到身份的、基于身份的策略中操作的 `Deny` 语句。

1. 通过删除 `Deny` 语句来更新策略。有关更多信息，请参阅[基于身份的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_id-based)和 [编辑 IAM 策略](access_policies_manage-edit.md)。

包含策略 ARN 的错误消息：

```
User: arn:aws:iam::123456789012:role/HR is not authorized to perform: codedeploy:ListDeployments
on resource: arn:aws:codedeploy:us-east-1:123456789012:deploymentgroup:*
with an explicit deny in an identity-based policy: arn:aws:iam::123456789012:policy/HRAccessPolicy
```

不包含策略 ARN 的错误消息：

```
User: arn:aws:iam::123456789012:role/HR is not authorized to perform: codedeploy:ListDeployments
on resource: arn:aws:codedeploy:us-east-1:123456789012:deploymentgroup:*
with an explicit deny in an identity-based policy
```