如何使用 IAM 角色限制来自特定 IP 地址的 API 调用对 AWS 管理控制台的访问?

2 分钟阅读
0

我想使用 AWS Identity and Access Management (IAM) 角色来限制 API 调用对 AWS 管理控制台的访问。

简短描述

在 IAM 策略的条件元素中使用 aws:SourceIp 全局条件键来限制来自特定 IP 地址的 API 调用。但是,此操作会拒绝对代您进行调用的 AWS 服务(例如 AWS CloudFormation)的访问,除非您同时使用 aws:ViaAWSService 全局条件。有关详细信息,请参阅 AWS: 根据源 IP 拒绝对 AWS 的访问

例如,假设您有一个 AWS 服务角色,该角色允许 AWS CloudFormation 调用 Amazon Elastic Compute Cloud (Amazon EC2) 来停止实例。请求将被拒绝,因为目标服务 (Amazon EC2) 看到的是调用服务 (AWS CloudFormation) 的 IP 地址,而不是源用户的 IP 地址。您无法通过调用服务将源 IP 地址传递给目标服务以在 IAM 策略中进行评估。

解决方法

创建一个 IAM 角色,为其附加与附加到 IAM 用户的 IAM 策略相同的一组权限。只有当请求来自指定 IP 地址时,这才允许 IAM 用户代入角色 sts:AssumeRole API。这是因为用户尝试代入角色时会执行 aws:SourceIp 限制检查。当用户代入 IAM 角色时,他们将获得附加到该角色的 IAM 策略的权限。由于附加到该角色的 IAM 策略不使用 aws:SourceIp 条件键,因此允许对 AWS 服务的访问。

创建下面的 IAM 策略,然后将此策略附加到具有编程访问权限的 IAM 用户。该 IAM 策略允许 IAM 用户代入名为 Bob 的角色。Bob 不需要额外权限。当 IAM 用户成功代入 Bob 角色时,其将获得所有其他必需的权限。

注意:

IAM 用户策略示例

该示例策略具有对账户中资源执行 API 调用的权限。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::EXAMPLEIAMACCOUNTID:role/Bob"
  }
}

创建 IAM 角色 Bob 以向 IAM 用户委派权限。然后,按照创建 IAM 角色(控制台)中的说明进行操作。您也可以使用 AWS CLI 或 API。

注意:

  • 使用控制台创建角色时,请修改角色的信任策略,类似于该示例中的 Bob 信任策略。通过使用 AWS CLI create-role 或 API CreateRole,您可以将信任关系策略文档作为 update-assume-role-policy 文档参数中的值进行传递。
  • 请求必须来自指定的 IP 地址范围 103.15.250.0/24 或 12.148.72.0/23。否则,IAM 用户将无法代入角色以及进行 API 调用。

IAM 角色信任策略示例

如果请求来自 IP 地址范围 103.15.250.0/24 或 12.148.72.0/23,则此示例信任策略允许用户代入角色。

**注意:**请将 YOURIAMUSERNAME 替换为您的 IAM 用户名。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:user/YOURIAMUSERNAME"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Deny",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:user/YOURIAMUSERNAME"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": [
            "103.15.250.0/24",
            "12.148.72.0/23"
          ]
        }
      }
    }
  ]
}

**注意:**此解决方法会中断 AWS CloudTrail 日志,因为操作是由用户代入的 IAM 角色执行的,而不是 IAM 用户。由 IAM 用户执行的 assumeRole API 调用将记录在 CloudTrail 日志中的 IAM 用户下。由 IAM 角色执行的任何其他 API 调用将记录在 CloudTrail 日志中的角色名称下。

相关信息

AWS 全局条件上下文键

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