git-cryptでGit内のシークレットを保護する:Vault不要で機密ファイルを暗号化

Git tutorial - IT technology blog
Git tutorial - IT technology blog

実話:GitHubスキャンボットに.envファイルが狙われた日

数年前、ある友人が誤って本番環境のデータベース情報が含まれた.envファイルをパブリックリポジトリにコミットしてしまいました。わずか2分足らずで、システムは自動ボットによる数万件のブルートフォースアタックを記録しました。結果として、チーム全員が深夜3時までAPIキーのローテーションとデータベースのクリーンアップに追われることになりました。GitGuardianのレポートによると、2023年には1,280万件以上のシークレットがGitHub上で流出しています。あなたも次の被害者にならないよう注意が必要です。

通常、機密ファイルを「隠す」ために.gitignoreを使用します。しかし、チーム開発においてSlack、Telegram、Google Drive経由で設定ファイルを送ることは、管理の混乱とセキュリティリスクを招きます。git-cryptは、まさにこの問題を解決するために生まれました。シークレットをGit内に保持しつつ、暗号化された状態で管理することができます。

git-cryptと他のソリューションの比較

設定に取り掛かる前に、git-cryptが他の競合ツールと比べてどのような立ち位置にあるかを確認しておきましょう:

  • AWS Secrets Manager / HashiCorp Vault: 大企業には非常に強力なツールです。しかし、月額数十ドルから数百ドルのコストがかかり、キー取得のための複雑なシステム構築に数日は必要です。
  • CI/CDの環境変数: デプロイ時のみ解決されます。ローカル環境での.envファイルの管理は、依然として手動で行う必要があります。
  • git-crypt: 無料で、5分で設定可能です。ローカルPC上のファイルはプレーンテキストですが、git pushするとGitが自動的にバイナリ形式に暗号化します。中小規模のプロジェクトにとって、最も「ちょうどいい」選択肢です。

なぜgit-cryptは開発者に支持されるのか?

最大のメリットは、ワークフローが非常にスムーズであることです。普段通りにgit addgit commitを行うだけで、習慣を変える必要はありません。アクセス権のないユーザーがGitHub上でファイルを開いても、意味不明な文字列の羅列が見えるだけです。

ただし、注意点もあります。git-cryptは柔軟な権限の取り消し(revoke)をサポートしていません。メンバーが離脱した場合、新しいキーを作成して全ファイルを再暗号化する必要があります。メンバーの入れ替わりが激しいチーム(ハイターンオーバー)の場合は、DopplerやVaultのような集中管理ソリューションを検討してください。

git-cryptの導入手順

ここでは、対称鍵(Symmetric Key)(1つのキーファイルを共有)とGPG(個人識別による管理)の2つの方法を解説します。

1. クイックインストール

macOSの場合、Homebrewを使用するのが最も簡単です:

brew install git-crypt

UbuntuまたはDebianの場合:

sudo apt install git-crypt

2. 保護対象ファイルの設定

まず、プロジェクトディレクトリでgit-cryptを初期化します:

git-crypt init

次に、暗号化したいファイルを.gitattributesファイルで指定します。例えば、.envファイルとcerts/ディレクトリ内のすべての証明書を保護したい場合は以下のようになります:

# .gitattributes ファイル
.env filter=git-crypt diff=git-crypt
certs/*.pem filter=git-crypt diff=git-crypt
config/secrets.yml filter=git-crypt diff=git-crypt

Tips: git addする前に.gitattributesを定義する必要があります。もし以前にプレーンテキストのままコミットしてしまった場合、Gitの履歴には以前の形跡が残ります。その場合は、BFG Repo-Cleanerなどのツールを使ってコミット履歴を完全に削除する必要があります。

3. 方法1:対称鍵(Symmetric Key)の使用(小規模チーム向け)

この方法では、1つの秘密鍵ファイルを作成します。このファイルをBitwarden Sendや1Passwordなどの安全なチャネルを通じて同僚に共有します。

キーをエクスポートするには、以下のコマンドを実行します:

git-crypt export-key ~/my-project.key

同僚がプロジェクトをクローンした後、以下のコマンドを実行するだけで、すべてのファイルが復号されます:

git-crypt unlock /path/to/my-project.key

4. 方法2:GPGの使用(よりプロフェッショナルで安全)

GPGを使用すると、共通のキーファイルを共有する必要がありません。各ユーザーが個人のキーを使用し、特定のメールアドレスに対してアクセス権を付与します。

まず、自分自身を復号許可リストに追加します:

git-crypt add-gpg-user [email protected]

新しいメンバーが加わった際は、そのメンバーからGPG公開鍵を送ってもらいます。そのキーをインポートして追加します:

gpg --import colleague-public-key.asc
git-crypt add-gpg-user [email protected]

システムは自動的に.git-crypt/ディレクトリ内にコミットを作成します。このコミットをプッシュすれば完了です。同僚はgit-crypt unlockと入力するだけで、PCが自動的に適切なキーを探してロックを解除します。

設定の確認

機密ファイルが漏れていないか確認するために、以下のコマンドを実行します:

git-crypt status

画面にファイルの一覧とencrypted(暗号化済み)というステータスが表示されます。重要なファイルがnot encryptedと表示されている場合は、すぐに.gitattributesファイルを確認してください。

トラブルを避けるための実用的な注意点

長期間git-cryptを運用して得られた経験則をいくつか紹介します:

  • .gitignoreを暗号化しない: Gitはどのファイルを無視すべきかを知るために、このファイルをプレーンテキストで読み取る必要があります。
  • ステージングエリアの処理: .gitattributesを修正しても暗号化ステータスが更新されない場合は、git rm --cached <file>を実行してから再度追加してみてください。
  • キーのバックアップ: 対称鍵を紛失すると、データは永久に復元不可能なバイナリデータとなります。パスワードマネージャーなどに厳重に保管してください。
  • CI/CDとの統合: GitHub Actionsの場合は、キーの内容をGitHub Secretsに保存し、パイプライン実行中に一時ファイルに書き出してからgit-crypt unlockを実行するように構成します。

git-cryptは、利便性とセキュリティのバランスが非常に優れたソリューションです。リポジトリを「すぐに実行可能(ready-to-run)」な状態に保ちつつ、悪意のある第三者から機密情報を守ることができます。

Share: