使用 Falco 检测容器内执行 `nc -l` 的异常行为

解读

在国内金融、运营商、政务云等高度合规场景,容器逃逸后横向移动常借助 nc -l 建立反向 shell 或临时 C2 通道。面试官想验证三点:

  1. 你能否把“容器可观测性”与“运行时安全策略”打通;
  2. 是否熟悉 Falco 规则语法、宏与列表 的二次开发;
  3. 能否给出 可落地的闭环处置流程(检测→告警→溯源→阻断)。

回答要体现“镜像层最小化+运行时强管控”双轮驱动思路,避免只背规则。

知识点

  • Falco 架构:内核驱动(kmod/eBPF)→ 审计事件 → 规则引擎 → 输出(stdout/syslog/gRPC/云审计 API)。
  • 系统调用维度execvecloneconnectaccept 等;nc -l 会触发 execve 并携带特定参数。
  • 规则原子containerproc.nameproc.argsspawned_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 隔离。

答案

  1. 规则编写
    新建 /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]
  1. 灰度验证
    在测试 Namespace 启动 alpine:latest Pod,执行 nc -l 9999,Falco 日志出现:
WARNING 容器内异常监听 … proc.cmdline=nc -l 9999
  1. 告警通道
    国内机房常禁外网,Sidekick 配置企业微信或钉钉机器人
- output: dingtalk
  webhook: https://oapi.dingtalk.com/robot/send?access_token=xxx
  custom_headers: "Content-Type: application/json"
  message_format: "Falco: {{ .Output }}"
  1. 溯源与处置
  • 使用 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 镜像版本
  1. 性能与合规
  • 生产集群 单节点 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 吊销该身份证书,实现 东西向流量自动熔断