源隐藏
概览
源隐藏是一组旨在缩小 Web 应用程序攻击面的技术。最佳做法是使用 CloudFront 作为 Web 应用程序的单一入口点,在该应用程序中应用安全控制,例如防御 DDoS 攻击和不良机器人的保护措施。源隐藏可阻止恶意行为者绕过 CloudFront 及其安全控制措施直接攻击来源,使用防火墙规则阻挡任何非来自 CloudFront 入口点的流量。可以在 OSI 模型的多个层上实现源隐藏。
在网络层
当您的源允许您控制入站网络访问时,请添加限制,仅允许来自 CloudFront 网络的流量。
如果您的源是 EC2 实例、应用程序负载均衡器或网络负载均衡器,则可以将您的源保留在 VPC 的私有子网中,并利用 CloudFront 的 VPC Origins 功能。它允许您将访问权限仅限制为您自己的 AWS 账户中使用 VPC Origins 配置的 CloudFront 分配。

如果必须将此类资源留在公有子网中(例如,多个 CDN 将访问您的 ALB),或者您的源类型不受 CloudFront 的 VPC Origins 支持,则可以使用安全组限制对 CloudFront 的访问。您需要将您的源与安全组关联,然后向该安全组添加 AWS 管理的 Amazon CloudFront 前缀列表。
如果您的源站位于您的本地,则可以通过允许列出 CloudFront 的源 IP 地址来限制对 CloudFront 的访问,当您根据服务字段的 CLOUDFRONT_ORIGIN_FACING 值进行筛选时,可以在该 IP 列表中找到该地址。使用这种方法,您需要订阅 IP 更改才能更新 ACL。查看这篇博客文章,了解如何使用第三方防火墙在本地网络服务器上实现源隐藏。为了进一步与互联网隔离,请考虑使用 Direct Connect 连接上的公共虚拟接口在您的本地基础设施和 AWS 之间设置 AWS Direct Connect。
网络层的访问控制是一个起点,但对您来说可能还不够。例如,如果有人在您的本地发现了原始域名,他们可以在自己的 AWS 账户中创建 CloudFront 分配并绕过您自己的分配。另一个例子是,当您使用 VPC Origins 功能时,您可能希望将您的源限制为您的 AWS 账户中的特定 CloudFront 分配,而在您的 AWS 账户中配置了 VPC Origins 的所有 CloudFront 分配均可访问该分配。在这种情况下,可以考虑使用应用层访问控制进行强化。
在应用层
源访问控制
使用源访问控制(OAC)可以非常简单地将某些类型的源锁定到 CloudFront,这是 CloudFront 的一项功能,它使用基于 IAM 策略的 AWS 签名版本 4 算法(sigv4)在本地签署对某些类型源的请求。目前,OAC 与 S3、MediaStore、MediaPackage、Lambda 函数 URL 和 S3 对象 Lambda 兼容。当 OAC 与 S3 一起使用时,您可以保持 S3 存储桶的私密性,并根据 S3 存储桶策略排他地访问 CloudFront。
当 OAC 不支持源类型时,您可以使用边缘函数签署对源的请求。下列博客中解释了示例实现:
基于访问控制的共享密钥
如果您的源不支持请求签名,或者您认为您的应用程序不需要这种级别的访问控制,则可以将 CloudFront 配置为向您的源发送包含共享密钥的自定义标头,您的源可以验证该标头以处理请求。考虑以下示例实现:
- 基于 ALB 的源。如果您的 ALB 已经与 AWS WAF WebACL 关联,则可以使用 ALB 规则或使用 AWS WAF 规则在基于 ALB 的源上验证密钥标头。
- 基于 API 网关的源。您可以使用 API 密钥在 API 网关上验证密钥标头。
- 基于 NGINX 的源。假设 CloudFront 发送了一个值为 abc123 的自定义标头 X-CloudFront,您可以通过在 /etc/nginx/nginx.conf Nginx 配置文件的服务器标签中添加以下代码来验证基于 Nginx 的 Web 服务器(基于云端或基于本地)上的密钥标头:
if ($http_x_cloudfront != "abc123") {
return 403;
} - 基于 Apache 的源。假设 CloudFront 发送了一个值为 abc123 的自定义标头 X-CloudFront,您可以通过在 httpd.conf 配置文件(和 ssl.conf 文件,若使用)中添加以下代码来验证基于 Apache 的 Web 服务器(基于云端或基于本地)上的密钥标头:
RewriteEngine On
RewriteCond %{HTTP:x-cloudfront} !^abc123$ [NC]
RewriteRule ^ - [F]
在所有情况下,都建议定期轮换此共享密钥,以降低泄露密钥的风险。在上面分享的示例实现中,带有 API 网关和 ALB 的实现都包含自动密钥轮换功能。