当前位置: 首页 > 工具软件 > Falco > 使用案例 >

【翻译】Falco插件的早期访问

通煜祺
2023-12-01

项目客串文章,最初由Mark Stemm发表在Falco博客

Falco即将推出的功能之一是通过使用插件扩展Falco的功能,这让我们非常兴奋。我们将在2021年北美Kubecon展会上演示这一功能。具体来说,我们将展示Falco对AWS Cloudtrail日志的支持,一个Cloudtrail插件和相关的Falco规则可以做到以下几点。

  • 读取Cloudtrail日志并将其作为事件返回
  • 识别Cloudtrail日志中的可疑或值得注意的活动。

该功能本身仍处于非常早期的访问阶段,我们预计它将在明年年初正式发布。同时,我们希望让潜在的插件开发者看一下API,并在我们向正式发布迈进时提供反馈。

什么是插件?

插件是符合文档化API的共享库,有两种类型。

  • 源插件添加新的事件源/过滤器字段,可以使用过滤表达式/Falco规则进行评估。
  • 提取器插件增加了定义新字段的能力,可以从核心Falco事件或其他插件生成的事件中提取信息。

这两种类型的插件有望极大地扩展Falco的功能,使用户能够为几乎所有类型的流数据编写规则。

插件可以用任何语言编写,只要该语言支持暴露C函数接口,可以从Falco等C/C++程序中调用。我们已经用这种接口编写了C、C++和Go语言的插件。对于Go,我们还编写了一个模块,处理C语言伪类型和Go类型之间的一些转换工作,并提供方便的方法,使其更容易在Go中编写插件。

源插件

一个源插件提供了一个新的事件源。它有能力 "打开 "和 "关闭 "一个提供事件的会话。它也有能力通过next()方法将事件返回给插件框架。

源插件也有能力从事件中提取基于字段的信息。例如,给定一个syscall事件,字段proc.name可以提取一个进程名称,如ngnix。该插件返回一组支持的字段,并有一些函数来提取给定事件和字段的值。然后,该插件框架可以根据这些字段与关系和/或逻辑运算符的组合建立过滤表达式/Falco规则条件。例如,让我们考虑一个表达式,ct.name=root和ct.region=us-east-1。插件框架处理解析表达式,调用插件来提取给定事件的 ct.name/ct.region字段的值,并确定表达式的结果。在Falco输出字符串中,如An EC2 Node was created (name=%ct.name region=%ct.region),插件框架处理解析输出字符串,调用插件提取字段值,建立解析字符串,并将模板字段名(如%ct.region)替换为值(如us-east-1)。

提取器插件

提取器插件只专注于从其他插件或核心库产生的事件中提取字段。它不提供事件源,但可以从其他事件源中提取字段。一个例子是json字段提取,一个插件可能能够从任意的json有效载荷中提取字段。

我们已经写了一个JSON提取器插件,可以从json有效载荷中提取任意数据,使用JSON指针

捕获文件中的插件事件

插件事件与.scap捕获文件兼容,可以被Falco读取,也可以被使用Falco库的sysdig等用户空间工具读/写。新的事件类型 "pluginevent "包含一个插件ID和一个由插件返回的任意有效载荷。这允许利用Falco库中现有的对捕获文件的支持。捕获文件有可能在同一文件中包含系统调用和插件事件的混合。你甚至可以在wireshark等工具中读取由插件生成的捕获文件。

插件事件源和互操作性

随着插件的引入,有可能出现许多新类型的事件和许多新的字段,可以从事件中提取信息。考虑到这一点,我们已经正式确定了Falco中规则与事件的匹配方式。

由源插件返回的事件有一个 "事件源",描述事件中的信息。这与插件的名称不同,允许多种插件产生同类型的事件。例如,可能有gke-audit-bridge、eks-audit-bridge、ibmcloud-audit-bridge等插件可以获取K8s审计信息。这些插件都有自己的共享库和实现,但都有相同的事件源k8s_audit。

当Falco加载规则时,它会读取source: 属性并尝试将事件源与加载的源和/或提取器插件相匹配。如果一个支持该事件源的源插件被加载,所有具有该特定源的规则将被评估为来自该源插件的事件。

提取器插件的处理方式略有不同。一个提取器插件可以选择提供一组兼容的事件源。当框架收到一个事件源在兼容事件源列表中的事件时,表达式/Falco输出中的字段将使用提取器插件从事件中提取。一个提取器插件也可以不命名一组事件源。在这种情况下,所有的事件都将被呈现给提取器插件,而不考虑其来源。在这种情况下,提取器插件必须检测任意有效载荷的格式,并能在有效载荷不被支持时返回NULL/无值。

在Falco中配置插件

插件是通过新的falco.yaml属性pluginsload_plugins在yaml中配置的。下面是一个例子。

plugins:
  - name: cloudtrail
    library_path: cloudtrail/plugin.so
    init_config:"..."
    open_params。"..."
  - 名称:json
    library_path: json/plugin.so
    init_config:""
    open_params:""

# 可选的
load_plugins:[cloudtrail, http_json]

falco.yaml中的plugins属性定义了可由Falco加载的插件集。该属性包含一个插件定义的列表。每个插件定义都有。

  • name: 插件的名称。
  • library_path。插件的共享库的路径。
  • init_config。一个配置字符串(通常是JSON),当插件被初始化时,它被传递给插件。
  • open_params。一个配置字符串,当该插件open()s一个新的事件流时,它被传递给该插件。

默认情况下,插件列表中的每个插件都将被加载。如果存在,load_plugins属性包含了被加载的插件的具体名称条目。

在Falco中运行插件

目前,当启用插件支持时,Falco对系统调用的核心支持被禁用。此外,一次只能加载一个源插件。如果加载多个源插件,falco将返回一个错误。任何数量的提取器插件都可以被同时加载。

我们打算放宽这些限制,允许同时运行多个源插件。这将在我们解决由单一Falco规则引擎处理多个事件流所导致的并发性、公平性和资源利用问题时发生。

Cloudtrail插件

除了引入插件支持外,我们还编写了一个源插件cloudtrail,可以读取Cloudtrail日志并将其作为事件传递给规则引擎。

该插件可以被配置为以多种方式获取日志文件,这取决于falco.yaml中的open_params值。

  • 一个S3桶:s3://<S3桶名称>[/<可选前缀>]
  • 一个SQS队列,传递SNS关于新日志文件的通知sqs://<SQS队列名称>
  • 一个本地文件系统路径。任何路径

该插件还导出了从cloudtrail事件中提取信息的字段,如事件时间、aws区域、S3桶/EC2实例名称等。

该插件使用AWS Go SDK使用的相同的认证机制。

  • 环境变量。用AWS_REGION=xxx指定AWS区域,用AWS_ACCESS_KEY_ID=xxx指定访问密钥ID,用AWS_SECRET_ACCESS_KEY=xxx指定秘密密钥。
  • 共享的配置文件。在$HOME/.aws/config的文件中指定AWS区域,在$HOME/.aws/redentials的文件中指定凭证。

AWS Cloudtrail的新规则

除了该插件外,我们还创建了新的Falco规则,在Cloudtrail日志中寻找可疑的、值得注意的和有趣的活动。下面是一个关于多因素认证、无MFA的控制台登录的规则示例。

- 规则。没有MFA的控制台登录
  desc: 检测一个没有MFA的控制台登录。
  条件。
    ct.name="ConsoleLogin" and ct.error=""
    and json.value[/userIdentity/type]!="AssumedRole" and json.value[/responseElements/ConsoleLogin]="Success"
    和json.value[/additionalEventData/MFAUsed]="No"
  输出。
    检测到一个没有MFA的控制台登录(请求用户=%ct.user,请求IP=%ct.srcip,AWS区域=%ct.region)
  优先级。优先级:CRITICAL
  来源:aws_cloudtrail

规则源是aws_cloudtrail。当Falco与加载的Cloudtrail插件一起运行时,它将评估这些规则,因为插件的事件源与规则中的源相匹配。ct.name、ct.error、ct.srcip等字段由插件通过调用插件的提取字段功能来解决。例如,将 ct.name与 "ConsoleLogin "相匹配表明是一次控制台登录尝试。Cloudtrail插件支持的全部字段都在README中。

也可以使用JSON插件,因为底层事件的有效载荷是具有这种格式的JSON。JSON插件可以使用它的json.value字段,它以JSON指针为参数,提取JSON对象的任何部分。例如,将json.value[/responseElements/ConsoleLogin]与 "Success "匹配,表示登录尝试成功,而json.value[/additionalEventData/MFAUsed]与 "No "匹配,表示没有使用MFA的控制台登录。

当事件符合这一规则时,Falco将发出警报,该警报可以发送到文件、stdout、syslog等,也可以发送到Falcosidekick

00:40:32.000000000: Critical 检测到一个没有MFA的控制台登录(请求用户=bob.user,请求IP=192.0.2.24,AWS区域=us-east-1)
当前的Cloudtrail规则集

以下是我们目前编写的全套规则。当该功能完全发布时,它们将在falco发布的文件aws_cloudtrail_rules.yaml中出现。这些规则包括检测任何变化("创建组"、"创建Lambda函数"),检测特定的错误配置/不良做法("无MFA的控制台登录"、"删除桶的加密"),以及检查允许/不允许的值列表("在未经批准的区域运行实例")。我们希望社区能提供更多的规则。

  • 通过假设角色的控制台登录
  • 不使用MFA的控制台登录
  • 不使用MFA的控制台根部登录
  • 停用根用户的MFA
  • 创建AWS用户
  • 创建组
  • 删除群组
  • 创建ECS服务
  • ECS任务运行或开始
  • 创建Lambda函数
  • 更新兰姆达函数代码
  • 更新Lambda功能配置
  • 运行实例
  • 在未批准的区域运行实例
  • 删除桶的加密
  • 删除桶的公共访问块
  • 列表中的水桶
  • 放置水桶ACL
  • 放置水桶策略
  • 创建CloudTrail轨迹
  • 禁用CloudTrail日志

了解更多

希望你现在已经很想了解更多关于插件和如何编写你自己的插件。在这个早期访问期间,你可以看一下预览文档,它更详细地介绍了插件的架构和实施细节。此外,我们还编写了一份开发者指南,记录了每个API函数,浏览了两个示例插件的代码,并讨论了一些编写插件的最佳实践。

祝你玩得开心,并让我们知道你的想法!

 类似资料: