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

上次更新时间:2019 年 10 月 21 日

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

简短描述

您可以在 IAM 策略的条件元素中使用 aws: SourceIp 全局条件键限制来自特定 IP 地址的 API 调用。但是,这样做会拒绝对代表您进行调用的 AWS 服务(例如 AWS CloudFormation)的访问。

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

注意:最好不要使用 aws: SourceIp 条件键。

解决方法

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

创建以下 IAM 策略,然后将此策略附加到具备编程访问权限的 IAM 用户。此 IAM 策略允许 IAM 用户使用角色名称 Bob 执行 AssumeRole Bob 不需要其他权限。当 IAM 用户成功代入角色 Bob 时,会获得所有其他必需权限。

注意:Bob 替换为您的 IAM 角色名称,并将 EXAMPLEIAMACCOUNTID 替换为您的账户 ID。

示例 IAM 用户策略

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

创建 IAM 角色 Bob 以向 IAM 用户委派权限。遵循创建 IAM 角色(控制台)的相关说明。您还可以使用 AWS 命令行界面 (AWS CLI) 或 API。

注意:使用控制台创建角色时,请修改角色的信任策略(类似于本例中的 Bob 信任策略)。通过使用 CLI create-role 或 API CreateRole,您可以将信任关系策略文档作为 --assume-role-policy 文档参数中的值进行传递。

IAM Bob 角色策略:此策略有权对账户中的资源执行 API 调用。

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

注意:请求必须来自指定的 IP 地址范围 103.15.250.0/24 或 12.148.72.0/23,否则 IAM 用户将无法代入该角色,也无法进行 API 调用。

示例 IAM 角色信任策略

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

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

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


这篇文章对您是否有帮助?

我们可以改进什么?


需要更多帮助?