概览

源隐藏是一组旨在缩小 Web 应用程序攻击面的技术。最佳做法是使用 CloudFront 作为 Web 应用程序的单一入口点,在该应用程序中应用安全控制,例如防御 DDoS 攻击和不良机器人的保护措施。源隐藏可阻止恶意行为者绕过 CloudFront 及其安全控制措施直接攻击来源,使用防火墙规则阻挡任何非来自 CloudFront 入口点的流量。可以在 OSI 模型的多个层上实现源隐藏。

在应用层

网络层上的源隐藏可保护您的源免受所有直接针对它的攻击。但是,攻击者可以使用您发现的源域名配置 CloudFront 发行版,并通过其 CloudFront 发行版对您的源进行应用程序层攻击,从而有效地绕过您在自己的 CloudFront 发行版上配置的安全控制措施。

除了混淆你的源域名(例如,避免使用 origin.example.com!),您可以在 CloudFront 和您的源之间添加应用程序层访问控制,以降低上述风险。根据源类型和安全要求,这可通过不同的方式实现。

基于签名请求的访问控制

OAC 是 CloudFront 的功能,它允许您使用基于 IAM 策略AWS 签名版本 4 算法(sigv4)在本地签署对特定类型源的请求。目前,OAC 与 S3MediaStoreMediaPackageLambda 函数 URLS3 对象 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 之间的流量将在私有托管网络上传输,无法通过互联网访问。

此页内容对您是否有帮助?