排查访问被拒绝错误消息 - Amazon Identity and Access Management
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

排查访问被拒绝错误消息

当 Amazon 显式或隐式拒绝授权请求时,将显示拒绝访问错误讯息。当策略包含特定的 Amazon 操作的 Deny 语句时,将发生显式拒绝。当没有适用的 Deny 语句且没有适用的 Allow 语句时,会发生隐式拒绝。由于 IAM policy 默认拒绝 IAM 主体,因此该策略必须显式允许主体执行操作。否则,该策略会隐式拒绝访问。有关更多信息,请参阅显式拒绝和隐式拒绝之间的区别

如果同一策略类型的多个策略拒绝授权请求,则 Amazon 在访问被拒绝错误消息中没有指定策略编号。如果授权请求被多种策略类型拒绝,则 Amazon 仅在错误消息中包含其中一种策略类型。

当我向某个 Amazon 服务发送请求时,收到了“访问被拒绝”

  • 检查错误消息是否包含与拒绝访问有关的策略类型。例如,如果错误提到由于服务控制策略 (SCP) 而拒绝访问,则可以专注于对 SCP 问题进行故障排除。知晓策略类型后,您还可以检查该策略类型策略中的特定操作是否存在拒绝语句或缺少允许。如果错误消息没有提到与拒绝访问有关的策略类型,请使用本部分中的其余指南进一步排除故障。

  • 验证您是否具有调用您请求的操作和资源的基于身份的策略权限。如果设置了任何条件,您还必须在发送请求时满足这些条件。有关查看或修改用于 IAM 用户、组或角色的策略的信息,请参阅 管理 IAM policy

  • 如果 Amazon Web Services Management Console 返回消息称您无权执行某个操作,则必须联系您的管理员寻求帮助。您的管理员为您提供了登录凭证或登录链接。

    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 资源。

  • 您是否尝试访问支持基于资源的策略(如 Amazon S3、Amazon SNS 或 Amazon SQS)的服务? 如果是,请确认策略将您指定为主体并为您授予访问权限。如果您在您的账户中向服务发出请求,基于身份的策略或基于资源的策略将向您授予相应的权限。如果您在不同的账户中向服务发出请求,则基于身份的策略和基于资源的策略这两者都必须向您授予权限。要查看哪些服务支持基于资源的策略,请参阅使用 IAM 的Amazon服务

  • 如果您的策略包含的条件具有键值对,请仔细检查。示例包括 aws:RequestTag/tag-key 全局条件密钥、 Amazon KMS kms:EncryptionContext:encryption_context_key 和多个服务支持的 ResourceTag/tag-key 条件键。确保键名称不与多个结果匹配。由于条件键名称不区分大小写,因为检查名为 foo 的键的条件将与 fooFooFOO 匹配。如果您的请求包含多个键值对,其中的键名称只是大小写形式不同,则您的访问可能会被意外拒绝。有关更多信息,请参阅IAM JSON 策略元素:Condition

  • 如果您具有权限边界,请验证用于权限边界的策略是否允许您的请求。如果基于身份的策略允许请求,但权限边界不允许,则会拒绝请求。权限边界控制 IAM 主体(用户或角色)可以拥有的最大权限。基于资源的策略不受权限边界限制。权限边界不常用。有关 Amazon 如何评估这些策略的更多信息,请参阅 策略评估逻辑

  • 如果您手动签署请求(不使用 Amazon SDK),请验证您已正确签署请求

当我使用临时安全凭证发送请求时,收到了“访问被拒绝”

  • 首先,请确保您未因与您的临时凭证无关的原因而被拒绝访问。有关更多信息,请参阅当我向某个 Amazon 服务发送请求时,收到了“访问被拒绝”

  • 要验证服务是否接受临时安全凭证,请参阅使用 IAM 的Amazon服务

  • 验证您的请求是否采用了正确的签名和适当的格式。有关详细信息,请参阅工具包文档或 将临时凭证用于 Amazon 资源

  • 验证您的临时安全凭证没有过期。有关更多信息,请参阅IAM 临时安全凭证

  • 验证 IAM 用户或角色拥有正确的许可。临时安全证书的权限派生自 IAM 用户或角色。因此,权限限于向您已担任其临时凭证的角色授予的权限。有关如何确定临时安全凭证的权限的更多信息,请参阅 控制临时安全凭证的权限

  • 如果您担任一个角色,您的角色会话可能受会话策略的限制。以编程方式使用 Amazon STS 请求临时安全凭证时,您可以选择传递内联或托管会话策略。会话策略是高级策略,在以编程方式为角色创建临时凭证会话时,这些策略将作为参数进行传递。您可以使用 Policy 参数传递单个 JSON 内联会话策略文档。您可以使用 PolicyArns 参数指定最多 10 个托管会话策略。生成的会话的权限是角色的基于身份的策略与会话策略的交集。或者,如果您的管理员或自定义程序为您提供临时凭证,它们可能已包含会话策略以限制您的访问。

  • 如果您是联合身份用户,您的会话可能受会话策略的限制。您以 IAM 用户身份登录到 Amazon,然后请求联合令牌以成为联合身份用户。有关联合身份用户的更多信息,请参阅GetFederationToken – 通过自定义身份凭证代理程序进行联合身份验证。在请求联合令牌时,如果您或您的身份代理传递了会话策略,则您的会话受这些策略的限制。生成的会话的权限是您的 IAM 用户的基于身份的策略与会话策略的交集。有关会话策略的更多信息,请参阅会话策略

  • 如果您使用角色访问具有基于资源的策略的资源,则验证策略已授予该角色权限。例如,以下策略允许 MyRole 从账户 111122223333 访问 MyBucket

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

拒绝访问错误消息示例

大多数拒绝访问的错误消息都以 User user is not authorized to perform action on resource because context 格式显示。在此示例中,user(用户)是无法获得访问权限的 Amazon 资源名称(ARN)action(操作)是策略拒绝的服务操作,resource(资源)是策略所执行操作的资源的 ARN。context(上下文)字段表示有关策略类型的其他上下文,用于解释策略拒绝访问的原因。

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

注意

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

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

由于服务控制策略而拒绝访问 – 隐式拒绝

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

  2. 通过添加 Allow 语句来更新 SCP。有关更多信息,请参阅 Amazon IAM Identity Center 用户指南中的更新 SCP

User: arn:aws:iam::777788889999:user/JohnDoe is not authorized to perform: codecommit:ListRepositories because no service control policy allows the codecommit:ListRespositories action

由于服务控制策略而拒绝访问 – 显式拒绝

  1. 检查服务控制策略(SCP)中的操作是否有 Deny 语句。对于以下示例,操作为 codecommit:ListRepositories

  2. 通过删除 Deny 语句来更新 SCP。有关更多信息,请参阅 Amazon IAM Identity Center 用户指南中的更新 SCP

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

由于 VPC 端点策略而拒绝访问 – 隐式拒绝

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

  2. 通过添加 Allow 语句来更新 VPC 端点策略。有关更多信息,请参阅《Amazon PrivateLink 指南》中的更新 VPC 端点策略

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

由于 VPC 端点策略而拒绝访问 – 显式拒绝

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

  2. 通过删除 Deny 语句来更新 VPC 端点策略。有关更多信息,请参阅《Amazon PrivateLink 指南》中的更新 VPC 端点策略

User: arn:aws:iam::123456789012:user/JohnDoe 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

由于权限边界而拒绝访问 – 隐式拒绝

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

  2. 通过将 Allow 语句添加到 IAM policy 来更新权限边界。有关更多信息,请参阅 IAM 实体的权限边界编辑 IAM policy

User: arn:aws:iam::123456789012:user/JohnDoe 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

由于权限边界而拒绝访问 – 显式拒绝

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

  2. 通过从 IAM policy 删除 Deny 语句来更新权限边界。有关更多信息,请参阅 IAM 实体的权限边界编辑 IAM policy

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

由于会话策略而拒绝访问 – 隐式拒绝

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

  2. 通过添加 Allow 语句来更新会话策略。有关更多信息,请参阅会话策略和 编辑 IAM policy

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

由于会话策略而拒绝访问 – 显式拒绝

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

  2. 通过删除 Deny 语句来更新会话策略。有关更多信息,请参阅会话策略和 编辑 IAM policy

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

由于基于资源的策略而拒绝访问 – 隐式拒绝

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

  2. 通过添加 Allow 语句来更新策略。有关更多信息,请参阅基于资源的策略和 编辑 IAM policy

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

由于基于资源的策略而拒绝访问 – 显式拒绝

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

  2. 通过删除 Deny 语句来更新策略。有关更多信息,请参阅基于资源的策略和 编辑 IAM policy

User: arn:aws:iam::123456789012:user/JohnDoe 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

由于角色信任策略而拒绝访问 – 隐式拒绝

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

  2. 通过添加 Allow 语句来更新策略。有关更多信息,请参阅基于资源的策略和 编辑 IAM policy

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

由于角色信任策略而拒绝访问 – 显式拒绝

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

  2. 通过删除 Deny 语句来更新策略。有关更多信息,请参阅基于资源的策略和 编辑 IAM policy

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

由于基于身份的策略而拒绝访问 – 隐式拒绝

  1. 检查附加到身份的基于身份的策略中的操作中是否有缺失的 Allow 语句。对于以下示例,操作为附加到用户 JohnDoe 的 codecommit:ListRepositories

  2. 通过添加 Allow 语句来更新策略。有关更多信息,请参阅基于身份的策略和 编辑 IAM policy

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

由于基于身份的策略而拒绝访问 – 显式拒绝

  1. 检查附加到身份的基于身份的策略中的操作中是否有显式 Deny 语句。对于以下示例,操作为附加到用户 JohnDoe 的 codedeploy:ListDeployments

  2. 通过删除 Deny 语句来更新策略。有关更多信息,请参阅基于身份的策略和 编辑 IAM policy

User: arn:aws:iam::123456789012:user/JohnDoe 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

由于其他策略,在 VPC 请求失败时拒绝访问

  1. 检查服务控制策略(SCP)中的操作是否有显式 Deny 语句。对于以下示例,操作为 SNS:Publish

  2. 通过删除 Deny 语句来更新 SCP。有关更多信息,请参阅 Amazon IAM Identity Center 用户指南中的更新 SCP

User: arn:aws:sts::111122223333:assumed-role/role-name/role-session-name is not authorized to perform: SNS:Publish on resource: arn:aws:sns:us-east-1:444455556666:role-name-2 with an explicit deny in a VPC endpoint policy transitively through a service control policy