2013年5月15日水曜日

リセット後のパスワードをメール送信するパスワードリセット方式の注意点

先日のエントリパスワードリマインダが駄目な理由にて、現在のパスワードをメール送信する「パスワードリマインダ」がパスワードリセット方式に比べてリスクがある(リスクのコントロールが弱い)という説明をしました。その際に説明したパスワードリセット方式は、パスワード変更の画面URLをメール送信するというものでしたが、もう一つのパスワードリセット方式としては、サイト側でパスワードをリセットして、リセット後のパスワードをメール送信するという方式もあります。このエントリでは、後者の仕様上の注意点について説明します。

とあるサイトのパスワードリセット方式

あるサイトのパスワードリセットの仕様を確認したところ下記の通りでした。
  • パスワードリセット画面では、ユーザIDとメールアドレスを入力する
  • ユーザIDとメールアドレスが共に該当するアカウントがないとエラーになる
  • サイト側でパスワードがリセットされ、リセット後のパスワードがメール送信される
  • 利用者はメール送信されたパスワードによりログインでき、通常の利用が可能となる
この仕様をモデルケースとして、パスワードリセット仕様の問題点について検討します。

問題1.メールのパスワードが盗聴された場合のコントロールがない

先のエントリで指摘したように、メールは盗聴される可能性があり、パスワードリセット機能には、パスワードリセットのメールが盗聴された場合のコントロールを盛り込む必要があります。上記のパスワードリセットの仕様では、メール盗聴の場合のコントロールがないため、リセット後のパスワードを第三者が盗聴した場合、利用者が気づくことなく永続的にパスワードの悪用ができてしまいます。
このように、単純なパスワードリセットの場合、パスワードリマインダと共通の弱点があります。

対策1.仮パスワード方式を採用する

この問題の対策として、「仮パスワード」を使う方法があります。仮パスワードとは、リセット後のパスワード(仮パスワード)ではログイン後全ての機能は使えず、パスワードの変更のみができるというものです。よくある実装は、仮パスワードでログインした場合は、パスワード変更の画面に遷移し、まずパスワードを変更しなければ他の機能は使えないようになっています。
この方式でも、第三者が仮パスワードを盗聴した場合、先にログインしてパスワードを変更してしまう可能性はありますが、単純なパスワードリセットと比べて以下が異なります。
  • 運が良ければ利用者の方が先にパスワードを変更して、第三者の悪用を防げる
  • 運悪く第三者が先にパスワードを変更した場合は、本来の利用者は、ログインできないことで悪用の可能性に気づくことができる
  • パスワード変更のメール通知機能により、第三者のパスワード変更についてもメールで確認できる
上記については、パスワード変更の画面URLを送信するタイプと同じですね。加えて、仮パスワードの有効期限(1時間~半日程度)を設けておくと、仮パスワードが放置された場合のリスクを低減できます。

問題2.パスワードリセット機能悪用によるサービス妨害

第三者がメールを盗聴できない場合でも、ログインIDとメールアドレスがわかれば、第三者がパスワードをリセットできてしまいす。この場合、第三者に新しいパスワードを知られてしまうリスクはありませんが、パスワードを勝手に変えられてしまい、サイトの利用を妨害される点が問題です。利用者は、新しいパスワードはメールにより知ることはできますが、面倒を強いられることになります。

対策2-1.仮パスワード発行後も元のパスワードでもログイン可能とする

正式なパスワードと仮パスワードを別々に管理して、仮パスワードが発行された状態でも、元のパスワードでログインできるようにしておけば、パスワードリセット機能の悪用を緩和できます。さらに、以下の仕様としておけば、利用者がパスワードリセット機能の悪用に気づきやすくなります。
  • 仮パスワードが有効な状態で、正式パスワードでログインした場合は、仮パスワードを無効にする
  • 上記の場合、「仮パスワードが○月○日○時○分に発行されていましたが無効にしました」などのメッセージを表示する

対策2-2.パスワードリセットの前に秘密の情報を問い合わせる

パスワードリセット機能の悪用を緩和する方法として、ユーザIDやメールアドレスのみでパスワードリセットするのではなく、もう一つ秘密情報を問い合わせるという方法があります。以下は、拙著「安全なWebアプリケーションの作り方」(P354)からの画面遷移の引用です。
上記では「秘密の質問と答え」を使っていますが、「秘密の質問と答え」は忘れやすいのが難点ですね。このため、秘密の質問に代えて、電話番号や(予備の)メールアドレスを問い合わせる方法も考えられます。
「電話番号なんて公開情報では駄目だろう」と思われるかもしれませんが、あくまで「パスワードリセット機能悪用によるサービス妨害の緩和策」なので、厳密な秘匿性が必須というわけではありません。
そもそも、オンラインのパスワードリセット機能にはリスクが伴うものであり、それが許容できない場合は、オンラインパスワードリセットの機能をやめるべきです。多くのネット銀行がオンラインのパスワードリセット機能を実装せず、書面でパスワードリセットするようにしているのは、この理由からです。

まとめ

パスワードリセットの実現方法として、「リセット後のパスワードをメール送信する方法」の課題と対策について説明しました。
課題としては以下がありました。
  • パスワードリセットのメールが盗聴された場合のコントロールがない
  • パスワードリセット機能の悪用によるサービス妨害のリスク
このため、以下を実現するとよいでしょう。
  • 仮パスワード方式とする(必須)
  • パスワード変更をメールで通知する(必須)
  • 仮パスワードの有効期限を設ける(強く推奨)
  • 仮パスワード発行後も元のパスワードは有効とする(強く推奨)
  • 仮パスワードが有効な状態で、元パスワードでログインした場合は、仮パスワードをキャンセルして警告表示する(推奨)
  • パスワードリセットの前に秘密情報を要求する(推奨)

[PR]

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ