docker 构建参数 - 构建参数 docker - docker 构建构建参数

Docker 构建参数:镜像中秘密泄露的隐蔽途径

构建参数:便利性可能损害安全性

Docker 构建参数使得在构建时传递配置值变得简单,但它们也带来了一个常被忽视的代价:这些参数会保留在镜像元数据和层中。开发者通常认为这些值在构建完成后就会消失,但实际上,Docker 构建参数指令会将它们嵌入到 Docker 镜像历史记录中。

⚠️此示例不安全,仅供学习交流之用。请勿用于生产环境。

FROM node:18
ARG API_KEY=my-secret-key
RUN echo "API_KEY=$API_KEY" > /app/config.txt

任何跑步的人 码头工人历史 or 码头工人检查 会发现 API_KEY 嵌入在镜像元数据中的值。这是因为 Docker 构建参数指令 commit将每个构建步骤都作为永久层。

安全版本:

# Use Docker BuildKit secrets instead of ARG
# docker build --secret id=api_key,src=./api.key .
FROM node:18
RUN --mount=type=secret,id=api_key cat /run/secrets/api_key > /app/config.txt

教育说明: 避免通过 Docker 构建参数注入密钥。 -秘密 BuildKit 提供的挂载点用于存储敏感数据;它们永远不会持久化到图层或元数据中。

秘密如何在层级和元数据中持久存在

Dockerfile 中的每条指令都会创建一个新的镜像层。即使您覆盖或删除文件,之前的镜像层也会保留在缓存中。 这就是为什么通过 Docker 构建参数或 Docker 构建参数注入的密钥会无限期地保留下来的原因。

⚠️此示例不安全,仅供学习交流之用。请勿用于生产环境。

FROM python:3.10
ARG GITHUB_TOKEN=ghp_ABC123TOKEN
RUN pip install private-package --extra-index-url https://user:$GITHUB_TOKEN@pypi.example.com

运用 ARG 这样就将令牌嵌入到图像层中,从而可见。 Docker 镜像检查 或从缓存中提取。 安全版本:

# Secure alternative using BuildKit secrets
# docker build --secret id=gh_token,src=.secrets/token.txt .
FROM python:3.10
RUN --mount=type=secret,id=gh_token pip install private-package --extra-index-url https://pypi.example.com

教育说明: 在使用过程中,敏感信息会永久保存。建议改用临时密钥挂载点来保护令牌和凭证。

常见错误配置 CI/CD Pipelines

In 现代 pipelines开发者经常通过以下方式传递秘密: CI/CD 使用 Docker 参数或共享缓存的环境。这种做法会将机密信息泄露到日志、运行器和注册表缓存中。 与共享跑步者 GitHub动作,GitLab CI,或 詹金斯这些秘密很容易传播到不相关的工作中。

⚠️此示例不安全,仅供学习交流之用。请勿用于生产环境。

# Never expose real tokens, credentials, or internal URLs in pipelines
- name: Build image
  run: docker build -t app --build-arg TOKEN=${{ secrets.API_TOKEN }} .

密钥最终会出现在构建日志和镜像元数据中,违反了最小权限原则。 安全版本: 

# Secure build command using BuildKit secret mount
- name: Secure Docker build
  run: docker buildx build --secret id=api_token,src=.secrets/api_token.txt .

教育说明: 避免 –build-arg 为了秘密。 CI/CD密钥绝不应该通过环境变量或日志传递。始终优先使用临时密钥挂载。

防止秘密泄露的最佳实践

防止机密信息泄露的第一步是认识到 Docker 构建参数的设计初衷就是公开的。它们非常适合用于配置(例如版本标签或功能标志),但不适合用于凭据。

最佳实践

  1. 使用 BuildKit - 秘密 对于敏感数据。
  2. 永远不要通过 ARG 或 ENV 定义密钥。
  3. 添加 .ENV, 秘密/配置/ 目录 .dockerignore.
  4. 应用多阶段构建 隔离私人舞台。
  5. 清除缓存 经过关键的构建阶段之后。
  6. 验证图像元数据 发布前请提供 Docker 历史记录。

迷你预防检查清单

  • 审核所有 Dockerfile 构建参数 Docker 用法。
  • 使用 BuildKit 替换凭据 -秘密.
  • 确保 .dockerignore 不包括敏感文件。
  • 消毒 CI/CD 环境变量。
  • 推送图片前自动进行秘密扫描。

教育说明: 如果某个值通过 Docker 构建参数传递,它将永久生效。请使用秘密挂载点和隔离的构建阶段来保护敏感数据。

部署前检测构建参数的不安全使用

在将镜像推送到生产环境之前,自动化扫描对于识别有风险的 Docker 构建参数模式至关重要。诸如此类的工具 特里维, 哈多林特西吉尼 可以检测嵌入在 Dockerfile 或镜像层中的凭据。

功能片段,带有上下文和控制护栏

# CI/CD guardrail: pre-deployment Dockerfile security scan
- name: Dockerfile security scan
  run: trivy config --severity HIGH, CRITICAL --ignore-unfixed.

此步骤起到预防性控制作用,在部署前阻止不安全的构建参数 Docker 指令。

教育说明: 将 Dockerfile 扫描作为一项强制性功能集成到系统中 CI/CD 阶段。自动化工具有助于确保构建过程的一致性和安全性。

Xygeni 如何防止构建时秘密泄露

西吉尼 机密安全 提供针对 Docker 参数滥用的专门检测。 它可以识别不安全的 ARG 定义,跟踪构建阶段中的秘密值,并标记图像元数据或缓存层中的残留凭据。 通过与您的设备集成 CI/CD pipeline它会在合并或发布之前强制执行 Docker 构建参数安全策略。

功能片段,上下文强制执行示例

# Secure enforcement of Docker build arg usage
- name: Xygeni Docker ARG enforcement
  run: dotnet xygeni enforce --rules dockerfile,secrets,build --fail-on-risk

将此职位添加到您的 pipeline持续保护的验证阶段。

教育说明: Xygeni 会自动强制执行安全的 Docker 实践,防止有风险的构建时配置在不同环境中泄露机密信息。

结论:Docker 构建参数绝不应处理密钥。

Docker 构建参数是一把双刃剑,方便配置,但也可能泄露机密信息。 您注入的每个构建 Docker 值都可以持久保存在元数据、镜像历史记录或缓存中。
保护您的构建:

  • 使用 BuildKit -秘密 用于凭证。
  • 在多阶段构建中隔离敏感数据。
  • 部署前扫描泄露的值。
  • 通过以下方式强制执行安全策略 Xygeni Code Security.

您的构建 pipeline 安全性取决于你不泄露哪些秘密。将每个 Docker 构建参数都视为潜在的泄露途径,并在攻击者发现之前将其锁定。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
7-day免费试用
无需信用卡

保护您的软件开发和交付

使用 Xygeni 产品套件