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

上次更新日期:2022 年 11 月 21 日

我想将对 AWS API 调用的访问限制为特定 IP 地址。我该如何使用 AWS Identity and Access Management (IAM) 角色将来自 API 调用的访问限制到 AWS 管理控制台?

简短描述

您可以在 IAM policy 的条件元素中使用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 policy 中进行评估。

解决方法

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

创建以下 IAM 策略,然后将此策略附加到具备编程访问权限的 IAM 用户。此 IAM 策略允许 IAM 用户使用角色名称 Bob 执行 AssumeRoleBob 不需要其他权限。当 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 调用记录在 IAM 用户的 CloudTrail 日志中。由 IAM 角色执行的任何其他 API 调用均记录在角色名称下的 CloudTrail 日志中。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?