在AWS服务中全面实施HTTP严格传输安全(HSTS)策略

本文详细介绍了如何在亚马逊API网关、应用程序负载均衡器和Amazon CloudFront等核心AWS服务中配置HTTP严格传输安全(HSTS)策略,以统一应对分布式架构中的安全挑战,防止协议降级攻击和中间人攻击,确保始终通过HTTPS进行通信。

在AWS服务中实施HTTP严格传输安全(HSTS)

在现代网络应用中,统一的安全策略至关重要。HTTP严格传输安全(HSTS)是一种Web安全策略机制,能强制浏览器仅通过HTTPS与服务器通信,有效防御协议降级和Cookie劫持攻击。然而,在AWS的分布式架构中,不同服务对HSTS的配置方法各异,导致安全态势不一致,给统一实施带来了挑战。

本文将提供一套跨AWS核心服务的HSTS综合实施方案,涵盖:

  • Amazon API Gateway: 为REST和HTTP API实现集中式HSTS头部管理。
  • 应用程序负载均衡器: 在基础设施层面为Web应用强制执行HSTS。
  • Amazon CloudFront: 通过边缘网络为全球内容交付安全头部。

通过遵循本文的步骤,您可以建立一个统一的HSTS策略,这不仅符合AWS完善架构框架的安全原则,还能保持最佳的应用性能。

理解HSTS安全性与优势

HSTS通过Strict-Transport-Security响应头声明策略。一旦浏览器接收到此策略,就会在后续访问中自动将HTTP请求转换为HTTPS,这种执行发生在浏览器层面,提供了第一道防线。

仅靠服务器端的HTTP到HTTPS重定向,在初次请求时仍存在安全缺口(例如SSL剥离攻击)。HSTS通过在浏览器层面执行,消除了这一初始HTTP请求的机会,构成了深度防御的关键一环。

其主要安全益处包括:

  • 防止协议降级攻击: 在浏览器建立HSTS策略后。
  • 缓解中间人攻击: 阻止未授权方拦截通信。
  • 防止未授权会话访问: 保护凭证免遭窃取。

HSTS实施的关键用例

HSTS能保护HTTP重定向无法覆盖的场景:

  • 混合内容服务: 防止浏览器向任何声明了HSTS的子域名发起初始HTTP请求。
  • 单点登录(SSO)流程: 确保在身份提供商和应用之间的多次重定向中,认证令牌和会话数据全程加密。
  • 微服务架构: 保护API端点,防止客户端初始连接时的协议降级。
  • CloudFront多源服务器场景: 即使在源站故障切换时,也防止浏览器回退到HTTP。

从AWS完善架构视角看,实施HSTS体现了深度防御原则,在应用协议层面增加了额外的安全层。

在Amazon API Gateway中实施HSTS

Amazon API Gateway没有内置的HSTS启用功能,需要根据API类型进行配置。

针对HTTP API

可以通过响应参数映射来设置HSTS头部:

  1. 在AWS API Gateway控制台中,导航到目标HTTP API的路由配置。
  2. 在"管理集成"标签页下访问路由的集成设置。
  3. 在"参数映射"部分:
    • 响应键: 输入 200
    • 修改类型: 选择 Append
    • 要修改的参数: 输入 header.Strict-Transport-Security
    • : 输入 max-age=31536000; includeSubDomains; preload

针对REST API

REST API通过代理或非代理集成模式提供更精细的控制。

  • 代理集成: 后端服务(如AWS Lambda)需在其响应中返回HSTS头部。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    import json
    def lambda_handler(event, context):
        return {
            'statusCode': 200,
            'headers': {
                'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload'
            },
            'body': json.dumps('Secure response with HSTS headers')
        }
    
  • 非代理集成: HSTS头部必须由REST API返回,可通过两种方法实现:

    1. 映射模板方法: 在"集成响应"标签页下,使用Velocity模板语言(VTL)配置映射模板来动态设置响应头部。
    2. 方法响应方法: 这是一种声明式配置。在"方法响应"标签页下添加HSTS头 strict-transport-security,然后在"集成响应"标签页的"头部映射"中,为该头部设置映射值为 max-age=31536000; includeSubDomains; preload

测试与验证

使用curl命令验证HSTS头部是否已正确添加:

1
curl -i https://your-api-gateway-url.execute-api.region.amazonaws.com/stage/resource

预期响应中应包含 strict-transport-security: max-age=31536000; includeSubDomains; preload

在AWS应用程序负载均衡器中实施HSTS

应用程序负载均衡器现在内置了对HTTP响应头部修改(包括HSTS头部)的支持,允许您从一个集中点强制执行一致的安全策略。

先决条件与基础设施要求

  • 功能正常的HTTPS监听器。
  • 在AWS Certificate Manager中配置有效的TLS证书链。
  • 为监听器启用头部修改功能(该功能默认关闭)。

配置步骤

  1. 打开Amazon EC2控制台,导航到负载均衡器。
  2. 选择您的应用程序负载均衡器。
  3. 在"监听器和规则"标签页,选择HTTPS监听器。
  4. 在"属性"标签页,选择"编辑"。
  5. 展开"添加响应头部"部分。
  6. 选择"添加HTTP严格传输安全(HSTS)头部"。
  7. 配置头部值:输入 max-age=31536000; includeSubDomains; preload
  8. 选择"保存更改"。

头部修改行为

  • 头部添加: 如果后端响应未包含指定头部,ALB会添加它。
  • 头部覆盖: 如果后端响应包含该头部,ALB会用配置的值替换现有值。
  • 集中控制: 确保一致的策略执行。

测试与验证

使用curl命令测试:

1
curl -I https://my-loadbalancer-1234567890.us-west-2.elb.amazonaws.com

预期响应中应包含 strict-transport-security: max-age=31536000; includeSubDomains; preload

在Amazon CloudFront中实施HSTS

Amazon CloudFront通过响应头部策略内置了对HTTP安全头部(包括HSTS)的支持,可在CDN边缘实现集中化的安全头部管理。

响应头部策略配置

  1. 在CloudFront控制台,导航到"策略" -> “响应头部”。
  2. 选择"创建响应头部策略"。
  3. 配置策略设置:
    • 名称: 例如 HSTS-Security-Policy
    • 描述: 例如 HSTS and security headers for web applications
  4. 在"安全头部"下配置:
    • 严格传输安全: 选择
    • 最长使用期限31536000 秒(1年)
    • 预加载: 选择(可选)
    • 包含子域: 选择(可选)
  5. 添加其他安全头部(如 X-Content-Type-Options, X-Frame-Options, Referrer-Policy, X-XSS-Protection)。
  6. 选择"创建"。

将策略附加到分配

  1. 导航到您的CloudFront分配。
  2. 选择"行为"标签页。
  3. 编辑默认行为(或创建新行为)。
  4. 在"响应头部策略"下,选择您创建的策略。
  5. 选择"保存更改"。

头部覆盖行为

响应头部策略提供"源覆盖"功能来控制头部管理方式:

  • 启用源覆盖: CloudFront将替换源服务器返回的现有同名头部。
  • 禁用源覆盖: CloudFront仅在源响应中不包含同名头部时,才会添加策略定义的头部,从而保留源的原始头部。

测试与验证

使用curl命令验证:

1
curl -I https://your-cloudfront-domain.cloudfront.net

预期响应中应包含配置的多个安全头部,包括 strict-transport-security: max-age=31536000; includeSubDomains; preload

安全考虑与最佳实践

实施HSTS需要仔细考虑安全影响和操作要求。

  • max-age指令: 决定浏览器强制HTTPS访问的时长。

    • 300秒(5分钟): 初始测试阶段的安全实验值。
    • 86,400秒(1天): 开发环境的短期承诺。
    • 2,592,000秒(30天): 预发布环境的中期验证。
    • 31,536,000秒(1年): 生产环境的长期承诺。
    • 建议从较短的值开始,随着对HTTPS基础设施稳定性的信心增强而逐步增加。
  • includeSubDomains指令: 将HSTS执行扩展到所有子域。

    • 好处: 跨整个域层次结构的全面保护,防止基于子域的攻击,简化安全管理。
    • 要求: 所有子域必须支持HTTPS并拥有有效的SSL证书,且需在整个域层次结构中保持一致的安全策略。
  • preload指令: 考虑实施HSTS预加载以获得最大安全覆盖。

    • 好处: 保护首次访问者,在发起网络请求前进行浏览器级执行。
    • 注意事项: 需要提交到浏览器预加载列表,逆转(移除)非常困难且耗时数月,需要对HTTPS基础设施做出长期承诺。

结论

跨AWS服务实施HSTS为保护Web应用免受协议降级攻击和确保通信加密奠定了坚实基础。通过利用API Gateway、CloudFront和应用程序负载均衡器的内置功能,组织可以创建全面的安全策略,这些策略符合AWS完善架构框架的原则,并与其他AWS安全服务和功能互补,构建起强大的深度防御体系。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计