标准答案
- 构建阶段需要凭据时应使用构建器提供的 secret mount,并确保凭据不写入最终层和缓存。
- 运行时秘密应通过受控 secret 管理和挂载方式注入,限制读取权限、生命周期和审计范围。
- 镜像、Dockerfile、构建日志、进程命令行和环境快照都要作为可能泄露的位置检查。
- 一旦秘密进入镜像或日志,应立即轮换并检查访问记录,不能只删除 Dockerfile 中的一行。
题目解析
ARG、ENV、Dockerfile 指令、构建日志、缓存和进程环境都可能留下秘密,删除文件不一定删除历史 layer。构建阶段应使用 BuildKit secret mount 等不进入镜像层的方式;运行阶段应由 Secret 管理系统按最小权限、短生命周期和审计要求注入。
秘密一旦进入镜像、日志或仓库,应按已经泄露处理:立即轮换、撤销旧凭据、检查访问记录和缓存范围,并重新构建干净制品。安全验证要覆盖构建产物、metadata、运行时 env、core dump 和诊断输出。
常见误区
- 误区:RUN echo $TOKEN 后再删除。改正:使用 secret mount,确保值不进入 layer、缓存、日志和最终镜像。
- 误区:把生产密码写进 compose 文件并提交仓库。改正:使用受控 Secret 注入和权限审计,仓库只保留引用或模板。