Linux sysdig 的 falco rules 热加载与自定义 macro/list 编写

1次阅读

falco规则修改后不生效是因为默认不自动重载,需手动sighup或systemctl kill -s sighup;macro中不能用list:字段,须在rules顶部或lists.yaml中定义小写无下划线的list并显式include;driver加载失败会导致启动卡住,应优先检查日志中的“loaded rules from”和“rules engine is ready”。

Linux sysdig 的 falco rules 热加载与自定义 macro/list 编写

falco rules 文件修改后为什么没生效

默认情况下,falco 不会自动重载规则文件——改完 rules.yaml 或新增 rule,必须手动触发重载或重启进程,否则所有改动静默失效。

常见错误现象:falco 日志里完全不出现新 rule 的匹配记录,甚至用 curl -X POST http://localhost:8765/healthz 检查都正常,让人误以为规则已加载。

  • 最稳妥的做法是发送 SIGHUP:kill -SIGHUP $(pidof falco)(注意不是 kill -9
  • 如果用 systemd 管理,执行:sudo systemctl kill -s SIGHUP falco
  • 确认是否成功:查看 falco 启动日志末尾是否有 Loaded rules from 和对应文件路径,以及 Rules engine is ready
  • 避免用 systemctl restart falco,它会导致监控空窗期,且可能因配置语法错误直接启动失败

macro 中引用 list 时总报 unknown field 错误

在 macro 定义里写 list: my_list_name 是错的;list 不是合法字段名,正确写法是用 append 或直接内联条件,但更常见的是把 list 名作为 condition 的一部分来引用。

典型错误信息:Error: unknown field "list" in ...

  • macro 内不能直接声明 list:,只能通过 condition 引用已定义的 list,例如:condition: (proc.name in my_proc_list)
  • list 必须在 rules 文件顶部或独立 lists.yaml 中定义,且名字要全小写、无下划线(如 my_proc_list 可,MY_PROC_LISTmy-proc-list 不行)
  • list 条目值如果是字符串,需加引号;如果是数字或布尔值,不加引号(- "sshd" ✅,- sshd ❌,会被解析成变量名)
  • macro condition 中若含多个 list 引用,建议用括号明确优先级,比如:(proc.name in shell_procs) or (proc.name in service_procs)

自定义 list 放在哪、怎么被 falco 扫到

falco 默认只加载 /etc/falco/falco_rules.yaml/etc/falco/falco_rules.local.yaml,其他文件(包括 lists.yaml)不会自动识别——必须显式 include。

使用场景:想把 proc 名、路径、用户列表等拆出来单独维护,避免主 rules 文件臃肿。

  • 把 list 定义写进 /etc/falco/lists.yaml,然后在 falco_rules.local.yaml 开头加上:include: lists.yaml
  • include 路径是相对于 falco 配置中 rules_file 所在目录的,不是绝对路径也不是工作目录
  • 同一个 list 名不能在多个文件里重复定义,否则加载失败并报 duplicate key
  • list 内容支持 - value 形式,也支持 - macro: some_macro 这种嵌套引用(只要 macro 已定义)

sysdig driver 加载失败导致 falco 启动卡住

如果 falco 启动日志停在 Loading sysdig driver... 就不动了,大概率是 kernel module 没装好或版本不匹配,和 rules 热加载无关,但常被误判为配置问题。

性能与兼容性影响:driver 缺失时 falco 会 fallback 到 eBPF,但部分事件(如 file open with flags)不可见,且 eBPF 模式对内核版本敏感(5.2+ 较稳)。

  • 先运行:sudo modprobe sysdig_probe,看是否报 Module not found
  • 若未安装 driver,用 sudo /usr/bin/falco-driver-loader bpf 强制走 eBPF(适合容器或 CI 环境)
  • 若坚持用 kernel module,检查 dkms status 是否有 sysdig 条目,没有就重装:sudo apt-get install linux-headers-$(uname -r) && sudo /usr/bin/falco-driver-loader kernel
  • 注意:某些云厂商定制内核(如 AWS AL2、azure AKS)禁用 module 加载,此时唯一可靠路径是 eBPF + --bpf-probe /root/.falco/bpf/probe.o

falco 的 rules 加载机制本身简单,但 macro/list 的作用域、include 路径解析、driver 依赖这三块容易串在一起出问题。改完规则后第一反应不该是调 condition,而是先看日志里有没有 “Loaded rules from” 和 “Rules engine is ready”。

text=ZqhQzanResources