土法炼钢 · 系统与基础设施

【Falco】Plugin 框架:container / k8smeta 与 syscall 主路径

文章导航

分类入口
kubernetessecurity
标签入口
#falco#plugins#container-plugin#k8smeta#libsinsp#v0.44.1

目录

前几篇把 syscall 路径走到规则与输出;本篇回答:plugin 插在哪一层、与驱动主路径如何分工,以及元数据空时规则为何「像没写」。核心误区是把 container.* / k8s.* 字段当成驱动保证的内核事实——在 0.44.1 叙事里,它们大量来自 plugin 富化,失败域独立于 modern_ebpf ∥ kmod。

另一类误区是「装了插件等于规则更强」:插件只提供字段或事件源,威胁语义仍由 YAML 条件决定。插件未加载时,依赖其字段的规则不会报「缺插件」,而会以条件为假的形式消失——这与第 6 篇失败表象直接咬合。排障若只看规则 diff、不看 load_plugins 与运行时套接字,会在错误层循环。

不写第三方 plugin 百科,不把未钉版本的插件行为写成 0.44.1 事实。读完应能画出 syscall 路径与 plugin 路径的合流图,并解释为何元数据空洞会让「已加载规则」静默。

本篇在系列中的位置

篇目 核心内容
第 8 篇 · 输出面 sink 与 gRPC 删除门
第 9 篇 · Plugin 框架 container / k8smeta、字段合流、元数据空
第 10 篇 · 部署与 driver.kind Helm、auto、least-privileged
系列目录 关键问题、阅读路径、全部价值点

版本锚定:Falco 0.44.1。plugin 配置面见 tag falco.yamlload_plugins / plugins。与 0.44 发行追踪对齐的参考工件:container 插件 0.7.1k8smeta 0.4.1(Helm chart / 发布 tracking 常见 pin)。开写或升版时仍须核对 falcosecurity/plugins 发布说明与当前 chart pluginRef,不以本文数字替代现场核对。


一、plugin 框架角色

官方 Plugins 文档把插件定义为符合公开 API 的共享库,可:

对 Falco 守护进程而言:plugins 描述可加载库与 init_configload_plugins 列出实际启用的名字(默认常为 [],显式开启)。事件源类插件与 syscall 源可并存;extractor 类插件则把字段并进既有求值面。只改 plugins 块却忘记写入 load_plugins,是「配置了但没加载」的常见疏漏。

框架解决的是扩展点,不是第二套规则语言。规则仍是第 6–7 篇的 YAML;插件决定某些字段有没有值、某些事件从哪来。相对「把所有逻辑塞进驱动」,plugin 让容器元数据与云审计等演进不必每次 bump 驱动 API/Schema——这是工程上的分叉收益,也带来「主路径健康、插件空洞」的新失败模式。


二、container / k8smeta(兼容 0.44.1)

插件 典型职责 与 0.44.1 的关系
container 经容器运行时套接字等路径提取容器元数据;丰富 container.*,并支撑部分 k8s.ns.name / k8s.pod.* 类字段(见 falco.yaml 注释:基本 K8s 字段需要 k8saudit 插件) 0.44 发行追踪与 changelog 将 0.7.1 与用户态对齐;配置示例在 tag falco.yamlplugins
k8smeta 对接独立的 k8s-metacollector,按节点粒度拉 Kubernetes 资源元数据,导出 k8smeta.* 字段类 chart 常见 pluginRef 钉到 0.4.1;未启用时文档描述会回退到容器注解等较窄信息

二者常被一起提起,但依赖不同:container 依赖节点上可见的运行时接口;k8smeta 依赖集群内部署的 metacollector 与网络可达性。只开其一、却写依赖另一字段类的规则,会得到「半套富化」——部分告警有 namespace、部分没有,看起来像随机误报/漏报。

k8saudit审计日志事件源插件,与「给 syscall 告警贴 pod 名」不是同一条需求——tag 注释已写明二者勿混。本篇不展开 k8saudit 规则库。若目标只是规则里写 k8s.pod.name,应先核对 container 插件与运行时套接字,而不是默认去部署一套审计 webhook。

版本策略:正文承认上述 pin 来自 0.44 发布追踪与 chart;现场以 plugins 仓库 release 与所部署 chart values 为准。第三方或自建插件不在本系列保证范围。plugin ABI 与 Falco 用户态错配时,失败往往在启动加载阶段,而不是「偶发无告警」——那更像元数据空,见第四节。升 chart 时若只动 image.tag 而忘记同步 pluginRef,等于人为制造混部。


三、与 libsinsp 字段合流

flowchart LR
  subgraph syscall_path ["syscall path"]
    drv["modern_ebpf or kmod"] --> scap["libscap"]
    scap --> sinsp["libsinsp state"]
  end
  subgraph plugin_path ["plugin path"]
    rt["runtime or metacollector"] --> plug["container / k8smeta plugin"]
    plug --> fields["extra fields"]
  end
  sinsp --> merge["field table for rules"]
  fields --> merge
  merge --> eng["rule engine"]

图:syscall 主路径与 plugin 富化路径在规则求值前合流(英文节点)。

驱动路径提供 syscall 上下文;libsinsp 维护线程/FD/进程树(第 4 篇)。container / k8smeta 在用户态把镜像名、pod、命名空间等写入同一字段表。规则条件不区分「字段来自驱动还是插件」——只看见有值或为空。这种透明合流提高了规则可移植性,也让字段空洞更难从条件文本本身读出来。

因此「集群内规则不命中、单机裸进程命中」优先怀疑合流侧元数据,而不是先改 evt.type。对照 Tetragon 内核 exec_id 血缘:Falco 此处仍是用户态拼装;plugin 延迟或失败不会回滚已捕获的 syscall 事件,只会让依赖元数据的规则变瞎。


四、元数据空时的失败表象

表象 优先核对
条件含 container.image.repository 等,生产永不命中 container 插件是否在 load_plugins;运行时套接字挂载与权限 3 / 本篇
只有注解级 K8s 信息、没有期望的 k8smeta.* k8smeta 是否加载;metacollector 地址/端口;节点粒度连通 3 / 本篇
-L 有规则、stdout 偶有命中但缺 K8s 字段 富化失败被规则用 and 静默掉 3→4
插件加载报错、进程拒绝启动 library_path、ABI 与 Falco 版本错配 部署 / 升级篇

第 6 篇「条件永远假」同构:表达式合法,左侧空。证据应包括插件启用列表与元数据源健康,而不是只 diff 规则 YAML。建议的静态核对顺序:load_plugins → 库文件是否存在于容器 → 运行时套接字/metacollector 网络策略 → 规则是否依赖仅在 k8smeta 启用后才存在的字段类。

无环境不伪造「container.id 为空」的日志行;语义上这类字段缺失即足以让依赖它们的规则静默。若必须在无集群时验证规则逻辑,应使用不依赖容器字段的最小条件,或明确标注「该规则仅在 plugin 富化成功后有效」。


五、不写第三方 plugin 百科

本系列对 plugin 的承诺止于:

不写:每个注册插件的配置菜谱、未核对 ABI 的「推荐插件列表」、用插件营销话术替代五轴排障。事件源类插件(云审计、业务日志等)若引入,须单独做版本门与规则源测试,不能假定与 syscall 主路径同 SLA。一条云审计规则静默,不应自动推导「节点上的 modern_ebpf 坏了」。也不写 k8saudit 全书、未现场核对的插件行为冒充 0.44.1 事实、以及伪造的字段为空日志样本;驱动 auto 见第 10 篇。

开放问题(研究台账 06–09):plugin 富化与 syscall 主路径的一致性 SLO——元数据延迟或空洞是否应进入与 drop 同级的值班指标。选型与联合 runbook 留到第 14–16 篇。在 SLO 缺位前,最低工程要求是:把「container/k8smeta 字段填充率」或等价健康信号从「有则更好」提升为排障必查项。


参考资料

规范 / 官方文档 / 源码(A)

站内对照(A/B)

学术 / 争论指针(A/B)


上一篇输出面

下一篇部署与 driver.kind

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。

2026-08-21 · kubernetes / security

【Falco】libsinsp:状态富化与用户态进程树

钉清 libsinsp 如何用机器状态、线程/FD 表与用户态进程树富化 scap 事件;对照 Tetragon exec_id 的内核血缘差,并列出富化失败时规则条件「永远假」的表象。

2026-08-21 · kubernetes / security

【Falco】响应与生态边界:告警下游到哪里为止

钉清 Falco 0.44.1 告警离开引擎后本系列承诺到哪一步:下游接线边界、规则仓库协作、响应自动化接口;不写 SIEM 逐步配置,并把生态开放问题交给选型终章。


By .