Falco 安装与使用
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| BPF | Berkeley Packet Filter | 伯克利包过滤器技术 |
| BTF | BPF Type Format | BPF 类型格式 |
| CPU | Central Processing Unit | 中央处理器 |
| eBPF | extended Berkeley Packet Filter | 扩展 BPF,用于内核可编程观测等场景 |
| ID | Identifier | 标识符 |
| JSON | JavaScript Object Notation | 一种结构化数据格式 |
| PVC | Persistent Volume Claim | 持久卷申领 |
| RBAC | Role-Based Access Control | 基于角色的访问控制 |
| SIEM | Security Information and Event Management | 安全信息与事件管理 |
| TLS | Transport Layer Security | 传输层安全协议 |
Falco 是什么#
Falco 用于运行时威胁检测,可通过 Linux 系统调用观察容器和节点上的行为,在匹配规则时输出告警。本文使用 Helm 部署 DaemonSet,并通过一条自定义文件操作规则验证告警链路。
Falco 默认负责检测和告警,不会自动阻止系统调用或终止容器。它与 Kyverno 可以配合使用:Kyverno 管理资源准入,Falco 观察资源运行后的行为。
安装准备#
- 准备 Linux 节点的 Kubernetes 测试集群,以及已配置的
kubectl和 Helm。 - 确保有部署 DaemonSet、RBAC 和访问宿主机资源所需的权限;集群的 Pod Security 或其他准入策略必须允许 Falco 所需的安全上下文和挂载。
- 本文选择
modern_ebpf驱动。节点内核需要 BTF 和 BPF ring buffer 等特性,通常 Linux 5.8 及以上具备,但应按实际内核特性判断。 - macOS 可以作为运行 Helm 和 kubectl 的客户端,Falco 本身运行在 Linux 节点上。官方快速入门不适用于 Windows/macOS 的 Docker Desktop 集群。
驱动要求参考内核事件与驱动文档,测试环境要求参考官方 Kubernetes 入门指南。不允许宿主机访问的托管运行环境需要先确认平台支持情况。
kubectl config current-context
kubectl get nodes -o wide
helm version如需检查 BTF,在实际 Linux 节点上执行以下命令;该检查只验证 BTF 文件存在,不代表所有 eBPF 特性和权限都已满足:
uname -r
test -r /sys/kernel/btf/vmlinux && echo "BTF available"使用 Helm 安装#
先查询 Chart 并固定版本,检查其应用版本和默认配置。部署方式见官方 Helm 文档。
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
helm search repo falcosecurity/falco --versions
# 替换为选定且适合当前集群的 Chart 版本。
export FALCO_CHART_VERSION='<选定的 Chart 版本>'
helm show chart falcosecurity/falco --version "$FALCO_CHART_VERSION"
helm show values falcosecurity/falco --version "$FALCO_CHART_VERSION" > falco-default-values.yaml创建 falco-values.yaml:
driver:
kind: modern_ebpf
tty: true
falco:
json_output: true
stdout_output:
enabled: true这里的 driver.kind 是 Helm Chart 参数,由 Chart 生成 Falco 配置;不要将它与 Falco 原生配置的 engine.kind 混用。参数结构应与所选版本的 values 对照,亦可查阅官方 Chart 配置。
helm upgrade --install falco falcosecurity/falco --namespace falco --create-namespace --version "$FALCO_CHART_VERSION" -f falco-values.yaml --wait --timeout 5m
kubectl -n falco get daemonsets,pods -o wide
kubectl -n falco rollout status daemonset/falco --timeout=180s
kubectl -n falco logs -l app.kubernetes.io/name=falco -c falco --tail=100 --prefix=true确认 DaemonSet 的 DESIRED、CURRENT、READY 数量符合预期,并检查每个需要监控的节点都运行了 Falco。污点、节点选择器或不支持的节点环境都可能造成监控缺口。
示例:检测容器写入指定测试文件#
1. 添加自定义规则#
将以下 customRules 追加到前面同一个 falco-values.yaml 的顶层,保留已有的 driver、tty 和 falco 配置。文件是 Helm values,不应通过 kubectl apply 应用。
customRules:
demo-rules.yaml: |-
- rule: Demo container writes marker file
desc: Detect a container opening the demo marker for writing
condition: >
evt.type in (open, openat, openat2)
and evt.is_open_write=true
and fd.typechar='f'
and fd.num>=0
and container.id != host
and fd.name=/tmp/falco-demo-marker
output: >
Demo marker opened for writing
(file=%fd.name command=%proc.cmdline container_id=%container.id)
priority: WARNING
tags: [demo, filesystem]规则检查容器内特定路径的成功写入打开操作,使用独立规则名,便于从其他告警中识别。它不依赖 Kubernetes 元数据补全,也不需要读取敏感文件。规则字段含义可参考Falco 规则基础。
更新安装并等待完成:
helm upgrade --install falco falcosecurity/falco --namespace falco --create-namespace --version "$FALCO_CHART_VERSION" -f falco-values.yaml --wait --timeout 5m
kubectl -n falco rollout status daemonset/falco --timeout=180s
kubectl -n falco logs -l app.kubernetes.io/name=falco -c falco --tail=100 --prefix=true先确认没有规则加载错误,再触发测试。若所选 Chart 未自动重载规则,可执行 kubectl -n falco rollout restart daemonset/falco,并再次等待 rollout 完成。
2. 创建测试容器并触发事件#
kubectl create namespace falco-demo
kubectl -n falco-demo run falco-demo --image=busybox:1.37.0 --restart=Never --command -- sleep 3600
kubectl -n falco-demo wait --for=condition=Ready pod/falco-demo --timeout=120s
kubectl -n falco-demo get pod falco-demo -o wide
kubectl -n falco-demo exec falco-demo -- sh -c 'echo falco-demo > /tmp/falco-demo-marker'确认测试 Pod 所在节点有就绪的 Falco Pod。写入命令正常完成是预期行为,Falco 只生成告警。
3. 查看告警#
kubectl -n falco logs -l app.kubernetes.io/name=falco -c falco --since=5m --tail=-1 --prefix=true在日志中寻找 Demo container writes marker file。启用 JSON 输出后,告警通常包含 rule、priority、output 和 output_fields;其中应能看到 /tmp/falco-demo-marker。使用标签选择器读取各 Falco Pod,避免只查看了其他节点的日志。
需要重复验证时,再执行一次写入命令即可。实际告警可能同时包含默认规则的结果。
可选:通过 Falcosidekick 转发告警#
Falcosidekick 用于将 Falco 告警转发到外部日志或通知系统。只启用组件不会自动配置任何外部接收端,需根据目标系统设置输出参数,参考官方转发文档。
可在现有 falco-values.yaml 顶层追加:
falcosidekick:
enabled: true然后再次执行前面的 Helm 更新命令。Chart 会配置 Falco 到 Falcosidekick 的连接。通过以下命令检查转发组件:
kubectl -n falco get deployments,services
kubectl -n falco logs deployment/falco-falcosidekick --tail=100Webhook、令牌等凭据应通过所选 Chart 支持的 Secret 配置提供,不应写入文档或提交到 Git。接入完成后再次触发测试文件规则,确认接收端收到事件。
日常使用与排错#
kubectl -n falco get pods -o wide
kubectl -n falco describe daemonset falco
kubectl -n falco get events --sort-by=.lastTimestamp| 现象 | 检查方向 |
|---|---|
| Pod Pending | 节点污点、调度约束、资源不足及准入策略 |
| Init 容器失败 | 镜像或规则制品下载是否可达,查看对应 Init 容器日志 |
| eBPF 加载失败 | 实际节点是否具备 BTF、ring buffer 和所需权限;按平台调整驱动配置 |
| 自定义规则未生效 | values 缩进、规则语法、启动日志,以及 ConfigMap 更新是否已加载 |
| 测试没有告警 | 测试 Pod 所在节点是否被覆盖、写入是否成功、日志时间范围是否正确 |
Kubernetes 字段为 <NA> |
检查容器运行时和元数据插件配置;元数据缺失不一定表示没有采集到系统调用 |
| 告警丢失或事件丢弃 | 查看 dropped syscall 相关日志/指标,评估节点负载、Falco CPU 和缓冲区配置 |
针对某个反复重启的 Pod,可执行 kubectl -n falco logs <Pod 名称> -c falco --previous 查看上一次运行日志。驱动和启动问题可进一步查阅官方排错文档。
生产环境应持续观察事件丢弃情况,并基于实际工作负载收敛规则和例外条件,避免直接关闭整类检测。本文只演示系统调用事件,Kubernetes Audit 事件需要单独配置事件源和对应插件。
企业 Hands-on:运行时告警接入值班闭环#
前面的测试文件规则只验证引擎;企业演练采用 真实业务基线。Falco 只检测,不保证阻断;策略阻断由准入、最小权限和网络控制承担。先确认节点内核/驱动、特权权限及 Autopilot/Fargate 等平台支持边界。
平台先基于一周以上正常流量审阅默认规则噪声,建立每条规则的负责人、严重度、例外依据和有效期。输出 JSON,经 Falcosidekick 的企业 TLS 接收端接入 SIEM/值班系统,凭据由 Secret 提供;至少覆盖 cluster、namespace、Pod、container、rule、time,避免采集命令参数中的敏感凭据。
在真实预生产 workload 使用的服务账户/容器安全上下文上,给专门的验证 Job加 security-exercise: approved 标签;Job 只访问自身 /tmp,不读取系统或业务秘密。追加下方规则到原 Helm values 的 customRules,保留原生产规则:
customRules:
enterprise-exercise.yaml: |-
- rule: Approved runtime exercise executes shell
desc: Validate SIEM delivery using an explicitly labelled exercise workload
condition: >
spawned_process and container and
k8s.ns.name = orders and
k8s.pod.label.security-exercise = approved and
proc.name in (sh, bash)
output: >
Approved security exercise
(rule=%evt.type ns=%k8s.ns.name pod=%k8s.pod.name
container=%container.id process=%proc.name)
priority: NOTICE
tags: [enterprise_exercise]先按所选 Falco 版本验证 Kubernetes metadata 字段/富化组件可用;没有元数据时该规则可能不匹配,不能假装“没告警所以安全”。这是告警交付验证规则,并不替代真实异常 shell、敏感文件、意外网络连接的生产检测策略。
helm upgrade --install falco falcosecurity/falco -n falco --version "$FALCO_CHART_VERSION" -f falco-values.yaml --wait --timeout 10m
kubectl -n falco rollout status daemonset/falco --timeout=5m
kubectl -n falco logs -l app.kubernetes.io/name=falco -c falco --since=5m --prefix=true企业验证 Job 使用批准的固定 digest 诊断镜像,命令只运行 sh -c 'printf runtime-exercise',设置 runAsNonRoot、drop ALL、只读根目录和资源上限。在各节点池各执行一次:核对事件到达 SIEM、去重关联、通知路由、值班确认和工单关闭;保存总耗时与事件 ID。
| 故障演练 | 必须确认 |
|---|---|
| Agent 滚动升级 | 节点池无长期覆盖缺口,驱动/规则加载正确,丢事件有告警 |
| 转发端短暂不可用 | 重试、队列/丢弃指标可见;Falcosidekick 不应被假设为无限持久消息队列 |
| 节点压力上升 | syscall drop 指标、CPU/内存和业务 p95 可接受,必要时调整资源和规则 |
| 告警接收身份越权 | 只能写指定租户/索引,不能读全企业日志或控制云资源 |
对不可容忍的告警丢失,采用已验证的持久消息链路并测算容量。默认不要自动杀容器;自动响应必须精确匹配、可审计、限速且先在 staging 演练,以免误报中断订单业务。
验证完成移除 exercise Job/规则,保留生产检测与收敛后的例外。恢复时回到上一个已验证 Chart、完整 values 和规则集,检查驱动兼容,再重放验证事件。
原实验的升级与清理#
将 Chart 版本、values 和自定义规则一起保存。升级前检查 Falco、Chart、规则集和插件的兼容要求;更新 FALCO_CHART_VERSION 后使用完整 values 执行前面的 Helm 更新命令,完成后重新触发测试规则。
清理测试 Pod 和命名空间:
kubectl delete namespace falco-demo如果继续保留 Falco,从 falco-values.yaml 中删除本文的测试规则并重新执行 Helm 更新。仅在不再需要运行时检测时卸载:
helm uninstall falco --namespace falco卸载后相关节点将不再由该实例检测。若额外启用了带存储的组件,还需单独检查其 PVC 保留策略。