とあるサイトのパスワードリセット方式
あるサイトのパスワードリセットの仕様を確認したところ下記の通りでした。- パスワードリセット画面では、ユーザIDとメールアドレスを入力する
- ユーザIDとメールアドレスが共に該当するアカウントがないとエラーになる
- サイト側でパスワードがリセットされ、リセット後のパスワードがメール送信される
- 利用者はメール送信されたパスワードによりログインでき、通常の利用が可能となる
問題1.メールのパスワードが盗聴された場合のコントロールがない
先のエントリで指摘したように、メールは盗聴される可能性があり、パスワードリセット機能には、パスワードリセットのメールが盗聴された場合のコントロールを盛り込む必要があります。上記のパスワードリセットの仕様では、メール盗聴の場合のコントロールがないため、リセット後のパスワードを第三者が盗聴した場合、利用者が気づくことなく永続的にパスワードの悪用ができてしまいます。このように、単純なパスワードリセットの場合、パスワードリマインダと共通の弱点があります。
対策1.仮パスワード方式を採用する
この問題の対策として、「仮パスワード」を使う方法があります。仮パスワードとは、リセット後のパスワード(仮パスワード)ではログイン後全ての機能は使えず、パスワードの変更のみができるというものです。よくある実装は、仮パスワードでログインした場合は、パスワード変更の画面に遷移し、まずパスワードを変更しなければ他の機能は使えないようになっています。この方式でも、第三者が仮パスワードを盗聴した場合、先にログインしてパスワードを変更してしまう可能性はありますが、単純なパスワードリセットと比べて以下が異なります。
- 運が良ければ利用者の方が先にパスワードを変更して、第三者の悪用を防げる
- 運悪く第三者が先にパスワードを変更した場合は、本来の利用者は、ログインできないことで悪用の可能性に気づくことができる
- パスワード変更のメール通知機能により、第三者のパスワード変更についてもメールで確認できる
問題2.パスワードリセット機能悪用によるサービス妨害
第三者がメールを盗聴できない場合でも、ログインIDとメールアドレスがわかれば、第三者がパスワードをリセットできてしまいす。この場合、第三者に新しいパスワードを知られてしまうリスクはありませんが、パスワードを勝手に変えられてしまい、サイトの利用を妨害される点が問題です。利用者は、新しいパスワードはメールにより知ることはできますが、面倒を強いられることになります。対策2-1.仮パスワード発行後も元のパスワードでもログイン可能とする
正式なパスワードと仮パスワードを別々に管理して、仮パスワードが発行された状態でも、元のパスワードでログインできるようにしておけば、パスワードリセット機能の悪用を緩和できます。さらに、以下の仕様としておけば、利用者がパスワードリセット機能の悪用に気づきやすくなります。- 仮パスワードが有効な状態で、正式パスワードでログインした場合は、仮パスワードを無効にする
- 上記の場合、「仮パスワードが○月○日○時○分に発行されていましたが無効にしました」などのメッセージを表示する
対策2-2.パスワードリセットの前に秘密の情報を問い合わせる
パスワードリセット機能の悪用を緩和する方法として、ユーザIDやメールアドレスのみでパスワードリセットするのではなく、もう一つ秘密情報を問い合わせるという方法があります。以下は、拙著「安全なWebアプリケーションの作り方」(P354)からの画面遷移の引用です。上記では「秘密の質問と答え」を使っていますが、「秘密の質問と答え」は忘れやすいのが難点ですね。このため、秘密の質問に代えて、電話番号や(予備の)メールアドレスを問い合わせる方法も考えられます。
「電話番号なんて公開情報では駄目だろう」と思われるかもしれませんが、あくまで「パスワードリセット機能悪用によるサービス妨害の緩和策」なので、厳密な秘匿性が必須というわけではありません。
そもそも、オンラインのパスワードリセット機能にはリスクが伴うものであり、それが許容できない場合は、オンラインパスワードリセットの機能をやめるべきです。多くのネット銀行がオンラインのパスワードリセット機能を実装せず、書面でパスワードリセットするようにしているのは、この理由からです。
まとめ
パスワードリセットの実現方法として、「リセット後のパスワードをメール送信する方法」の課題と対策について説明しました。課題としては以下がありました。
- パスワードリセットのメールが盗聴された場合のコントロールがない
- パスワードリセット機能の悪用によるサービス妨害のリスク
- 仮パスワード方式とする(必須)
- パスワード変更をメールで通知する(必須)
- 仮パスワードの有効期限を設ける(強く推奨)
- 仮パスワード発行後も元のパスワードは有効とする(強く推奨)
- 仮パスワードが有効な状態で、元パスワードでログインした場合は、仮パスワードをキャンセルして警告表示する(推奨)
- パスワードリセットの前に秘密情報を要求する(推奨)
[PR]
0 件のコメント:
コメントを投稿