Cloudflare如何检测坏僵尸程序

2020-05-08 01:30:25

构建Cloudflare机器人管理平台是一种令人振奋的体验。它融合了分布式系统、网络开发、机器学习、安全和研究(以及介于两者之间的所有学科),同时还能对抗不断适应和积极进取的对手。

这是Cloudflare正在进行的Bot管理的故事,也是关于支持它的检测机制的一系列博客文章的介绍。我将从Bot管理领域的几个定义开始,然后介绍产品和技术需求,从而概述我们构建的平台。最后,我将分享有关支持我们平台的检测机制的详细信息。

机器人-网络上的一种自主程序,可以与计算机系统或用户交互,模仿或取代人类用户的行为,执行重复性任务的速度比人类用户快得多。

好的机器人--对与他们互动的企业有用的机器人,例如像Googlebot,Bingbot这样的搜索引擎机器人,或者像Facebook Bot这样在社交媒体平台上运行的机器人。

坏机器人-旨在执行恶意操作,最终伤害企业的机器人,如凭据填充机器人、第三方抓取机器人、垃圾邮件机器人和偷偷摸摸的机器人。

僵尸程序管理-阻止不需要或恶意的互联网僵尸通信,同时仍允许有用的僵尸程序访问Web属性,方法是检测僵尸程序活动,区分所需的和不需要的僵尸程序行为,并确定不需要的活动的来源。

WAF-基于一组安全规则监视和控制网络流量的安全系统。

CloudFlare从一开始就一直在阻止恶意机器人访问网站或滥用API,同时通过抵消机器人的碳成本来帮助气候变化。随着时间的推移,很明显,我们需要一个专门的平台,将不同的机器人对抗技术结合起来,并简化客户体验。在设计这个新平台时,我们试图满足以下关键要求。

完整而不复杂-客户只需单击一个按钮即可打开/关闭Bot管理,以保护他们的网站、移动应用程序或API。

值得信赖-客户想知道他们是否可以信任网站访问者是否就是他们所说的那个人,并为该信任级别提供确定性指标。

灵活性-客户应该能够定义流量僵尸管理缓解应该应用于哪个子集,例如,仅适用于登录URL、定价页面或站点范围。

准确-机器人管理检测应该有一个非常小的错误,例如,没有或很少的人类访问者应该被错误地识别为机器人。

可恢复-如果预测错误,人类访问者应该仍然能够访问网站,以及让好的机器人通过。

此外,新的Bot管理产品的目标是使其在以下用例中很好地工作:

除了上面的产品要求之外,我们工程师还列出了新的机器人管理平台的必备条件。最关键的是:

可伸缩性-平台应该能够计算每个请求的分数,即使在每秒超过1000万个请求的情况下也是如此。

低延迟-检测必须以极快的速度执行,请求处理速度不会超过100微秒,并且不需要额外的硬件。

可配置性-应该可以配置对哪些流量应用哪些检测,包括每个域/数据中心/服务器级别。

可修改性-平台应易于扩展,具有更多的检测机制、不同的缓解操作、更丰富的分析和日志。

安全性-不应使用一个客户的敏感信息来构建保护另一个客户的模型。

可解释性&可调试性-我们应该能够以直观的方式解释和调整预测。

有了这些要求,早在2018年,我们的小工程师团队就开始设计和构建下一代Cloudflare机器人管理。

CloudFlare的运营规模巨大。在撰写本文时,这意味着涵盖26M+Internet属性,平均每秒处理1100万个请求(峰值超过14M),并检查来自不同协议级别的250多个请求属性。关键问题是如何利用这种“海量”数据的力量,以一种简单、可靠和可解释的方式保护我们所有的客户免受现代网络威胁?

BOT管理很难。有些机器人很难检测到,需要长时间查看多个维度的请求属性,有时单个请求属性可能会泄露它们。更多的信号可能会有所帮助,但它们是可以概括的吗?

当我们对流量进行分类时,客户应该决定如何处理它,还是我们可以代表客户做出决定?什么概念可以解决所有这些不确定性问题,并帮助我们实现上面的要求?

正如您从小节标题中可能已经猜到的那样,我们提出了可信分数或简单的分数的概念-一件事来统治它们-表明请求是来自人类(高分数)还是来自自动化程序(低分数)的可能性在0到100之间。

好的,假设我们能够为每个传入的HTTP/HTTPS请求分配这样的分数,我们或客户应该如何处理它呢?也许在日志中提供这样的分数就足够了。然后,客户可以在他们的一端进行分析,找到得分最低的最频繁的IP,然后使用Cloudflare防火墙拦截这些IP。虽然有用,但这样的过程将是手动的,容易出错,最重要的是不能实时完成以保护客户的互联网财产。

幸运的是,大约在我们开始开发这个系统的同时,我们防火墙团队的同事刚刚宣布了防火墙规则。受广为人知的Wireshark®语言的启发,这一新功能为客户提供了以灵活直观的方式控制请求的能力。防火墙规则支持各种请求字段,我们想-为什么不让分数成为这些字段之一呢?然后,客户可以编写细粒度规则来阻止非常特定的攻击类型。cf.bot_management.core字段就是这样诞生的。

Cloudflare Bot Management的核心功能是一键解决多个产品和技术要求-它简单、灵活、可配置,并根据客户的请求为客户提供有关机器人的遥测。客户可以调整防火墙规则中的得分阈值,具体取决于他们对误报/漏报的敏感度。此外,这个直观的分数允许我们在幕后扩展我们的检测能力,而无需客户调整任何配置。

那么,我们如何才能创造出这样的分数呢?它有多难呢?让我们在下一节中对其进行探讨。

是什么推动了机器人管理得分?简短的答案是一套微服务。在构建这个平台时,我们试图尽可能多地重用管道、数据库和组件,但是很多服务都必须从头开始构建。让我们来看一下整体架构(这个过于简化的版本包含与Bot管理相关的服务):

简而言之,我们的系统处理从边缘数据中心接收的数据,使用以下技术产生和存储BOT检测机制所需的数据:

在请求处理阶段,在Cloudflare边缘位置的每台机器上运行的Bot管理模块中,所有的Bot检测机制都会实时应用于每个请求。当请求传入时,我们提取并转换所需的请求属性,并将它们提供给我们的检测机制。Bot管理模块生成以下输出:

防火墙字段-Bot管理字段-cf.bot_management.core-一个整数,表示请求是否来自自动化程序(低分)到人工(高分)的可能性,介于0和100之间。-cf.bot_management.verify_bot-一个布尔值,指示此类请求是否来自Cloudflare白名单中的bot。-cf.bot_management.static_resource-指示请求是否与多种类型的静态资源的文件扩展名匹配的布尔值。

Cookie-最值得注意的是,它会生成cf_bm,这有助于管理符合与bot相关的标准的传入流量。

JS挑战-对于我们的一些检测和客户,我们将其注入到不可见的JavaScript挑战中,为我们提供更多用于bot检测的信号。

检测日志-我们通过我们的数据管道将每个应用的检测、使用的功能和标志的详细信息记录到ClickHouse,其中一些用于分析和客户日志,而其他用于调试和改进我们的模型。

一旦僵尸程序管理模块生成了必填字段,防火墙就会接管实际的僵尸程序缓解。

Cloudflare Firewall直观的仪表盘使用户能够通过轻松点击来构建强大的规则,并且还提供了Terraform集成。针对规则引擎检查每个对防火墙的请求。根据僵尸程序管理模块生成的分数和配置的阈值,可以根据用户的需要阻止、质询或记录可疑请求,同时将合法请求路由到目的地。

允许匹配请求免除由其他防火墙规则内容触发的质询和阻止操作。

质询(验证码)-用于确保访问站点的访问者是人工的,而不是自动的。

JS挑战-用于确保僵尸程序和垃圾邮件无法访问所请求的资源;但是,浏览器可以自由地自动满足挑战。

我们的防火墙分析工具由ClickHouse和GraphQL API提供支持,使客户能够使用直观的界面快速识别和调查安全威胁。除了分析之外,我们还使用LogPush API和/或LogPush提供所有机器人相关活动的详细日志,这为您提供了将日志放到云存储中的简单方法。

如果客户希望根据分数更灵活地处理请求,例如,他们可能想要注入新的或更改现有的HTML页面内容,或向机器人提供不正确的数据,或拖延某些请求,Cloudflare Workers提供了这样做的选项。例如,使用此小代码片段,我们可以将分数传回源服务器,以进行更高级的实时分析或缓解:

addEventListener(';FETCH';,Event=>;{event.respondWith(handleRequest(event.request))})异步函数HandleRequest(Request){Request=新请求(Request);request.headers.set(";CF-Bot-Score";,request.cf.bot_management.core)Return Fetch(Request);}。

现在,让我们看看如何使用多个检测机制生成单个分数。

Cloudflare僵尸管理平台目前使用五种互补的检测机制,生成它们自己的分数,我们将它们组合在一起,形成发往防火墙的单个分数。大多数检测机制都应用于每个请求,而有些检测机制是针对每个客户启用的,以更好地满足他们的需求。

轻松自注册-甚至在我们在活动模式下启用Bot管理之前,我们就能够知道它对特定客户的工作效果如何,包括提供有关Bot活动的历史趋势。

反馈循环-每个请求的评分以及所有功能的可用性对于我们检测机制的持续改进具有巨大的价值。

确保可伸缩性-如果我们可以计算每个请求和客户的得分,这意味着Cloudflare背后的每个互联网资产都是潜在的Bot Management客户。

全球机器人洞察-Cloudflare拥有2600多万个互联网资产,使我们能够了解并应对随着时间的推移在安全和威胁情报方面发生的结构性变化。

总体而言,Cloudflare可见的互联网流量的三分之一以上来自不良机器人,而机器人管理客户的不良机器人比率甚至更高,约为43%!

让我们按照与Cloudflare Bot Management集成的时间顺序深入研究特定的检测机制。

关于分数的大部分决定都是使用我们的机器学习模型做出的。早在2018年,这些也是第一批产生分数并向船上客户提供的检测机制。机器学习的成功应用需要高数量、多样性和高质量的数据,而得益于免费和付费客户,Cloudflare拥有这三者,从而使我们的所有客户能够持续学习和改进我们的模型。

机器学习检测机制的核心是CatBoost-一个用于决策树梯度增强的高性能开源库。之所以选择CatBoost,是因为该库具有出色的功能:

推理速度-在我们的情况下,应用我们的任何模型只需不到50微秒,从而确保请求处理保持极快的速度。

C和Rust API-我们边缘的大部分业务逻辑都是使用Lua编写的,更具体地说是LuaJIT,所以拥有一个兼容的FFI接口来应用模型是非常棒的。

对于每台机器上的每个请求,都有多个CatBoost模型以影子模式运行在Cloudflare的Edge上。其中一个模型在活动模式下运行,这会影响防火墙的最终得分。所有ML检测结果和功能都记录在ClickHouse中,以供进一步分析、模型改进、分析和面向客户的日志。我们将分类和数字特征都输入到我们的模型中,这些特征是从请求属性和使用这些属性构建的请求间特征中提取出来的,由Gagarin请求间特征平台计算和交付。

我们能够使用极其可靠和高性能的QuickSilver配置数据库在几秒钟内部署新的ML型号。可以使用相同的机制为特定客户配置哪个版本的ML模型应在活动模式下运行。

深入研究我们的机器学习检测机制值得一篇自己的博客文章,它将涵盖我们如何使用GPU针对数万亿请求训练和验证我们的模型,模型特征交付和提取如何工作,以及我们如何解释和调试内部和外部的模型预测。

并不是世界上所有的问题都能通过机器学习得到最好的解决。我们可以通过各种方式调整ML模型,但在某些情况下,它们的性能可能会低于基本的启发式方法。通常,机器学习试图解决的问题并不是全新的。在构建Bot管理解决方案时,很明显,有时请求的单个属性可能会泄露一个机器人。这意味着我们可以创建一系列简单的规则,以一种直接的方式捕获机器人,同时还可以确保最低的误报率。

启发式引擎是2019年集成到Cloudflare Bot管理平台的第二个检测机制,它也应用于每个请求。根据请求的某些属性,我们有多种启发式类型和数百条特定规则,其中一些很难欺骗。当任何请求与任何启发式规则匹配时,我们分配可能的最低分数1。

速度-如果ML模型推理每个模型花费的时间不到50微秒,则可以应用数百个启发式算法,而不到20微秒!

可部署性-启发式引擎允许我们使用QuickSilver在几秒钟内添加新的启发式,并且它将应用于每个请求。

覆盖面广-使用一组简单的启发式算法,我们可以将大约15%的全球流量和大约30%的Bot Management客户流量归类为机器人。对一些IF条件来说还不算太差,对吧?

最低假阳性-因为我们对添加的启发式非常确定和保守,所以该检测机制在所有检测机制中FP率最低。

ML的标签-由于高度确定性,我们使用启发式分类的请求来训练我们的ML模型,然后可以概括从启发式学习的行为,并提高检测的准确性。

因此,启发式方法在与机器学习进行调整时给了我们一个提振,它们包含了许多关于机器人的直觉,这有助于推动Cloudflare机器人管理平台的发展,并允许我们加入更多的客户。

机器学习和启发式检测提供了巨大的价值,但它们都需要在标签上输入人工信息,或者基本上需要老师来区分对错。虽然我们的监督ML模型甚至可以很好地概括新的威胁,就像我们教给他们的一样,但我们决定走得更远。如果有一种方法不需要老师,而是可以学会区分不良行为和正常行为,那会怎样呢?

进入行为分析检测机制,2018年初步开发,2019年与Bot管理平台融合。这是一种无监督的机器学习方法,具有以下特性:

适合特定的客户需求-它为所有Bot Management客户自动启用,计算和分析较长时间内的正常访问者行为。

检测以前从未见过的机器人-因为它不使用已知的机器人标签,它可以检测特定客户网站上的正常行为中的机器人和异常。

更难回避--异常行为往往是机器人特定目标的直接结果。

请继续关注更详细的博客,了解行为分析模型和支持这种不可思议的检测机制的平台,保护我们的许多客户免受看不见的攻击。

到目前为止,我们已经讨论了如何检测坏机器人和人类。好的机器人怎么办,其中一些对客户网站非常有用?是否需要专用的检测机制,或者是否有我们可以从前面描述的检测机制中使用的东西?虽然大多数好的僵尸请求(如Googlebot、Bingbot、LinkedInbot)已经由其他检测机制产生了较低的分数,但我们也需要一种方法来避免有用的僵尸的意外阻塞。这就是防火墙字段cf.bot_management.verify_bot在2019年出现的原因,允许客户自己决定是让所有好的机器人通过,还是限制对网站某些部分的访问。

计算已验证Bot标志的实际平台本身应该有详细的博客,但简而言之,它具有以下属性:

基于验证器的方法-我们支持多种验证机制,每种机制都允许我们通过群集一组IP来可靠地确认良好的机器人身份。

反向DNS验证器-执行反向DNS检查,以确定bot的IP地址是否与其声称的主机名匹配。

Downloader验证器-从僵尸所有者网站上托管的文本文件或HTML页面中收集良好的僵尸IP。

机器学习验证器-使用无监督学习算法,对无法通过其他方法验证的好机器人IP进行聚类。

僵尸程序目录-一个带有UI的数据库,用于存储和管理通过Cloudflare网络的僵尸程序。

使用上面列出的多种验证方法,经过验证的Bots检测机制识别出数百个唯一的好机器人身份,它们属于不同的公司和类别。

当谈到机器人管理检测质量时,关键在于信号的质量和数量。所有前面描述的检测都使用通过网络发送的请求属性,并使用不同的技术在服务器端进行分析。是否有更多可用信号,可以从客户端提取以。

..