源隐藏
概览
源隐藏是一组旨在缩小 Web 应用程序攻击面的技术。最佳做法是使用 CloudFront 作为 Web 应用程序的单一入口点,在该应用程序中应用安全控制,例如防御 DDoS 攻击和不良机器人的保护措施。源隐藏可阻止恶意行为者绕过 CloudFront 及其安全控制措施直接攻击来源,使用防火墙规则阻挡任何非来自 CloudFront 入口点的流量。可以在 OSI 模型的多个层上实现源隐藏。
在应用层
网络层上的源隐藏可保护您的源免受所有直接针对它的攻击。但是,攻击者可以使用您发现的源域名配置 CloudFront 发行版,并通过其 CloudFront 发行版对您的源进行应用程序层攻击,从而有效地绕过您在自己的 CloudFront 发行版上配置的安全控制措施。
除了混淆你的源域名(例如,避免使用 origin.example.com!),您可以在 CloudFront 和您的源之间添加应用程序层访问控制,以降低上述风险。根据源类型和安全要求,这可通过不同的方式实现。
基于签名请求的访问控制
OAC 是 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]
在所有情况下,tt 都建议定期轮换此共享密钥,以降低泄露密钥的风险。在上面分享的示例实现中,带有 API 网关和 ALB 的实现都包含自动密钥轮换功能。
在网络层
CloudFront 使用服务字段的 CLOUDFRONT_ORIGIN_FACING 值发布用于与您的源建立 TCP 连接的 IP 地址。您可以在源的防火墙上实现 ACL,以阻挡非源自 CloudFront 面向源 IP 的流量。使用这种方法,您需要订阅 IP 更改才能更新 ACL。查看这篇博客文章,了解如何使用第三方防火墙在本地网络服务器上实现源隐藏。
如果您的源托管在 Amazon VPC 中,则只需将 Amazon CloudFront 的 AWS 托管前缀列表添加到连接到您的源(EC2、NLB、ALB 等...)的安全组中即可实现源隐藏。
在这两种情况下,都建议通过 TLS 在 CloudFront 和您的源之间建立安全连接。
在物理层
如果您的源位于您的本地,请考虑使用 Direct Connect 连接上的公共虚拟接口在您的本地基础设施和 AWS 之间设置 AWS Direct Connect。这样,您的源和 CloudFront 之间的流量将在私有托管网络上传输,无法通过互联网访问。