健壮 Dockerfile 的核心是“锁定来源、阻断动态、验证完整性”。需用镜像 SHA256 哈希替代标签引用,禁用 FROM 变量注入,杜绝未经校验的远程下载,强制非 root 用户运行,并配合签名验证与静态扫描。
编写健壮的 Dockerfile 规避供应链注入,核心在于“锁定来源、阻断动态、验证完整性”。不是靠经验或侥幸,而是用确定性机制切断攻击链。
使用 FROM ...@sha256:... 替代任何带标签(如 :latest、:alpine)的镜像引用。标签可被覆盖或篡改,而 SHA256 哈希是内容指纹,不可伪造。
FROM ghcr.io/devcontainers/base:ubuntu-22.04@sha256:9f8c6a2c7e...
FROM ubuntu:22.04 或 FROM node:20-alpine
cosign verify 在 CI 中校验签名,例如:cosign verify --certificate-oidc-issuer https://token.actions.githubusercontent.com --certificate-identity-regexp '.*github.com/.*' ghcr.io/xxx/app:v1
Dockerfile 中的 ARG 和 FROM ${BASE_IMAGE} 是供应链投毒高危点——攻击者只需污染构建上下文或环境变量,就能替换镜像源。
FROM 行使用变量,尤其是未设默认值或未校验的 ARG
docker build --build-arg NODE_VERSION=20.12.2 --no-cache .
ARG 做白名单校验,如:ARG NODE_VERSION=20.12.2 后加注释说明该版本已审计任何从网络拉取内容的行为(curl | bash、wget、git clone)都可能引入恶意代码,尤其当 URL 含变量或未校验 checksum 时。
RUN 中执行未经哈希校验的下载,例如:RUN curl -sL https://example.com/install.sh | bash —— ❌ADD + 内置 checksum(如 ADD --checksum=sha256:... file.tgz /tmp/)postCreateCommand、runArgs 等 Dev Container 配置项,过滤含 eval、curl |、bash -c 的指令即使镜像层被污染,限制运行时权限也能大幅压缩攻击面。Hadolint 的 DL3002 规则会标记最后 USER 为 root 的风险。
USER 1001:1001(而非 USER root、USER 0、USER root:root)RUN 阶段临时切回 root 执行敏感操作后未切换回来--cap-drop=ALL --read-only 等运行时参数,进一步收紧能力不复杂但容易忽略:真正健壮的 Dockerfile 不是写得最短,而是每一步都有不可绕过的约束和验证锚点。