使用自定义 header 将 CloudFront 限制为特定 IP 范围的 S3 静态网站
S3 static website with CloudFront restricted to specific IP range using custom header
我想将网站部署到 S3 存储桶并使用静态网站托管。但是,我有一些严格的安全限制:
- 必须使用 HTTPS
- 对网站的访问必须限制在特定的 IP 范围内
这是我的计划:
- 使用AWS WAF限制可以访问网站的IP
- 使用 CloudFront 来利用 HTTPS
- 格式化 CloudFront 分配以转发一个自定义 header,它将充当 S3
的访问密钥
- 将 S3 存储桶安全策略限制为仅允许包含来自上述 CloudFront 的自定义 header 的流量。
这是一张图表:
不过我有一个大问题:在 CloudFront 之间转发自定义 header 真的 是最好的方法吗? AWS 文档说源访问身份不能用于充当网站的 S3 存储桶 (https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html)。自定义 header 似乎不如 Origin Access Identity 安全,而且更难维护。使用随机字符串作为防止某人绕过我的 CloudFront 分配并直接访问 S3 存储桶的唯一安全措施让我感到不舒服。如果恶意方猜测
我在这里的另一个选择是硬着头皮转移到服务器,在那里我可以更好地控制很多安全性,但我想利用 S3 网站的便利性。
您不能在 S3 上使用任何自定义 header,仅允许某些 header,例如:Referer、User-Agent 等。
最好的方法是将 OAI 与 S3 Rest API 端点而不是网站端点一起使用。
但是,您可以为网站端点选择替代方法:
1. 允许 CloudFront IP 范围访问 S3 存储桶。
http://d7uri8nf7uskq.cloudfront.net/tools/list-cloudfront-ips
和
2. 在 CloudFront 源配置中添加源客户 header 例如 "Referer: some random value" 并创建存储桶策略以允许 Referer header.
中的特定值
您应该从 S3 存储桶中删除网站配置并使用 Origin Access Identity。您的其余设置没问题。
您不需要将 S3 存储桶配置为网站端点,因为您不会直接通过 S3 提供您的内容。使用 Origin Access Identity,您的存储桶将只能从 CloudFront 获得(除非您在存储桶策略中添加其他内容),这就是您想要的。
- 使用 AWS WAF 来限制对一组 IP 的访问似乎是可行的方法。
- 使用 Cloudfront,您还可以提供私有内容。桶不必是 public。
Allow access to an Amazon S3 bucket only from a CloudFront distribution
使用这种方法,您不需要针对 IP 地址限制的单独存储桶策略
我想将网站部署到 S3 存储桶并使用静态网站托管。但是,我有一些严格的安全限制:
- 必须使用 HTTPS
- 对网站的访问必须限制在特定的 IP 范围内
这是我的计划:
- 使用AWS WAF限制可以访问网站的IP
- 使用 CloudFront 来利用 HTTPS
- 格式化 CloudFront 分配以转发一个自定义 header,它将充当 S3 的访问密钥
- 将 S3 存储桶安全策略限制为仅允许包含来自上述 CloudFront 的自定义 header 的流量。
这是一张图表:
不过我有一个大问题:在 CloudFront 之间转发自定义 header 真的 是最好的方法吗? AWS 文档说源访问身份不能用于充当网站的 S3 存储桶 (https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html)。自定义 header 似乎不如 Origin Access Identity 安全,而且更难维护。使用随机字符串作为防止某人绕过我的 CloudFront 分配并直接访问 S3 存储桶的唯一安全措施让我感到不舒服。如果恶意方猜测
我在这里的另一个选择是硬着头皮转移到服务器,在那里我可以更好地控制很多安全性,但我想利用 S3 网站的便利性。
您不能在 S3 上使用任何自定义 header,仅允许某些 header,例如:Referer、User-Agent 等。 最好的方法是将 OAI 与 S3 Rest API 端点而不是网站端点一起使用。
但是,您可以为网站端点选择替代方法: 1. 允许 CloudFront IP 范围访问 S3 存储桶。
http://d7uri8nf7uskq.cloudfront.net/tools/list-cloudfront-ips
和 2. 在 CloudFront 源配置中添加源客户 header 例如 "Referer: some random value" 并创建存储桶策略以允许 Referer header.
中的特定值您应该从 S3 存储桶中删除网站配置并使用 Origin Access Identity。您的其余设置没问题。
您不需要将 S3 存储桶配置为网站端点,因为您不会直接通过 S3 提供您的内容。使用 Origin Access Identity,您的存储桶将只能从 CloudFront 获得(除非您在存储桶策略中添加其他内容),这就是您想要的。
- 使用 AWS WAF 来限制对一组 IP 的访问似乎是可行的方法。
- 使用 Cloudfront,您还可以提供私有内容。桶不必是 public。 Allow access to an Amazon S3 bucket only from a CloudFront distribution 使用这种方法,您不需要针对 IP 地址限制的单独存储桶策略