Solist Work Blog

Software engineer note

Passwordについて考える

パスワードをどのように取り扱うのかは結構頭を悩ませる問題です。 この記事では私のパスワードの管理方法について書いていくことにしましょう。 私がパスワードについて考えるときにヒントにしたのはエドワード・スノーデンが何を使っているかです。

エドワード・スノーデンNSAの職員だったわけですから、彼が使っているソフトウェアならば少なくとも数年前のNSAのレベルの相手でもパスワードが守れるはずです。1 このレベルの相手に対してパスワードを守れるならばとりあえず安全であるといってもよいのではないでしょうか。

エドワード・スノーデンがジャーナリストに情報提供する際に条件としたのはGnuPGで暗号化したメールでやり取りすることです。つまりGnuPGで暗号化したメールはNSAにとってもやっかいなものであるということがわかります。 というわけなのでパスワードなどのセンシティブな情報はエドワード・スノーデンがお勧めするGnuPGで暗号化するようにしましょう。2

私はほとんど全てのパスワードをGnuPGをバックエンドとして使っているespy(Emacs Simple Password Yielder)で管理しています。 espyの作者によるとセキュリティを高めるためにソースコードを極限までシンプルにしてオープンソースで公開したので今後は変更しないそうです。むしろ彼はコードを全部読んだらパッケージとして使わないで手動で自分のEmacsに組み込んでほしいと言ってのけるクールなエンジニアです。つまり将来の彼のGitHubもMELPAも信用しないでくれと言っているのです。 実際に途中経路が改ざんされることもよくあることなので、彼が言っていることもあながち大げさでもなく、セキュリティはこれくらいの神経質さでちょうどよいのかもしれません。

これらを二段階認証のDropboxにいれているのでDropboxの社員に私のパスワードファイルを持っていかれてもまだGnuPGに守られているということになります。 USBメモリだけにrecovery-codeやpasswordをGnuPGで暗号化したファイルを置いておくとUSBメモリをなくした場合悲惨なことになります。 それにUSBメモリをなくす確率とDropboxの社員にファイルを持っていかれる確率をくらべるとおそらく前者のほうが高いのではないでしょうか。また、USBメモリを唯一のデータ置き場にすることはデータが消える可能性があるので心もとないです。3 セキュリティを高めるためにはGnuPGで暗号化したファイルはローカルで持つのがよいのでしょうが、定期的にクリーンインストールしてセキュリティを高めたいという要件もあるので私はDropboxにGnuPGで暗号化したファイルを置くことを利便性とセキュリティの落とし所としています。4

GnuPGの使い方

GnuPGをインストールしておきます。ArchLinuxでは以下でインストールします。

sudo pacman -S gnupg

次に鍵を生成します

gpg --full-gen-key
RSA暗号4096
名前を入力 Pico Taro
メールアドレス pico@example.com
期限は無限

鍵を確認する

gpg --list-secret-keys
/home/masa/.gnupg/pubring.kbx
-----------------------------
sec   rsa4096/**************** 2019-09-14 [SC]
  ****************************************
uid                 [  究極  ] Pico Taro <pico@example.com>
ssb   rsa4096/**************** 2019-09-14 [E]

まずはrecovery-codeをGnuPGで暗号化してみましょう。 Google、GitHub、Dropboxは二段階認証で使わないとセキュリティから見て好ましくないので、もし二段階認証を使っていないならすぐに設定してください。ほとんどの人は二段階認証にスマートフォンを使用すると思いますが、スマートフォンが壊れたり無くなったりした場合に備えてrecovery-codeが発行されます。recovery-codeが外部に漏れるとアカウントを乗っ取られてしまいますので、recovery-codeのファイルの暗号化は必須です。5

gpg -c google-recovery-code

手っ取り早く共通鍵暗号方式のみを使用してパスワードで暗号化されました。 先程作った公開鍵を使って暗号化するには以下のようにします。

gpg -r pico@example.com --encrypt google-recovery-code

コマンドで暗号化する時はこれだけで暗号化したファイルができます。 EmacsはデフォルトでGnuPGが扱えるようになっているので拡張子を.gpgにしてgoogle-recovery-code.gpgで保存しましょう。

GnuPGで暗号化

共通鍵暗号方式のみを使用してパスワードで暗号化する場合はTabを二回押して[OK]をクリックします。 公開鍵を選択してmでチェックを入れると公開鍵を使って暗号化されます。この場合はパスワードは不要ですが、gpg –full-gen-keyで生成した公開鍵が必要になります。6 秘密鍵をなくしそうな人はパスワードの桁数を12桁以上にして暗号化するのも手ですが、公開鍵のほうがさらに安全性が高いので公開鍵を使って暗号化しましょう。 以下は説明の簡略化のため共通鍵暗号方式のみを使用してパスワードで暗号化した場合について書いています。

GnuPGのパスワードを設定する

パスワードを二回入力します。パスワードの入力が終わればGnuPGで暗号化されたファイルが生成されます。

GnuPGで暗号化が完了

パスワードで暗号化した場合はこれ以降はこのgoogle-recovery-code.gpgをパスワード無しで開くことはできません。 総当たり攻撃プログラムを作成して解析される場合にそなえて、パスワードは最低でも12文字以上にしましょう。 英数字小文字大文字記号の12桁のパスワードを解析するには数十年かかるので、そのgpgファイルにフェルマーの最終定理の証明が書かれているのでもなければ誰も数十年かけてgpgファイルを解析しようとは思わないでしょう。7

espyの使い方

次にespyの使い方を説明します。 MELPAからインストールしましょう。

M-x package-install espy

パスワードファイルを~/backup/passwd/password.org.gpgに保存します。 拡張子はorg-modeで管理するので.org.gpgにする必要があります。

init.el

(setq espy-password-file "~/backup/passwd/password.org.gpg")

password.org.gpgファイルの書式は以下のように保存しておきます。

~/backup/passwd/password.org.gpg

* Bank of America
user: user
pass: password
* Bank of Scotland
user: user
pass: password
* amex
user: user
** amex password
pass: password
** amex password2
pass: password2

例えばAmerican Expressのように第二パスワードが必要なものはこのように保存しておきます。

さっそく使ってみましょう。

M-x espy-get-pass

espy-get-passを実行

マスターパスワードを入力します。

espyでパスワードを選択する

欲しいパスワードを選択します。 これでペーストするだけでパスワードが使えますので ブラウザのパスワード入力フォームにペーストできます。

M-x espy-get-user

ユーザー名が必要な時はこちらのコマンドをたたきます。espyのコマンドはこの2つだけです。

browserpass

さらにブラウザと連動したパスワード管理をしたいならbrowserpassbrowserpass-extensionがおすすめです。 GnuPGを使って安全にパスワード管理ができて、かつオープンソースなのでソースコードを確認することもできるので安心して利用することができます。

browerpassを使っているところ

ログインページにアクセスして拡張機能の鍵アイコンをクリックすると該当ドメインのユーザー名とパスワードが表示されます。クリックすれば選択したユーザー名とパスワードが自動入力されます。

sudo pacman -S browserpass browserpass-chrome browserpass-firefox

browserpassをインストールしたら次にChrome webstoreFirefoxアドオンbrowserpassをインストールします。

browserpassの設定画面

add storeボタンを押してCustom store locationsを設定します。

~/backup/browserpass

あるいはシンボリックリンクをはるのもよいでしょう。

ln -vsfn ${HOME}/backup/browserpass ${HOME}/.password-store

このディレクトリ直下に次のような形式でgpgファイルを置いていきます。 ログインページのドメインをファイル名にしましょう。

~/backup/browserpass/github.com.gpg
~/backup/browserpass/twitter.com.gpg
~/backup/browserpass/app.netlify.com.gpg

gpgファイルの中身の書式は以下のようにして公開鍵でgpgファイルを暗号化しておきます。

user: username
pass: password

複数のアカウントを使う場合はログインページのドメイン名のディレクトリを作り、そのなかに複数のgpgファイルを作成します。

~/backup/browserpass/login.yahoo.co.jp/your-yahoo-id.gpg
~/backup/browserpass/login.yahoo.co.jp/your-yahoo-anothor-id.gpg

~/backup/browserpass/には暗号化したデータしかないのでお好きなクラウドに転送してバックアップしましょう。

alias syncdropbox='time rclone sync ${HOME}/backup dropbox:backup'
alias syncdrive='time rclone sync ${HOME}/backup drive:backup'
alias backupcloud='syncdropbox; syncdrive'

わたしは.zshrcにこのようなaliasを設定してbackupcloudコマンドでまとめてDropboxとGoogle Driveにバックアップしています。 rcloneの設定方法などはこちらの記事を参考にしてください。


  1. 今のところNSAが私のパスワードを欲しがっているとは思えませんが…。 ↩︎

  2. エドワード・スノーデンがお勧めするTailsというLinuxディストリビューションはプライバシー保護には最適ですが、ログが残らないのでソフトウェアエンジニアが開発環境にするのには向いていません。GnuPGだけでも十分セキュアだと思います。 ↩︎

  3. ブロックチェーンのパスワードなどをUSBメモリだけに入れていてデータが消えた場合、誰かにブロックチェーンで管理している資産を取られる心配はないかもしれませんが、誰にもその資産が使えない状態になってしまいます。これが本当の塩漬けかもしれません。 ↩︎

  4. 定期的にクリーンインストールすると万が一ウィルスが侵入していても排除することができます。全体をバックアップするような方法で対処するとウィルスも一緒にバックアップすることになるのでクリーンインストールのほうがはるかに安全です。オープンソースのソフトウェアのメインラインにウィルスを混入させるのは多数のソフトウェアエンジニアの目があるために困難ですから、これ以上にセキュアな環境はないでしょう。クリーンインストールは最高のセキュリティ対策なのです。定期的にクリーンインストールする方法はこちらの記事を参考にしてください。 ↩︎

  5. Dropboxのrecovery-codeだけは何のパスワードかわからない状態にして財布に入れておくか庭に埋めておくとよいでしょう。こうしておくと鍵を保管している金庫の中に鍵があって金庫が開けられない問題が解決します。私なら自分か家族にしかわからない並べ替え方を添えてrecovery-codeを分割して保存するでしょう。あえて方法や場所をぼかして書いているのはここを見た人に狙われないようにするためです。 ↩︎

  6. GnuPGでは公開鍵を使用するとマスターパスワードが必須になったのでたまにマスターパスワードは聞かれます。秘密鍵とマスターパスワードだけオフラインの複数の場所で管理すれば安全です。GnuPGのマスターパスワードは毎日聞かれるので忘れないでしょうから、秘密鍵は災害が起きた時のために物理的に離れた場所に保管しておくのがよいと思います。私はRaid1NASとUSBメモリに入れています。さらに心配ならUSBメモリなどに秘密鍵を入れて自分しか知らない場所に埋めておくか銀行の貸金庫にあずけておくのがよいかもしれません。貸金庫を使う場合、銀行がNSAなどからも秘密鍵を守ってくれるのかは知りませんので自己責任でどうぞ。 ↩︎

  7. 総当たり攻撃するパスワード解析プログラムは並列化可能なので数十年かからないではないかといえばそうでしょう。しかし、クラウドサーバーを大量に借りて並列で解析した場合一ヶ月くらいで解析可能かもしれませんが、その費用はおそらく数千万円から数億円のオーダーになるのではないでしょうか。あなたのパスワードを狙っている相手がお金に糸目をつけないならその心配をしたほうがよいでしょう。相手に応じてパスワードの桁数を増やすことや記号をパスワードに含めることなどを検討してください。ムーアの法則が終わりに近づいているのでパスワードを20桁以上に増やさなくてもよさそうではあります。私はEmacs上でpassword-genaratorをインストールしてM-x password-generator-paranoidでoXi&^(U9eQ%cxO9?7Sliのような20桁のパスワードを生成しています。しかしこのような記号や20桁のパスワードを許容しないサイトが存在するのでその場合は仕方なくM-x password-generator-strongで生成した0W8HcwEwW&2aのような12桁のパスワードで我慢しています。これ以下の強度のパスワードしか設定できないサイトは利用することをやめたほうがよいかもしれません。本来サイトのデータベースには不可逆暗号化したパスワードしか入れてはいけないはずですが、そうなっていないサイトが存在するため、あるサイトからパスワードが漏洩した場合他のサイトとパスワードを使いまわしているとパスワードの強度が高くても意味がないので当然サイトごとに異なったパスワードを使うべきでしょう。 ↩︎

タグ一覧

お仕事のご相談などはこちらからどうぞ

お仕事の依頼はこちらからどうぞ