更新时间:2026年6月8日
Linux 运行时威胁检测(Runtime Threat Detection)是一种在容器、Pod 与主机进程正在执行时实时观测系统调用、文件 I/O、网络连接与凭据访问的安全防御方法,目前业内最主流的两套开源方案是 Falco 0.40 与 Tetragon 1.4,两者都基于 eBPF,可在内核层捕获事件、按规则匹配并在毫秒内告警或阻断。本文用一份生产级实战指南,帮你把 Falco 与 Tetragon 部署到 Kubernetes 与裸机,写出符合 MITRE ATT&CK Linux 矩阵的检测规则,并把告警接入 Loki/Elastic SIEM。
- Falco 0.40(2026 年 4 月发布)默认启用 modern eBPF 探针,移除了内核模块构建依赖,支持 Linux 5.8+ 内核免编译运行。
- Tetragon 1.4 引入
TracingPolicyNamespaced 与 Process Credentials 监控,可在 eBPF LSM 钩子点直接阻断进程,而不仅是告警。
- Falco 偏检测告警(detect-only),Tetragon 同时支持检测 + 内核态强制(enforce),两者互补而非互替。
- 规则书写应直接映射到 MITRE ATT&CK Linux 子矩阵(T1059、T1611、T1068、T1574 等),便于 SOC 三级分析师溯源。
- Falcosidekick 是事实标准的告警分发器,原生支持 Loki、Elastic、Slack、PagerDuty 等 60+ 后端,0.10 版本新增 OTLP 导出。
- 生产环境务必启用
dropped events 监控与规则性能 profiler,否则一条贪心规则可能引发 30% 以上的 CPU 占用。
什么是 Linux 运行时威胁检测
运行时威胁检测(Runtime Threat Detection,RTD)与"漏洞扫描"或"配置审计"是两类不同的安全控制:前者关心进程当前正在做什么,后者只看二进制版本或 YAML 字段。当攻击者已通过未知 0day 进入容器,扫描器对此一无所知,唯有 RTD 能在 execve("/bin/sh", ...) 出现的瞬间触发告警。
RTD 的技术核心是 eBPF。内核 5.8 之后的 BPF Type Format(BTF)使得探针无需重新编译即可在任何主流发行版(Ubuntu 22.04/24.04、RHEL 9.x、Debian 12、Amazon Linux 2023)运行。Falco 与 Tetragon 都是 CNCF 项目,前者于 2024 年毕业,是首个达到 Graduated 级别的运行时安全工具;后者由 Isovalent(已被 Cisco 收购)维护,深度集成 Cilium 数据平面。
在我落地过的金融云项目中,RTD 通常承担三类检测:容器逃逸(CVE-2024-21626 这类 runc 漏洞被利用时的特征序列)、凭据滥用(读取 /etc/shadow、Kubernetes ServiceAccount token 异常使用)以及反向 shell(一次性 socket+dup2+execve 链)。我们把这三类与容器纵深防御策略并行启用,把告警均时间(MTTD)从原先依赖审计日志的 8 分钟降到 3 秒内。
Falco 与 Tetragon 有什么区别
这是 2026 年云原生安全圈最常被问到的 PAA 问题之一。简短回答:Falco 是检测引擎(detect),Tetragon 是检测 + 阻断引擎(detect & enforce)。技术细节如下表:
| 维度 | Falco 0.40 | Tetragon 1.4 |
| eBPF 探针类型 | tracepoint + kprobe + modern eBPF | kprobe + LSM BPF + uprobe |
| 规则语言 | YAML + 类 SQL 条件表达式 | TracingPolicy CRD(Kubernetes 原生) |
| 阻断能力 | 无(0.40 版仅 alert/log/exit) | 支持 SIGKILL、override return value |
| K8s 上下文富化 | 需要 K8s Audit 插件 | 原生通过 Cilium identity |
| 典型部署形态 | DaemonSet + Falcosidekick | DaemonSet 或 Cilium 子模块 |
| 性能开销(参考值) | 1-3% CPU/节点 | 0.5-2% CPU/节点 |
| MITRE ATT&CK 映射 | 规则 metadata 字段 | label + 自定义注解 |
| 许可证 | Apache 2.0 | Apache 2.0 |
两者并非"二选一",许多成熟团队同时部署:Falco 负责广覆盖告警(社区规则集已覆盖 280+ 条 MITRE 技术),Tetragon 负责少数高危场景的内核态强制阻断。例如检测到 setuid(0) 时,Falco 出告警发给 SIEM,Tetragon 同时通过 LSM BPF 直接 KILL 进程,做到检测与响应解耦。
Falco 0.40 安装与 modern eBPF 配置
Falco 0.40 在 2026 年 4 月发布,最大变化是把 modern eBPF 设为默认驱动,旧的内核模块(falco-driver)正式标记为 deprecated。我推荐用 Helm 部署到 Kubernetes 集群:
# 1. 添加 Helm 仓库(官方 chart 已在 2026 年迁移到 falcosecurity/charts)
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
# 2. 以 modern eBPF 驱动安装,开启 Falcosidekick 与 Web UI
helm install falco falcosecurity/falco \
--namespace falco --create-namespace \
--set driver.kind=modern_ebpf \
--set tty=true \
--set falcosidekick.enabled=true \
--set falcosidekick.webui.enabled=true \
--set collectors.kubernetes.enabled=true
# 3. 验证 Pod 与驱动状态
kubectl -n falco get pods
kubectl -n falco logs ds/falco -c falco | grep -E "driver|engine"
# 期望看到:Loaded event sources: syscall + Loading modern BPF probe
裸机部署可用官方 DEB/RPM:
# Ubuntu 24.04 / Debian 12
curl -fsSL https://falco.org/repo/falcosecurity-packages.asc | \
sudo gpg --dearmor -o /usr/share/keyrings/falco-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/falco-archive-keyring.gpg] \
https://download.falco.org/packages/deb stable main" | \
sudo tee /etc/apt/sources.list.d/falcosecurity.list
sudo apt update && sudo apt install -y falco
# 切换到 modern eBPF(无需 dkms / kernel-headers)
sudo sed -i 's/^# *engine:.*/engine:\n kind: modern_ebpf/' /etc/falco/falco.yaml
sudo systemctl enable --now falco-modern-bpf.service
sudo journalctl -u falco-modern-bpf.service -f
编写映射 MITRE ATT&CK 的 Falco 规则
Falco 默认加载 /etc/falco/falco_rules.yaml 与社区维护的 falco-rules 仓库。生产环境务必把自定义规则写到 /etc/falco/rules.d/00-custom.yaml,避免被升级覆盖。以下示例检测 T1611(容器逃逸经由 cap_dac_override)与 T1059.004(Unix shell 反向连接):
- macro: container
condition: (container.id != "host")
- macro: shell_procs
condition: (proc.name in (sh, bash, zsh, dash, ksh))
- rule: 容器内异常反向 Shell
desc: 检测容器内 shell 进程 fork 后立即建立外向 TCP 连接,常见反向 shell 模式
condition: >
container and shell_procs and evt.type=execve
and proc.pname in (sh, bash, dash)
and fd.typechar = '4' and fd.net != "127.0.0.1"
output: >
Reverse shell suspected (user=%user.name container=%container.name
image=%container.image.repository cmd=%proc.cmdline dest=%fd.rip:%fd.rport)
priority: CRITICAL
tags: [container, shell, mitre_execution, T1059.004]
source: syscall
- rule: 容器内 SUID 提权链
desc: 检测容器内进程在 execve 之后立即调用 setuid(0)
condition: >
container and evt.type=setuid and evt.arg.uid=0
and not proc.name in (sudo, su, doas, login)
output: >
Possible container escape via setuid(0)
(proc=%proc.name container=%container.name image=%container.image.repository)
priority: HIGH
tags: [container, privilege_escalation, mitre_privilege_escalation, T1611]
关键技巧:
- 用
tags 字段写 MITRE ID。Falcosidekick 会把它原样转发到 SIEM,分析师在 Kibana/Loki 中按 tags:T1611 一键关联攻击链。
- 用
macro 做共享条件,避免规则中重复写 container.id != "host"。Falco 0.40 编译器会自动内联,性能无损。
- 用
exception 字段精细化白名单,例如允许 nginx-ingress 容器读取 /etc/nginx 但仍对其他容器告警。
规则写完后,先在本地用 falcoctl 干跑:
falcoctl driver config --type modern_ebpf
sudo falco -c /etc/falco/falco.yaml \
--rules-file /etc/falco/rules.d/00-custom.yaml \
-o "engine.kind=modern_ebpf" \
--validate /etc/falco/rules.d/00-custom.yaml
用 Tetragon 实现内核态阻断
Falco 告警之后还要等 SOC 人响应,平均也得几十秒。对"读取 /etc/shadow"或"加载未签名内核模块"这种零容忍场景,最好让内核直接拒绝。Tetragon 通过 LSM BPF 钩子做到这一点:
# 1. 部署 Tetragon(独立模式,与 Cilium 解耦)
helm install tetragon cilium/tetragon \
--namespace kube-system \
--set tetragon.exportFilename=/var/run/tetragon/events.log \
--set tetragon.enablePolicyFilter=true
# 2. 编写一条 TracingPolicy:阻断容器读取 /etc/shadow
cat <<'EOF' | kubectl apply -f -
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: block-shadow-read
spec:
kprobes:
- call: "security_file_open"
syscall: false
args:
- index: 0
type: "file"
selectors:
- matchArgs:
- index: 0
operator: "Equal"
values:
- "/etc/shadow"
matchActions:
- action: Override
argError: -1 # 返回 EPERM 给用户态
- action: Post
EOF
# 3. 在 Pod 内验证
kubectl exec -it test-pod -- cat /etc/shadow
# 期望输出:cat: /etc/shadow: Operation not permitted
kubectl -n kube-system logs ds/tetragon -c export-stdout | jq 'select(.process_kprobe)'
注意 action: Override 需要内核 5.3+ 与 CAP_BPF。如果只想告警不阻断,把 matchActions 改为 action: Post。Tetragon 还能监控进程凭据(cap_capable、commit_creds),这与eBPF 攻防的内核可观测点完全一致,但策略文件更易交付给 SecOps 团队。
通过 Falcosidekick 接入 Loki/Elastic SIEM
Falco 自身不存储事件,Falcosidekick 是事实标准的事件分发器。0.10 版本(2026 年 3 月)新增了 OpenTelemetry OTLP 导出与 ChatOps 模板。以下是一个把告警同时打到 Loki + Slack 的配置:
# /etc/falcosidekick/config.yaml
listenport: 2801
debug: false
slack:
webhookurl: "https://hooks.slack.com/services/XXX/YYY"
outputformat: "all"
minimumpriority: "warning"
messageformat: "Falco 告警: %s"
loki:
hostport: "http://loki.observability.svc:3100"
user: "falco"
apikey: "${LOKI_API_KEY}"
minimumpriority: "notice"
extralabels: "rule,priority,tags,container.id,k8s.ns.name,k8s.pod.name"
otlpmetrics:
endpoint: "http://otel-collector.observability.svc:4318"
protocol: "http/protobuf"
查询示例(LogQL):
{job="falcosidekick"} | json
| tags=~".*T1611.*"
| priority="CRITICAL"
| line_format "{{.k8s_ns_name}}/{{.k8s_pod_name}} {{.output}}"
这种映射让你按 ATT&CK 技术 ID 做仪表盘。同一 Pod 在 5 分钟内连续触发 T1059 + T1611 + T1068,几乎可以确认是真实入侵。把这个查询封装为 Grafana alert,与auditd MITRE ATT&CK 映射的事件做 cross-correlation,可以进一步去掉单源 false positive。
eBPF 不是零成本。在 Falco 启动后查看 falco_internal_events 指标:
curl -s http://127.0.0.1:8765/metrics | grep -E "drop|cpu"
# 关键指标:
# falco_n_drops_total{reason="buffer"} 缓冲区溢出
# falco_n_drops_total{reason="pf"} page fault 跳过
# falco_cpu_usage_perc_total Falco 进程 CPU %
常见调优手段:
- 提高 ringbuffer:
--cri-buf-size-preset 4 把每 CPU 缓冲从 8MB 提到 16MB,对高 QPS 节点效果显著。
- 裁剪规则集:禁用与业务无关的规则(如 GCP/Azure 特有规则)。我在一个 200 节点集群把规则数从 380 降到 162 后,CPU 占用从 5.4% 降到 1.8%。
- 使用
base_syscalls 配置:Falco 0.36+ 允许只挂接必要 syscall,base_syscalls.custom_set: [execve, execveat, openat, connect] 比默认列表少 60% 事件。
- 分流到独立队列:把高优先级规则(CRITICAL)路由到 PagerDuty,低优先级写 Loki,避免 SOC 被淹没。
Tetragon 通过 BPF perf buffer 上报事件,瓶颈通常是用户态 JSON 序列化。如果开启 tetragon.enableMsgHandlingLatency,可以看到 p99 延迟,超过 10ms 就考虑缩减 TracingPolicy 范围或启用 policyFilter。
MITRE ATT&CK Linux 矩阵覆盖度评估
很多团队部署完工具就以为安全了,但实际覆盖率可能不到 30%。我建议做一次正式的 ATT&CK 映射审计:
- 从 MITRE ATT&CK Linux 矩阵导出全部 Technique(约 240+ 条 sub-technique)。
- 用
falcoctl rules dump --format json | jq '.[].tags[]' | sort -u 列出所有规则携带的 T-ID。
- 把两个列表做差集,得到未覆盖的技术,按 likelihood × impact 排序。
- 对未覆盖项写规则或调用 Falco 社区规则库提交的开源规则。
2026 年 Falco 社区规则集(v3.2)已经覆盖:T1059(脚本解释器)、T1068(提权)、T1071(应用层 C2)、T1078(合法账户)、T1190(公网漏洞利用)、T1486(数据加密 - 勒索)、T1543(创建/修改系统进程)、T1611(容器逃逸)、T1614(系统位置发现)等 90+ 条核心技术,比 2024 年新增约 35%。Tetragon 社区维护的 TracingPolicy 示例则覆盖了内核态特有的 T1547(持久化注册)与 T1014(Rootkit)。
常见问题解答
Falco 一定要 eBPF 吗?没有 BTF 的旧内核怎么办?
不是必须。Falco 支持三种驱动:modern eBPF(推荐,内核 5.8+)、legacy eBPF(内核 4.14+)、内核模块(旧系统兜底)。无 BTF 时用 legacy eBPF 即可,但需要安装 kernel-headers 包来现场编译探针;2026 年 Falco 0.42 将移除 legacy eBPF,应尽快升级内核。
Falco 能阻断容器逃逸吗?
Falco 0.40 仍主要负责检测,没有内核态阻断能力。你需要 Tetragon 或 Cilium BPF LSM 提供 enforce 能力。两者组合的典型架构:Falco 发现 T1611 容器逃逸 → 通过 webhook 触发 Tetragon TracingPolicy 临时升级到 enforce 模式,或者直接由 Falco Talon 调用 Kubernetes API 删除 Pod。
Falco 与 Wazuh、Tracee 怎么选?
Wazuh 偏 HIDS(基于日志的主机入侵检测),擅长 FIM、rootcheck 与合规扫描,但 eBPF 实时性弱。Tracee(Aqua Security)规则少但能解析签名分析。Falco 在云原生场景最成熟、社区规则最多。如果你的 workload 主要是 Kubernetes,选 Falco + Tetragon;纯传统服务器,Wazuh + auditd 更合适。
Falco 的 CPU 开销具体是多少?
取决于规则数与 syscall 量。社区基准(2026 年 Falco 0.40,64 vCPU 节点):默认 180 条规则约占用 1-3% CPU;裁剪到 100 条以下并启用 base_syscalls.custom_set,可降到 0.5-1%。高 QPS 的 API 网关节点建议先在 staging 跑 24 小时观察 falco_n_drops_total,确保丢事件率小于 0.1%。
如何把 Falco 告警接入 SOC 工单系统?
Falcosidekick 原生支持 PagerDuty、Opsgenie、ServiceNow、Jira、TheHive 等 60+ 后端。推荐做法是按 priority 路由:CRITICAL → PagerDuty + TheHive 工单;HIGH → Slack + Loki;NOTICE 仅写 Loki。再配合 Falco Talon(0.3 版本)实现自动响应,例如自动隔离涉事 Pod 或回滚 Deployment。