Skip to content

データセキュリティと機密情報の管理

本プロジェクトではセキュリティを重視し、パスワードや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.md

3. 環境変数 (.env) の使用

環境ごとの設定値(ドメイン名、公開しても問題ない設定など)は .env ファイルで管理します。

使用方法

  1. プロジェクトルートに .env ファイルを作成します(Gitにはコミットしません)。
  2. docker-compose.yml から env_file または ${VARIABLE} 構文で参照します。

例 (.env):

bash
DOMAIN_NAME=local.dev
mariadb_user=wordpress_user

例 (docker-compose.yml):

yaml
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 コマンドで値を覗き見ることが難しいため、より安全です。

設定手順

  1. シークレットファイルの作成: ローカルの secrets/ ディレクトリに、機密情報だけを記載したテキストファイルを作成します。

    bash
    mkdir -p secrets
    echo "my_super_secure_password" > secrets/db_password.txt
    echo "my_api_key_12345" > secrets/api_key.txt
  2. docker-compose.yml の定義: トップレベルの secrets 定義と、各サービスの secrets 定義を追加します。

    yaml
    services:
      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
  3. アプリケーションでの利用: コードやスクリプト内で /run/secrets/db_password ファイルを読み取って使用します。

    例 (Python):

    python
    with open('/run/secrets/db_password', 'r') as f:
        password = f.read().strip()

    例 (Shell Script):

    bash
    export 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製の最新ツールで、高速かつ安全です。

bash
# インストール (例)
pip install git-filter-repo

# 特定のファイルを全履歴から削除
git filter-repo --path secrets/api_key.txt --invert-paths

代替ツール: BFG Repo-Cleaner

Java製のツールで、使いやすさに定評があります。

bash
# 特定のファイルを全履歴から削除
bfg --delete-files .env

これらの処置を行った後、強制プッシュ (git push --force) が必要になります。 一度漏洩したパスワードやAPIキーは、「もはや秘密ではない」と見なし、必ず【無効化・再発行】してください。

6. 参考資料

データセキュリティと機密情報の管理に関する信頼できる情報源です。判断に迷った際の指針としてください。

  • Docker 公式ドキュメント:

  • The Twelve-Factor App:

    • III. Config - アプリケーションの設定(Config)をコードから分離し、環境変数に格納する原則について。モダンなアプリケーション開発のバイブルです。
  • GitHub Docs:

  • OWASP (Open Web Application Security Project):

Released under the MIT License.