我的 AWS Identity and Access Management (IAM) 策略返回一个错误或者我的 IAM 策略未按预期发挥作用。如何对 IAM 策略进行问题排查?

对 IAM 策略进行问题排查:

1.   理解错误消息并确定 API 调用方

2.   评估 IAM 策略

3.   排查示例

1.理解错误消息并确定 API 调用方

查看以下示例以确定错误消息、API、API 调用方和正在被调用的资源:

示例错误消息 API 调用方是谁 哪个 API 什么资源 何时
A:“在调用 DeleteKeyPair 操作时出现错误 (UnauthorizedOperation):未授权您执行此操作。” 未知 DeleteKeyPair 未知 出错时间
B:“在调用 AssumeRole 操作时出现错误 (AccessDenied):用户 arn:aws:iam::123456789012 :user/test 无权对资源 arn:aws:iam::123456789012 :role/EC2-FullAccess 执行 sts:AssumeRole”

arn:aws:iam::123456789012 :user/test

AssumeRole

arn:aws:iam::123456789012 :role/EC2-FullAccess

出错时间

C:“在调用 GetSessionToken 操作时出现错误 (AccessDenied):无法调用带会话凭证的 GetSessionToken” 未知

GetSessionToken

未知

出错时间

D:“在调用 AssociateIamInstanceProfile 操作时出现错误 (UnauthorizedOperation):未授权您执行此操作。已编码授权失败消息:....” 未知

AssociateIamInstanceProfile

未知

出错时间

在查看错误消息之后,请务必在查看 IAM 策略前代表正确的 IAM 身份进行 API 调用。如果 API 异常/错误消息不包含调用方信息,请按照以下步骤确定 API 调用方:

  1. 打开 AWS 管理控制台
  2. 在页面右上角选择账户信息旁边的箭头。
  3. 如果您以 IAM 角色登录账户,请选择角色名称旁边的箭头来查看源凭证、账户信息、目标角色名称和账户信息。
  4. 如果您作为联合身份用户登录账户,您的 IAM 角色会列在联盟登录之下。

您可以使用 AWS 命令行界面 (AWS CLI) 命令 get-caller-identity 来确定 API 调用方。您也可以使用带 --debug 标记的 AWS CLI 命令通过详细输出确定凭证来源,输出类似如下内容:

2018-03-13 16:23:57,570 - MainThread - botocore.credentials - INFO - Found credentials in shared credentials file: ~/.aws/credentials

2.评估 IAM 策略

在某个附加的策略中明确允许使用 API 并在任一附加的策略中均未明确拒绝使用 API。

通过检查附加的 IAM 策略来验证是否已授予 API 调用方适当权限。有关更多信息,请参阅确定是否允许或拒绝请求

在您验证完 API 调用方已获得适当的 IAM 权限后,请审查资源级权限。如果 API 操作不支持资源级权限,请在 IAM 语句的资源元素中指定通配符 (*)。此外,您还可以查看策略摘要来排查资源级权限问题。查看策略摘要:

  1. 打开 AWS Identity and Access Management 控制台
  2. 在导航窗格中,选择策略
  3. 选择策略名称旁边的箭头来展开策略详细信息视图。
  4. 选择策略摘要

在以下示例策略中,策略仅向 StartInstances 提供权限,但是策略不向 DeleteSubnet 权限授予权限。由于 DeleteSubnet 操作不支持资源级权限,您无法在资源元素中指定 Amazon 资源名称 (ARN),因此请改用星号 (*):"Resource": "*"

示例策略 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PermissionNotGrantedAsAPIDoesNotSupportResourceLevelPermission",
            "Effect": "Allow",
            "Action": "ec2:DeleteSubnet",
            "Resource": "arn:aws:ec2:us-east-1:123456789012:subnet/subnet-254cf47c"
        },
        {
            "Sid": "PermissionGrantedAsAPISupportResourceLevelPermission",
            "Effect": "Allow",
            "Action": "ec2:StartInstances",
            "Resource": "arn:aws:ec2:us-east-1:123456789012:instance/i-0e58cfa95b858b1ce"
        }
    ]
}

在您确认自己的资源级权限后,请查看您的 IAM 策略中使用的条件。全局条件键可以在所有支持 IAM 进行访问控制的 AWS 服务中使用,而特定于服务的条件键只能在特定的服务中使用 - EC2 条件应用到 EC2 API 操作。有关更多信息,请参阅 Actions, Resources, and Condition Context Keys for AWS Services。如果您使用多个条件,请参阅一个条件中包含多个值

在以下策略示例中,当 IAM API 请求由 IAM 用户“admin”调用并且 API 请求的源 IP 地址为“1.1.1.0/24”或“2.2.2.0/24”时,条件相匹配。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:username": "admin"
                },
                "IpAddress": {
                    "aws:SourceIp": [
                        "1.1.1.0/24",
                        "2.2.2.0/24"
                    ]
                }
            }
        }
    ]
}

查看可能会影响权限的任何特定于服务的控制。例如,VPC 终端节点策略和组织服务控制策略 (SCP) 也会影响权限评估。有关更多信息,请参阅使用 VPC 终端节点控制对服务的访问关于服务控制策略

3.排查示例

通过使用此评估方法,您可以确定针对不同 AWS 服务的权限问题收到的错误消息的原因。有关更多详细信息,请参阅以下常见错误消息和排查步骤:

示例错误消息 A:

此错误消息指示您无权调用 DeleteKeyPair API

  1. 请确定 API 调用方。
  2. 请确认 ec2:DeleteKeyPair API 操作未包含在任何拒绝语句中。
  3. 请确认 ec2:DeleteKeyPair API 操作包含在允许语句中。
  4. 请确认未针对此 API 操作指定资源。注意:此 API 操作不支持资源级权限
  5. 请确认允许语句中指定的所有 IAM 条件受 delete-key-pair 操作支持,并且条件相匹配。

示例错误消息 B:

此错误消息包含 API 名称、API 调用方和目标资源。请确保调用 API 的 IAM 身份拥有正确的资源访问权限。使用上述评估方法查看 IAM 策略并评估以下内容:

IAM 角色的信任策略:EC2-FullAccess:

  1. 请确认 arn:aws:iam::123456789012:user/test 或 arn:aws:iam::123456789012:root 未包含在信任策略的任何拒绝语句中。
  2. 请确认 arn:aws:iam::123456789012:user/test 或 arn:aws:iam::123456789012:root 包含在信任策略的允许语句中。
  3. 请确认允许语句中指定的所有 IAM 条件均受 sts:AssumeRole API 操作支持并且相匹配。

附加到 API 调用方的 IAM 策略 (arn:aws:iam::123456789012:user/test)

  1. 请确认 arn:aws:iam::123456789012:role/EC2-FullAccess 未包含在任何含有 sts:AssumeRole API 操作的拒绝语句中。
  2. 如果 arn:aws:iam::123456789012:root 包含在信任策略的允许语句中,请确认 arn:aws:iam::123456789012:role/EC2-FullAccess 包含在含有 sts:AssumeRole API 操作的 IAM 策略的允许语句中。
  3. 请确认允许语句中指定的所有 IAM 条件均受 sts:AssumeRole API 操作支持并且相匹配。

示例错误消息 C:

此错误消息指示 get-session-token 不受临时凭证的支持。有关更多信息,请参阅比较 AWS STS API 操作

示例错误消息 D:

此错误消息返回一则可以提供授权失败详细信息的编码消息。要对错误消息进行解码并获得授权失败的详细信息,请参阅 DecodeAuthorizationMessage。在对错误消息进行解码之后,请确定 API 调用方并查看资源级权限和条件。

查看 IAM 策略权限:

  1. 如果错误消息指示 API 被明确拒绝,请从匹配的语句中删除 ec2:AssociateIamInstanceProfile 或(和)iam:PassRole API 操作。
  2. 请确认 ec2:AssociateIamInstanceProfile 和 iam:PassRole 位于含有受支持和正确的资源目标的允许语句中。例如,请确认 ec2:AssociateIamInstanceProfile API 操作的资源目标是 EC2 实例并且“iam:PassRole”的资源目标是 IAM 角色。
  3. 如果 ec2:AssociateIamInstanceProfile 和 iam:PassRole API 操作位于同一个允许语句中,请确认允许语句中指定的所有条件均受 ec2:AssociateIamInstanceProfile 和 iam:PassRole API 操作的支持,并且相关条件相匹配。
  4. 如果 ec2:AssociateIamInstanceProfile 和 iam:PassRole API 操作位于不同的允许语句中,请确认各允许语句中指定的所有条件均受相应的操作支持,并且相关条件相匹配。

此页面对您有帮助吗? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS 支持中心

发布时间:2018 年 6 月 8 日