如何使用 IAM 策略排查访问被拒绝或未授权操作错误?
上次更新日期:2020 年 11 月 3 日
我的 AWS Identity and Access Management (IAM) 策略返回一个错误或者我的 IAM 策略未按预期发挥作用。如何对 IAM 策略进行问题排查?
简短描述
对 IAM 策略进行问题排查:
- 确定 API 调用方
- 评估 IAM 策略
- IAM 策略错误消息排查示例
解决方法
理解错误消息并确定 API 调用方
重要提示:
- 开始之前,请确保您已安装并配置 AWS 命令行界面 (AWS CLI)。
- 如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI。
请务必在查看 IAM 策略前代表正确的 IAM 身份进行 API 调用。如果错误消息不包含调用方信息,请按照以下步骤确定 API 调用方:
- 打开 AWS 管理控制台。
- 在页面右上角选择账户信息旁边的箭头。
- 如果您以 IAM 角色登录账户,请选择角色名称旁边的箭头来查看源凭证、账户信息、目标角色名称和账户信息。
- 如果您作为联合身份用户登录账户,您的 IAM 角色会列在 Federated Login(联盟登录)下。
您可以使用 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
评估 IAM 策略
通过检查附加的 IAM 策略来验证是否已授予 API 调用方适当权限。有关更多信息,请参阅确定在账户内是否允许或拒绝请求。
在您验证完 API 调用方已获得适当的 IAM 权限后,请审查资源级权限。如果 API 操作不支持资源级权限,请在 IAM 语句的资源元素中指定通配符 (*)。此外,您还可以查看策略摘要来排查资源级权限问题。查看策略摘要:
- 打开 IAM 控制台。
- 在导航窗格中,选择 Policies(策略)。
- 选择策略名称旁边的箭头来展开策略详细信息视图。
- 选择 Policy summary(策略摘要)。
在以下示例中,策略仅向 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 策略中使用的条件。AWS 全局条件上下文密钥可与支持 IAM 进行访问控制的所有 AWS 服务一起使用。特定于服务的条件密钥只能在特定服务中使用 — EC2 条件对 EC2 API 操作。有关更多信息,请参阅 AWS 服务的操作、资源和条件上下文密钥。如果您使用多个条件,请参阅一个条件中包含多个值。
在此示例策略中,如果 IAM API 请求由 IAM 用户 admin 调用且源 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 终端节点策略和 AWS Organizations 服务控制策略 (SCP) 也会影响权限评估。有关更多信息,请参阅使用 VPC 终端节点控制对服务的访问。
IAM 策略错误消息排查示例
查看以下示例以确定错误消息、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 | 未知 | 出错时间 |
通过使用此评估方法,您可以确定针对不同 AWS 服务的权限问题收到的错误消息的原因。有关更多详细信息,请参阅以下常见错误消息和排查步骤:
示例错误消息 A:
此错误消息指示您无权调用 DeleteKeyPair API。
- 请确定 API 调用方。
- 请确认 ec2:DeleteKeyPair API 操作未包含在任何拒绝语句中。
- 请确认 ec2:DeleteKeyPair API 操作包含在允许语句中。
- 请确认未针对此 API 操作指定资源。注意:此 API 操作不支持资源级权限。
- 请确认允许语句中指定的所有 IAM 条件受 delete-key-pair 操作支持,并且条件相匹配。
示例错误消息 B:
此错误消息包含 API 名称、API 调用方和目标资源。请确保调用 API 的 IAM 身份拥有正确的资源访问权限。使用上述评估方法查看 IAM 策略并评估以下内容:
IAM 角色的信任策略:EC2-FullAccess:
- 请确认 arn:aws:iam::123456789012:user/test 或 arn:aws:iam::123456789012:root 未包含在信任策略的任何拒绝语句中。
- 请确认 arn:aws:iam::123456789012:user/test 或 arn:aws:iam::123456789012:root 包含在信任策略的允许语句中。
- 请确认允许语句中指定的所有 IAM 条件均受 sts:AssumeRole API 操作支持并且相匹配。
附加到 API 调用方的 IAM 策略 (arn:aws:iam::123456789012:user/test):
- 请确认 arn:aws:iam::123456789012:role/EC2-FullAccess 未包含在任何含有 sts:AssumeRole API 操作的拒绝语句中。
- 如果 arn:aws:iam::123456789012:root 包含在信任策略的允许语句中,请确认 arn:aws:iam::123456789012:role/EC2-FullAccess 包含在含有 sts:AssumeRole API 操作的 IAM 策略的允许语句中。
- 请确认允许语句中指定的所有 IAM 条件均受 sts:AssumeRole API 操作支持并且相匹配。
示例错误消息 C:
此错误消息指示 get-session-token 不受临时凭证支持。有关更多信息,请参阅比较 AWS STS API 操作。
示例错误消息 D:
此错误消息返回一则可以提供授权失败详细信息的编码消息。要对错误消息进行解码并获得授权失败的详细信息,请参阅 DecodeAuthorizationMessage。在对错误消息进行解码之后,请确定 API 调用方并查看资源级权限和条件。
查看 IAM 策略权限:
- 如果错误消息指示 API 被明确拒绝,请从匹配的语句中删除 ec2:AssociateIamInstanceProfile 或 iam:PassRole API 操作。
- 请确认 ec2:AssociateIamInstanceProfile 和 iam:PassRole 位于含有受支持和正确的资源目标的允许语句中。例如,请确认 ec2:AssociateIamInstanceProfile API 操作的资源目标是 EC2 实例并且 iam:PassRole 的资源目标是 IAM 角色。
- 如果 ec2:AssociateIamInstanceProfile 和 iam:PassRole API 操作位于同一个允许语句中,请确认所有条件均受 ec2:AssociateIamInstanceProfile 和 iam:PassRole API 操作的支持,并且相关条件相匹配。
- 如果 ec2:AssociateIamInstanceProfile 和 iam:PassRole API 操作位于不同的允许语句中,请确认各允许语句中的所有条件均受操作支持,并且相关条件相匹配。