Pass: The Standard Unix Password Manager の紹介
Pass: The Standard Unix Password Manager というパスワードマネージャがあります。gpg と git が pass コマンドという bash スクリプトで組み合わせてあって、利用者の応用力が試されるイケてるアプリケーションです。
ところで私の pass の利用歴は約 2.5 年です。個人用で登録しているパスワードの数はこれくらいです。
$ git -C ~/.password-store/private ls-files | grep .gpg$ | wc -l
252
$
当初から今まで継続して使っていますが、去年くらいまでは持て余していた気がします。ですが自分で便利な使い方を見つけていくうちに、活用でき始めたなと実感しています。
パスワードマネージャには類似のアプリケーションが数多くあります。ですがモノリシックなツールと違い、pass を構成するアプリケーションはソフトウェア開発で使うものと共通する所が多いです。ぜひ自分に合った応用方法を見つけましょう。
対象者
これは pass コマンドをインストールしてパスワードの出し入れはできたが、それ以外の用途が思い付かない人向けの記事です。
基本的な使い方は pass をインストールしてから man pass
を見るか、password-store - Simple password manager using gpg and ordinary unix directories. で確認してください。
もし pass をインストールしてみたが gpg とか git などのアプリケーションを積極的には使いたくない、ソフトウェア開発者以外とパスワードを共有したい、という場合は他のアプリケーションを使うべきです。
git
pass を使い始めるには、パスワードを保存する場所を作る pass init {gpg-id}...
を実行します。実行直後はこのようなファイル構成になるでしょう。
$ pass init hoge@example.com
Password store initialized for hoge@example.com
$ cd ~/.password-store
$ tree -a
.
└── .gpg-id
0 directories, 1 file
$ cat .gpg-id
hoge@example.com
$
pass を使い始める動機の 1 つにパスワードを複数人で共有したい、というのがあります。複数人でデータを共有するといえばソフトウェア開発者お馴染みの Git です。pass ではそういう用途に使えるサブコマンド pass git init
があります。でもこのコマンドは便利なのでしょうか?
例えば pass を紹介している Arch Linux のドキュメントでは pass に環境変数を渡して利用用途などによって Git レポジトリを切り変えるシェルスクリプトを例示しています。
たしかにこれで複数人が pass を使うときに Git レポジトリを用途によって分けたい、というのは実現できます。ただ運用面を考えると、利用者同士でシェルを揃えるというのは難しい場合があります。そのため pass の呼び出し元のシェルに依存しないほうが運用し易い場面も出てくるでしょう。
ということで複数のレポジトリを使う方法として pass git
コマンドを全面的に捨てます。その代わりに自前で Git レポジトリを作る構成で使います。
※ただ git init するだけです。例なので /tmp を HOME にしてやってます。
$ git init ~/.password-store/work
Initialized empty Git repository in /tmp/.password-store/work/.git/
$ git init ~/.password-store/private
Initialized empty Git repository in /tmp/.password-store/private/.git/
$
work レポジトリが仕事用、private レポジトリが個人用という想定です。レポジトリは普通のディレクトリなので環境変数など意識せず pass ${repository}/path/to/target
というパスの指定で使えます。ただし Git レポジトリを pull したり push したりする場合 git を直接使う必要があります。該当ディレクトリに移動するか、git -C ~/.password-store/${repository}
のように -C を付けて git を使う必要があります。この作戦は git commit に当たる pass の操作のコストを減らしつつ、その分のコストを git pull や git push で払う感じです。
この構成で初めから今まで使ってます。私にとっては必須の構成です。
gpg
gpg は git に負けず、かなり連携を効かせられるアプリケーションです。
pass の利用を始めるとき、gpg の鍵を作ります。(gpg --full-generate-key
とかで。)
そのとき gpg は主キーと同時に暗号化機能を持つ副キーを作ります。pass ではこの副キーを使います。この鍵を使えば pass の利用者間でパスワード以外のファイルも暗号化してやりとりができます。ですが、この機能を使いたいタイミングは今のところありません。
それよりもオススメしたいのが ssh-agent の代わりに gpg-agent を使うことです。外部サービスなどで使っている SSH の公開鍵を gpg で管理してみましょう。鍵などの秘匿情報は漏れるものと考えて、その鍵に使用期限を付けることで漏れても使えなくなる安心な鍵を作ることができます。
漏れた先の時刻設定が意図的に古くされたら期限設定も意味ないのかもしれませんが…
その鍵を作った後の状態はこんな感じです。usage: S
という署名機能だけを持った副キーに期限を付けています。
$ gpg --edit-key hoge@example.com
gpg (GnuPG) 2.2.25; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
sec rsa3072/A3DDFADA5A35CF2A
created: 2020-12-04 expires: never usage: SC
trust: ultimate validity: ultimate
ssb rsa3072/8B83D07BAA92CEBF
created: 2020-12-04 expires: never usage: E
ssb rsa3072/B1B81A516CEA847C
created: 2020-12-04 expires: 2021-03-05 usage: S
[ultimate] (1). hoge hige pon <hoge@example.com>
gpg>
この状態で OpenSSH 形式の公開鍵を作れます。
$ gpg --export-ssh-key 'B1B81A516CEA847C!'
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCwrYqzViS9gGQLHxKm+hJ8FF0ELehTyoelI4LgKoCPmOBW10aZ5/uqJp9v3fLeN7Sy2yIpsRYaeNwVpWX+oQ58UjuhUEkil9MZQ5KjXk8F8oYorbykoV15XAr5CP/xlYLIMZAmlOH1mz6VKvJIYvifLQAFQuFCVOER7cmZIJl7S4OH7YZnpJMLAaOvDOqpj9bOiAMGbGnFSfx45eZEa4Jbckv2tdk2YZq7PIkVnAG3eEqSa9pPA9neix4j7/YqsC/EOdc/qz8hhECXkELTFDXfg0Hl5MVEOr/Oz9GdG/ubZYgC5No7WNlhkWA+ROr5p10ce9iJB+6iuywkJb0mR7QDJIqFVfQjjJgzC+S40xyfim/g9AYfyhKPOyveKet7oEK+doG1dRWI1wLK0LQT4nbKJ2KyY/JjbQqcTZ5eZcKOtVdaRZM0kPOJ+l7yZjbpmOmi64kbEvo4kxgj8eNeaYxjX2RvtPbwek3rJ1y4n217g3RLu3d3tjgetScNr75BzeE= openpgp:0x6CEA847C
これに gpg-agent に --enable-ssh-support
引数が渡れば ssh-agent と同じように動きます。ただ直接 gpg-agent を使うよりは、他にもオプションも渡すために設定ファイルを経由したほうがいいです。例えばこんな感じです。
~/.gnupg/gpg-agent.conf
pinentry-program /path/to/bin/pinentry
enable-ssh-support
default-cache-ttl-ssh 600
max-cache-ttl-ssh 1800
設定項目の意味はこの辺りを参照してください。
Agent Options (Using the GNU Privacy Guard)
使う鍵はシェル起動時のシェルスクリプトなどでキーグリップを渡すといいでしょう。ただ gpg-agent の実装のせいか ~/.gnupg/sshcontrol に書き込む鍵が多いと SSH ログインの認証時に上から順に試してるせいか、ログインアタックしてるように SSH サーバ側に見られることがあるようです。2 個とか 3 個程度に留めておきましょう。
# gpg --list-keys --with-keygrip hoge@example.com
echo 鍵のKeygrip > ~/.gnupg/sshcontrol
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent
pass private/path/to/secret.pem | ssh-add -q -
互換クライアント
パソコン以外でも pass は使えます。ここでは Android アプリケーションの Password Store アプリを紹介します。
他の互換クライアントは公式ページに載ってるので確認してください。
Password Store アプリは pass find
相当の検索機能とレポジトリのディレクトリ階層を辿るファイルマネージャ風の UI で操作します。Git や SSH の機能が入っています。ただし SSH で使える鍵は RSA のみです。
設定によっては他の Android アプリケーションのパスワード入力のプロンプトで自動的に呼び出されます。
ただし gpg の機能はないので単独では動作しません。gpg の代わりになる OpenKeychain アプリもインストールして連携する必要があります。Password Store アプリで使う鍵はこれで作ります。
せっかくなので OpenKeychain アプリで Password Store アプリが暗号化に使う鍵に加え、SSH で使う鍵も作ります。↑で紹介した gpg の鍵から OpenSSH 形式の公開鍵を作る方法を組み合わせてみます。
ただし OpenSSH 形式の公開鍵をエクスポートする機能は OpenKeychain アプリにないです。結局使い始めるときは OpenKeychain アプリから公開鍵だけをパソコンにコピーして gpg を使う必要があります。
こういう感じです。
# hoge2@example.com の公開鍵が hoge2.asc に保存されている想定
gpg --import hoge2.asc
# SSH の公開鍵に使う鍵の鍵 ID を確認する
gpg --list-keys --keyid-format LONG hoge2@example.com
# SSH の公開鍵を表示する
gpg --export-ssh-key '鍵ID!'
まとめ
gpg も git も応用範囲が広いアプリケーションです。まずは慣れましょう。慣れたら YubiKey 等のスマートキーを使うのもオススメです。
今後もパスワードマネージャアプリは増えていくでしょうが、自分の使い方をよく考えてパスワード管理の運用コストを下げましょう。