购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.5 libsinsp

libsinsp代表“系统检测库”(library for system inspection)。这个库进一步扩充libscap生成的数据流,并提供许多高级原语。让我们先从它最重要的功能开始探索:状态引擎。

3.5.1 状态引擎

如前所述,当Falco开始运行时,libscap会构建一组表将低层级标识符(如文件描述符编号)转换为高层级、可操作的信息(如IP地址和文件名)。这看起来很棒,但如果程序是在Falco启动后打开文件呢?例如,UNIX中一个非常常见的系统调用open,它接受两个输入参数(文件名和一些标志),并返回一个文件描述符,标识新打开的文件:

在实践中,open与许多其他系统调用一样会创建一个新的文件描述符,改变调用它的进程的状态。如果进程在Falco启动后调用open,那么它的新文件描述符将不是状态表的一部分,Falco并不知道该如何处理这个描述符。但是,仔细想一下open是一个系统调用,而系统调用总是被用来创建、销毁或修改文件描述符。再回想一下,Falco库会捕获每个进程的所有系统调用。

libsinsp会有专门的逻辑来检查每个改变状态的系统调用,并根据系统调用参数更新状态表。换句话说,它会跟踪整个机器的活动,以保持状态能与底层操作系统同步。此外,对容器的支持也是这样的方式。libsinsp将这些不断更新的信息保存在一个层次结构中,该结构(见图3-4)从进程表开始,其中每一项都会包含一个文件描述符表以及其他信息。

图3-4:libsinsp状态层级结构

这些准确的、不断更新的状态表是Falco扩充数据的核心,也是规则引擎的关键构建模块。

3.5.2 事件解析

状态引擎需要大量的逻辑来理解系统调用并解析它们的参数,这就是libsinsp的事件解析器所做的。状态跟踪使用了事件解析,但它也可以用于其他目的。例如,它从系统调用或其他数据源中提取有价值的参数,将它们用于规则引擎。它也可以整理和重构多个分布消息的缓冲区,使其更容易从Falco规则解码其内容。

3.5.3 过滤器

过滤是Falco中最重要的概念之一,它在libsinsp中得到了完全的实现。过滤器是一个布尔表达式,它将多次检查结合在一起,每次检查都将过滤器字段与常量值进行比较。当我们查看规则时,过滤器的重要性显而易见。事实上,它非常重要,我们会用第6章的全部篇幅来讨论它。以下面这个简单的规则为例:

规则的条件(condition)部分是一个libsinsp过滤器。这个例子中的条件会检查容器ID不是host,并且进程名是bash,满足这两个条件的每个系统调用捕获都将触发该规则。

libsinsp负责定义和实现与系统调用相关的过滤器字段。它还包含评估过滤器并告诉我们是否应该触发规则引擎,因此毫不夸张地说,libsinsp是Falco的核心。

3.5.4 输出格式

让我们再回顾一下示例规则,可以看到output部分使用了与condition部分类似的语法:

当规则触发时,Falco会打印输出。是的,你可以在本节使用过滤器字段(与condition部分中使用的字段相同),在字段名称前加上%字符。libsinsp具有解析这些字段并创建最终输出字符串的逻辑。一个好消息是,如果你成了编写条件过滤器的专家,你也将掌握输出字符串!

3.5.5 关于libsinsp的另一件事

现在你可能已经看到,Falco的很多逻辑都在libsinsp中实现,这是该项目有意设计的。Falco的开发人员认识到其数据收集堆栈的价值和优雅性,并意识到它可以成为许多其他工具的基础。这正是libsinsp存在的原因,它位于功能强大的Falco集合栈(包括驱动程序、插件和libscap)之上,并以一种可重用的方式添加了Falco逻辑中最重要的部分。更重要的是,libsinsp支持从容器、虚拟机、Linux主机和云基础设施收集安全和取证数据所需的一切。同时,它稳定、高效,并且有良好的技术文档供参考。

还有很多其他开源和商业工具也构建在libsinsp之上。如果你也想编写一个,或者对此感到好奇想了解更多,我们建议你到 falcosecurity/libs 项目存储库( https://oreil.ly/Cp2Nt) 进行查看。 u4M7a50XTtA6aEVv3Hw/t2z67eLwr4aAH1jU/8FmhUxbkkxg01hQ2tg3+/2o1by9

点击中间区域
呼出菜单
上一章
目录
下一章
×