4. 容器镜像安全基线:镜像漏洞扫描、镜像签名与验证、基础镜像选择策略、镜像仓库安全
容器镜像作为云原生应用交付的核心载体,其安全性直接决定了生产环境的整体风险水平。镜像安全基线覆盖从构建、存储到运行的全生命周期,包括漏洞扫描、签名验证、基础镜像选型与仓库防护四个关键维度。
4.1 镜像漏洞扫描:从被动修复到主动阻断
镜像漏洞扫描是安全基线的第一道防线。现代扫描工具(如 Trivy、Grype、Anchore)不仅检测操作系统包(apt、yum、apk)的 CVE,还覆盖语言依赖(npm、pip、maven)和配置文件中的密钥泄露。
关键指标: 生产环境应强制要求镜像零高危漏洞(CVSS ≥ 7.0)准入;中危漏洞(CVSS 4.0–6.9)需在 72 小时内修复并重新构建。
扫描策略应嵌入 CI/CD 流水线,在镜像推送至仓库前完成阻断。以下为典型扫描策略对比:
| 扫描阶段 | 触发时机 | 阻断条件 | 告警方式 |
|---|---|---|---|
| 构建时扫描 | Docker build 完成后 | 存在任意高危漏洞 | 流水线失败 + 邮件通知 |
| 仓库准入扫描 | 镜像 push 至仓库前 | 漏洞数量超过阈值 | Webhook 阻断 + 工单创建 |
| 运行时周期性扫描 | 每 24 小时 | 新增高危漏洞 | Slack 告警 + 自动创建 Jira |
# 使用 Trivy 在 CI 中执行扫描并输出 JSON 结果
trivy image --severity HIGH,CRITICAL --exit-code 1 --format json \
--output scan-result.json \
registry.example.com/app:v1.2.3
4.2 镜像签名与验证:防止篡改与供应链投毒
镜像签名通过非对称加密为镜像内容生成数字签名,确保镜像在传输和存储过程中未被篡改。业界主流方案包括 Cosign(Sigstore 项目)和 Notation(OCI 标准)。
最佳实践: 使用 Sigstore 的 Keyless 模式(基于 OIDC 身份)替代传统密钥管理,降低密钥泄露风险。签名验证应在容器运行时(如 Kyverno、OPA Gatekeeper)强制实施。
签名验证流程包含三个核心步骤:
- 签名生成: 构建者使用私钥对镜像摘要(digest)签名,并将签名附加到镜像仓库。
- 策略定义: 集群管理员配置准入策略,指定允许的签名者身份(如邮箱、组织)。
- 运行时验证: 容器运行时或准入控制器在拉取镜像时验证签名,拒绝未签名或签名无效的镜像。
# 使用 Cosign 签名镜像(Keyless 模式)
cosign sign --keyless --identity "builder@example.com" \
registry.example.com/app:v1.2.3
# 在 Kyverno 策略中验证签名
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: verify-image-signature
spec:
rules:
- name: check-cosign
match:
resources:
kinds:
- Pod
verifyImages:
- image: "registry.example.com/*"
keyless:
identities:
- issuer: "https://accounts.google.com"
subject: "builder@example.com"
4.3 基础镜像选择策略:最小化攻击面
基础镜像的选择直接影响漏洞密度和修复成本。推荐采用 Distroless 或 Alpine 等精简镜像,避免包含 shell、包管理器等非必要组件。
常见陷阱: 使用
latest 标签会导致不可复现的构建;基础镜像应固定到具体 digest(如 alpine:3.19@sha256:... ),并定期更新至最新补丁版本。
基础镜像选型评估维度:
| 镜像类型 | 大小 | 漏洞数量(典型) | 适用场景 |
|---|---|---|---|
| Distroless | ~20 MB | 0–2 | 生产环境、高安全要求 |
| Alpine | ~5 MB | 0–5 | 通用微服务、CI 构建 |
| Ubuntu | ~80 MB | 50–200 | 开发环境、依赖复杂场景 |
4.4 镜像仓库安全:访问控制与审计
镜像仓库是供应链攻击的高价值目标。安全基线应覆盖以下方面:
- 访问控制: 基于角色的访问控制(RBAC),区分推送、拉取、删除权限;禁止匿名拉取。
- 传输加密: 强制使用 HTTPS 和 TLS 1.2+;内部仓库建议启用 mTLS。
- 审计日志: 记录所有镜像推送、拉取、删除操作,保留至少 90 天。
- 镜像保留策略: 自动清理超过 30 天的未使用镜像标签,减少漏洞暴露面。
# Harbor 仓库策略示例:自动清理旧镜像
apiVersion: goharbor.io/v1alpha1
kind: RetentionPolicy
metadata:
name: clean-old-images
spec:
schedule: "0 2 * * *"
rules:
- tag: "latest"
retain: 10
- tag: "v*"
retain: 30
- untagged: true
retain: 0
供应链安全闭环: 将漏洞扫描、签名验证、基础镜像策略和仓库安全整合为统一策略,通过 OPA/Gatekeeper 或 Kyverno 在集群层面强制实施,实现从代码提交到运行时的全链路安全基线。