GitをHTTP経由で使うときのパスワードを安全に扱いたい
Git 1.7.9がリリースされたので、変更点のハイライトをつらつらと眺めてみよう、と思ったら初っぱなに興味深い一文発見。
"Credential helper" support, that allows integration of HTTP authentication with platform-native key-chain implementations;
Git Blame: Git 1.7.9
つまり、OS Xユーザからすると、HTTP認証にKeychainを使えるってことではなかろうか。
追記: HomebrewのGitパッケージは2012年4月中旬あたりから /usr/local/bin/git-credential-osxkeychain をインストールするようになっている。
ゆえあって、SSHでなくHTTPSで使用しているGitリポジトリがあるのだが、普通に使っていると困ったことにgit-pullやgit-pushのたびにユーザ名とパスワードの入力を求められるので、すごく面倒くさい。
この面倒から逃れるためのとりあえずの策として、~/.netrcにユーザ名とパスワードを書き込んでしまっているのだが、これもまた困ったことに、中身が平文なのである。パスワードを平文保存するのはなんとも居心地が悪い。
もし、OS XのKeychainを認証情報の保存先に使えるのであれば願ったり叶ったりである。man gitcredentials によると、 git help -a | grep credential- で使えるcredential helperがわかるらしいぞ!それっぽい名前はあるだろうか…
$ git help -a | grep credential- credential-cache merge-one-file show-branch credential-cache--daemon merge-ours show-index credential-store merge-recursive show-ref
…ない!つ、使えなそうだぞ。
めげずにGitのリポジトリを見てみると、それっぽいのがあった!
https://github.com/gitster/git/tree/master/contrib/credential/osxkeychain
まず、このリポジトリをgit-cloneしてきて、Keychain用のcredential helperを作る。
$ git clone git://github.com/gitster/git $ cd git/contrib/credential/osxkeychain $ make
できたバイナリを、PATHが通っているディレクトリに置く。とりあえずはgitの実行コマンドと同じ場所に置くとしようか。下記のコマンドで指定しているディレクトリは、HomebrewでGitを入れている場合のもの。*1
$ cp -p git-credential-osxkeychain /usr/local/Cellar/git/1.7.9/libexec/git-core
これでどうか。
$ git help -a | grep credential- credential-cache merge-one-file show-index credential-cache--daemon merge-ours show-ref credential-osxkeychain merge-recursive stage credential-store merge-resolve stash
credential-osxkeychain出現!
必要なcredential helperが手に入ったので、次は.gitconfigをいじる。
# ~/.gitconfig ... [credential] helper = osxkeychain [credential "https://git.example.com"] username = idesaku
準備完了。
$ git clone https://git.example.com/hoge.git Password for 'https://idesaku@git.example.com':
こんな感じに初回だけパスワード入力を求められる。しかし、これでKeychainにパスワードが安全に保存され、二回目以降はパスワードをKeychainから持ってくるため、人間様が入力する必要は無くなる。
Keychain Access.appで、git.example.comへの認証情報が追加されていることが確認できるはずである。
こうして、多少後ろめたく思いつつ使っていた.netrcを追放して、快適かつより安全にGitを使えるようになったわけである。また一つ、なんだかなー、と思っていた材料が消えた。つくづくGitはすばらしい。
ちなみに、1.7.9にはPull Requestワークフローのより良いサポートやSigned Commit(タグじゃない!)の導入など面白そうな新機能が他にも追加されているようだ。これからリリースノートを読む。