TL; DR
Falco = 规则驱动的运行时检测引擎,开箱即用、规则生态丰富,适合以检测告警为核心诉求的团队。
Tetragon = eBPF 驱动的内核级可观测性 + 执行引擎,低开销、可运行时阻断,适合深度集成 Cilium 生态、需要精细控制能力的团队。
选型关键:不是谁更好,而是谁更匹配你的安全成熟度、技术栈和运营能力。
1. 背景:为什么需要运行时安全?
随着 Kubernetes 成为现代应用部署的事实标准,安全边界正在从"构建时"向"运行时"延伸。
传统防御体系------镜像扫描、准入控制、网络策略------解决的是"不让有问题的镜像跑起来"和"限制东西能访问谁"的问题。但它们无法回答一个关键问题:一个已经在运行的容器里,正在发生什么?
真实威胁场景往往发生在运行时:
-
攻击者利用漏洞在容器内弹出一个 Shell
-
恶意程序偷偷访问
/etc/shadow或挂载的 ServiceAccount token -
容器被攻陷后向外发起异常网络连接
-
开发人员在生产容器里手动执行调试命令
运行时安全(Runtime Security) 正是为弥补这一缺口而生:通过持续监控容器和主机的运行时行为,及时发现、调查并响应威胁。
本文对比当前云原生运行时安全领域两个最主流的开源工具------Falco 与 Tetragon,帮助你在选型时做出明智决策。
2. 核心对比一览
| 对比维度 | Falco | Tetragon |
|---|---|---|
| 核心定位 | 运行时威胁检测与安全可观测性 | eBPF 驱动的运行时可观测性与执行 |
| 底层技术 | 内核模块 / eBPF 探测器 + 规则引擎 | 纯 eBPF 内核级插桩 |
| 事件来源 | 系统调用、容器运行时、K8s API | 内核 tracepoint / kprobe / uprobe |
| 主要功能 | 检测可疑行为 → 生成告警 | 采集内核级事件 → 可观测 + 可执行 |
| 执行/阻断能力 | 弱:依赖外部响应器(FalcoSidekick 等) | 强:原生支持基于策略的运行时阻断 |
| 规则语言 | 自定义规则 DSL(YAML) | Kubernetes CRD(TracingPolicy) |
| 规则生态 | 非常丰富:官方规则库 + 社区贡献 | 较少:官方示例为主,仍在快速成长 |
| K8s 原生集成 | DaemonSet 部署,自动关联 Pod 元数据 | CRD 原生,与 Cilium 深度集成 |
| 事件粒度 | 中高层语义("容器内启动 Shell") | 底层内核级(具体系统调用、参数) |
| 性能开销 | 中等(取决于规则复杂度) | 低(eBPF 在内核侧过滤,减少上下文切换) |
| 部署复杂度 | 低:Helm chart 一键部署 | 中:需考虑内核版本兼容性 |
| 社区活跃度 | CNCF 毕业项目,生态成熟 | CNCF 孵化项目,Cilium 团队背书 |
| 最佳场景 | 行为检测 + 告警集成 + 合规审计 | 深度可观测 + 运行时执行 + Cilium 生态 |
3. 核心差异的本质:两种安全范式
两者的根本区别不在于"谁功能多",而在于安全 范式 的不同:
Falco:规则驱动的"安全分析师"
Falco 的工作方式像一位经验丰富的安全分析师:它内置了一套规则库,持续观察系统行为,一旦发现"不对劲"的活动就触发告警。
核心理念:用高层语义规则描述"什么是异常"
bash
# Falco 规则示例:容器内启动 Shell
- rule: Terminal shell in container
desc: A shell was used as the entrypoint/exec in a container
condition: >
spawned_process and container
and shell_procs and not shell_container
and not stage_container
output: >
A shell was spawned in a container (user=%user.name container=%container.name image=%container.image repo=%container.image.repository)
priority: WARNING
优势:
-
规则表达力强,安全策略可直接翻译成检测规则
-
官方规则库覆盖 OWASP Top 10、PCI DSS 等合规要求
-
输出渠道丰富:stdout、文件、Syslog、K8s Events、Slack、PagerDuty、Elasticsearch 等
局限:
-
本身不具备阻断能力,响应需依赖外部系统
-
规则数量增多后性能开销会上升
Tetragon:eBPF 驱动的"内核显微镜 + 执行器"
Tetragon 直接在 Linux 内核中植入 eBPF 程序,像给系统行为装了一个高精度显微镜。它不仅能观察,还能在事件发生时直接在内核层做出决策。
核心理念:在内核层做观测和控制,从源头解决问题
bash
# Tetragon 策略示例:阻止容器执行 /bin/curl
apiVersion: tetragon.cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: block-curl-in-container
spec:
kprobes:
- call: sys_execve
syscall: true
args:
- index: 0
type: "string"
selectors:
- matchBinaries:
- operator: In
values:
- "/bin/curl"
matchNamespace:
- operator: In
values: ["prod"]
matchActions:
- action: Sigkill
arg: "Blocked curl execution in prod namespace"
优势:
-
原生支持运行时阻断(Sigkill、Postpone 等动作)
-
eBPF 在内核侧过滤,性能开销极低
-
与 Cilium 网络策略天然联动,形成"网络 + 运行时"统一防护
局限:
-
规则以内核事件为粒度,编写门槛较高
-
对内核版本有要求(需 5.x+,部分特性依赖更新内核)
-
规则生态尚在建设中
一句话总结
-
Falco 回答的是:"发生了什么可疑的事?"(检测 + 告警)
-
Tetragon 回答的是:"具体是怎么发生的?要不要直接拦住?"(观测 + 执行)
4. 技术基石:eBPF 到底是什么?
理解 Tetragon 绕不开 eBPF (Extended Berkeley Packet Filter )。
eBPF 是一种可以在 Linux 内核中运行沙箱程序的技术。你可以把它理解为内核里的"微型虚拟机"------安全相关的逻辑在内核态执行,只把过滤后的事件送到用户态,大大减少了数据拷贝和上下文切换的开销。
传统方式 vs eBPF 方式:
| 传统审计方式 | eBPF 方式 | |
|---|---|---|
| 数据采集 | 全量拷贝到用户态再过滤 | 内核态先过滤,只送必要事件 |
| 性能开销 | 高(大量上下文切换) | 低(内核侧高效过滤) |
| 灵活性 | 编译进内核或加载内核模块 | 动态加载,无需重启 |
| 安全性 | 内核模块崩溃 = 系统崩溃 | 验证器保证程序安全 |
但 eBPF 不是银弹:
-
内核版本依赖:不同 eBPF 特性需要不同内核版本,老版本内核能力受限
-
学习曲线陡峭:写 eBPF 程序需要理解内核内部机制
-
可观测 ≠ 安全:eBPF 只是技术手段,策略设计和运营能力才是关键
5. 性能与资源开销对比
| 指标 | Falco | Tetragon |
|---|---|---|
| CPU 开销 | 1%~5%(取决于规则数量和复杂度) | <1%(eBPF 内核侧过滤) |
| 内存 占用 | 100200 MB / Agent | 50100 MB / Agent |
| 事件 吞吐量 | 中(规则匹配后输出) | 高(内核侧批量处理) |
| 延迟 | 事件到告警:数百毫秒 | 事件到执行:亚毫秒级 |
实际开销取决于工作负载密度和策略复杂度,以上为典型生产环境参考值。
6. 选型决策树
bash
你的核心诉求是什么?
│
├─ 主要是检测和告警,不想折腾
│ └─ → 选 Falco ✅
│
├─ 需要运行时阻断/执行能力
│ └─ → 选 Tetragon ✅
│
├─ 已经在用 Cilium / 计划用 eBPF 技术栈
│ └─ → 选 Tetragon ✅
│
├─ 安全团队 rule-of-thumb:快速落地合规检测
│ └─ → 选 Falco ✅
│
└─ 需要深度内核级可观测性,排查复杂运行时问题
└─ → 选 Tetragon ✅
选择 Falco,如果你:
-
需要一个成熟、开箱即用的运行时检测引擎
-
要把安全检测接入现有的 SIEM / 告警 / 事件响应 工作流
-
希望把合规要求(PCI、SOC2、等保)快速翻译成检测规则
-
初期聚焦"看得见",而非"拦得住"
-
团队以安全运营为主,不想深入内核层
选择 Tetragon,如果你:
-
需要低开销的内核级可观测性,看清进程树、文件访问、网络连接
-
有明确的运行时阻断需求(如阻止敏感二进制执行)
-
技术栈已包含或计划采用 Cilium,追求统一的可观测体验
-
团队具备 eBPF / Linux 内核专业能力,能处理兼容性问题
-
需要将运行时策略与网络策略联动,形成纵深防御
7. 实施路线图:分阶段落地
无论选哪个工具,都建议遵循观测优先、逐步收紧的落地策略:
第一阶段:威胁建模(1~2 周)
-
明确你的资产和信任边界:哪些 Namespace 是生产?哪些 Pod 跑特权容器?
-
列出你最关心的威胁场景:Shell 弹出?敏感文件访问?异常出站连接?
-
排优先级:先解决最痛的 1~3 个问题
第二阶段:部署与基线(2~4 周)
-
在测试集群部署工具,先用默认规则/策略跑起来
-
观察 1~2 周,建立正常行为基线
-
记录误报率,识别哪些规则在你的环境里"太吵"
第三阶段:策略调优(持续)
-
针对误报优化规则:加白名单、调整阈值、排除已知合法行为
-
从"所有事件都告警"逐步聚焦到"真正值得响应的事件"
-
建立规则评审机制:新增/修改规则要有 Review
第四阶段:集成与响应(2~4 周)
-
将事件接入现有的监控和告警平台(Prometheus + Grafana、PagerDuty、Opsgenie)
-
制定响应手册:什么级别的告警需要谁介入?处置流程是什么?
-
定期演练:模拟一个入侵场景,看看检测和响应是否顺畅
第五阶段:谨慎开启执行(可选)
-
在充分验证检测准确性后,再逐步启用阻断等执行动作
-
先 dry-run,后 enforcement:先观察模式跑一段时间,确认无误伤再开阻断
-
从低风险动作开始:先 Block 非核心 Namespace,再推广到生产
8. 常见陷阱与最佳实践
⚠️ 三大常见误区
-
检测 ≠ 预防 告警发出去不代表威胁被阻止了。很多团队以为装了运行时安全工具就万事大吉,实际上如果没有自动化响应闭环,检测到攻击也只是"事后知道了"。
-
规则越多越好?错 堆一堆规则只会制造噪音。误报太多会让运营团队"狼来了"效应------真正重要的告警被淹没在日志里。少而精比多而全更有效。
-
工具上线 = 安全落地?错 运行时安全工具本身也需要运维:版本升级、规则维护、误报调优、性能监控。没有明确 Owner 的工具,最后都会变成摆设。
✅ 最佳实践清单
-
从观测模式开始,不要一开始就开阻断
-
每个告警都要有明确的响应人和处置流程
-
定期 review 规则库,清理过时和高误报的规则
-
把运行时事件与 CI/CD 流水线、镜像扫描结果关联起来
-
至少做一次红蓝对抗演练,验证检测有效性
-
给运行时安全工具本身也加上监控(它挂了要知道)
9. 结论
Falco 和 Tetragon 不是非此即彼的竞争对手,而是代表了云原生运行时安全的两条互补路径:
-
Falco 是运行时检测层的首选起点------成熟、易用、生态丰富,适合快速建立安全可见性。
-
Tetragon 是深度可观测与执行控制的进阶选择------基于 eBPF,性能更强、控制更精细,适合有技术积累的团队。
最终,真正成熟的运行时安全策略不是"选一个最好的工具",而是把工具嵌入完整的 DevSecOps 生命周期:
-
构建时:镜像扫描、依赖分析
-
部署时:准入控制、策略校验
-
运行时:行为检测、异常响应
-
闭环:事件调查、持续优化
工具只是手段,持续的安全运营和响应能力才是目标。
参考资料
-
CNCF 云原生安全全景图