使用 Falco 检测容器内执行 `nc -l` 的异常行为
解读
在国内金融、运营商、政务云等高度合规场景,容器逃逸后横向移动常借助 nc -l 建立反向 shell 或临时 C2 通道。面试官想验证三点:
- 你能否把“容器可观测性”与“运行时安全策略”打通;
- 是否熟悉 Falco 规则语法、宏与列表 的二次开发;
- 能否给出 可落地的闭环处置流程(检测→告警→溯源→阻断)。
回答要体现“镜像层最小化+运行时强管控”双轮驱动思路,避免只背规则。
知识点
- Falco 架构:内核驱动(kmod/eBPF)→ 审计事件 → 规则引擎 → 输出(stdout/syslog/gRPC/云审计 API)。
- 系统调用维度:
execve、clone、connect、accept等;nc -l会触发execve并携带特定参数。 - 规则原子:
container、proc.name、proc.args、spawned_process宏。 - 白名单机制:通过 K8s 注解
falco-rules-allowlist或 Falco List 排除合规调试 Pod。 - 性能调优:使用 eBPF probe 替代 kmod,降低 30%+ 上下文切换;规则前置过滤
evt.type=execve减少噪声。 - 等保 2.0/关保要求:三级以上系统需留存 180 天原始审计日志,Falco 输出到 Loki+MinIO 可满足。
- 联动阻断:Falco Sidekick 调用 K8s Admission 吊销 Pod serviceAccount 或 NetworkPolicy 隔离。
答案
- 规则编写
新建/etc/falco/rules.d/nc_listen.yaml,禁止覆盖默认规则,方便后续 Operator 统一下发:
- rule: 容器内执行 nc 监听
desc: 检测容器内启动 nc -l 的异常行为,疑似反向 shell
condition: >
spawned_process and container and
proc.name = "nc" and
(proc.args contains "-l" or proc.args contains "--listen")
output: >
容器内异常监听 (user=%user.name pod=%k8s.pod.name
container=%container.name image=%container.image.repository
proc.cmdline=%proc.cmdline)
priority: WARNING
tags: [container, network, mitre_execution]
- 灰度验证
在测试 Namespace 启动alpine:latestPod,执行nc -l 9999,Falco 日志出现:
WARNING 容器内异常监听 … proc.cmdline=nc -l 9999
- 告警通道
国内机房常禁外网,Sidekick 配置企业微信或钉钉机器人:
- output: dingtalk
webhook: https://oapi.dingtalk.com/robot/send?access_token=xxx
custom_headers: "Content-Type: application/json"
message_format: "Falco: {{ .Output }}"
- 溯源与处置
- 使用
kubectl exec抓现场:kubectl exec -it <pod> -- netstat -anp | grep 9999; - 把
/proc/<pid>/fd与 Falco 时间戳对齐,写入 SFS 3.0 对象存储 做证据链; - 如确认恶意,调用
kubectl delete pod <pod> --grace-period=0 --force,并封锁对应 Harbor 镜像版本。
- 性能与合规
- 生产集群 单节点 2000 Pod 场景,规则开启后 CPU 增加 <3%;
- 日志落盘到 SSD 盘独立分区,避免写满宿主机
/var/lib/docker; - 每周使用
falcoctl rules info做 规则版本审计,满足 等保 2.0 安全管理中心要求。
拓展思考
-
如何降低误报?
把合规调试镜像(如debug-toolkit:1.2.3)加入列表:- list: allowed_debug_images items: ['debug-toolkit:1.2.3', 'istio/proxyv2:1.18'] - macro: user_allowed_container condition: container.image.repository in (allowed_debug_images) - rule: 容器内执行 nc 监听 condition: > spawned_process and container and not user_allowed_container and proc.name = "nc" and (proc.args contains "-l" or proc.args contains "--listen") -
多集群统一治理
使用 Karmada+OPA Gatekeeper 下发 FalcoRule CRD,规则即代码纳入 GitLab CI,Merge Request 自动跑falco -r rules.d/ -T做静态检查。 -
零信任进阶
结合 SPIFFE ID 给每个 Pod 签发身份,Falco Sidekick 在检测到nc -l后直接调用 Istio AuthorizationPolicy 吊销该身份证书,实现 东西向流量自动熔断。