为 传统负载均衡器 配置异步缓解模式 - Elastic Load Balancing
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

为 传统负载均衡器 配置异步缓解模式

异步缓解模式可以保护您的应用程序不受由于 HTTP 异步造成的问题的影响。负载均衡器根据每个请求的威胁级别对请求进行分类,允许安全请求,然后根据您指定的缓解模式来减轻风险。异步缓解模式包括“监控”、“防御”和“最严格”。默认情况下采用“防御”模式,该模式可在保持应用程序可用性的同时,针对 HTTP 异步提供持久的缓解作用。您可以切换到最严格模式,确保应用程序只接收符合 RFC 7230 标准的请求。

http_desync_guardian 库会分析 HTTP 请求,防止发生 HTTP 异步攻击。有关更多信息,请参阅 github 上的 HTTP 异步监护

分类

下面列出了这些分类。

  • 合规 — 请求符合 RFC 7230 标准,不构成已知的安全威胁。

  • 可接受 — 请求不符合 RFC 7230 标准,但不构成已知的安全威胁。

  • 不明确 — 请求不符合 RFC 7230 标准,会带来风险,因为各个 Web 服务器和代理可能会以不同的方式处理该请求。

  • 严重 — 请求会带来很高的安全风险。负载均衡器会阻止请求,向客户端提供 400 响应,并关闭客户端连接。

下面的列表描述了每个分类的问题。

可接受

  • 标头包含非 ASCII 字符或控制字符。

  • 请求版本包含错误的值。

  • 对于 GET 或 HEAD 请求,有一个值为 0 的 Content-Length 标头。

  • 请求 URI 包含一个未采用 URL 编码的空格。

不明确

  • 请求 URI 包含控制字符。

  • 请求同时包含 Transfer-Encoding 标头和 Content-Length 标头。

  • 存在多个具有相同值的 Content-Length 标头。

  • 标头是空的,或者有一行中只包含空格。

  • 有一个标头可以使用常见的文本规范化技术标准化为 Transfer-Encoding 或 Content-Length。

  • 没有为 GET 或 HEAD 请求定义 Content-Length 标头。

  • 没有为 GET 或 HEAD 请求定义 Transfer-Encoding 标头。

严重

  • 请求 URI 包含 Null 字符或回车符。

  • Content-Length 标头包含一个无法解析或不是有效数字的值。

  • 标头包含 Null 字符或回车符。

  • Transfer-Encoding 标头包含错误的值。

  • 请求方法格式不正确。

  • 请求版本格式不正确。

  • 存在多个具有不同值的 Content-Length 标头。

  • 存在多个 Transfer-Encoding: chunked 标头。

如果请求不符合 RFC 7230 标准,负载均衡器将递增 DesyncMitigationMode_NonCompliant_Request_Count 指标。有关更多信息,请参阅传统负载均衡器 指标

Modes

下表描述 Classic Load Balancer 如何根据模式和分类来处理请求。

分类。 监控模式 防御模式 最严格模式
合规 已允许 已允许 已允许
可接受 已允许 已允许 阻止
不明确 已允许 允许¹ 阻止
严重 已允许 阻止 阻止

¹ 系统将路由请求,但关闭客户端和目标连接。

修改异步缓解模式

使用控制台更新异步缓解模式

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格上的 LOAD BALANCING 下,选择 Load Balancers

  3. 选择负载均衡器。

  4. 描述选项卡上,选择配置异步缓解模式

  5. 配置异步缓解模式页上,选择监控防御最严格

  6. 选择 Save

使用 AWS CLI 更新异步缓解模式

使用 modify-load-balancer-attributes 命令,并将 elb.http.desyncmitigationmode 属性设置为 monitordefensivestrictest

aws elb modify-load-balancer-attributes --load-balancer-name my-load-balancer --load-balancer-attributes file://attribute.json

下面是 attribute.json 的内容。

{ "AdditionalAttributes": [ { "Key": "elb.http.desyncmitigationmode", "Value": "strictest" } ] }