凭据泄漏在哪里发生
构建缓存、镜像层、制品归档都可能夹带凭据:包管理器配置(.npmrc、.pypirc)、kubeconfig、镜像层里的环境变量与文件、CI 缓存目录都在高发名单上。对策分两头:事前用短时凭据与密钥挂载替代「写进构建环境」,事后定期扫描制品与历史层,发现即轮换凭据并重建受影响制品。
基本信息
| 适用平台 | Docker/BuildKit 构建、CI 缓存、制品库 |
|---|---|
| 高发位置 | 包管理器配置、kubeconfig、镜像层里的环境变量与文件、CI 缓存目录 |
| 对策 | 构建期用密钥挂载;凭据最小权限且短时效;事后扫描制品 |
| 清理 | 发现即轮换凭据并重建受影响制品 |
| 审计 | 定期扫描仓库历史与制品中的凭据残留 |
典型使用场景
- 私有源认证:npm/pip 私有源令牌不进镜像层,用挂载注入
- 镜像审计:对现网镜像做层扫描,找出历史残留凭据
- 缓存治理:CI 缓存目录访问控制与定期清理
- 事故响应:先轮换再重建制品,最后复盘入口
- 发布前检查:把「制品内无凭据」列入检查清单
- 轮换联动:发现泄漏先轮换凭据再清理,顺序不能反
BuildKit 挂载密钥
BuildKit 挂载密钥
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm ci # 只读挂载,文件不进层
# 构建命令:docker build --secret id=npmrc,src=$HOME/.npmrc .
# 抽查:镜像历史里不应出现令牌字符串
docker history --no-trunc registry.example.com/app:1.9.0 | grep -i -E 'token|password' || echo clean高发位置与对策
| 位置 | 怎么进去的 | 对策 |
|---|---|---|
| 包管理器配置 | 复制或写入凭据文件 | 密钥挂载 |
| 镜像层环境变量 | 构建指令写入 | 改为运行时注入 |
| CI 缓存目录 | 构建过程写盘 | 缓存按权限隔离 |
| 制品归档 | 打包带上本地文件 | 打包白名单与扫描 |
缓存与层是「历史沉积」:改流程后旧内容仍在,需要清理与扫描确认,删除源配置不等于历史消失。
扫描范围要两边都覆盖:仓库全量拉取扫描加现网镜像抽查,只扫源码会漏掉制品里的残留。