云原生安全实战:利用 Tetragon + LSM BPF 实现容器文件系统细粒度审计
在云原生环境下,容器的运行时安全防护(Runtime Security)一直是技术难点。传统的审计工具(如审计日志或基于 kprobes 的方案)往往存在被绕过的风险,或在防御时存在“检测到即已发生”的滞后性。
Cilium 社区推出的 Tetragon 凭借 eBPF 技术,特别是利用 LSM (Linux Security Modules) BPF,提供了更为底层的内核级感知与拦截能力。本文将带你通过实战演练,利用 Tetragon 构建一套基于 LSM 的容器文件系统审计策略。
一、 为什么选择 LSM BPF?
在 Tetragon 中,监控内核函数的手段主要有 kprobes 和 LSM。
- kprobes:在内核函数入口或出口插入钩子。虽然灵活,但容易受到 TOCTOU(Time-of-Check Time-of-Use) 攻击。攻击者可以在检查点之后、实际操作执行前修改用户态数据。
- LSM BPF:LSM 是 Linux 内核中用于增强安全性的框架(如 AppArmor, SELinux)。通过 LSM BPF,我们可以在内核执行安全决策的关键路径上插入 eBPF 程序。
- 原子性:LSM 钩子通常位于内核对象操作的最后关卡,无法轻易绕过。
- 策略执行:LSM 不仅能审计(Audit),还能直接在内核层拒绝(Deny)违规操作。
二、 前置要求
要运行基于 LSM 的 Tetragon 策略,你需要满足以下环境:
- Linux Kernel: 5.7 或更高版本(LSM BPF 的标准支持版本)。
- 内核配置:
CONFIG_BPF_LSM=y且CONFIG_DEBUG_INFO_BTF=y。 - LSM 初始化: 启动参数中需包含
lsm=...bpf。 - Tetragon: 已部署在 Kubernetes 集群中。
三、 实战:构建文件系统只读审计策略
假设我们有一个敏感应用,其 /etc 目录下的配置文件在容器启动后不应被修改。我们希望利用 Tetragon 审计任何试图写入该目录的行为。
1. 编写 TracingPolicy
Tetragon 使用自定义资源(CRD)TracingPolicy 来定义监控逻辑。以下是一个针对文件系统写入操作的 LSM 审计策略:
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: "audit-etc-writes"
spec:
lsmHooks:
- hook: "file_open"
args:
- index: 0
type: "file" # 对应内核中的 struct file
selectors:
- matchArgs:
- index: 0
operator: "Prefix"
values:
- "/etc/"
matchActions:
- action: Post
# 仅当以写入权限打开文件时触发
matchPIDs:
- operator: "In"
values: [ 0 ] # 此处可结合 namespace 过滤
matchArgs:
- index: 0
operator: "Contains"
values:
- "WRITE" # 过滤写标志
注意:实际 Tetragon 策略中,针对 LSM 的 file_open 钩子可以直接访问内核 file 结构体,这比监控系统调用 sys_open 更为准确。
2. 更精细的策略:拦截与审计
在更高级的场景中,我们可能需要拦截(Block)操作。以下策略展示了如何利用 security_file_permission 钩子来实施拦截:
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: "restrict-sensitive-write"
spec:
lsmHooks:
- hook: "security_file_permission"
args:
- index: 0
type: "file"
- index: 1
type: "int" # 访问权限掩码
selectors:
- matchArgs:
- index: 0
operator: "Prefix"
values:
- "/etc/shadow"
- "/etc/passwd"
- index: 1
operator: "Mask"
values:
- "2" # MAY_WRITE 标志
matchActions:
- action: Sigkill # 发现违规写操作直接杀死进程
四、 验证策略效果
应用策略:
使用kubectl apply -f policy.yaml将策略下发到集群。触发告警:
进入目标容器,尝试修改敏感文件:kubectl exec -it my-pod -- touch /etc/test_file查看审计日志:
通过 Tetragon 的 CLI 工具tetra观察实时输出:kubectl logs -n kube-system -l app.kubernetes.io/name=tetragon -c export-stdout | tetra observe --filter-pod my-pod你会看到类似如下的输出,详细记录了进程、UID、文件名以及触发的 LSM 钩子:
🚀 process default/my-pod /usr/bin/touch /etc/test_file LSM file_open /etc/test_file [WRITE]
五、 核心优势总结
- 低开销:eBPF 程序运行在内核态,无需在用户态和内核态之间频繁拷贝数据。
- 高可靠:基于 LSM 钩子,能够有效防御通过硬链接、符号链接等方式绕过常规路径检查的手段。
- 可编程性:通过 BPF 程序,可以实现非常复杂的上下文感知审计(例如:允许特定的运维脚本写入,但禁止其他进程写入)。
六、 避坑指南
- BTF 支持:确保你的环境开启了 BTF,否则 Tetragon 无法解析内核结构体成员,会导致策略失效。
- 权限控制:部署 Tetragon 时需要特权容器(Privileged),并挂载内核 debugfs。
- 策略范围:生产环境建议先使用
action: Post(仅审计)观察一段时间,确认无误后再开启action: Sigkill或拒绝执行逻辑。
通过 Tetragon 与 LSM BPF 的结合,开发者和安全工程师可以构建出真正的“零信任”运行时环境,让每一个敏感的内核操作都暴露在聚光灯下。