使用客户端 JA3 指纹和 HTTP 标头顺序增强您的安全态势并减少误报

作者: 拉姆·乔兰 |

信息安全从业人员使用基于互联网协议 (IP) 地址的安全控制措施,例如屏蔽列表和基于速率的规则来阻止恶意流量。但是,仅基于 IP 地址阻止恶意流量可能会无意中封锁合法用户,从而导致误报。这是因为许多用户共享网络地址转换 (NAT) 或运营商级 NAT (CGNAT) 背后的 IP 地址。为了解决这个问题,我们可以通过分析技术收集补充的客户数据,并用它来完善安全控制。以这个比喻为例:我们可以通过整合其他属性(例如人的身高和眼睛颜色)来提高识别准确性,而不是仅凭姓名来识别一个人。

在这篇文章中,我们将讨论如何通过使用两项亚马逊云科技服务的功能来改善安全状况并减少误报:Amazon WAF,可帮助您防范常见的网络漏洞,以及提高应用程序性能和安全的全球分布式内容分发网络 (CDN) 服务 Amazon CloudFront。具体而言,我们将讨论如何在 Amazon WAF 规则中使用最终用户的 JA3 指纹和 HTTP 标头顺序数据来增强您的安全状态。有关在 Amazon WAF 中管理误报的详细指南,请参阅在 Amazon WAF 中管理误报。

JA3 指纹和标题顺序简介

JA3 指纹和标题订单提供粒度级数据,使您可以识别和分析客户并完善安全控制。

JA3 指纹是一个 32 个字符的哈希值,源自传入请求的 TLS 客户端 Hello。该指纹用作客户端 TLS 配置的唯一标识符。示例 JA3 指纹:18ad6e1a77c00d96229ccb62a794860d

标头顺序源自客户端的 HTTP 请求。它是客户端发送以冒号分隔的请求标头的保留顺序。标头顺序示例:主机:sec-ch-ua: sec-ch-ua-mobile: user-agent: sec-ch-ua-platform: accept: sec-fetch-site: sec-fetch-mode: sec-fetch-dest: referer: accept-encoding: accept-language: cookie

使用 JA3 指纹和标题顺序的常见用例

让我们来看看使用JA3指纹和标题顺序可能有益的三个常见用例。为了说明用例,让我们设想一个经营电子商务业务的场景。

用例 1:使用 Amazon WAF 日志进行安全和欺诈调查

您的团队观察到,您的电子商务应用程序的统一登录资源标识符 (URI) 正面临大量意外客户流量。要调查客户流量,您可以利用 Amazon WAF 日志。

要访问 Amazon WAF 日志,需要启用日志记录并将其发送到日志目标,例如 CloudWatch Logs 日志组。要将Amazon WAF日志配置为发送到CloudWatch Logs日志组,请按照在亚马逊CloudWatch Logs中分析Amazon WAF日志的 “设置” 部分中概述的八个步骤进行操作。Amazon WAF 控制台中的 CloudWatch Log Insights 选项卡使您可以轻松分析您的 Amazon WAF 日志。借助 CloudWatch Log Insights,您可以实时搜索、分析和可视化您的日志,以解决问题并确定趋势。

运行图 1 所示的查询使您能够分析登录 URI 的客户端流量。尽管客户端流量是从多个 IP 地址发送的,但它们都共享相同的 JA3 指纹。这可能表示来自单个客户端设备的自动账户接管 (ATO) 攻击,该攻击将请求分散到多个 IP 地址以逃避检测。掌握这些精细的细节可以指导你采取适当的对策来缓解这种攻击。

AWS CloudWatch Log Insights 查询显示了使用相同 ja3Fingerpintern 的多个登录请求

图 1:登录 URI 的客户端流量

利用 Amazon WAF 欺诈控制账户防范 (ATP) 功能来监控和自动缓解账户盗用攻击,可以成为抵御这种威胁的有效预防措施。

  • 在上述调查中,该查询用于查找客户登录请求的 URI 的 JA3 指纹

field s @timestamp、httpRequest.URI、httpRequest.clientIP、httpRequest.Country、ja3Fingerprint

| 过滤 httpRequest.URI == “/login”

| 将 @message '{“名称”: “用户代理”, “值”:” *”}' 解析为 UserAgent

| 限制 25

通过精心设计的查询对数据进行精确切片和分割可以提高调查效率,并使您能够发现关键见解。以下是一些示例查询,可用于使用 Amazon WAF 日志进行调查。

  • 查询以查找排名靠前的 JA3 指纹

字段 @timestamp

| ja3Fingerprint 的 requestCount 统计数 (*)

| 限制 25

  • 查询以查找来自特定 JA3 指纹的客户端请求

字段 @timestamp、httpRequest.URI、action、httpRequest.clientIP、TerminatingRuleID、labels.0.name、labels.1.name、labels.1.name、labels.2.name、labels.2.name、labels.3.name

| 过滤器 ja3fingerprint = “在此处输入-ja3 指纹”

| 将 @message '{“名称”: “用户代理”, “值”:” *”}' 解析为 UserAgent

| 限制 25

  • 查询以查找被特定 WAF 规则阻止的请求

字段 @timestamp、httpRequest.URI、action、httpRequest.clientIP、ja3Fingerprint、TerminatingRuleID、labels.0.name、labels.1.name、labels.2.name、labels.3.name

| 筛选动作 == “屏蔽”

| 过滤器 terminatingRuleID == “亚马逊云科技-AWSManagedrulessqliRuleSet”

| 将 @message '{“名称”: “用户代理”, “值”:” *”}' 解析为 UserAgent

| 限制 25

用例 2:使用 Amazon WAF 实施精细的阻止列表

可以使用 JA3 指纹细化在 Amazon WAF 中实施的屏蔽列表规则。您可以在 Amazon WAF 中使用 JA3 指纹匹配语句来实施规则。以下是在 WAF 中使用 JA3 指纹规则来阻止已知恶意 IP 地址的示例。

在分析应用程序的 WAF 日志时,您会注意到一个特定的 IP 地址经常以您的应用程序为目标进行恶意 SQL 注入和跨站脚本攻击。此 IP 地址属于采用 NAT 的领先电信服务提供商。由于您还有合法用户与恶意客户端共享相同的 IP 地址,因此您无法完全封锁此 IP 地址。

在这种情况下,您可以将 JA3 Fingerprint 纳入您的屏蔽列表规则,以有选择地阻止恶意客户端。您可以使用 Amazon WAF 日志识别 JA3 指纹并配置屏蔽列表规则,如下图 2 所示。这可以让你准确地阻止恶意请求,同时降低误报的可能性。

使用 IP 地址和 JA3 指纹组合阻止流量的 AWS WAF 自定义规则

图 2:使用两个参数的 Amazon WAF 定制区块规则

用例 3:使用 CloudFront 查看器标头和基于 Amazon WAF 速率的规则减少不必要的爬虫程序流量

有害机器人会积极从您的应用程序中窃取定价和内容,从而导致成本和性能问题增加。您已经实施了 Amazon WAF 的默认基于速率的规则,当请求超过配置的阈值时会阻止请求。但是,您会收到合法客户的投诉,说他们被封锁了。进一步的分析表明,一些被封锁的IP地址由有害的机器人和合法客户端共享。

默认情况下,Amazon WAF 基于速率的规则仅使用客户端 IP 地址来限制请求的速率。但是,您可以选择使用其他聚合密钥,例如 HTTP 标头、Cookie 或查询参数。

为了解决合法客户端被封锁的问题,您可以整合来自 CloudFront 查看器标头的 JA3 指纹和标头顺序数据,以增强基于速率的规则。JA3 指纹值在 Cloudfront-Viewer-JA3-指纹标头中提供,标头顺序值在 Cloudfront-Viewer-Header-Order 标头中提供。通过使用两个 CloudFront 查看器标头作为请求聚合密钥,您可以实施基于速率的精确规则,以阻止恶意流量模式,同时最大限度地减少对合法用户的影响。

探索用例 3 解决方案背后的架构

下一节深入探讨了该解决方案,还提供了实施和测试该解决方案的步骤。

架构图显示了经 AWS WAF 检查的 Amazon CloudFront 查看器标头

图 3:架构图

该解决方案的工作流程如下:

  1. 客户端访问您的应用程序并请求一个或多个对象。DNS 将请求路由到最能满足请求的 CloudFront 边缘站点。
  1. CloudFront 会检查其缓存中是否有请求的内容。如果内容在缓存中,CloudFront 会将其返回给用户。否则,CloudFront 使用原始请求策略添加 Cloudfront-Viewer-JA3-Fingerprint 和 Cloudfront-Viewer-Header-Header-order 订单标头,并将请求转发给 Amazon WAF。
  1. Amazon WAF 根据配置的网络访问控制列表 (ACL) 规则检查传入的请求标头。它可以检查 Cloudfront-Viewer-JA3 指纹和 Cloudfront-Viewer-Header-Header-order 标头以及其他请求参数。然后,它将请求转发给 Origin。它还将日志发送到 Amazon CloudWatch Logs 日志组。
  1. Amazon CloudWatch 可用于实时搜索、分析和可视化您的日志

该解决方案可以使用 Amazon WAF 来实现,Amazon WAF 与支持的区域服务(如亚马逊 API Gateway 和应用程序负载均衡器)相关。此解决方案不适用于与 CloudFront 关联的 Amazon WAF,因为这里的 WAF 检查是在添加 CloudFront 查看器标头之前进行的。

实施和测试用例 3 解决方案的步骤

第 1 步:部署 CloudFormation 模板

这将部署解决方案所需的服务和相关资源。它包括以下内容:

  • 用作来源的亚马逊 API Gateway 终端节点。
  • 一个 CloudWatch Logs 日志组。
  • 与 Amazon API Gateway 关联的 Amazon WAF 网络 ACL。WAF 已启用日志记录功能,可以使用配置的 CloudWatch 日志组作为目标。
  • 使用已配置的 Amazon API Gateway 作为源的 CloudFront 分配。

a) 单击 “启动堆栈” 按钮,在您的账户中启动 CloudFormation 堆栈

注意:堆栈在美国东北弗吉尼亚地区 (us-east-1) 启动。要将解决方案部署到其他区域,请下载解决方案的 CloudFormation 模板,提供所需的参数,然后将其部署到所选区域。

b) 在 “指定堆栈详细信息” 页面上,更新以下内容并部署模板:

    • 堆栈名称:ja3headerOrderStack
    • 日志组前缀:ja3headerOrderlog

堆栈将在大约 10 分钟内部署。完成后,“输出” 选项卡将列出以下资源,如图 4 所示。

部署堆栈后,CloudFormation 输出选项卡提供指向关键资源的链接

图 4:CloudFormation 的输出选项卡

第 2 步:查看 Amazon WAF 规则

部署的 Amazon WAF 的 WebACL 有一条名为 “Cloudfront_Viewer_rate_Based_Rule” 的规则。可以使用 CloudFormation 堆栈的 “输出” 选项卡中提供的链接访问 WebACL。WebACL 中配置的规则使用四个请求聚合密钥,分别是 Cloudfront-Viewer-Header-Order、Cloudfront-Viewer-JA3-Fingerpintern、URI 和 IP 地址。速率限制阈值设置为 100。这意味着,当具有相同的 Cloudfront-Viewer-Header-Header-Order、Cloudfront-Viewer-JA3 指纹、URI 和 IP 地址的请求在五分钟内超过阈值 100 时,它们将被阻止。

要使用此基于速率的规则为您的应用程序提供优秀保护,必须确定要实施的正确速率限制阈值。确保设置此阈值以避免阻塞合法流量。您可以通过 “计数” 规则操作尝试不同的速率限制阈值,以确定相应的值。您也可以考虑使用质询规则操作来代替屏蔽规则操作。使用挑战规则操作需要额外付费。

第 3 步:测试实现

要测试配置的基于费率的 Amazon WAF 规则,您可以使用命令行工具,在五分钟内生成数百个客户请求。

您可以使用如下所示的 CURL 命令发送 300 个请求。你必须用你的 CloudFront 域名替换 CloudFront 域名。你可以在第二个 CloudFormation 堆栈的输出选项卡中找到你的 CloudFront 域名

因为我在 {1.. 300};做 curl-I-X 获取 “https://yourcloudfrontdomainname.cloudfront.net/prod/pets/1”;完成

几分钟后,在您执行命令后,基于速率的规则开始阻止命令行工具的测试流量。在 WAF 阻止来自命令行工具的流量时,你可以尝试从浏览器访问相同的 URI。您发现浏览器的请求已获得 WAF 的允许。这种选择性屏蔽归因于浏览器的 JA3 指纹和标题顺序值与命令行工具不同,这导致浏览器流量被允许。

您可以在 Amazon WAF 的 “CloudWatch 日志洞察” 标签中使用以下查询来分析来自 CloudFront 查看器标头的 JA3 指纹和标头订单数据。

字段 @timestamp、httpRequest.URI、action、httpRequest.clientIP、TerminatingRuleID

| 将 @message '{“名称”:” Cloudfront-viewer-ja3-指纹”,“值”:” *”} '解析为 ja3fingerpintern

| 将 @message '{“名称”:“Cloudfront-viewer-Header-order”,“value”:” *”} '解析为标题顺序

| 限制 25

结论

JA3 指纹和标头订单数据提供有关客户的精细数据,使您能够进行深入的安全和欺诈分析。它还使您能够实施更有效的 Amazon WAF 基于费率的规则、阻止列表和允许列表。这可以帮助阻止您的应用程序免受恶意流量,同时允许访问合法客户端,从而改善您的安全状况。立即开始在您的 Amazon WAF 配置中利用 JA3 指纹和标头订单数据,以更好地保护您的应用程序,同时保持合法用户的无缝访问。

如果你对这篇文章有反馈,请在下面的评论部分提交评论。如果您对这篇文章有疑问,请联系 Amazon Support。


作者简介

Ram Cholan 是总部位于新加坡的亚马逊云科技边缘服务解决方案架构师,他支持客户优化应用程序性能并改善安全状况。Ram 在信息安全、网络工程和托管服务领域拥有超过 15 年的经验,带来了深厚的技术专业知识,使客户能够解决其业务挑战。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。