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(タグじゃない!)の導入など面白そうな新機能が他にも追加されているようだ。これからリリースノートを読む。

*1:もっとも、これだとGitのバージョンが上がるたびにgit-credential-osxkeychainを配置し直さないといけないので、別のところに置いた方が賢明かもしれない。