libscap的名字代表“用于系统捕获的库”(library for system capture),这清楚地说明了它的用途。libscap是输入数据在进入Falco处理管道之前的网关,让我们看一下libscap可以为我们做的主要事情。
libscap库包含控制内核模块和eBPF探针的逻辑,包括加载、启动和停止捕获,以及读取它们产生的数据。此外,它还包括加载、管理和运行插件的逻辑。
libscap旨在将通用的捕获抽象导出到堆栈的上层。这意味着无论数据是如何收集的(内核模块、eBPF探针、插件),使用libscap的程序将具有一致的方法来枚举和控制数据源、启动和停止捕获以及接收捕获的事件,并且不必担心这些不同输入源接口的细微差别。
libscap中另一个非常重要的功能是支持跟踪文件。如果你曾使用Wireshark或tcpdump创建或打开过PCAP文件,我们确信你已经了解跟踪文件的概念是多么有用和强大!如果没有类似的经历,我们在这里稍做解释。
除了捕获和解码网络流量外,协议分析器(如Wireshark和tcpdump)还允许你将捕获的网络数据包“导出”到跟踪文件中。跟踪文件包含每个数据包的副本,以便稍后可以用它分析网络活动。你还可以与其他人共享这些文件,或者过滤内容以摘出相关信息。
跟踪文件通常被称为PCAP文件,这个名称来源于对其中的数据进行编码的 .pcap 文件格式(一种为世界上所有网络工具都理解的开放、标准化格式)。这催生了无数个在计算机网络中至关重要的使用“先捕获、后分析”工作流的工具。
许多Falco用户没有意识到Falco支持使用 .pcap 格式的跟踪文件。这个功能非常强大,当你有丰富的经验时,它绝对应该成为你的武器库的一部分。例如,在编写新规则时,跟踪文件是非常有价值的。
我们将在第4章和第13章详细讨论如何利用跟踪文件,但现在让我们通过一个Falco跟踪文件的例子来勾起你的兴趣,这只需要简单的两步。为此,我们需要引入一个名为sysdig的命令行工具。你将在第4章了解更多关于sysdig的知识,但目前我们只将它视作一个简单的跟踪文件生成器。
首先按照安装说明( https://oreil.ly/Rmkxr) 在Linux主机上安装sysdig。安装完成后,在命令行上运行以下命令,指示sysdig捕获主机生成的所有系统调用,并将它们写入一个名为 testfile.scap 的文件:
等待几秒钟以确保命令正在执行,然后按Ctrl+C组合键停止sysdig。现在,你已经获得了主机几秒的活动快照,让我们来看看它都包含哪些内容:
稍后我们将详细介绍此输出的格式,但是你可能已经看出这是由Xorg、gmain和prlcp等系统工具执行的一系列后台输入/输出活动,这些工具在这台机器空闲时正在运行。
可以将跟踪文件想象为将我们带回到过去:你在特定时间点拍摄了主机的快照,现在你可以跟踪主机上在该时间点附近生成的系统调用,详细观察每个进程。使用Falco处理跟踪文件非常简单,可以让你快速查看在此期间是否发生了安全违规事件。以下是它的输出示例:
幸运的是,一切都很安全。这种一致的、回溯的运行Falco的方式在规则编写或单元测试时非常有用,我们在第13章深入研究规则时再详细讨论。
收集系统状态是与捕获系统调用相关的一项重要任务。内核模块和eBPF探针产生了原始系统调用,但是缺乏Falco需要的一些重要上下文。
让我们看一个例子。一个非常常见的系统调用是read,顾名思义,它从文件描述符读取数据缓冲区的内容。下面是read的指令原型:
它有三个输入:文件描述符标识、要填充的缓冲区和缓冲区大小。它返回写入缓冲区的数据量。
文件描述符类似于操作系统内核中的对象ID:它可以表示文件、网络连接(特别是套接字)、管道端点、互斥量(用于进程同步)、定时器等对象。
在编写Falco规则时,知道文件描述符编号不是很有用。作为用户,我们更习惯使用文件或目录名,或者连接的IP地址和端口,而不是文件描述符编号。libscap帮助我们实现了这一点。在Falco启动时,libscap从操作系统内的不同来源(例如,Linux文件系统的 /proc 入口)获取一组数据,它使用这些数据来构建一组表,用来将上述神秘的数字(文件描述符、进程ID等)解析为逻辑实体及其细节,从而更容易理解和使用。
这也是Falco的语法比大多数同类工具更具表现力和可用性的原因之一。在本书中,你会经常听到这样一个观点:如果没有上下文,再细粒度的数据也没有意义,希望能给你带来一点启发。接下来,我们将深入研究另一个重要的Falco库:libsinsp。