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)│
└──────────┘
|
操作要点:
- 新服务上线后在 Discover 模式下观察 1-2 天
- 确认合法的连接关系已全部学习到
- 创建对应的 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 对接安全运营平台作为备份 |
十二、待优化方向
- Falco + FalcoTalon 自动化响应: 当前仅告警,引入 FalcoTalon 实现检测→自动隔离→回收 Pod 的闭环
- Kyverno Policy-as-Code: 将 Kyverno 策略纳入 Git 仓库,通过 CI/CD 自动同步到集群
- NeuVector + SIEM 集成: 将 NeuVector 事件通过 syslog/Webhook 推送到 SIEM 平台做统一分析
- Grafana 统一大盘: 整合 Falco 告警 + NeuVector 事件 + Kyverno 审计到单一 Grafana Dashboard