Skip to content

安全陷阱

用户

  • 容器默认以 root 运行 — 安全扫描器会标记
  • USER 指令放在需要 root 的 RUN 之后 = 构建失败
  • 容器中 UID 1000 的用户在宿主机可能是另一个用户 — 容易混淆
  • --user 运行时参数会覆盖 Dockerfile 中的 USER — 但文件权限不变

密钥

  • ENV SECRET=xdocker historydocker 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 + 验证镜像源

由云锦鸿维护