オープンソースのERP iDempiereのパスワードに関する対策について、IPAが発行する「安全なウェブサイトの作り方 改訂第7版」を参考に、調査及び研究しその成果をまとめています。
パスワードに関する対策
IPA 「安全なウエブサイトの作り方 改訂第7版」55ページからの引用
ウェブサイトにおける利用者の認証は、ユーザID とパスワードを用いる方法が一般的です。しかし、 パスワードの運用やウェブページ上のパスワードの取り扱い方法に問題がある場合、利用者の認証情 報が悪意ある人に不正取得される危険性が高まります。
認証情報の不正取得の手段の一つに、ユーザID やパスワードの「推測」があります。これは、推測さ れやすい単純なパスワードで運用している場合に悪用される手段ですが、ウェブページの表示方法によ っては、さらに推測のヒントを与えてしまう場合があります。利用者の認証を行うウェブサイトでは、次の 内容に注意してください。
初期パスワードは、推測が困難な文字列で発行する
初期パスワードについて、「安全なウエブサイトの作り方 改訂第7版」では、次のように記載されています。
初期パスワードは、暗号論的擬似乱数生成器を利用して規則性をなくし、可能であれば英数字や記 号を含めた長い文字列で発行してください。パスワード発行に規則性がある場合、調査のためのテス トユーザを複数登録され、その際に発行されたパスワードから規則性を導き出されてしまうかもしれま せん。利用者によっては、初期パスワードを変更せずに継続して利用することも考えられるため、初期 パスワードが推測しやすい仕様は避けるべきです。
初期パスワードについては、iDempiereの管理者がユーザーに割り当てる事になりますので、どのようなパスワードをユーザーに割り当てるかは、管理者次第です。「安全なウエブサイトの作り方 改訂第7版」に記載されている通り、暗号論的疑似乱数生成器を利用してパスワードを発行するなど運用で対応する事になります。
ユーザーが初期パスワードを変更する際には、簡単なパスワードを設定できないようにパスワードポリシーを作成する事ができます。
◆最小の長さ
0より大きい数値を設定すると、パスワードの文字列を設定した数値以上の長さにする必要があります。
◆最大の長さ
0より大きい数値を設定すると、パスワードの文字列を設定した数値以下の長さにする必要があります。
◆アルファベットの最小文字数
0より大きい数値を設定すると、パスワードの文字列に設定した数値以上のアルファベットを含める必要があります。
◆数字の最小文字数
0より大きい数値を設定すると、パスワードの文字列に設定した数値以上の数字を含める必要があります。
◆大文字の最小文字数
0より大きい数値を設定すると、パスワードの文字列に設定した数値以上のアルファベットの大文字を含める必要があります。
◆小文字の最小文字数
0より大きい数値を設定すると、パスワードの文字列に設定した数値以上のアルファベットの小文字を含める必要があります。
◆アルファベットでも数字でも無い文字の最小文字数
0より大きい数値を設定すると、パスワードの文字列に設定した数値以上のアルファベットでも数字でもない文字列を含める必要があります。
◆無効となる連続したアルファベットの文字数
0より大きい数値を設定すると、パスワードの文字列に設定した数値以上の連続したアルファベットがある場合、そのパスワードはエラーとなります。このフィールドに設定できる値は3以上です。例えばこのフィールドの値に3を設定した場合、"abc","cba","xyz"など3連続のアルファベットをパスワードに含める事ができなくなります。
◆無効となる連続した数字の文字数
0より大きい数値を設定すると、パスワードの文字列に設定した数値以上の連続した数値がある場合、そのパスワードはエラーとなります。このフィールドに設定できる値は3以上です。例えばこのフィールドの値に3を設定した場合、"123","789","987"など3連続の数値をパスワードに含める事ができなくなります。
◆無効となる連続したQWERTYの文字数
0より大きい数値を設定すると、パスワードの文字列に設定した数値以上の連続したキーボードの配列順の文字列がある場合、そのパスワードはエラーとなります。このフィールドに設定できる値は3以上です。例えばこのフィールドの値に3を設定した場合、"qwe","asd","dsa"など3連続のキーボードの文字列の配置をパスワードに含める事ができなくなります。
◆無効となる連続した同じ文字の文字数
0より大きい数値を設定すると、パスワードの文字列に設定した数値以上の連続した同じ文字がある場合、そのパスワードはエラーとなります。このフィールドに設定できる値は3以上です。例えばこのフィールドの値に3を設定した場合、"111","aaa","bbb"など3連続の同じ文字をパスワードに含める事ができなくなります。
◆パスワードの再利用可能日数
以前に使用したパスワードの再利用を許可する日数を設定します。
◆ユーザー名をパスワードに含めない
このフラグをONにするとユーザ―名がパスワードに含まれないようにチェックする事ができます。
◆パスワードに空白を含めない
このフラグをONにするとパスワードに空白(スペース)が含まれないようにチェックする事ができます。
◆辞書を使用する
辞書としてテキストに含めた文字列をパスワードに使用するのを禁止する事ができます。辞書に複数の文字を登録する際には文字ごとに改行したテキストファイルを用意します。
◆逆さ読みもチェックする
辞書としてテキストに含めた文字列をパスワードに使用するのを禁止した際に、このフラグをONにすると逆さ読みもチェックする事ができます。
パスワードの変更には、現行パスワードの入力を求める
パスワードの変更について、「安全なウエブサイトの作り方 改訂第7版」では、次のように記載されています。
パスワードの変更には、必ず現行パスワードの入力を求めるようにしてください。
iDempiereでは、ログイン時にパスワードの変更を促すようにする事ができます。その際に、現行のパスワードの入力を求めます。
関連するコンテンツ
入力後の応答メッセージが認証情報の推測のヒントにならない工夫をする
入力後の応答メッセージが認証情報の推測のヒントにならない工夫をする事について、「安全なウエブサイトの作り方 改訂第7版」では、次のように記載されています。
認証画面で利用者が入力を誤った際、遷移後の画面で「パスワードが間違っています」というエラー メッセージを表示するものは、「ユーザID は正しく、パスワードが間違っている」ということを示している ことになります。このような表示内容は、登録されているユーザID の割り出しを容易にしてしまうため、お勧めできません。入力後の応答メッセージには、「ユーザID もしくはパスワードが違います」というよ うな表示を用い、認証情報の推測のヒントを与えない工夫をしてください。
iDempiere/JPiereでも、ユーザーIDとパスワードのどちらが間違っているのか推測できないようなメッセージが使用されています。
入力フィールドでは、パスワードは伏字で表示されるようにする
入力フィールドでは、パスワードは伏字で表示されるようにするについて、「安全なウエブサイトの作り方 改訂第7版」では、次のように記載されています。
利用者にパスワードを入力させるときは、ブラウザに備わっているパスワード専用の入力フィールド を用いるようにしてください。これにより、入力したパスワード文字列は伏せ字(アスタリスク "*")で表 示されます。
パスワードをサーバ内で保管する際は、平文ではなソルト付きハッシュ値の形で保管する
パスワードをサーバ内で保管する際は、平文ではなソルト付きハッシュ値の形で保管するについて、「安全なウエブサイトの作り方 改訂第7版」では、次のように記載されています。
ウェブサイト内で保管したパスワードがSQL インジェクション攻撃などにより外部に漏洩した場合、 パスワードリスト攻撃等の不正ログインに悪用される可能性が高くなります。このため、万一パスワー ド情報が漏洩した場合でも直ちに悪用されることのないように、パスワードを保護した形で保管します。 この目的のためには、パスワードのハッシュ値(暗号論的ハッシュ関数により計算)の形で保管するこ とが一般的に行われています。
ハッシュ値から平文文字列を復元することは一般的には困難ですが、弱いパスワードの場合は辞 書攻撃により元のパスワードを復元できてしまいますし、複数の同じハッシュ値を探すことで、同一の 弱いパスワードをつけているアカウントを簡単に見つけることができてしまいます。また、辞書攻撃で 復元できないパスワードであっても、十分に長いパスワードでないと、総当り攻撃により、十分な時間 をかければ元のパスワードを復元できてしまう問題があります。そして、それを高速に実現するレイン ボーテーブルという技法が開発されています。
これらに対し、保管するハッシュ値を、パスワードにソルトと呼ばれるユーザ毎に異なる文字列をつ けてからハッシュ値を求めたものとすることにより、見かけのパスワードを長くして、レインボーテーブ ル攻撃を回避できますし、前記の同一のパスワードの発見も回避できます。したがって、このようなソ ルト付きハッシュ値の形でパスワードを保管することをお勧めします。
さらに、それでもなお、弱いパスワードや十分に長くないパスワードは、十分な時間をかければ復元 されてしまうので、復元にかかる計算時間を長くするために、あえて計算の遅いハッシュ関数を使う技 法があります。そのような遅いハッシュ関数を実現する一つの方法として、ハッシュ値をさらにハッシュ 関数にかける計算を繰り返し行う方法があり、この方法はストレッチングと呼ばれています。