Edited at

git cryptを導入する


git-cryptを使って公開したらやばい情報を暗号化して管理する

社内で開発プロジェクトにgit-cryptを導入しようとした時のまとめ

※ クライアントはmac前提でhomebrew導入済み

GPGを使って公開鍵秘密鍵を用い、gitリモート上は暗号化したファイルを管理し、ローカルでは秘密鍵で復号化したファイルを扱う。


パッケージインストール

【やる人:プロジェクトメンバー全員】

以下をローカルインストール


  • GPG関連

$ brew install gnupg gnupg2 pinentry-mac

$ mkdir ~/.gnupg
$ echo "pinentry-program /usr/local/bin/pinentry-mac" >>~/.gnupg/gpg-agent.conf


  • git-crypt

brew install git-crypt


鍵を作る

【やる人:最低導入者一人。個々に管理したい場合は全員】

ローカルで以下を実行


  • キーペア作成

$ gpg --generate-key

# 対話形式でuserid, email, password(任意)を入力


  • 公開鍵エクスポート

$ gpg --output [任意の公開鍵名].gpg --export [作成したキーのemail]


gitリポジトリへの導入

【やる人:導入者】


  • 自分以外のチームメンバーの鍵を登録する場合(公開鍵のインポート)

# 公開鍵をインポート(事前に公開鍵をもらっとく)

$ gpg --import [貰った公開鍵ファイル]
# 鍵を信頼する手続き
$ gpg --sign-key [上の鍵で登録したemail]


  • リポジトリ適用

# gitリポジトリルートで実行

$ git crypt init
# 対象メンバーを登録。自分もしくは自分以外の事前に上で公開鍵をインポートしたメンバーを指定(人数分実行)
$ git crypt add-gpg-user [鍵登録してるemail]

リポジトリルートに .git-crypt ディレクトリが作成され、 .git-crypt/keys/default/0/ に公開鍵が配置される


  • 秘密情報ファイルの指定

    暗号化してgit管理したいファイルをリポジトリルートの .gitattributes に記載

# ファイル数分記載する

$ vi .gitattributes
[暗号化したいファイル名] filter=git-crypt diff=git-crypt
...


  • gitに登録

    普通にaddしてcommit

    ローカル上は暗号化されてないように存在しているが、リモートにプッシュしてリモート上で見ると暗号化されたファイルとなっている

    .git-crypt .gitattributes をgitignoreしたらダメ


プロジェクト導入

【やる人:リポジトリ導入者以外全員】


何もしないと暗号化されたファイルがローカルに存在する事になるので復号化処理をする。

たまに暗号化してたら同様に行う。

# 対象リポジトリクローンとか導入後のmasterを反映したのち

$ git-crypt unlock


一つの鍵でチーム運用


  • 鍵作成者

# 公開鍵のエクスポート

$ gpg -a --export [キー登録されてるemail] > public.txt
# 秘密鍵のエクスポート
$ gpg -a --export-secret-keys [キー登録されてるemail] > secret.txt
# 公開鍵の信用情報エクスポート
$ gpg --export-ownertrust > trust.txt


  • 鍵貰う人

    事前に上記で作成した public.txt secret.txt trust.txt を貰っておく

# 公開鍵のインポート

$ gpg --import public.txt
# 秘密鍵のインポート
$ gpg --import --allow-secret-key-import secret.txt
# 公開鍵の信用情報インポート
$ gpg --import-ownertrust trust.txt
# 状態の確認 uidが[究極]になってたらOK
$ gpg --list-secret-keys


参考

https://dev.classmethod.jp/tool/git/git-crypt/

https://text.baldanders.info/openpgp/openpgp-key-management/

https://lpi.or.jp/ex/303/ex_755.shtml

https://cast-a-spell.at.webry.info/200701/article_16.html