如何对使用 IAM 角色或用户请求 API 调用时出现的显式拒绝错误消息进行故障排除?

3 分钟阅读
0

我想对使用 AWS Identity and Access Management (IAM) 角色或用户请求 API 调用时出现的显式拒绝错误消息进行故障排除。

简短描述

为使 IAM 实体(角色或用户)成功进行 API 调用,该实体必须满足以下条件:

  • 角色或用户拥有请求 API 调用的正确权限。
  • 适用于请求上下文的所有策略中的任何语句均不会拒绝该权限。

如果您的 IAM 实体不满足这些条件,则 API 调用将失败并返回类似于以下内容的 (AccessDenied) 错误:

  • "IAM user or role experiencing the issue: arn:XXXXXXXX:iam::XXXXXXXX:role/TestReadOnly"
  • "Error: An error occurred (AccessDenied) when calling the RunInstances operation: User: arn:aws:iam::XXXXXXXX:user/tester is not authorized to perform: ec2:RunInstances on resource: role TestReadOnly with an explicit deny"

**注意:**本文中的故障排除步骤专用于处理显式拒绝错误,而非隐式拒绝错误。有关隐式拒绝错误的详细信息,请参阅隐式拒绝和显式拒绝之间的区别

解决方法

由于以下一个或多个策略存在问题,导致出现显式拒绝错误:

  • 基于身份的策略
  • 基于资源的策略
  • 权限边界
  • 服务控制策略
  • 会话策略

基于身份的策略

基于身份的策略用于控制实体的允许/拒绝操作。使用这些故障排除步骤来识别基于身份的策略的相关问题。

**注意:**最佳做法是在条件中使用 DenyStringNotLike 以防止意外特权访问。

1.检查您基于身份的策略中是否包含拒绝语句。以下示例包含拒绝语句:

{
  "Effect": "Deny",
  "Action": "iam:DeleteRole"
  "Resource": "*"
}

2.检查您的策略是否强制执行多重身份验证 (MFA)。如果强制执行 MFA,则当您的 IAM 实体未使用其他身份验证因素进行身份验证时,权限将被拒绝。例如,如果您的实体使用 AWS CLI 进行身份验证而不是 MFA,则您的 API 调用将被拒绝。请参阅以下 MFA 强制执行示例:

{
  "Sid": "DenyAllExceptListedIfNoMFA",
  "Effect": "Deny",
  "NotAction": [
    "iam:CreateVirtualMFADevice",
    "iam:EnableMFADevice",
    "iam:GetUser",
    "iam:ListMFADevices",
    "iam:ListVirtualMFADevices",
    "iam:ResyncMFADevice",
    "sts:GetSessionToken"
  ],
  "Resource": "*",
  "Condition": {
    "BoolIfExists": {"aws:MultiFactorAuthPresent": "false"}
  }
}

该策略显式拒绝所有 API 调用,NotAction 策略元素中提及的调用除外。

3.确保您的策略满足所有必需的条件。如果您的策略有多个条件运算符或多个密钥,则会使用 AND 逻辑对这些条件进行评估。每个 RequestTag 键都必须在单独的语句中使用才能获得相同的 AND 逻辑。以下是导致 API 调用失败的常见问题的示例:

{
  "Sid": "AllowRunInstancesWithRestrictions2",
  "Effect": "Deny",
  "Action": [
    "ec2:CreateVolume",
    "ec2:RunInstances"
  ],
  "Resource": [
    "arn:aws:ec2:*:*:volume/*",
    "arn:aws:ec2:*:*:instance/*"
  ],
  "Condition": {
    "ForAllValues:StringNotLike": {
      "aws:TagKeys": "Production"
    },
    "StringEquals": {
      "ec2:InstanceType": "t2.micro"
    }
  }
}

为避免这些 API 调用出现显式拒绝访问错误,请确保满足上述条件。

注意aws:TagKeys 条件区分大小写。

基于资源的策略

基于资源的策略用于允许或拒绝对资源的访问。与基于身份的统一 IAM 策略不同,基于资源的策略是由服务设计的。以下故障排除步骤使用 Amazon Simple Storage Service (Amazon S3) 基于资源的策略和 VPC 端点策略作为示例。

S3 存储桶策略评估

Amazon S3 存储桶策略评估的工作原理如下:

**注意:**这假定将存储桶 ACL 设置为默认值。

  • 要访问同一账户中的存储桶,IAM 实体需要拥有基于身份的 IAM 策略中的权限存储桶策略中的权限。
  • 要访问其他账户中的存储桶,IAM 实体需要拥有存储桶策略中的权限以及基于身份的 IAM 策略中的权限才能获取访问权限。

1.检查基于资源的策略中是否存在拒绝语句。此示例显示了存储桶策略中的拒绝语句:

{
  "Effect": "deny",
  "Principal": {
    "AWS": "arn:aws:iam::111111111111:role/ROLENAME"
  },
  "Action": "s3:ListBucket",
  "Resource": "arn:aws:s3:::MyExampleBucket"
}

2.检查您策略中描述的 ARN 是否正确。

3.如果当前用户的 aws:userid 与策略中定义的值不同,则存储桶策略将拒绝访问。请参阅以下示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*",
            "AIDAEXAMPLEID",
            "111111111111"
          ]
        }
      }
    }
  ]
}

VPC 端点

VPC 端点策略是附加到端点的 IAM 资源策略。此策略不会覆盖或替换 IAM 用户策略或服务特定策略(例如 S3 存储桶策略)。

使用接口端点连接到 Amazon S3 时,有两种方法可以控制对您的 Amazon S3 数据的访问,即:

  • 您可以控制能够使用 VPC 端点访问端点服务的 AWS 主体(AWS 账户、IAM 用户和 IAM 角色)。
  • 您可以使用 Amazon S3 存储桶策略控制有权访问您的存储桶的 VPC 或 VPC 端点。

以下示例为 Amazon S3 存储桶策略。该策略限制从 ID 为 vpce-11111 的 VPC 端点访问名为 examplebucket 的特定存储桶。如果未使用指定端点,该策略将拒绝对该存储桶的所有访问。aws:SourceVpce 条件用于指定端点。

{
   "Version": "2012-10-17",
   "Id": "Policy123456789”,
   "Statement": [
     {
       "Sid": "AccessSpecificVPCEOnly",
       "Principal": "*",
       "Action": "s3:*",
       "Effect": "Deny",
       "Resource": ["arn:aws:s3:::examplebucket",
                    "arn:aws:s3:::examplebucket/*"],
       "Condition": {
         "StringNotEqualsIfExists": {
           "aws:SourceVpce": "vpce-11111”
         }
       }
     }
   ]
}

务必确认 VPC 端点不会显式拒绝对资源的访问。

权限边界

权限边界是一种托管策略,可用于设置基于身份的策略可以向 IAM 实体授予的最大权限。该托管策略可以限制对实体的访问权限,这可能会导致出现显式拒绝错误消息。

此示例显示了 IAM 策略中允许但权限边界内显式拒绝的操作。请参阅下面的权限边界:

{
  "Version": "2012-10-17",

  "Statement": [

    {
      "Effect": "Deny",
      "Action": "ec2:*"

      "Resource": "*"
    }
  ]
}

该用户具有以下权限:

{
  "Version": "2012-10-17",

  "Statement": {
    "Effect": "Allow",
    "Action": "ec2:RunInstances",

    "Resource": "*"
  }
}

尽管用户拥有 RunInstances 权限,但当他们发起请求时会收到一条显式拒绝消息。要解决此错误,请确保您的权限边界和 IAM 当前都显式允许此操作。

服务控制策略

服务控制策略 (SCP) 允许您管理组织中的权限。以下示例显示了 SCP 中的拒绝语句。在此示例中,SCP 附加到成员账户或特定组织单位 (OU)。该策略显式拒绝访问 RunInstances 操作:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "ec2:RunInstances"

      "Resource": "*"
    }
  ]
}

要解决显式拒绝错误,请执行以下操作之一:

  • 将 SCP 与账户分离。
  • 通过添加排除某些用例的条件来修改拒绝语句。例如,如果 IAM 主体使用角色 CloudOps,则此示例中的此 SCP 不会拒绝 ec2:RunInstances:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "ec2:RunInstances"     
      "Resource": "*",
      "Condition": {
        "ArnNotLike": {
          "aws:PrincipalARN": "arn:aws:iam::*:role/CloudOps"
        }
      }
    }
  ]
}

会话策略

会话策略是您在以编程方式为角色或用户创建临时会话时作为参数传递的高级策略。您可以使用 AssumeRole、AssumeRoleWithSAML 或 AssumeRoleWithWebIdentity API 操作创建角色会话并传递会话策略。

例如,当用户尝试调用 RunInstances API 时,此策略会生成显式拒绝错误。始终检查会话策略中是否存在拒绝语句:

{
  "Version": "2012-10-17",

  "Statement": {
    "Effect": "Deny",
    "Action": "ec2:RunInstances",

    "Resource": "*"
  }
}

相关信息

适用于 AWS 资源的 Access Management

如何使用服务控制策略在您的 Amazon Organization 的账户之间设置权限防护机制

IAM 实体的权限边界

如何限制 Amazon S3 存储桶对特定 IAM 角色的访问

使用存储桶策略控制从 VPC 端点的访问

AWS 官方
AWS 官方已更新 1 个月前