安全陷阱
用户
- 容器默认以 root 运行 — 安全扫描器会标记
USER指令放在需要 root 的RUN之后 = 构建失败- 容器中 UID 1000 的用户在宿主机可能是另一个用户 — 容易混淆
--user运行时参数会覆盖 Dockerfile 中的 USER — 但文件权限不变
密钥
ENV SECRET=x在docker history和docker inspect中可见ARG用于密钥也在 history 中可见 — 不安全COPY secrets.txt烘焙到镜像层 — 即使后续删除,前一层数据仍在--env-file运行时安全,但文件需在宿主机上保护
BuildKit 密钥
RUN --mount=type=secret未启用 DOCKER_BUILDKIT=1 时不可用- Secret 挂载仅在该 RUN 步骤可用 — 不会持久化
- Secret ID 必须精确匹配 — 拼写错误 = 构建失败但无明确提示
- 未显式挂载 secret 的 stage 无法访问
镜像扫描
- 基础镜像的漏洞会被继承 — 定期更新基础镜像
- CI 中扫描但不在 registry 中扫描 = 生产环境可能有漏洞镜像
- 包已修复 CVE 但基础镜像未更新 = 仍然有漏洞
- Distroless 镜像难以扫描 — 报告的 CVE 少不代表 bug 少
运行时
--privileged= 完全访问宿主机设备、内核模块等--cap-add SYS_ADMIN几乎和 privileged 一样危险 — 避免-v /:/host挂载宿主机根目录 = 容器被攻破即全盘沦陷--pid=host允许从容器查看/杀死宿主机进程
网络
- 容器在 bridge 网络中可访问元数据服务 (169.254.x.x)
- 没有
--network=none时,容器默认有网络访问 - 发布端口无防火墙 = 对互联网公开
- 同一网络中的容器可以互相访问 — 并非完全隔离
供应链
- 公共 registry 的基础镜像可能是恶意的 — 验证发布者
latest标签可能被劫持 — 关键镜像使用 digest- 构建时下载的依赖可能变化 — 使用 lock files + 验证镜像源