4. 镜像仓库安全策略:访问控制、镜像签名验证、漏洞扫描、镜像清理策略
镜像仓库是容器供应链的核心资产节点,一旦被攻破或配置失当,攻击者可以注入恶意镜像、窃取敏感负载或篡改生产部署。本章围绕仓库安全四维策略展开:访问控制(谁可以拉/推)、签名验证(镜像是否可信)、漏洞扫描(镜像内已知风险)、清理策略(防止过期镜像堆积与泄露)。
容量水位视角: 安全策略直接影响仓库存储增长曲线与拉取性能。例如,未清理的过期镜像会占用存储配额,而签名验证失败会导致部署流水线阻塞,形成“安全积压”。巡检时应将安全事件与存储水位关联分析。
4.1 访问控制:最小权限与多租户隔离
访问控制是仓库安全的第一道门。生产环境应遵循 RBAC(基于角色的访问控制) 与 ABAC(基于属性的访问控制) 混合模型,确保每个身份只拥有完成其任务所需的最小权限。
| 角色 | 典型权限 | 适用场景 |
|---|---|---|
| 匿名用户 | 只读(公开仓库) | 开源镜像拉取 |
| 开发者 | 推送到 dev/feature 命名空间 | 日常开发与 CI 构建 |
| 安全审核员 | 只读 + 扫描报告查看 | 合规审计与漏洞追踪 |
| 运维管理员 | 全仓库管理 + 清理策略配置 | 仓库运维与容量规划 |
巡检要点: 检查是否存在长期未轮转的机器人令牌、是否启用了 IP 白名单或 VPC 端点限制、匿名拉取是否被意外开启。建议每季度执行一次权限审计,移除僵尸账号与过期密钥。
4.2 镜像签名验证:从推送到部署的信任链
镜像签名使用非对称加密为镜像内容生成数字签名,确保镜像在构建后未被篡改。主流方案包括 Docker Content Trust (DCT)、Notary 以及 Sigstore Cosign。签名验证应嵌入 CI/CD 流水线的两个关键节点:推送时强制签名 与 部署前验证签名。
常见陷阱: 签名密钥管理不当(如私钥泄露、未轮转)、签名验证跳过(CI 中设置 DCT_SKIP_VERIFY=true)、以及签名存储与镜像仓库分离导致的验证超时。巡检时应检查签名覆盖率:
已签名镜像数 / 总镜像数 ≥ 95%。
4.3 漏洞扫描:持续检测与阻断策略
镜像漏洞扫描应覆盖 操作系统包(如 apt、yum、apk)与 应用依赖(如 pip、npm、maven)。扫描时机包括:推送时触发、定时全量扫描、以及部署前强制扫描。扫描结果应关联 CVE 严重等级 与 修复状态,形成阻断策略。
| 扫描阶段 | 阻断策略 | 容量水位影响 |
|---|---|---|
| 推送时扫描 | Critical/High 漏洞 → 拒绝推送 | 减少无效镜像存储,降低仓库膨胀速度 |
| 定时全量扫描 | 发现新漏洞 → 通知 + 自动打标签(quarantine) | 隔离高危镜像,避免被拉取部署 |
| 部署前扫描 | 准入控制器拦截未通过扫描的镜像 | 防止已过期的扫描结果进入生产 |
巡检指标: 扫描覆盖率(应接近 100%)、扫描延迟(推送后 5 分钟内完成)、以及“已隔离镜像”占仓库总存储的比例。若隔离镜像占比超过 10%,说明基础镜像更新滞后,需推动基础镜像重建。
4.4 镜像清理策略:生命周期管理与存储水位控制
镜像清理是防止仓库存储无限膨胀、降低安全暴露面的关键手段。清理策略应基于 标签规则、时间窗口 与 引用计数 三个维度。
4.4.1 清理策略核心规则
- 标签保留规则: 保护
latest、stable、release-*等关键标签不被清理;未打标签的镜像(<none>:<none>)超过 7 天自动删除。 - 时间窗口规则: 非活跃镜像(最近 90 天未被拉取)进入冷存储或删除;开发分支镜像保留 30 天。
- 引用计数规则: 被 K8s Deployment/StatefulSet 引用的镜像禁止清理;清理前需扫描集群内所有运行 Pod 的镜像引用。
- 安全隔离规则: 被标记为“高危漏洞”且无法修复的镜像,立即隔离并设置 7 天自动删除倒计时。
容量水位联动: 建议设置存储阈值告警(如仓库使用量达到配额的 80%),自动触发清理策略执行。清理后应生成报告,对比清理前后的存储节省量,用于容量规划与成本分摊。
4.5 四维策略综合巡检清单
| 维度 | 巡检项 | 健康标准 | 告警阈值 |
|---|---|---|---|
| 访问控制 | 匿名拉取是否关闭 | 关闭 | 开启 → 高危 |
| 访问控制 | 机器人令牌轮转周期 | ≤ 90 天 | 超过 180 天 → 高危 |
| 签名验证 | 镜像签名覆盖率 | ≥ 95% | < 80% → 高危 |
| 签名验证 | 部署准入策略启用 | 已启用 | 未启用 → 高危 |
| 漏洞扫描 | 扫描覆盖率 | 100% | < 90% → 中危 |
| 漏洞扫描 | Critical 漏洞修复时长 | ≤ 24 小时 | 超过 72 小时 → 高危 |
| 清理策略 | 过期镜像占比 | ≤ 10% | 超过 20% → 中危 |
| 清理策略 | 清理策略执行频率 | 每日 | 未配置 → 高危 |
容量水位安全红线: 当仓库存储使用量超过配额 85% 时,应暂停所有非紧急推送,优先执行清理策略。同时检查是否因签名验证失败或扫描阻塞导致镜像堆积,形成“安全死锁”——即镜像无法通过验证,也无法被清理(因为被 Deployment 引用)。此时需要人工介入,更新 Deployment 镜像引用或强制清理。