1.1 Falco概览
从最高层来看,Falco的架构非常直接:通过在分布式基础设施上安装多个传感器来完成部署。每个传感器负责(从本地机器或者通过一些API)收集数据,然后运行一组规则,并在有问题发生时发出通知。图1-1简单展示了它的工作原理。
图1-1:Falco的高层架构
你可以将Falco想象成基础设施的安全摄像头网络:你将传感器放置在关键位置并观察正在发生的情况,如果检测到有害行为,它们会通知你。在Falco中,这些不好的行为由社区创建和维护的一组规则来定义,你可以根据需要定制或扩展这些规则。Falco传感器产生的警报理论上可以保留在本地机器中,但在具体实践中,它们通常被导出到集中式收集器。对于集中式警报收集,你可以使用通用的安全信息和事件管理(Security Information and Event Management,SIEM)工具,也可以使用像Falcosidekick这样的专用工具。我们将在第12章中详细介绍警报收集。
现在,让我们更深入地研究Falco的架构并探索它的核心组件,先从传感器开始吧。
1.1.1 传感器
图1-2展示了Falco传感器的工作模式。
图1-2:Falco传感器架构
传感器引擎接收两种输入:数据源和规则。传感器将规则应用于来自数据源的每个事件。当规则匹配事件时,将产生一条输出消息。
1.1.2 数据源
每个传感器能够从多个来源收集数据。最初,Falco专门设计用于收集系统调用,到目前为止,系统调用仍然是其最重要的数据源之一。我们会在第3章和第4章详细介绍系统调用,现在你可以把系统调用理解为正在运行的程序用来与外部世界交互的接口。打开或关闭文件、建立或接收网络连接、从磁盘或网络读写数据、执行命令、使用管道或其他类型的进程间通信与其他进程通信,这些都是使用系统调用的例子。
Falco通过测量Linux操作系统的内核来收集系统调用。它可以通过两种不同的方式实现这一点:部署内核模块(即可以安装在操作系统内核中以扩展内核功能的一段可执行代码)或使用eBPF技术(该技术可以在操作系统内部安全地运行脚本执行操作)。我们将在第4章详细讨论内核模块和eBPF。
利用这些数据,Falco可以发挥令人难以置信的作用:掌握基础设施中发生的一切。以下是Falco可以检测的一些示例:
• 权限升级。
• 访问敏感数据。
• 所有权更改和模式更改。
• 意外的网络连接或套接字突变。
• 异常的程序执行。
• 数据泄漏。
• 违反合规要求。
除了系统调用之外,Falco还扩展了其他数据源,本书后面的章节会给出一些示例。例如,Falco可以实时监控云上的日志,并在云基础设施中发生异常情况时发出通知。以下是一些示例:
• 用户登录时没有进行多重身份验证。
• 云服务的配置更改。
• 有人访问Amazon Web Services(AWS)S3存储桶中的敏感文件。
Falco会经常添加新的数据源,因此我们建议你访问官方网站(https://falco.org)和Slack频道(https://oreil.ly/Y4bUt)以了解最新内容。
1.1.3 规则
规则会告诉Falco引擎如何处理来自数据源的数据。它们允许用户以紧凑和可读的格式定义策略。Falco预置了一套相对全面的规则,覆盖了主机、容器、Kubernetes和云安全,你也可以轻松创建自定义的规则。我们将会花大量篇幅来讨论规则,尤其是在第7章和第13章,相信读完本书后,你将成为这方面的大师。我们先看看下面这个示例:
上述规则会检测在容器内启动bash shell的情况,这个操作在基于容器的不可变基础设施中通常是不建议的。规则中的核心条目是条件(condition)和输出(output),前者告诉Falco要查看什么,后者是条件触发时Falco将告诉你的内容。可以看到,条件和输出都作用于某些字段(field),这是Falco的核心概念之一。条件是一个布尔表达式,结合了对字段和值的检查(本质上就是一个过滤器)。输出则是文本和字段名称的组合,它们的值将在通知中打印出来,语法类似于编程语言中的print语句。
你是否想到了tcpdump或Wireshark这样的网络工具?赞!它们就是Falco的一大灵感来源。
1.1.4 数据扩充
丰富的数据源和灵活的规则引擎帮助Falco成为强大的运行时安全工具。在这些基础之上,来自不同提供商的元数据丰富了它的检测。
当Falco告诉你发生了什么事情时(例如,系统文件被修改),你通常需要更多信息来了解问题的原因和范围。这是哪个进程造成的?是在容器里发生的吗?如果是,容器和镜像的名称是什么?发生这种情况的服务/命名空间是什么?是生产环境还是开发环境?是root用户做出的更改吗?
Falco的数据扩充引擎通过构建环境状态来解决这个问题,包括运行的进程和线程、它们打开的文件、它们运行的容器和Kubernetes对象等。Falco的规则和输出可以访问所有状态。例如,你可以轻松地确定规则的范围,使其仅在生产环境或特定服务中触发。
1.1.5 输出通道
每次规则被触发时,相应的引擎都会发出输出通知。一个最简单的配置就是引擎将通知写入标准输出(通常没有实际作用)。幸运的是,Falco提供了丰富的方式将通知路由到指定位置,包括日志收集工具、云存储服务(例如,S3)以及像Slack和电子邮件这样的通信工具。这里先提一下整个生态体系中非常重要的Falcosidekick项目,它被专门设计用于连接Falco与外部世界,让输出变得更加轻松(更多信息请参见第12章)。
1.1.6 容器和其他
Falco是为现代云原生应用程序设计的,因此它对容器、Kubernetes和云环境有着出色的、开箱即用的支持。由于本书是关于云原生安全的,因此我们将重点关注这部分内容。但需要注意的是,Falco并不局限于运行在云端的容器和Kubernetes,你完全可以使用它作为主机安全工具,许多预置规则都可以帮助保护你的Linux服务器。Falco对网络检测也有很好的支持,可以检查连接、IP地址、端口、客户端和服务器的活动,并在它们显示有问题或发生意外/异常行为时发出警报。