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)强制实施。

签名验证流程包含三个核心步骤:

  1. 签名生成: 构建者使用私钥对镜像摘要(digest)签名,并将签名附加到镜像仓库。
  2. 策略定义: 集群管理员配置准入策略,指定允许的签名者身份(如邮箱、组织)。
  3. 运行时验证: 容器运行时或准入控制器在拉取镜像时验证签名,拒绝未签名或签名无效的镜像。
# 使用 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"
镜像签名验证流程 开发者构建镜像 Cosign 签名 推送至仓库 存储签名 准入控制器验证 允许/拒绝 Pod 验证失败时,准入控制器拒绝 Pod 创建并记录审计日志

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
镜像仓库安全架构 安全边界 RBAC 访问控制 推送/拉取/删除 TLS/mTLS 加密 传输层保护 审计日志 90 天保留 清理策略 30 天 所有组件协同工作:RBAC 控制访问 → TLS 保护传输 → 日志记录操作 → 策略清理旧镜像 建议结合镜像签名验证,形成完整的供应链安全闭环
供应链安全闭环: 将漏洞扫描、签名验证、基础镜像策略和仓库安全整合为统一策略,通过 OPA/Gatekeeper 或 Kyverno 在集群层面强制实施,实现从代码提交到运行时的全链路安全基线。