Falco全解析(一)

Falco能做什么

Falco主要通过系统调用去加固和监视系统

  • 解析来自内核的系统调用
  • 强大的规则引擎判断系统调用是否安全
  • 当发现非法系统调用时发出警告

Falco架构

从最底层开始介绍,Falco最底层是由LSMebpf驱动的一个monitor,他会捕捉全部的系统调用并且传输至引擎中判断,引擎也就是libsinsplibscap,最后引擎使用GRPC或者其他通信方式发送出去,算是比较常规的架构(内核获取信息+用户态引擎判断+网络传输结果)

我对这部分ebpf的代码比较感兴趣,内核部分的代码在这里可以找到,同时引擎的代码也在这个仓库中,有意思的一点是现在sysdig的内核探针也是用的是Falco的,然而Falco是捐赠给CNCF的开源项目

使用

Falco有直接可以运行的binary文件,因此可以直接执行falco,也可以使用官方提供的Falco Docker镜像运行,官方更推荐使用特权模式运行:

1
2
3
4
5
6
7
8
9
10
docker pull falcosecurity/falco-driver-loader:latest
docker run --rm -i -t \
--privileged \
-v /root/.falco:/root/.falco \
-v /proc:/host/proc:ro \
-v /boot:/host/boot:ro \
-v /lib/modules:/host/lib/modules \
-v /usr:/host/usr:ro \
-v /etc:/host/etc:ro \
falcosecurity/falco-driver-loader:latest

我这里由于后期有打算进行二次开发,因此选择自己编译后运行二进制文件,我的环境如下:宿主机 M1 mac,虚拟机使用的是MultiPass,ubuntu 22.10发行版,内核版本5.15.0-60-generic,因为之前已经在这个虚拟机中测试过ebpf,所以说我可以直接编译

1
2
3
4
git clone https://github.com/falcosecurity/falco.git
mkdir build && cd build
cmake ..
make (falco/bpf/driver/libscap等,这里选择你想要编译的组建)

一路也比较顺利,编译之后在/build/driver可以看见你编译出的.ko后缀的驱动和.o后缀的BTF文件,内核可以直接加载并运行,编译整个Falco消耗的时间还是比较长因为他会编译所用到的所有依赖(而且是边下载边编译)…耐心等待即,编译时还出现了compiler被莫名其妙terminate的情况,给MulitPass加了点内存之后总算可以编译成功了

直接运行binary其实坑挺多的,需要你首先使用falco-driver-loader去加载驱动或者ebpf,然后再补充rules和配置文件之后才可以运行,更方便的还是使用docker去运行,Falco既可以运行在容器中,也可以运行在宿主机上,一般来说Falco在k8s中以DaemonSet的形式运行在每一台Node上

再补充一点坑的地方,从官方仓库下载好的预编译好的probe.o文件是专门为pagesize=64k的linux内核编译的,所以我的并不能加载普通的bpf文件,但是我后来试了一下modern(也就是开启了BTF支持的,当然这里要求内核版本大于5.8),modern BPF不仅实现了CO—RE,并且使用ring buffer取代了perf map算是有了性能提升,可以看一下运行falco之后使用bpftool查看,一下子多了两百多个程序…

还有一个坑记录一下:MultiPass默认是给了单个cpu,想要使用Ring Buffer的话必须CPU数量在2以上,所以需要改一下

1
multipass set local.spruce-bluejay.cpus=4

libs代码解析

libs仓库中的架构图更详细一些

libs仓库中的文件分布如下

  • drivers目录包含了全部内核层的东西,也就是驱动和ebpf程序,这部分程序主要监视和捕获内核
  • userspace目录则是包含了用户态的东西,libscap(library for system capture)主要负责直接与驱动交互,控制内核层的事件抓取,同时会捕捉文件打开与关闭的情况,并且实现了操作系统状态收集,最后把这些事件全部发送至libinsp中;libsinsp(library for system inspection)主要负责对发送来的事件进行一些简单的过滤,并且解析过滤后的事件,并且对输出结果做一些格式化

ebpf部分

入口是probe.c,这里是主要挂载了ebpf跟踪点的地方,传统的ebpf部分在nsfocus中已经有比较详细的讲解,下一篇中主要分析modern和传统ebpf的实现和改造

引用文献