基于S3与CloudFront的静态站点如何限制非生产环境仅VPN可访问
无需新增EC2实例的可行方案
以下方案均基于AWS托管服务实现,完全不需要自行部署维护EC2实例:
方案1:CloudFront + AWS WAF 源IP白名单控制(最轻量)
- 适用场景:非生产站点可暴露公网域名,仅需限制访问来源的场景
- 实现逻辑:所有通过VPN接入VPC的用户访问公网时,出口IP统一为VPC关联的NAT网关公网EIP,直接通过WAF限制仅允许这些IP访问即可
- 配置步骤:
- 为非生产环境对应的CloudFront分发绑定独立的WAF WebACL
- 在WebACL中添加允许规则,匹配条件为
源IP属于VPC NAT网关公网EIP列表,动作为放行 - 将WebACL的默认动作设置为拦截所有请求
- 配置非生产环境S3桶关闭公网访问,桶策略仅允许CloudFront OAC(源访问控制)读取内容,避免绕过CloudFront直接访问S3
- 扩展适配:如果VPN用户直接使用VPC内网IP访问,可将WAF规则调整为匹配
X-Forwarded-For头中的VPC内网网段即可
方案2:全内网访问方案(无公网暴露面,安全性最高)
- 适用场景:非生产站点完全不允许公网访问,仅VPC内网及VPN接入用户可访问
- 配置步骤:
- 为非生产环境的S3桶创建仅限VPC访问的接入点(Access Point),配置桶策略仅允许该接入点读取内容
- 在对应VPC中创建S3的接口型VPC端点,安全组放通VPC内网网段(含VPN分配的IP段)的443端口访问
- 在Route 53中创建私有托管区,将dev/uat/qa等非生产子域名解析到对应CloudFront分发的域名,同时配置CloudFront仅允许VPC内网IP段访问
- VPN用户默认使用VPC内部DNS解析域名,所有访问请求全程走内网链路,公网无法解析到对应站点入口,天然无法访问
方案3:细粒度权限扩展方案
如果需要区分不同环境的访问权限(比如dev环境仅允许开发组访问,uat仅允许测试组访问),可以为非生产环境的CloudFront配置Viewer Request触发的Lambda@Edge,校验请求携带的内部身份凭证(比如企业SSO的Cookie、自定义请求头),校验通过才转发请求到S3源站,该方案也不需要额外部署服务器资源。
注意:所有方案都必须先关闭S3桶的公网访问开关,配置严格的桶访问策略,避免出现绕过访问控制直接访问S3源站的漏洞。
内容的提问来源于stack exchange,提问作者Andriy Kopachevskyy
相关产品推荐
相关产品推荐

