Git の認証情報を暗号化して保存する

2018.05.03

Git の認証情報はメモリかストレージに平文として保存されてしまう. さらに,メモリでは再ログインをすると失われてしまい,新たにユーザ名とパスワードを入力する必要がある. これはとても面倒なのでストレージに暗号化して保存することにする.

Gitは認証情報の保存方法を選択することができ,cache(メモリに保存), store(平文でストレージに保存) のほか,自作のスクリプトにより拡張することができる. 今回はBashスクリプトgit-credential-passを作成して認証情報をGPGで暗号化して保存する.

注:

  1. 認証方式をhttpsでなくsshにすればssh-agentの世界になるのでここでは関係ない.
  2. 当然,あらかじめGPGの鍵を作成しておく必要がある.
  3. gpg-agentが正常に動作している必要がある.でなければ,GPGの秘密鍵を(おそらくpinentryにより)毎回入力する必要がある. ようするに,GitのHTTPS認証をGPGに任せるということである.

スクリプト

次のスクリプトを,git-credential-passとしてPATHの通った場所に保存し,実行権限をつける.

dotfiles/git-credential-pass at master · noyuno/dotfiles

使用方法

まずGitの認証情報を保存するための関連付けをする. 次の1行目と2行目は同じ動作をする

git config --global credential.helper 'pass'
git config --global credential.helper 'pass -d ~/.password-store/git -g ~/.password-store/.gpg-id'

-dで認証情報を保存するディレクトリを,-gでGPGメールアドレス(recipient)を指定する.

その後は,いつもどおりにgit pull, git pushなど認証が必要なコマンドを使う. 認証情報が保存されていない初回だけリモートのユーザ名とパスワードを入力する必要があるが, それ以降の同じリモートのリポジトリは入力する必要はなく自動で認証される.

passについて

pass とはGitとGPGを使ってパスワードを管理するツールである. passは既定で.password-storeを使う.

git-credident-passが吐いたパスワード情報をGitで管理すると, 一度一つのコンピュータで認証すれば他の自分のコンピュータ(GPG秘密鍵が入っているコンピュータ)で再びGitのユーザ名とパスワードを入力する必要がなくなる. また,パスワードをすべて.password-storeに保存しておけば集中管理ができて楽である. これらの利便性を享受するため,git-credident-passの既定の保存先が~/.password-store/gitになっている.

もちろんpassは必須ではなく,引数を指定することでgit-credident-pass単体で使うこともできる.


新しい記事: LaTeXのマイテンプレート 2018.05.24
古い記事: ブログ執筆環境を求めて 2018.04.28