约束OpenAPI调用来源IP合法范围

访问OpenAPI时,建议配置RAM Policy规则限制访问源端IP地址合法范围,防止在凭据泄露的情况下,攻击者可以从网络任意位置使用该凭据非法操控或访问云资源。

安全风险

默认情况下,任何拥有合法AccessKey (AK)凭证的实体,可以从互联网的任意角落发起对云资源的OpenAPI调用。这意味着,一旦AK凭证因配置不当、代码硬编码或员工离职等原因泄露,攻击者便获得了直接操控云资源的“钥匙”,其风险是全局性的,可能导致数据被窃、资源被恶意删除或产生高额费用。

最佳实践

通过RAM Policy规则限制访问源端IP地址,即使AK凭证泄露,攻击者也必须从预设的、受信任的IP地址(如公司出口IP、堡垒机IP)发起攻击才能成功。

控制台

  1. 创建RAM用户(阿里云主账号无法通过RAM Policy限制访问源IP)

    1. 使用阿里云账号(主账号)或RAM管理员登录RAM控制台

    2. 在左侧导航栏,选择身份管理 > 用户

    3. 用户页面,单击创建用户,根据提示完成信息填写,单击确定,完成安全验证。

  2. 创建自定义权限策略

    1. 使用RAM管理员登录RAM控制台。在左侧导航栏,选择权限管理 > 权限策略

    2. 在权限策略页面,单击创建权限策略

    3. 创建权限策略页面,单击脚本编辑页签。输入以下权限策略内容,然后单击确定

      {
        "Version": "1",
        "Statement": [
          {
            "Action": "ecs:*",  // ecs下所有OpenAPI,如果是云上所有OpenAPI则配置为*
            "Resource": "*",
            "Effect": "Allow",
            "Condition": {
              "IpAddress": {
                "acs:SourceIp": [
                  "200.1.xxx.xxx/24",  // 替换为允许的 IP 地址范围
                  "213.1.xxx.xxx"      // 替换为允许的单个 IP 地址
                ]
              }
            }
          }
        ]
      }
    4. 输入策略名称备注,单击确定,完成安全验证。

  3. RAM用户绑定权限策略

    1. 使用RAM管理员登录RAM控制台

    2. 在左侧导航栏,选择身份管理 > 用户

    3. 用户页面,单击目标RAM用户操作列的添加权限

    4. 新增授权面板,选择权限策略后,单击确认新增授权

API

  1. 调用CreateUser接口创建RAM用户:

    • UserName:RAM用户的登录名称。

    • DisplayName:RAM用户的显示名称。

  2. 调用CreatePolicy接口创建RAM Policy:

    • PolicyName:策略名称,建议具有可读性(如 RestrictIPAccess)。

    • PolicyDocument:策略内容,JSON 格式,指定允许的 IP 地址范围。

  3. 调用AttachPolicyToUser接口为RAM用户绑定策略:

    • PolicyType:策略类型,固定为 "Custom"

    • PolicyName:策略名称(如 RestrictIPAccess)。

    • UserName:RAM 用户名称(如 TestUser)。

说明

通过 RAM Policy 限制源 IP 无法直接限制从 VPC 访问 OpenAPI 的源 IP,因为acs:SourceIp 实际上是基于调用 OpenAPI 请求的公网出口 IP 或 NAT 网关出口 IP,而不是 VPC 内部的私有 IP 地址。

合规能力

检查:是否存在RAM用户没有绑定源IP限制策略

使用阿里云CLI工具,运行以下脚本,遍历所有 RAM 用户并检查是否绑定了 IP限制策略:

#!/bin/bash

# 定义策略ARN(Aliyun Resource Name)
POLICY_ARN="acs:ram::123456789012:policy/RestrictIPAccess"  #替换成自己的Policy Arn

# 获取所有RAM用户列表
USER_LIST=$(aliyun ram ListUsers | jq -r '.Users.User[].UserName')

# 遍历每个用户并检查是否绑定了指定策略
for USER in $USER_LIST; do
  # 获取用户绑定的策略列表
  POLICIES=$(aliyun ram ListPoliciesForUser --UserName $USER | jq -r '.Policies.Policy[].PolicyArn')

  # 检查策略是否包含目标策略ARN
  if ! echo "$POLICIES" | grep -q "$POLICY_ARN"; then
    echo "用户 $USER 未绑定策略 $POLICY_ARN"
  fi
done

修复:批量给RAM用户绑定源IP限制策略

使用阿里云CLI工具,运行以下脚本,遍历所有 RAM 用户并为没有绑定策略的用户绑定策略:

#!/bin/bash

# 定义策略ARN(Aliyun Resource Name)
POLICY_ARN="acs:ram::123456789012:policy/RestrictIPAccess"   #替换成自己的Policy Arn

# 获取所有RAM用户列表
USER_LIST=$(aliyun ram ListUsers | jq -r '.Users.User[].UserName')

# 遍历每个用户并检查是否绑定了指定策略
for USER in $USER_LIST; do
  # 获取用户绑定的策略列表
  POLICIES=$(aliyun ram ListPoliciesForUser --UserName $USER | jq -r '.Policies.Policy[].PolicyArn')

  # 检查策略是否包含目标策略ARN
  if ! echo "$POLICIES" | grep -q "$POLICY_ARN"; then
    echo "用户 $USER 未绑定策略 $POLICY_ARN"
    
    # 为用户绑定策略
    echo "正在为用户 $USER 绑定策略 $POLICY_ARN ..."
    aliyun ram AttachPolicyToUser \
      --PolicyType Custom \
      --PolicyName RestrictIPAccess \
      --UserName $USER
    
    if [ $? -eq 0 ]; then
      echo "策略 $POLICY_ARN 已成功绑定到用户 $USER"
    else
      echo "策略 $POLICY_ARN 绑定失败,请检查权限或策略是否存在"
    fi
  fi
done