Falco云原生安全:Falco原理、实践与扩展
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 生成事件

生成事件的方法数以万计。在系统调用的场景中,实际上,只要进程在运行,许多事件就会自然地连续发生。然而,要使Falco发挥作用,我们必须关注能够触发警报的事件。你可能还记得,Falco预置了一组开箱即用的规则,涵盖了最常见的安全场景。Falco使用这些规则来表示异常的行为,因此我们需要选择一个规则作为目标,然后在系统中通过模拟恶意操作来触发它。

在本书中,特别是在第13章中,你将看到有关规则的全面解析、如何使用Falco的规则语法解释和编写条件,以及在条件和输出中支持哪些字段。现在,让我们简单回顾一下什么是规则,并通过一个实际的例子来解释它的结构:

规则声明是一个包含若干键的YAML对象。第一个键rule作为规则集(包含规则定义的一个或多个YAML文件)中规则的唯一标识。第二个键desc允许规则的作者简要描述规则要检测的内容。键condition是最重要的一个,它允许使用一些简单的语法来表达安全断言。各种布尔运算符和比较运算符可以与字段(包含收集到的数据)结合使用,以过滤相关的事件。在上面的示例规则中,evt.dir是一个用于过滤的字段。我们将在第6章中详细介绍Falco支持的字段和过滤器。

条件为假,什么也不会发生;条件为真,断言得到满足,然后立即触发警报。警报将包含一条消息,由规则作者使用规则声明的键output定义,键priority对应的值也将出现在报告中。下一节我们会更详细地介绍警报的内容。

条件condition的语法还可以使用更多的结构,如列表list和宏marco,这些结构可以在规则集中与规则一起定义。顾名思义,列表是可以跨不同规则重用项的列表。类似地,宏是可重用的条件块。为了完整说明,下面是在“Write below binary dir”这条规则中键condition使用的两个宏(bin_diropen_write):

在运行时,当加载规则时,宏会被展开。因此,我们可以想象最终的规则条件将类似于:

条件判断广泛地利用了字段。在这个例子中,你可以很容易地识别条件中的字段(例如,evt.typeevt.is_open_writefd.typecharevt.dirfd.numfd.directory),因为它们后面通常跟着一个比较操作符(例如,=>=in)。字段名包含一个点(.),因为具有相似上下文的字段被分组到类中,其中点之前的部分表示类(例如,evtfd)。

尽管你可能还没有完全理解条件的语法,但没有关系,你现在需要知道的是,在条件中列出的目录之一(如/bin)中创建一个文件(这意味着打开一个文件并进行写入)就可以触发规则中的条件,让我们试试看。

首先,启动Falco并加载目标规则。规则“Write below binary dir”包含在文件/etc/falco/falco_rules.yaml中,在启动时默认加载,所以你不需要手动复制它,只需打开一个终端并执行命令:

然后,通过在/bin目录中创建一个文件来触发规则,一种直接的方法是打开另一个终端窗口并输入:

现在,如果回到第一个终端,Falco正在运行,你应该会发现一行日志(即由Falco发出的警报),看起来如下所示:

我们被Falco发现了!幸运的是,这正是我们想要实现的。我们将在下一节更详细地查看输出。

规则告诉Falco我们想要执行哪些安全策略(由条件键condition指定),以及违反策略时想要接收哪些信息(由输出键output指定)。每当事件满足规则定义的条件时,Falco就会发出警报(输出一行文本),因此如果我们再次运行上面创建文件的命令,就会触发一个新的警报。

在学习了上面这个例子之后,你自己也可以试着验证一些其他的规则。为了帮助实现这个目标,Falcosecurity组织提供了一种称为事件生成器event-generator的工具。这是一个简单的命令行工具,不需要任何特殊的安装步骤。你可以访问https://oreil.ly/CZGpM下载最新版本,然后在任何你喜欢的地方解压并使用它。它提供了一个事件集合,与默认Falco规则集中包含的许多规则相匹配。例如,要生成符合规则“Read sensitive file untrusted”中条件的事件,你可以在终端窗口中执行以下命令:

需要注意的是,这个工具可能会对你的系统做出一些变更。例如,由于该工具的目的是重现真正的恶意行为,因此一些操作会修改/bin/etc/dev等文件和目录。在使用该工具之前,请确保你已经完全理解了其用途及选项。正如在线文档https://oreil.ly/dL8gV所建议的,在容器中运行事件生成器event-generator更安全。