如何保护AWS Elastic Beanstalk端点免受公共直接访问?
解决方案
方法1:用AWS WAF拦截非法请求(推荐)
直接给Elastic Beanstalk的应用负载均衡器绑定AWS WAF,通过规则过滤不符合要求的请求:
- 创建WAF Web ACL,关联到你的应用负载均衡器
- 添加字符串匹配规则,校验请求的
Referer头是否以https://xxxx.com/开头(需包含HTTPS协议和路径前缀) - 规则动作设置为:允许符合条件的请求,拒绝其余所有请求
- 额外优化:可补充规则校验
Origin头是否等于https://xxxx.com,进一步提升验证严谨性
注:Referer虽可被伪造,但能有效阻止绝大多数非浏览器场景的直接访问(比如Postman默认不会携带合法的Referer),且配置简单、成本极低。
方法2:后端代码层面添加请求头验证
在Spring Boot应用中新增拦截器/过滤器,强制校验请求的Referer或Origin头:
- 实现
HandlerInterceptor接口,在preHandle方法中做校验:
public class RefererValidationInterceptor implements HandlerInterceptor { private static final String ALLOWED_DOMAIN = "https://xxxx.com"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String referer = request.getHeader("Referer"); String origin = request.getHeader("Origin"); // 校验Referer或Origin是否符合要求 if ((referer != null && referer.startsWith(ALLOWED_DOMAIN)) || (origin != null && origin.equals(ALLOWED_DOMAIN))) { return true; } response.setStatus(HttpServletResponse.SC_FORBIDDEN); return false; } }
- 在Spring配置类中注册该拦截器,确保覆盖所有API路径
- 灵活优化:可将允许的域名存入环境变量,方便不同部署环境切换配置
方法3:通过Lambda@Edge传递验证令牌(更高安全性)
借助CloudFront的Lambda@Edge函数为合法前端请求添加唯一令牌,后端校验令牌有效性:
- 在CloudFront的Viewer Request事件中绑定Lambda@Edge函数,为来自
xxxx.com的请求添加自定义头(例如X-Frontend-Token: your-unique-secret) - 在Spring Boot后端新增过滤器,检查所有API请求是否携带该自定义头且令牌值匹配
- 注意:Lambda@Edge需部署在us-east-1区域,令牌需严格保密,避免泄露
关于之前CloudFront前缀列表配置无效的原因
前端发起的API请求来自终端用户的浏览器,请求源IP是用户的公网IP,而非CloudFront服务器的IP。将负载均衡器安全组源限制为CloudFront前缀列表后,用户的请求会被直接拦截,自然导致网站无法调用API——安全组的源限制针对的是请求发起方的IP,此处发起方是终端用户,而非CloudFront。
内容的提问来源于stack exchange,提问作者Seng Wee
相关产品推荐
相关产品推荐

