俺専用パスワード管理ツールを作った

github.com

恥ずかしながらわたし、つい最近まで類似のパスワードを適当に記憶に頼って数種類使い分けるという運用をしていた。しかしながら、次のようなメールが期間をおいていくつか届き、類似のパスワードを使っている他のサービスに被害が及ぶのを恐れて、ランダムにパスワードを生成して保存するツールを作った。

f:id:kuenishi:20170124213157p:plain
f:id:kuenishi:20170124215620p:plain

いくつかのECサイト、特に小規模ECサイトは2要素認証が設定できないものが多く*1、あのアマゾンでさえ…と思ったら、いつのまにか2要素認証できるようになっていた。そうはいっても一部のサイトではクレジットカード情報を保存しておきながら2要素認証しないとか不安しかないので、自分でパスワード管理できるプログラムを練習がてら作って運用をまるごと変えることにした。既存のパスワード管理のソフトウェアやサービスがいくつもあるが、以下の理由でやめた

  • 無料サービスは信用できない
  • 有料サービスはちょっと躊躇する(秘密鍵を預けるのは怖い
  • プロプライエタリなソフトウェアは、いざというときに検証できない(損害賠償するのかな)
  • OSSはGUIがついているものが大半で、コードベースが大きいので検証しにくい

要件としては

  • パスワードを暗号化してローカルファイルシステムに保存する
  • 保存したファイルは読みやすいフォーマットであること、外部にバックアップ可能であること
  • 秘密鍵は別途保存
  • ツール全体のコードが小さいこと(目標1000行以下、GUIは不要)
  • 依存するライブラリは最小限にして、常にコードをチェックできるようにしておくこと
  • ポータブルであること(Mac, Linux, Windowsで動くこと)
  • 他の端末にもデータを移せること

くらい。それで作ったのが、冒頭の Baccounts だ。GnuPGの秘密鍵が安全に保持されている限りパスワードが漏洩される危険はない。ブラウザを使わないのでXSSやCSRF、自動補完の心配もない。Baccounts が持っている機能は

  • プロファイル毎に、サイトのメールアドレスを保存したりパスワードを生成(generate)・表示(show)できる
  • プロファイルやアカウントを一覧表示(list)
  • 持っている公開鍵暗号ペアを一覧表示(list-keys)
  • 公開鍵があれば、その鍵ペアに対して全ての情報をexportできる(複数のマシンで使いまわせる)

である。なにかのサイトにログインしたいときは、次のような感じでパスワードを見ずに取り出せる

$ baccounts show -site https://twitter.com                                                      [~/log/baccounts]
datafile: /Users/kuenishi/.baccounts
baccounts version 0.0.1-SNAPSHOT - data file version: 0.0.1-SNAPSHOT
Passphrase of your GPG key:
Secret Keyring: /Users/kuenishi/.gnupg/secring.gpg
Pass for https://twitter.com copied to clipboard

非エンジニアの人はCUIとかGo言語とか使えないと思う…なお、GnuPG 1.4または2.0で作った OpenPGP フォーマットの公開鍵と秘密鍵が "$HOME/.gnupg" 以下に揃っていることが動作条件だ。これは

$ baccounts list-keys
$ baccounts test

などとして動作確認することができる。

なお、コードの透明性を高めるためにライセンスはあえてGPLとした。これからコミットされるコードは全て署名を要求することにしようと思う。

今後やりたいことは

  • Androidアプリでも作ってスマホでも使えるようにする
  • keybase.io にデータを保存、できるかな?
  • GnuPG 2.1 (gpgsm) フォーマットも読めるようにする...これはGoのcrypto/openpgp次第かな…
  • yubikeyなどの物理デバイスでの解錠
  • 実行バイナリの署名付き配布
  • パスワードの更新

などである。もし興味のある人がいたらPull requestを送ってくれてもよいし、セキュリティホールがあった場合はご指摘いただければと思う。

*1:おめーだよ、ヨドバシ.com!!