访问OpenAPI时,建议配置RAM Policy规则限制访问源端IP地址合法范围,防止在凭据泄露的情况下,攻击者可以从网络任意位置使用该凭据非法操控或访问云资源。
安全风险
默认情况下,任何拥有合法AccessKey (AK)凭证的实体,可以从互联网的任意角落发起对云资源的OpenAPI调用。这意味着,一旦AK凭证因配置不当、代码硬编码或员工离职等原因泄露,攻击者便获得了直接操控云资源的“钥匙”,其风险是全局性的,可能导致数据被窃、资源被恶意删除或产生高额费用。
最佳实践
通过RAM Policy规则限制访问源端IP地址,即使AK凭证泄露,攻击者也必须从预设的、受信任的IP地址(如公司出口IP、堡垒机IP)发起攻击才能成功。
控制台
创建RAM用户(阿里云主账号无法通过RAM Policy限制访问源IP)
使用阿里云账号(主账号)或RAM管理员登录RAM控制台。
在左侧导航栏,选择。
在用户页面,单击创建用户,根据提示完成信息填写,单击确定,完成安全验证。
创建自定义权限策略
使用RAM管理员登录RAM控制台。在左侧导航栏,选择。
在权限策略页面,单击创建权限策略。
在创建权限策略页面,单击脚本编辑页签。输入以下权限策略内容,然后单击确定。
{ "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 地址 ] } } } ] }输入策略名称和备注,单击确定,完成安全验证。
为RAM用户绑定权限策略
使用RAM管理员登录RAM控制台。
在左侧导航栏,选择。
在用户页面,单击目标RAM用户操作列的添加权限。
在新增授权面板,选择权限策略后,单击确认新增授权。
API
调用CreateUser接口创建RAM用户:
UserName:RAM用户的登录名称。
DisplayName:RAM用户的显示名称。
调用CreatePolicy接口创建RAM Policy:
PolicyName:策略名称,建议具有可读性(如RestrictIPAccess)。PolicyDocument:策略内容,JSON 格式,指定允许的 IP 地址范围。
调用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