WEBKT

云原生安全实战:利用 Tetragon + LSM BPF 实现容器文件系统细粒度审计

66 0 0 0

在云原生环境下,容器的运行时安全防护(Runtime Security)一直是技术难点。传统的审计工具(如审计日志或基于 kprobes 的方案)往往存在被绕过的风险,或在防御时存在“检测到即已发生”的滞后性。

Cilium 社区推出的 Tetragon 凭借 eBPF 技术,特别是利用 LSM (Linux Security Modules) BPF,提供了更为底层的内核级感知与拦截能力。本文将带你通过实战演练,利用 Tetragon 构建一套基于 LSM 的容器文件系统审计策略。

一、 为什么选择 LSM BPF?

在 Tetragon 中,监控内核函数的手段主要有 kprobesLSM

  1. kprobes:在内核函数入口或出口插入钩子。虽然灵活,但容易受到 TOCTOU(Time-of-Check Time-of-Use) 攻击。攻击者可以在检查点之后、实际操作执行前修改用户态数据。
  2. LSM BPF:LSM 是 Linux 内核中用于增强安全性的框架(如 AppArmor, SELinux)。通过 LSM BPF,我们可以在内核执行安全决策的关键路径上插入 eBPF 程序。
    • 原子性:LSM 钩子通常位于内核对象操作的最后关卡,无法轻易绕过。
    • 策略执行:LSM 不仅能审计(Audit),还能直接在内核层拒绝(Deny)违规操作。

二、 前置要求

要运行基于 LSM 的 Tetragon 策略,你需要满足以下环境:

  • Linux Kernel: 5.7 或更高版本(LSM BPF 的标准支持版本)。
  • 内核配置: CONFIG_BPF_LSM=yCONFIG_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 # 发现违规写操作直接杀死进程

四、 验证策略效果

  1. 应用策略
    使用 kubectl apply -f policy.yaml 将策略下发到集群。

  2. 触发告警
    进入目标容器,尝试修改敏感文件:

    kubectl exec -it my-pod -- touch /etc/test_file
    
  3. 查看审计日志
    通过 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]
    

五、 核心优势总结

  1. 低开销:eBPF 程序运行在内核态,无需在用户态和内核态之间频繁拷贝数据。
  2. 高可靠:基于 LSM 钩子,能够有效防御通过硬链接、符号链接等方式绕过常规路径检查的手段。
  3. 可编程性:通过 BPF 程序,可以实现非常复杂的上下文感知审计(例如:允许特定的运维脚本写入,但禁止其他进程写入)。

六、 避坑指南

  • BTF 支持:确保你的环境开启了 BTF,否则 Tetragon 无法解析内核结构体成员,会导致策略失效。
  • 权限控制:部署 Tetragon 时需要特权容器(Privileged),并挂载内核 debugfs。
  • 策略范围:生产环境建议先使用 action: Post(仅审计)观察一段时间,确认无误后再开启 action: Sigkill 或拒绝执行逻辑。

通过 Tetragon 与 LSM BPF 的结合,开发者和安全工程师可以构建出真正的“零信任”运行时环境,让每一个敏感的内核操作都暴露在聚光灯下。

云安全实战派 eBPFTetragon容器安全

评论点评