我们相信,了解Falco的起源可以为你提供有用的架构知识,并帮助你更好地使用它。另外,这也是一个有趣的故事!
在20世纪90年代末互联网高速发展的繁荣期,计算机网络迅速普及,因此也产生了对它们进行监控、故障排除和安全保护的需求。不幸的是,许多团队买不起当时的网络可视化工具,这些工具都是商业版的,价格非常昂贵。结果就是许多人都在黑暗中摸索前行。
但是很快,世界各地的团队开始研究这个问题的解决方案。其中一些涉及扩展现有的操作系统以添加数据包捕获功能,换句话说,可以将现成的计算机工作站转换为可以运行在网络上的设备,并收集其他工作站发送或接收的所有数据包。由加州大学伯克利分校的Steven McCanne和Van Jacobson开发的Berkeley Packet Filter(BPF)就是这样一个解决方案,它被设计用来扩展BSD操作系统内核。如果你使用Linux,可能会熟悉eBPF(e代表extended,即扩展的),它是一个可用于在Linux内核中安全地执行代码的虚拟机。eBPF是Linux内核中最热门的现代特性之一,经过多年的改进,它已经发展成为一项非常强大和灵活的技术,但它最初只是一个用于BSD UNIX的可编程数据包捕获和过滤模块。
BPF附带了一个名为libpcap的库,任何程序都可以使用它来捕获原始的网络数据包,它的出现引发了网络和安全工具的激增。基于libpcap的第一个工具是名为tcpdump的命令行网络分析器,它仍然是几乎所有UNIX发行版的一部分。在1998年,一个基于图形用户界面(GUI)的开源协议分析器Ethereal(2006年更名为Wireshark)问世,它迅速成为并且现在仍然是数据包分析领域的行业标准。
tcpdump、Wireshark和许多其他流行的网络工具的共同之处在于能够访问丰富、准确、可靠的数据源,并且是以非侵入性的方式收集原始的网络数据包,请记住这个概念!
像tcpdump和Wireshark这样的网络工具是BPF数据包捕获栈早期自然发展出来的应用程序,人们很快就开始在数据包的用例中发挥创造性。例如,Martin Roesch在1998年发布了一个名为Snort的开源网络入侵检测工具。它是一个处理网络捕获数据包的规则引擎,具有一组内置规则,可以通过查看数据包及其包含的协议和携带的负载内容来检测威胁及异常活动,并启发了很多类似工具的构建,如Suricata和Zeek。
像Snort这样的工具之所以强大,是因为它们能够在应用程序运行时验证网络和应用程序的安全性。这非常重要,因为它提供了实时的保护,并且对运行时行为的关注使得基于尚未公开的漏洞检测威胁成为可能。
刚刚我们了解到网络数据包慢慢成了可见性、安全性和故障排除的流行数据源,基于它们的应用催生了几个成功的产业。然而,IT行业逐渐发展的趋势削弱了数据包作为真相来源的用处:
· 全面收集数据包变得越来越复杂,特别是在云环境中,对路由器和网络基础设施的访问受到限制。
· 加密和网络虚拟化使得提取有价值的信息更具挑战性。
· 容器和编排工具(如Kubernetes)的兴起使得基础设施更具弹性。相应地,想要可靠地收集网络数据也变得更加复杂。
随着云计算和容器的普及,这些问题在21世纪10年代初开始变得更加明确。再一次,一个令人兴奋的新生态系统正在蓬勃发展,但没有人知道如何对它进行故障排除并施加保护。
这就是本书作者的工作核心。我们发布了一个名为sysdig的开源工具,构建这个工具的灵感来自这样一组问题:为现代云原生应用程序提供可见性的最佳方式是什么?我们能否将建立在数据包捕获之上的工作流应用于这个新世界?有没有更好的数据源?
sysdig最初专注于收集来自操作系统内核的系统调用。系统调用是一种丰富的数据源,甚至比数据包还要丰富,因为它们不仅关注网络数据,还包括文件I/O、指令执行、进程间通信等。对于云原生环境来说,它们是比网络数据包更好的数据源,因为它们可以从容器和云实例的内核中收集。此外,收集它们更简单、更高效且入侵性更小。
sysdig最初由三个独立的组件构成:
· 一个内核捕获探针(有两种版本:内核模块和eBPF)。
· 一组辅助捕获程序开发的库。
· 一个具有解码和过滤功能的命令行工具。
换句话说,它是将BPF栈移植到系统调用。sysdig被设计成支持最流行的网络数据包工作流:跟踪文件、简单过滤、脚本化等。从一开始,我们还覆盖了与Kubernetes和其他编排工具的原生集成,目标场景是现代应用程序环境。sysdig很快在社区中备受欢迎,这也验证了该技术方案的有效性。
行业发展的下一步应该是什么呢?你应该猜到了,就是一个类似Snort但用于系统调用的工具。我们认为,在sysdig库之上构建一个灵活的规则引擎将是一个强大的工具,能够可靠且高效地检测到现代应用程序中的异常和入侵行为。本质上它采用的还是Snort方法,但应用在系统调用上,并且设计为在云环境中工作。
Falco就是在这样的背景下诞生的。第一个(简易)版本于2016年年底发布,包括大多数重要组件(如规则引擎)。Falco的规则引擎深受Snort的启发,但被设计为用于操作更丰富、更通用的数据集,并插入了sysdig库,附带了一组相对简洁但很有用的规则。Falco最初的版本是单机版,不支持分布式部署。我们将它作为开源发布,因为我们看到了社区的广泛需求。当然,也是因为我们热爱开源!
随着Falco的演进和社区的逐步接受,开发人员开始将其扩展到新的适用领域。例如,在2018年,我们添加了Kubernetes审计日志作为数据源的支持,该功能可以让Falco利用审计日志产生的事件流,在配置错误和发生威胁时及时检测到它们。
发布这个功能需要我们不断改进引擎,这使得Falco变得更加灵活,适用场景更广泛。
2018年,sysdig将Falco作为沙箱项目贡献给云原生计算基金会(Cloud Native Computing Foundation,CNCF)。CNCF是许多现代云计算基础重要项目的家园,如Kubernetes、Prometheus、Envoy和OPA等。对于我们的团队来说,使Falco成为CNCF的一员是将其发展为真正由社区驱动的成果的一种方式,以确保它与其他云原生栈完美集成和对它的长期支持。2021年,sysdig内核模块、eBPF探针和库作为Falco组织的子项目都贡献给了CNCF,进一步扩展了这项工作。完整的Falco技术栈现在交到了一个中立的、有爱心的社区手中。
时光流逝,Falco也在逐渐成熟。首先,它先进的引擎、高效的性质和易于部署的特性,使其适用于基于系统调用的运行时安全之外的更多领域。其次,随着软件变得越来越分布式和复杂,运行时安全对于即时检测威胁(包括预期的威胁和意外的威胁)至关重要。最后,我们相信世界需要一种一致的、标准化的方式来实现运行时安全。特别地,对于能够以一种融合的方式保护工作负载(进程、容器、服务、应用程序)和基础设施(主机、网络、云服务)的解决方案的需求日益增长。
因此,Falco的下一步发展规划将是模块化、灵活性以及支持更多跨领域的数据源。例如,在2021年,我们添加了一个新的插件基础设施,允许Falco利用云供应商日志等数据源来检测错误配置、未经授权的访问、数据盗窃等。
Falco发展的故事线跨越了20多年,将许多团队、发明和项目联系在一起,而这些内容乍一看似乎并不相关。但是在我们看来,这个故事恰恰说明了为什么开源这么酷:成为一个贡献者可以让你向聪明的前辈学习,在他们的创新基础上进行构建,并以创造性的方式连接社区。