如何阻止AWS账号B中特定EC2实例访问账号A的AWS REST API
可行解决方案
方案1:AWS WAF 精准IP拦截(修正之前的配置问题)
你之前用WAF没生效,大概率是配置环节出错了,按以下步骤调整:
- 先获取账号B中目标EC2实例的公网IP地址(如果是内网访问则取私网IP,需确保VPC peering或网络连通)
- 在账号A的WAF控制台创建新规则:
- 规则类型选「IP匹配」,填入目标EC2的IP(格式
x.x.x.x/32) - 动作设置为「阻止」,并将该规则的优先级设为最高(确保先于其他允许规则触发)
- 规则类型选「IP匹配」,填入目标EC2的IP(格式
- 将WAF关联到你的API所在的资源:如果是API Gateway部署的API,关联到对应API;如果是ALB后端的API,关联到目标ALB
- 验证:用目标EC2实例发起请求,确认被拦截;用账号B其他实例或外部来源测试,确保正常访问
方案2:API Gateway 资源策略(仅适用于API Gateway部署的API)
如果你的REST API是基于AWS API Gateway,直接修改其资源策略,实现「允许账号B所有访问,但排除特定EC2 IP」的逻辑:
- 打开API Gateway控制台,进入目标API的「资源策略」页面
- 替换为类似以下的策略(替换占位符为你的实际信息):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域:账号A ID:API ID/*/*/*", "Condition": { "StringEquals": { "aws:PrincipalAccount": "账号B ID" }, "NotIpAddress": { "aws:SourceIp": ["目标EC2的IP/32"] } } }, { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域:账号A ID:API ID/*/*/*", "Condition": { "StringNotEquals": { "aws:PrincipalAccount": "账号B ID" } } } ] }
- 保存策略后,测试访问效果:目标EC2被拦截,账号B其他实例及外部来源正常访问
方案3:应用层拦截(适用于EC2/容器部署的API)
如果你的API部署在账号A的EC2或容器中,可直接在应用的反向代理或代码中添加IP拦截规则:
- 比如用Nginx:在配置文件中添加
deny x.x.x.x;(x.x.x.x为目标EC2的IP),重启Nginx后生效 - 比如在API代码中(如Python/Java),添加请求IP校验逻辑,若匹配目标IP则返回403禁止访问
补充:之前方案失败的原因分析
- AWS WAF:未正确关联资源、规则优先级低于允许规则,或IP地址填写错误
- 安全组:跨账号安全组只能引用整个安全组,无法针对单个EC2实例做限制
- NACLs:其实可以添加单个IP的拒绝规则,但需注意NACLs是无状态的,要同时配置入站和出站规则,且拒绝规则优先级高于允许规则,但灵活性不如WAF或资源策略
内容的提问来源于stack exchange,提问作者sonu_chauhan
相关产品推荐
相关产品推荐

