Falco 容器运行时安全检测基于系统调用监控技术,能够在容器与 Kubernetes 集群中实时识别异常行为,如容器内执行 shell、反弹连接、读取敏感文件等,是云原生环境下重要的运行时安全工具。本文介绍 Falco 的部署、规则配置与验证实战。
适用场景
- Kubernetes 集群与 Docker 容器运行时安全监控
- 检测容器逃逸前兆、反弹 shell、特权容器滥用等行为
- 满足等保 2.0、PCI-DSS 对运行时行为审计的合规要求
前置条件
- Linux 内核 3.10+(使用 eBPF 驱动需内核 4.15+)
- 已部署 Kubernetes 1.19+ 集群,或仅有 Docker 的运行环境
- Helm 3(采用 Chart 方式安装时)
原理说明
Falco 通过内核模块(kmod)或 eBPF 探针捕获系统调用(syscall)事件,将事件流与规则引擎匹配后输出告警。规则由 macro(宏)、list(列表)与 rule(规则)组成,例如用 container.id != host 判断事件是否发生在容器内。事件输出支持 stdout、文件、syslog、HTTP webhook 等多种方式,可灵活对接告警平台。
操作步骤
1. Helm 安装(推荐)
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
helm install falco falcosecurity/falco --namespace falco --create-namespace --set driver.kind=ebpf --set falco.jsonOutput=true --set falco.fileOutput.enabled=true --set falco.fileOutput.filename=/var/log/falco_events.json
2. Docker 环境直接运行
docker run -it --rm --privileged -v /var/run/docker.sock:/host/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /etc:/host/etc:ro falcosecurity/falco:latest
3. 编写自定义规则 /etc/falco/falco_rules_local.yaml
- rule: Shell inside container
desc: 容器内执行交互式 shell(排除已知运维容器)
condition: >
spawned_process and container and shell_procs
and proc.aname not in (shell_binaries) and not user_known_shell_procs
output: 容器内发现 shell (user=%user.name shell=%proc.name cmdline=%proc.cmdline)
priority: WARNING
tags: [container, shell]
4. 校验规则语法
falco --dry-run -r /etc/falco/falco_rules_local.yaml
–dry-run 只做规则加载与语法检查,不启动监控。
5. 触发验证
kubectl exec -it <pod-name> -- /bin/sh
# 容器内执行:whoami、cat /etc/shadow 等敏感操作后退出
随后查看 /var/log/falco_events.json(或 kubectl logs)是否新增 WARNING 级别告警记录。
配置验证
falco --dry-run -r ...无语法错误输出helm status falco状态为 deployed,kubectl logs -n falco deploy/falco无驱动加载错误- 执行 kubectl exec 后事件文件出现包含 “容器内发现 shell” 的告警
- 规则优先级从高到低为 EMERGENCY > ALERT > CRITICAL > ERROR > WARNING > NOTICE > INFO > DEBUG,可据此过滤告警
常见问题
FAQ 1:驱动选 kmod 还是 eBPF?
内核 4.15+ 优先推荐 eBPF(–set driver.kind=ebpf),免编译、兼容新内核;老内核使用 kmod,需提前安装对应内核头文件(linux-headers-$(uname -r)),否则驱动加载失败。
FAQ 2:误报较多如何调优?
不要在官方 falco_rules.yaml 上直接修改,应新增 falco_rules_local.yaml 追加同名规则覆盖,或降低规则 priority、在 condition 中追加 and not user_known_xxx 宏排除已知运维行为。
FAQ 3:告警如何对接钉钉、Slack?
启用 fileOutput 后,可由 filebeat 或 promtail 采集事件文件;更轻量的方式是启用 programOutput 调用脚本转发,或部署 falcosidekick,它原生支持 Slack、钉钉、Webhook、S3 等输出目标。
总结
Falco 以系统调用级行为监控填补了镜像扫描与基线检查的盲区,能发现”看起来正常但行为可疑”的运行时攻击。建议将默认规则集与少量自定义规则结合部署,事件落盘并转发至告警平台,与 Kube-bench 基线扫描、Trivy 镜像扫描配合,形成容器安全的扫描、基线、运行时三层防线。