ビルド引数:セキュリティを損なう可能性のある利便性
Dockerのビルド引数を使用すると、ビルド時に設定値を簡単に渡すことができますが、見落とされがちな欠点があります。それは、これらの引数がイメージのメタデータとレイヤーに保持されることです。開発者はこれらの値がビルド後に消えると考えがちですが、実際には、ビルド引数のDocker命令によって、これらの値はDockerイメージの履歴に埋め込まれます。
⚠️これは安全でない例であり、教育目的のみに使用してください。本番環境では使用しないでください。
FROM node:18 ARG API_KEY=my-secret-key RUN echo "API_KEY=$API_KEY" > /app/config.txt 走っている人は誰でも ドッカーの歴史 or dockerinspect 見つけるでしょう API_KEY イメージのメタデータに埋め込まれた値。これは、Docker build build arg 命令が原因で発生します。 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 image inspect またはキャッシュから抽出されたもの。 セキュア版:
# 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 . 教育上の注意: 避ける –ビルド引数 秘密のために。 CI/CD機密情報は環境変数やログを介して渡されるべきではありません。常に一時的なシークレットマウントを使用するようにしてください。
秘密漏洩を防ぐためのベストプラクティス
機密情報の漏洩を防ぐには、まずDockerのビルド引数が設計上公開されていることを認識することから始める必要があります。これらは設定情報(バージョンタグや機能フラグなど)には最適ですが、認証情報には適していません。
ベストプラクティス
- BuildKitを使用する - 秘密 機密データ用。
- 秘密情報をARGやENVで定義してはいけません。
- 追加 .env, 秘密/, config / ディレクトリへ .dockerignore.
- マルチステージビルドを適用する 個室ステージを隔離するため。
- キャッシュをクリアする 繊細な構築段階を経て。
- 画像メタデータの検証 公開前にDockerの履歴を確認する。
ミニ予防チェックリスト
- すべてのDockerfileを監査する ビルド引数 Docker 使用法。
- 認証情報をBuildKitに置き換えてください -秘密.
- 確保 .dockerignore 機密ファイルは除外します。
- 消毒する CI/CD 環境変数。
- イメージをプッシュする前に、シークレットスキャンを自動化する。
教育上の注意: Dockerのビルド引数を通して値が渡されると、その値は永続的に保存されます。機密データを保護するには、シークレットマウントと隔離されたビルドステージを使用してください。
# 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ビルドのビルド引数はすべて潜在的な情報漏洩経路とみなし、攻撃者に発見される前に厳重に保護してください。






