データセキュリティと機密情報の管理
本プロジェクトではセキュリティを重視し、パスワードやAPIキーなどの機密情報をGitリポジトリにコミットしないように管理する必要があります。 ここでは、環境変数、Docker Secrets、および推奨されるファイル除外設定について解説します。
1. 認証情報の管理原則
絶対にやってはいけないこと:
- Dockerfileの中にパスワードをハードコードする。
- ソースコードの中にAPIキーを直接記述する。
.envファイルやsecrets/ディレクトリ内のファイルをGitにコミットする。
認証情報が誤ってGitに公開されると、プロジェクトのセキュリティが根本から損なわれ、評価において**Fail(失敗)**の対象となります。
2. .gitignore と .dockerignore
機密情報を含むファイルが誤ってGitに追加されたり、Dockerイメージに含まれたりするのを防ぐために、除外設定を適切に行います。
.gitignore の設定
Gitの追跡から除外するファイルやディレクトリを指定します。
.env
secrets/
*.key
*.crt
*.pem
node_modules/.dockerignore の設定
Dockerビルドコンテキスト(docker buildコマンドで送信されるファイル群)から除外するファイルを指定します。これにより、最終的なイメージ内にソースコードとして機密ファイルが含まれるのを防ぐだけでなく、ビルド時間の短縮にもつながります。
プロジェクトルートに .dockerignore を作成し、以下を含めることを推奨します:
.git
.gitignore
.env
secrets/
node_modules/
docker-compose.yml
Makefile
README.md3. 環境変数 (.env) の使用
環境ごとの設定値(ドメイン名、公開しても問題ない設定など)は .env ファイルで管理します。
使用方法
- プロジェクトルートに
.envファイルを作成します(Gitにはコミットしません)。 docker-compose.ymlからenv_fileまたは${VARIABLE}構文で参照します。
例 (.env):
DOMAIN_NAME=local.dev
mariadb_user=wordpress_user例 (docker-compose.yml):
services:
nginx:
environment:
- DOMAIN_NAME=${DOMAIN_NAME}4. Docker Secrets の使用
パスワード、データベースのルートパスワード、APIキーなどの機密情報は、環境変数ではなく「Docker Secrets」を使用して管理することを強く推奨します。
Docker Secrets とは?
Docker Swarmモードで本来使用される機能ですが、Docker Composeでもファイルベースのシークレットとして利用可能です。シークレットは、コンテナ内の /run/secrets/<secret_name> にファイルとしてマウントされます。 環境変数と異なり、docker inspect コマンドで値を覗き見ることが難しいため、より安全です。
設定手順
シークレットファイルの作成: ローカルの
secrets/ディレクトリに、機密情報だけを記載したテキストファイルを作成します。bashmkdir -p secrets echo "my_super_secure_password" > secrets/db_password.txt echo "my_api_key_12345" > secrets/api_key.txtdocker-compose.yml の定義: トップレベルの
secrets定義と、各サービスのsecrets定義を追加します。yamlservices: mariadb: image: mariadb secrets: - db_password # このサービスでdb_passwordを使用可能にする environment: # 対応しているイメージでは、FILEパスを指定することでシークレットを読み込める - MYSQL_PASSWORD_FILE=/run/secrets/db_password secrets: db_password: file: ./secrets/db_password.txt api_key: file: ./secrets/api_key.txtアプリケーションでの利用: コードやスクリプト内で
/run/secrets/db_passwordファイルを読み取って使用します。例 (Python):
pythonwith open('/run/secrets/db_password', 'r') as f: password = f.read().strip()例 (Shell Script):
bashexport DB_PASS=$(cat /run/secrets/db_password)
5. 暗号化について(高度な対策)
必須ではありませんが、チーム開発で機密情報を共有する必要がある場合、平文のファイルをチャット等で送るのは危険です。以下のようなツールの使用を検討してください。
- Git-crypt / Ansible Vault: リポジトリ内の特定のファイルを暗号化してコミットし、復号鍵を持つメンバーだけが閲覧できるようにします。
- 1Password / LastPass: チーム用のパスワードマネージャーで共有します。
本プロジェクト(個人または少人数チーム)の範囲では、secrets/ ディレクトリを .gitignore に含め、各自がローカルでファイルを作成する方法が最も簡単かつ安全です。
5.5. 過去に機密情報をコミットしてしまった場合の対処
単に git rm でファイルを削除し、新しいコミットを作っても、Gitの履歴( .git ディレクトリ内)には機密情報が残り続けます。 完全に履歴から抹消するには、履歴改変ツールを使用する必要があります。
WARNING
以下の操作はリポジトリの履歴を破壊的に変更します。必ずバックアップを取ってから実行し、チームメンバーと連携してください。
推奨ツール: git-filter-repo
Python製の最新ツールで、高速かつ安全です。
# インストール (例)
pip install git-filter-repo
# 特定のファイルを全履歴から削除
git filter-repo --path secrets/api_key.txt --invert-paths代替ツール: BFG Repo-Cleaner
Java製のツールで、使いやすさに定評があります。
# 特定のファイルを全履歴から削除
bfg --delete-files .envこれらの処置を行った後、強制プッシュ (git push --force) が必要になります。 一度漏洩したパスワードやAPIキーは、「もはや秘密ではない」と見なし、必ず【無効化・再発行】してください。
6. 参考資料
データセキュリティと機密情報の管理に関する信頼できる情報源です。判断に迷った際の指針としてください。
Docker 公式ドキュメント:
- Use secrets in Docker Compose - Docker ComposeでのSecretsの定義と使用方法。
- Manage sensitive data with Docker secrets - Docker Secretsの概念とアーキテクチャ(Swarmベースですが概念は共通)。
The Twelve-Factor App:
- III. Config - アプリケーションの設定(Config)をコードから分離し、環境変数に格納する原則について。モダンなアプリケーション開発のバイブルです。
GitHub Docs:
- Removing sensitive data from a repository - 万が一、機密情報をコミットしてしまった場合の対処法(
git filter-repoや BFG Repo-Cleaner の使用)。
- Removing sensitive data from a repository - 万が一、機密情報をコミットしてしまった場合の対処法(
OWASP (Open Web Application Security Project):
- Secrets Management Cheat Sheet - アプリケーションにおける機密情報管理のベストプラクティス集。