GPGで.envファイルを暗号化し、機密情報を漏らさずにGitにコミットする流れを示した代表画像

概要

アプリケーションの設定ファイルや環境変数定義ファイルをGitにコミットしなければならない場合があります。

開発環境のパスワードだからと不用意にコミットしてしまったり、本番(プロダクション)環境のパスワードが含まれたままコミットされてしまうこともよくあります。

この記事では、機密情報が含まれるファイルをコミットする際に、内容を暗号化して隠す方法をまとめます。

代表的なアプローチはいくつかありますが、ここではGPGを直接使用する方式のみを扱います。

ファイル内容の暗号化によく使われるおすすめの方法

  • gpg
  • age
  • git-crypt(Gitフィルターベースの暗号化)
  • sops(+age)

なぜGPGなのか?

GitHubのコミット/タグ署名のためにすでにGPGを使っているケースが多いです。

同じキーでファイルの暗号化まで拡張できる点がメリットです。

インストール/キー生成についてはGitでGPGによるコミット署名を行うの記事を参考にしてください。

ファイル暗号化だけが目的なら、ageのほうがシンプルに感じられるかもしれません。

ファイルの暗号化/復号化

事前要件: 以下の手順を進める前に、GPGキーが発行されている必要があります。

最初に確認すべき点(重要)

  • すでに過去のコミットに含まれたことがある場合、.gitignoreに追加しても過去のコミットから機密情報を閲覧できてしまいます。
  • 完全に取り除くには、機密情報を失効/再発行し、gitコミットを書き換える必要があります。
    • git filter-repo または BFG Repo-Cleaner
    • (必要な場合)force push

元のファイルをGitから除外する

1# .gitignoreに.envを追加
2echo ".env" >> .gitignore
3
4# もしすでに追跡されている場合はインデックスから削除
5# (ローカルファイルは残し、Gitの追跡のみ解除)
6git rm --cached .env

ファイルの暗号化

注意事項

  • gpg --encryptは既存ファイルを更新する概念ではなく、実行のたびに出力ファイルを新規作成します。
  • ファイルがすでに存在する場合、上書きするか確認されます。自動的に同意するには--yesオプションを使用します。

.envファイルの例:

機密情報が含まれる.envファイルから、暗号化された.envファイルを作成します。

1# 指定したrecipient(受信者)のキーで暗号化して.env.encを生成
2gpg --encrypt -r [email protected] --output .env.enc .env
3
4# 上書きまで自動化したい場合は
5# gpg --yes --encrypt -r [email protected] --output .env.enc .env

ファイルの復号化

.env.encファイルから機密情報を含む.envファイルを作成します。

1gpg --decrypt .env.enc > .env

その他

デフォルトrecipientの指定

  • 毎回-rを指定するのが面倒な場合に使用できます。
  • default-recipient: -rオプションがない場合にデフォルトで使用
  • encrypt-to: -rオプションに関係なく必ず含める
  • 設定ファイル: ~/.gnupg/gpg.conf
1# デフォルトキー
2default-key {pub uuid}
3
4# デフォルトrecipient
5default-recipient {pub uuid}
6
7# 必ず含めるrecipient(必要な場合のみ)
8#encrypt-to {pub uuid}

関連記事