コラボレーション・エンジニアの考える日々

企業での情報共有とコミュニケーションについて、ITを中心に企業コラボレーションを考えていくブログです。

より安全なパスワードを設定しよう!

DominoサーバーをWebで使用する場合、Domino Directoryのユーザー文書の"インターネットパスワード"というフィールドにWeb認証用のパスワードを入れます。ここに例えば"password"と入れて保管すると、"355E98E7C7B59BD810ED845AD0FD2FC4"という文字列に変換されて保管されます。ユーザー文書は通常誰でもアクセスできるので、このような形でハッシュすることにより、元のパスワードが分からないようにしているわけです。これは一見安全なように見えますが、"辞書攻撃"と呼ばれるクラッキングに弱いのです。


辞書攻撃とは、パスワードに使用されそうな文字列を大量に登録したデータベースを用意して、片っ端から試してみるという方法です。通常、そのデータベース中のパスワード文字列はハッシュして格納されています。ハッシュ関数にはSHA1、MD2、MD5というような標準のものがあり、ロジックは公開されているので、そのようなデータベースを構築することは可能です。Domino Directoryを入手できれば、この辞書データベースを検索することにより、全てのユーザーのパスワードのハッシュ値が検査され、辞書中のパスワードを使用している何割かのユーザーのパスワードは分かってしまいます。こうしてクラッカーは、ユーザーID・パスワードをまんまと入手してシステムに侵入してくるというわけです。


このような辞書攻撃への対応策として、Dominoは"Salted Hash"と呼ばれるハッシュ関数を用意しています。普通のハッシュ関数は、パスワード文字列を渡すとハッシュ値を返します。


Hash(パスワード文字列) = ハッシュ値


これに対して、Salted Hash関数は、ランダムな文字列(これをソルトと呼ぶ)を実行時点で生成して、それとパスワード文字列を合わせてハッシュ関数を通してハッシュ値を出すというものです。


Salted-Hash(パスワード文字列)
= Hash(パスワード文字列 + ランダム文字列) + ランダム文字列
= ハッシュ値 + ランダム文字列


結果として出てきた文字列のうち、ランダム文字列の部分は取り出し可能です。そうでなければ、Dominoサーバー自身がユーザーのパスワードを認証できなくなってしまいますからね。しかしランダム文字列が分かったとしても、これはユーザー毎に異なります。クラッキングする為には、辞書データベースをSalted Hash関数でユーザー毎に再作成しなければなりません。辞書データベースに登録されている単語数は膨大なので、この作業にはかなり時間がかかります。ユーザー数が多ければそれだけ掛け算で時間がさらにかかります。このように、Salted Hash関数により、クラッキングにかかる時間を膨大なものにし、クラッキングしにくくすることが可能なのです。


Dominoは、デフォルトでは通常のハッシュしかしませんから、Salted Hashを使用するように設定することが望ましいと思います。方法としては、Domino Directoryの"ディレクトリプロフィールの編集"というアクションを実行して出てくる”より安全なインターネットパスワードの使用”というパラメータをオンにします。こうすることにより、その後、登録されるユーザーのインターネットパスワードはSalted Hashで作成されることになります。もう既に登録されているユーザーに対しては、ユーザー文書を選択して、"強固なパスワード形式への変更"というアクションを実行します。これで一括で変更してくれます。


しかしSalted-Hashであっても、時間さえあればパスワードは分かってしまいます。やはり、パスワードは複雑なものを選んだり、こまめに変更するというような基本的な運用が必要ですね。