Django+Elastic Beanstalk环境中将EC2公网IP加入ALLOWED_HOSTS是否安全?
单实例Elastic Beanstalk环境添加EC2公网IP到Django ALLOWED_HOSTS的安全性说明
结论:临时添加公网IP不会引入严重安全风险,但长期运维不推荐,优先建议通过Nginx配置从根源解决报错
报错原因
单实例Elastic Beanstalk没有搭载负载均衡,EC2实例直接暴露在公网环境,会收到两类带公网IP作为Host头的请求:
- 公网爬虫、端口扫描工具批量扫描IP段时主动发起的探测请求
- 部分内部健康检查、运维操作直接调用实例公网IP产生的合法请求
这些请求转发到Django层后,因为公网IP不在ALLOWED_HOSTS列表中,就会触发Invalid HTTP_HOST_HEADER报错。
直接添加公网IP到ALLOWED_HOSTS的弊端
- 单实例EC2的公网IP不固定,实例重启、环境重建后IP会变更,每次都需要修改配置重新部署,运维成本高
- 公网IP属于公开可扫描资产,添加后会增大攻击面,恶意攻击者可以直接通过IP构造请求发起攻击,虽然不会直接触发严重安全漏洞,但会提高恶意请求到达Django层的概率
更推荐的解决方案(无需添加公网IP到ALLOWED_HOSTS)
修改Nginx配置,新增默认服务块拦截所有Host头不匹配正式域名的请求,不让非法请求到达Gunicorn和Django层:
# 默认拦截规则,所有未匹配到正式域名的请求直接断开 server { listen 80 default_server; listen 443 ssl default_server; server_name _; ssl_certificate 【你的SSL证书公钥路径】; ssl_certificate_key 【你的SSL证书私钥路径】; return 444; } # 原有正式站点配置 server { listen 443 ssl; server_name xxx.elasticbeanstalk.com; # 剩余原有配置、代理到Gunicorn的规则保持不变 }
配置重启生效后,所有通过公网IP、陌生域名发起的请求都会被Nginx直接拦截,不会再产生相关报错。
临时添加公网IP的注意事项
如果确实有业务需要直接通过公网IP访问服务,添加时需要注意:
- 不要硬编码IP到Django配置文件,可以在settings.py中通过AWS实例元数据接口动态获取当前实例公网IP,避免IP变更后需要重新打包部署
- 不要长期保留不再使用的公网IP在ALLOWED_HOSTS列表中,定期清理冗余配置
内容的提问来源于stack exchange,提问作者gowthz
相关产品推荐
相关产品推荐

