SSH秘密鍵のパスフレーズは(つけるなら)11文字以上にしましょうねという話
twitter上で、「SSHの秘密鍵って、盗まれて.bash_history見られたらアクセスし放題だから危ないからパスフレーズを付けるべき」という話があった。個人的には、パスフレーズは気休め程度にしかならないと思っているので付けていない。そもそも、SSH秘密鍵のパスフレーズは、ネットワーク越しのパスワードとは違うもので(だから違う名前がついているのだが)、ZIPファイルのパスワードと似たようなものだ。攻撃者がファイルをローカルにコピーしてじっくり解析できる。
よって、パスフレーズが役に立つのは、
という場合だ。このシナリオなら、攻撃者によって接続先に不正にアクセスされるのを防ぐことができる。
パスフレーズによって、どれくらいの猶予が生まれるのか?
パスフレーズによって、どれくらいの猶予が生まれるのだろうか?言い換えれば、秘密鍵のパスワードをクラックするのにどれくらいの時間がかかるのだろうか?
実験してみた。環境は
CPU | Intel Core i7 2.67GHz (実験では1コアしか使っていない) |
OS | Ubuntu Linux 10.4 LTS |
パスフレーズをクラックする方法は・・・、調べれば数分でわかるが、書かないでおくことにする。
で、上記環境で実験したところ、5文字のパスフレーズを破るのに561秒かかった(ちなみに、手元のOpenSSHでは、5文字がパスフレーズの長さの下限である)。道具にちょっと工夫をすれば、複数台のマシンに分散することは容易だ。例えば、4コアのマシンを16台使って解析する場合を考えてみよう。簡単のために、使えるアルファベットが60文字だとすると、以下のようになる。
5文字 | 8秒 |
6文字 | 480秒 |
7文字 | 8時間 |
8文字 | 20日 |
9文字 | 3.3年 |
10文字 | 197年 |
上の計算は計算機の進歩をまったく考えてないから、計算機速度が100倍なら10文字でも2年で破れることになる。2年なら秘密鍵を取り替えるには十分な時間ではないかと思われるかもしれないが、秘密鍵を取り替えるためにはそもそも「盗難に気づく」必要がある。これはかなり難しいと思う。なので、盗難には気づかないという前提での強度を考えるなら、2年あるいは3年というのは短い。結果、パスフレーズの長さは11文字以上欲しいところである。
※当たり前だが、辞書アタックでヒットする場合はもっと速く破れる。そのようなパスワードは避けるべき。
さらに言えば、秘密鍵にパスフレーズをつける場合と言うのは、接続先が秘密鍵認証しか受け付けない場合だろうと思う。
- 秘密鍵を置くホスト自体が信頼できない場合(ホストの管理者を信頼できない場合)や、ノートパソコン等のハード的な紛失・盗難の危険がある場合は、秘密鍵というシステム自体を使うべきではない。それに、秘密鍵が漏れている時点で、ホームディレクトリ全部漏れているわけで、他に心配することが山ほどある。
- それ以外の強固なセキュリティを必要としない場面(組織内のクラスタとか)では、パスフレーズなしで良い
- 秘密鍵のパスフレーズを11文字も打つくらいならパスワード認証+ホスト制限の方がいいと思う。
と言う感じ。