Webセキュリティの小部屋

Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから
公開日:2014年11月8日

秘密の質問は本当に必要なのか

最近、サービスで秘密の質問と答えを要求するものが増えてきていますが、秘密の質問は本当に必要なのでしょうか。秘密の質問には、いろいろと疑問点があるので、少し考察してみたいと思います。

まず、秘密の質問を使用しているのは、どのような状況でしょうか。現状では、以下の場合が想定されます。

  1. パスワードを忘れてしまったため、パスワードを再発行するための本人確認として使用する
  2. 定期的に秘密の質問を要求することにより、アカウント乗っ取りの被害を軽減する
  3. 通常と異なる状況からログインされている時の本人確認として使用する

こうしてみると、秘密の質問は必要な機能なような気がしますが、本当にそうなのでしょうか?

1は、登録メールアドレスにパスワードリセット用のアドレスを送信することで解決します。但し、乗っ取りによる変更を防ぐために、メールアドレス変更時にはメールアドレスリセットのアドレスを変更前のメールアドレスに送信する必要があります。

2は、秘密の質問が安全なものであれば、限定的であれば効果がありそうです。秘密の質問の安全性については後述します。しかし、あくまで限定的です。

3については、効果がありますが、ログインアラートで代替が可能です。

ここで、秘密の質問を使用することによる課題も考えてみましょう。

  • 秘密の質問は、多くの場合選択式となっていて自分で質問を設定できない。そのため第三者が知りうる情報が秘密の質問に指定されることが多く、本人確認を行う手段として適切ではない。
  • 秘密の質問の答えを忘れた場合の復旧措置が多くの場合用意されていない。
  • 秘密の質問は、多くの場合変更することができない。
  • 秘密の質問は、本人確認の最終手段なのにパスワードと同レベルの安全性で保護されていない。

ざっと考えてみただけで、これだけの課題が想定される手法には問題があります。実装上の課題も含まれていますが、それも含めて秘密の質問を採用するには課題が多いと言えるでしょう。

それでは、秘密の質問を採用しない場合の問題となりそうな点も考えてみましょう。

  1. パスワードリスト攻撃に対応することができない
  2. パスワードを忘れた場合の本人確認ができない
  3. パスワード変更時、本当に本人だと確認する手段が用意されていない
  4. 通常と異なる状況からログインされても、本人確認する手段がない

1についてですが、パスワードリスト攻撃を秘密の質問で防ごうと思ったら、ログインの度に秘密の質問を入力することになり、利便性が大きく低下してしまいます。これは現実的ではないでしょう。パスワードリスト攻撃には別の方法で対策すべきです。

2についてですが、パスワードのリセットは、本人確認を秘密の質問で行う必然性がありません。登録メールアドレスにパスワードリセット用のアドレスを送信すればよいだけです。

3についてですが、パスワードリセットと同様に登録メールアドレスにパスワードリセット用のアドレスを送信すればよいだけですので、これも秘密の質問を使用する必然性はありません。

4については、最近のサービスではアクティビティとして、どこからログインされたかの履歴を表示する機能が実装されるようになってきました。ユーザーがアクティビティを確認できるようにすれば、秘密の質問を使用する必然性はなくなります。

こうしてみると、秘密の質問を採用する必然性は低いと言えます。

ですが、パスワードリスト攻撃に対してはどのように対抗すればよいのでしょうか。

それは、秘密の質問に頼るのではなく、アカウントが乗っ取られない方法を採用することでしょう。

具体的には、2段階認証を採用することが一番確実な方法でしょう。2段階認証の採用が難しい場合は、ログインが成功または失敗した場合に、登録メールアドレスにログインされた旨の情報を通知することにより(ログインアラート)、ユーザーが被害に合う前に対策できるようにする方法を検討するとよいでしょう。

あまり推奨しませんし、効果は限定的ですが、パスワードの定期変更もパスワードリスト攻撃に対しての対抗手段になりえます。但し、これについては現在さかんに議論が行われている答えがでていない方法で、しかも効果が限定的であれば、ユーザーの負担を考えるとあまり採用しない方がよいのではないでしょうか。

今まで、秘密の質問の必然性はないというお話をしてきましたが、多層防御という観点からすると秘密の質問にも採用する意味が生まれてきます。ですが、秘密の質問を採用するには、安全性を確保するために必要となる前提があります。

その前提とは以下のものです。

  1. 秘密の質問はユーザーが指定できるようにする
  2. 秘密の質問の答えは、パスワードと同程度のセキュリティレベルで保護する
  3. 秘密の質問の答えを忘れた場合の復旧手段を用意する

1については、秘密の質問は一般的な情報が多く、アカウントを保護するには脆弱です。ユーザーのみが知りうる秘密の情報を登録できるよう、秘密の質問はユーザーがオプションで指定できるようにする必要があります。

2については、最近議論されるようになってきましたが、秘密の質問の答えを平文で保存していないでしょうか。平文ではないにしても、単純にハッシュ化しているだけで保存していないでしょうか。

秘密の質問の答えは、採用するなら本人確認の重要な秘密情報になるので、パスワードと同程度のセキュリティレベル、具体的には、ソルト+ハッシュ化を行い、できればハッチングも併用して保存するとよいでしょう。これにより、情報が漏洩したとしてもアカウントへの被害を軽減することができます。

3についてですが、これはパスワードリセットと同様に登録メールアドレスに秘密の質問と答えをリセットするアドレスを送信することでよいでしょう。

但し、アカウント乗っ取りにあった場合は、登録メールアドレスも変更される可能性があるので、メールアドレス変更時にもメールアドレスリセット用のアドレスを変更前の登録メールアドレスに送信した方がよいでしょう。

ユーザーの利便性としては、秘密の質問および答えを変更できるようにした方がよいのですが、これは単純に実装するとアカウント乗っ取りにあったときに、攻撃者に変更されてしまい、手の打ちようがなくなってしまいます。

ですので、秘密の質問および答えを変更する場合は、登録メールアドレスに登録情報リセット用のアドレスを送信する方法がよいでしょう。

まとめ

秘密の質問の必要性について考察してきましたが、まとめると以下のようになります。

・秘密の質問は必ずしも必要ではない
・秘密の質問より2段階認証などアカウント乗っ取りを防ぐ方法の採用が優先される
・多層防御として秘密の質問を採用する場合には、セキュリティに配慮した実装にする

秘密の質問を採用しているサービスでここまで対応しているところは少ないかもしれません。秘密の質問は絶対のものではないですが、より安全になるよう改善をしてゆくことをお勧めします。

 

 

 


スポンサーリンク




カテゴリー:ブログ

Twitter でも、いろんな情報を発信しています。



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA