nabeo がピーしているブログ (仮)

どーも、nabeop です

pass で複数のレポジトリを管理する

この記事は仕事用のマシンで pass のレポジトリを統合した時に実施した作業のメモです。

仕事とプライベートの両方でパスワードなど秘密情報の管理に pass を使っています。ただし、仕事の pass は会社のレポジトリ、プライベートの pass はプライベートなレポジトリと管理しているレポジトリが分断していて、仕事で使っているマシンでプライベートなアカウントにログインするときに若干不便を感じていました。しかし、pass は .gpg-id というファイルに複数の GPG 鍵の gpg-id を列挙することで、複数人での秘密情報の共有をサポートしており、レポジトリは git の機能が全て使えます。そこで git の subtree を使って複数のレポジトリを統合して、かつ、仕事用の GPG 鍵と私用の GPG 鍵の両方を使い分けて秘密情報を管理することにしました。

複数の GPG 鍵で秘密情報を暗号化する

そもそも GPG は複数の公開鍵で暗号化して、秘密情報を複数人で共有することができます。例えば、A と B という2つの gpg-id で暗号化する場合は以下ように暗号化します。

gpg --encrypt --recipient A --recipient B file

pass は内部的に gpg コマンドを実行していて、細かな差異はあると思いますが、概ね上記のように複数の gpg-id を指定して暗号化しているはずです。

また、pass で暗号化に使用する gpg-id を複数指定する場合は .gpg-id というファイルに対象の gpg-id を1行づつ記載します。また、 .gpg-id ファイルはディレクトリごとに作成することが可能なので、private というディレクトリ以下のファイルについては A と B の gpg-id で暗号化したい場合は以下のように pass init を実行して、 .gpg-id ファイルの作成し、既存のファイルの再暗号化が実行されます。

pass init --path private A B

上記のコマンドを実行したあとは private/.gpg-id が生成され、以後、ファイルの更新/追加のときは private/.gpg-id に記載されている GPG 公開鍵で暗号化されます。

複数のレポジトリを統合して管理する

pass では PASSWORD_STORE_DIR 環境変数を使って、pass コマンドが参照するディレクトリを切り替えることができます。例えば以下のようにエイリアスを定義することで、複数のレポジトリを個別に管理することは可能です。

alias pass='PASSWORD_STORE_DIR=~/.password-store pass'
alias private-pass='PASSWORD_STORE_DIR=~/.private-password-store pass'

ただし、使用する秘密情報の文脈に応じてコマンドを変更する必要があり面倒です。

また、 pass git コマンドは内部的に git コマンドを呼び出しているだけなので、git の機能を使って複数のレポジトリを統合することができそうです。つまり、pass git push コマンドは内部的に git push を呼び出しているということは pass git subtree も同様に git subtree を呼び出しており、git-subtree が使えるはずです。

まずは、プライベートで使っている pass レポジトリはプライベートの GPG 公開鍵でしか暗号化しておらず、仕事用のマシンには私用の GPG 秘密鍵は入れていなかったので、以下のように仕事用の GPG 公開鍵でも暗号化するように変更します。

pass init <プライベートの GPG 公開鍵の gpg-id> <仕事用の GPG 公開鍵の gpg-id>

つぎにプライベートで使っている pass のレポジトリを git@github.com:nabeo/password-store.git に移して、以下のように pass 管理のディレクトリ以下に subtree として登録します。

pass git remote add github.com/nabeo git@github.com:nabeo/password-store.git
pass git subtree add --prefix nabeo github.com/nabeo master
pass git subtree pull --prefix nabeo github.com/nabeo master

これで仕事用のマシンでもプライベートで使っているサービスの秘密情報を共有することができました。あとはレポジトリ内の更新があったときは pass git push の他に以下のようにプライベート側のレポジトリも更新しておくようにします。

pass git subtree push --prefix nabeo github.com/nabeo master

git-subtree はタイプする文字が多いのが難点ですが、そのうち慣れるでしょと楽観的に考えてます。