目录

1
2
3
4
title: "Goreplay-新增server字段抓取api来源"
draft: true
tags: [容器安全]
categories: [技术]

容器安全全生命周期防护体系建设

项目角色: SRE 工程师 —— 负责方案设计、组件部署、策略制定、日常运维
项目周期: 2025.11 - 至今(持续运营)
基础设施: ACK + Calico + 阿里云容器镜像仓库


一、项目背景与目标

1.1 痛点

问题 现状
准入无管控 任何镜像都能直接部署,没有镜像来源校验和安全上下文检查
运行时无感知 容器内执行 Shell、挂载敏感目录、提权操作等行为完全不可见
网络无隔离 Pod 之间东西向流量没有策略控制,默认全通
漏洞无闭环 镜像 CVE 扫描结果没有与部署策略联动

1.2 目标

构建 准入控制 → 网络微隔离 → 运行时检测 三层容器安全防护体系,覆盖容器全生命周期。


二、整体架构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
┌─────────────────────────────────────────────────────────────────┐
│                     容器安全三层防护体系                            │
├─────────────┬─────────────────────┬──────────────────────────────┤
│   Layer 1   │      Layer 2        │         Layer 3              │
│  准入控制    │    网络微隔离         │      运行时威胁检测            │
│  (事前拦截)  │   (事中阻断)          │      (事后告警)               │
├─────────────┼─────────────────────┼──────────────────────────────┤
│             │                     │                              │
│  Kyverno    │    NeuVector        │       Falco                  │
│  Admission  │    Network Policy   │    Syscall Audit             │
│  Controller │    WAF / DLP        │    K8s Audit Logs            │
│             │                     │                              │
├─────────────┼─────────────────────┼──────────────────────────────┤
│  ✓ 镜像来源验证  │  ✓ Pod 间流量可视化   │  ✓ Shell 逃逸检测             │
│  ✓ 安全上下文强制 │  ✓ 自动学习白名单      │  ✓ 特权容器检测               │
│  ✓ 资源限制强制   │  ✓ Learn→Monitor→Protect │  ✓ 敏感文件读取检测         │
│  ✓ CVE 阻断联动   │  ✓ WAF 规则防护       │  ✓ 异常进程启动检测            │
│  ✓ 命名空间标签管理 │  ✓ 出口流量控制       │  ✓ 网络连接异常检测            │
└─────────────┴─────────────────────┴──────────────────────────────┘

三层联动关系

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
用户 kubectl apply
       │
       ▼
  ┌──────────┐     拒绝     ┌─────────────┐
  │ Kyverno  │─────────────▶│  拦截部署     │
  │ 准入检查  │              └─────────────┘
  └────┬─────┘
       │ 放行
       ▼
  ┌──────────┐
  │ Pod 运行  │
  └────┬─────┘
       │
       ├──────────▶ NeuVector  网络策略 + WAF(主动阻断异常连接)
       │
       └──────────▶ Falco      syscall 审计(被动告警异常行为)
                              │
                              ▼
                         ┌──────────┐
                         │ 钉钉告警  │
                         └──────────┘

三、环境信息

K8s 发行版 K3s v1.27+
管理平台 KubeSphere
CNI Calico
容器运行时 containerd
镜像仓库 阿里云杭州 registry
JDK 基础镜像 Dragonwell 8u / 11u

四、Layer 1 — Kyverno 准入控制

4.1 部署

1
2
3
helm repo add kyverno https://kyverno.github.io/kyverno/
helm install kyverno kyverno/kyverno -n kyverno --create-namespace \
  --set admissionController.replicas=2

4.2 核心策略

策略 1:禁止使用 latest 标签 + 强制指定镜像仓库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: enforce-image-registry
spec:
  validationFailureAction: Enforce
  background: true
  rules:
    - name: validate-registry
      match:
        any:
        - resources:
            kinds:
              - Pod
      validate:
        message: "镜像必须来自 helian-health 仓库且不允许使用 latest 标签"
        pattern:
          spec:
            containers:
              - image: "registry.cn-hangzhou.aliyuncs.com/helian-health/*"
                ^(image): "!*:latest"

策略 2:强制非 root + 只读根文件系统

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: enforce-security-context
spec:
  validationFailureAction: Enforce
  rules:
    - name: require-non-root
      match:
        any:
        - resources:
            kinds: [Pod]
      validate:
        message: "容器必须以非 root 用户运行,且根文件系统为只读"
        pattern:
          spec:
            containers:
              - securityContext:
                  runAsNonRoot: true
                  readOnlyRootFilesystem: true
                  allowPrivilegeEscalation: false

策略 3:资源限制强制配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-resource-limits
spec:
  validationFailureAction: Enforce
  rules:
    - name: check-resources
      match:
        any:
        - resources:
            kinds: [Pod]
      validate:
        message: "必须设置 CPU 和内存的 requests 与 limits"
        pattern:
          spec:
            containers:
              - resources:
                  requests:
                    memory: "?*"
                    cpu: "?*"
                  limits:
                    memory: "?*"
                    cpu: "?*"

策略 4:禁止挂载 hostPath(敏感目录)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: block-hostpath
spec:
  validationFailureAction: Enforce
  rules:
    - name: deny-hostpath-sensitive
      match:
        any:
        - resources:
            kinds: [Pod]
      validate:
        message: "禁止挂载敏感 hostPath 目录"
        deny:
          conditions:
            all:
            - key: "{{ request.object.spec.volumes[?].hostPath.path || '' }}"
              operator: AnyIn
              value:
                - "/"
                - "/etc"
                - "/var/run/docker.sock"
                - "/proc"
                - "/sys"

4.3 Kyverno + CVE 扫描联动

配合阿里云镜像仓库漏洞扫描,通过 Kyverno VerifyImages 策略阻止部署含有高危 CVE 的镜像:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: check-image-cve
spec:
  validationFailureAction: Enforce
  rules:
    - name: verify-cve-scan-passed
      match:
        any:
        - resources:
            kinds: [Pod]
      verifyImages:
      - imageReferences:
        - "registry.cn-hangzhou.aliyuncs.com/helian-health/*"
        attestors:
        - entries:
          - keyless:
              subject: "*"
              issuer: "*"
              rekor:
                url: https://rekor.sigstore.dev
        attestations:
        - predicateType: https://example.com/cve-scan/v1
          conditions:
          - all:
            - key: "{{ status }}"
              operator: Equals
              value: "PASS"

五、Layer 2 — NeuVector 网络微隔离

5.1 部署

1
2
3
4
5
6
7
8
helm repo add neuvector https://neuvector.github.io/neuvector-helm/
helm install neuvector neuvector/core -n neuvector --create-namespace \
  --set controller.replicas=2 \
  --set enforcer.enabled=true \
  --set manager.svc.type=NodePort \
  --set manager.svc.nodePort=30443 \
  --set cve.scanner.enabled=true \
  --set k3s.enabled=true

5.2 工作模式(三段式推进)

1
2
3
4
  Discover (1-2周)    Monitor (1-2周)     Protect (长期)
  ─────────────────▶  ───────────────▶  ────────────────
   自动学习流量模式      告警但不拦截         正式阻断违规流量
   建立连接白名单        验证误报率           策略生效运行

5.3 核心策略配置

网络规则

1
2
3
4
5
6
7
8
Policy → Network Rules:
  Group: production     Mode: Protect
  规则:
    - 允许 prod-ns → db-ns:3306   (业务数据库连接)
    - 允许 prod-ns → redis-ns:6379 (缓存连接)
    - 允许 所有 ns → dns:53        (DNS 解析)
    - 禁止 prod-ns → external      (默认禁止出站)
    - 禁止 所有 ns → prod-ns 非白名单端口

WAF 防护

1
2
3
4
5
6
7
Policy → WAF:
  模式: Monitor → 逐步切 Protect
  规则集:
    ✓ SQL 注入检测
    ✓ XSS 攻击检测
    ✓ 路径遍历检测
    ✓ 命令注入检测

进程/文件策略

1
2
3
4
5
6
Policy → Process Profile:
  模式: Basic → 学习后切 Protect
  规则:
    ✓ 禁止 bash/sh/zsh 在业务容器中执行
    ✓ 禁止 curl/wget 在 non-init 容器中使用
    ✓ 禁止包管理器 (apt/yum/apk) 执行

5.4 网络拓扑可视化

NeuVector UI 的 Network Activity 页面,实时展示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
┌──────────┐    ┌──────────┐    ┌──────────┐
│ gateway  │───▶│business-svc│──▶│  mysql   │
│ (NodePort)   │  (Deploy)  │   │ (Stateful)│
└──────────┘    └─────┬─────┘    └──────────┘
                      │
                      ▼
                 ┌──────────┐
                 │  redis   │
                 │ (Stateful)│
                 └──────────┘

操作要点:

  1. 新服务上线后在 Discover 模式下观察 1-2 天
  2. 确认合法的连接关系已全部学习到
  3. 创建对应的 Group + 规则 → 切 Monitor → 确认无误报 → 切 Protect

六、Layer 3 — Falco 运行时威胁检测

6.1 部署

1
2
3
4
5
6
7
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm install falco falcosecurity/falco -n falco --create-namespace \
  --set falcosidekick.enabled=true \
  --set falcosidekick.config.webhook.address="https://oapi.dingtalk.com/robot/send?access_token=xxx" \
  --set driver.kind=ebpf \
  --set collectors.containerd.enabled=true \
  --set collectors.kubernetes.enabled=true

6.2 核心告警规则(自定义)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# /etc/falco/custom-rules.yaml
- rule: Container Drift Detected
  desc: 检测容器内新建或修改可执行文件
  condition: >
    spawned_process
    and container
    and proc.name in (chmod, cp, mv, wget, curl)
    and (fd.name startswith /etc or fd.name startswith /usr/bin)    
  output: >
    容器运行时漂移告警!
    容器=%container.name 镜像=%container.image
    进程=%proc.name 文件=%fd.name
    K8s_NS=%k8s.ns.name Pod=%k8s.pod.name    
  priority: CRITICAL
  tags: [container, drift, supply_chain]

- rule: Privileged Container Created
  desc: 检测特权容器的创建
  condition: >
        evt.type=container and container.privileged=true
  output: >
    特权容器创建告警!
    容器=%container.name 镜像=%container.image
    K8s_NS=%k8s.ns.name    
  priority: CRITICAL
  tags: [container, privilege]

- rule: Sensitive Mount Detected
  desc: 检测敏感路径挂载
  condition: >
    evt.type=container
    and container.mount.dest in (/etc, /proc, /var/run/docker.sock, /sys)    
  output: >
    敏感路径挂载告警!
    挂载路径=%container.mount.dest
    容器=%container.name K8s_NS=%k8s.ns.name    
  priority: CRITICAL
  tags: [container, mount, security]

- rule: Outbound C2 Connection
  desc: 检测到已知 C2 IP 的出站连接
  condition: >
    evt.type=connect
    and container
    and fd.sip in (known_c2_ip_list)    
  output: >
    C2 IP 连接告警!
    目标IP=%fd.rip:%fd.rport
    容器=%container.name Pod=%k8s.pod.name K8s_NS=%k8s.ns.name    
  priority: EMERGENCY
  tags: [network, c2, threat_intel]

6.3 falcosidekick 钉钉告警配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# values.yaml
falcosidekick:
  enabled: true
  config:
    dingtalk:
      webhookurl: "https://oapi.dingtalk.com/robot/send?access_token=xxx"
      # 按优先级分通道
      minimumpriority: "warning"
    webhook:
      address: ""  # 可额外发送到安全运营平台
  customRules:
    custom-rules.yaml: |-
            # 上述自定义规则

6.4 告警测试

1
2
3
4
5
6
7
# 方式1:执行 Shell 触发
kubectl exec -it <pod> -- sh -c "cat /etc/shadow"

# 方式2:Falco 自带事件生成器
kubectl run falco-event-generator \
  --image=falcosecurity/event-generator \
  -- run --all

七、三层联动场景

场景 1:新业务上线全流程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
开发提交 Deployment YAML
        │
        ▼
  ┌─────────────────┐
  │ Kyverno 自动检查  │
  │  ✓ 镜像来源      │
  │  ✓ 安全上下文    │
  │  ✓ 资源限制      │
  │  ✓ CVE 扫描      │
  └───────┬─────────┘
          │ 通过
          ▼
  ┌─────────────────┐
  │ Pod 创建启动     │
  └───────┬─────────┘
          │
          ▼
  ┌─────────────────────────────────────────┐
  │ NeuVector 自动学习 (Discover mode)       │
  │  → 识别通信关系 → 加入对应 Group          │
  │  → 学习进程行为 → 建立进程白名单           │
  └───────┬─────────────────────────────────┘
          │ 学习完成(1-2天)
          ▼
  ┌─────────────────┐
  │ 切 Monitor → 切 Protect │
  │ 网络策略 + WAF 正式生效  │
  └───────────────────────┘

场景 2:容器入侵检测 → 自动化响应

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
攻击者 getshell → 执行 shell 命令
        │
        ▼
  ┌─────────────────────────────┐
  │ Falco 检测到异常 syscall     │
  │ → 触发 "Container Drift" 告警│
  └───────┬─────────────────────┘
          │
          ▼
  ┌───────────────────────────────────┐
  │ falcosidekick → 钉钉通知 SRE      │
  │ NeuVector 同步 → 隔离该 Pod        │
  │ (network quarantine)              │
  └───────────────────────────────────┘

场景 3:C2 IP 检测闭环

1
2
3
4
5
6
7
8
9
Falco 检测到 Pod 连接已知 C2 IP
        │
        ├──▶ 钉钉告警(EMERGENCY 级别)
        │
        ├──▶ NeuVector API → 自动隔离 Pod
        │     curl -X POST https://neuvector-mgr/v1/workload/{id}/quarantine
        │
        └──▶ Kyverno Cleanup Policy → 自动清理被污染 Pod
              (防止镜像被重新拉取)

八、日常运维 SOP

8.1 每日巡检清单

检查项 命令/入口 预期结果
Falco 告警 kubectl logs -n falco -l app.kubernetes.io/name=falco --tail=50 无 CRITICAL 告警
NeuVector 事件 Web UI → Security Events 无 PROTECT 模式拦截的新事件
Kyverno 拒绝记录 kubectl get clusterpolicyreport -A 拒绝数量正常范围内
各组件 Pod 健康 kubectl get pods -n falco -n neuvector -n kyverno 全部 Running

8.2 周度任务

  • 检查 NeuVector Discover → Monitor 过渡状态(新上线的 Group)
  • 审查 Falco 告警趋势,调整规则阈值避免误报
  • Kyverno 策略版本对账(仓库最新 vs 集群当前)
  • 镜像仓库 CVE 扫描报告审阅

8.3 月度任务

  • Falco 自定义规则 review(新增/删除/修改)
  • NeuVector 策略有效性验证(通过 group 的 allowed/denied 计数判断)
  • Kyverno 策略覆盖率统计(哪些命名空间在保护范围内)

8.4 告警分级处理

级别 来源 响应时间 处理方式
EMERGENCY Falco C2 连接 15分钟 立即隔离 Pod + 排查
CRITICAL Falco 特权容器/漂移 30分钟 核查是否为合规操作
WARNING NeuVector 网络阻断 1小时 确认是否为新业务流量
INFO Kyverno 拒绝 按需 通知开发修正 YAML

九、故障处理经验

故障 1:NeuVector 误封业务流量

现象: 业务线反馈某个服务访问超时
排查过程:

1
2
3
4
5
6
# 1. 确认 NeuVector 是否拦截
kubectl logs -n neuvector <enforcer-pod> | grep "deny"
# 2. 查看 Security Events
# NeuVector Web UI → Security Events → 筛选 deny 事件
# 3. 确认策略
# 查看对应 Group 的 Network Rules,找到被阻断的规则

根因: Monitor 学习时间不足(仅 4 小时),合法连接未学习到
解决: 将该 Group 回退 Discover → 跑满 48 小时 → Monitor → Protect
教训: Discover 模式至少跑 24-48 小时覆盖完整业务周期

故障 2:Falco 大量误报告警刷屏

现象: 钉钉每分钟收到数十条 Falco 告警
排查过程:

1
kubectl logs -n falco <falco-pod> | grep "Warning" | sort | uniq -c | sort -rn | head

根因: 健康检查探针频繁执行 cat /health 触发了 Sensitive File Read 规则
解决: 自定义规则中排除 known-probe 容器标签

1
2
3
condition: >
  ...
  and not k8s.pod.label.app contains "health-check"  

故障 3:Kyverno 导致 Deployment 批量失败

现象: CI/CD 流水线多个 Deployment 创建失败
排查过程:

1
2
kubectl describe deployment <name> | grep -A 20 "Events"
kubectl get clusterpolicyreport -o yaml | grep -B 5 "fail"

根因: Kyverno enforce-security-context 策略要求所有 Pod 设置 readOnlyRootFilesystem: true,部分中间件(如 Nacos)启动需要写临时文件
解决: 在策略中增加 exclude 命名空间

1
2
3
4
5
6
7
8
match:
  any:
  - resources:
      kinds: [Pod]
exclude:
  any:
  - resources:
      namespaces: [nacos, logging, monitoring]

十、项目成果

指标 数据
准入拦截 累计拦截 XX 次不合规部署(latest 标签、无 resource limits、root 运行)
运行时告警 Falco 日均告警 XX 条,误报率 < 5%
网络隔离 XX 个业务 Group 处于 Protect 模式,阻断异常连接 XX 次
漏洞联动 通过 Kyverno + 镜像扫描联动,阻止 XX 个高危 CVE 镜像部署
应急响应 C2 IP 检测 → 隔离 → 通知 自动化链路,平均响应 < 5 分钟

十一、关键决策记录

决策 选项 选择 理由
准入控制器 OPA/Gatekeeper vs Kyverno Kyverno YAML 策略直观,与 K8s 原生风格一致,学习成本低
网络隔离 Calico NetworkPolicy vs NeuVector NeuVector 提供可视化拓扑和学习模式,运维友好;Layer7 WAF 能力
运行时检测 Falco vs Aqua/Twistlock Falco 开源、CNCF 孵化项目、社区活跃、eBPF 方案性能开销低
告警通道 Webhook vs 钉钉 钉钉 + Webhook 钉钉满足 95% 场景,Webhook 对接安全运营平台作为备份

十二、待优化方向

  1. Falco + FalcoTalon 自动化响应: 当前仅告警,引入 FalcoTalon 实现检测→自动隔离→回收 Pod 的闭环
  2. Kyverno Policy-as-Code: 将 Kyverno 策略纳入 Git 仓库,通过 CI/CD 自动同步到集群
  3. NeuVector + SIEM 集成: 将 NeuVector 事件通过 syslog/Webhook 推送到 SIEM 平台做统一分析
  4. Grafana 统一大盘: 整合 Falco 告警 + NeuVector 事件 + Kyverno 审计到单一 Grafana Dashboard