モダン2FAとは何か?
パスワード・ベースのセキュリティの課題をいくつか挙げてみよう:
- パスワードは、一見強固に見えるものでも推測される可能性がある。
- エンドユーザーは、良いリクエストと悪意のあるリクエストの違いを見分けられる必要がある。例として、フィッシング攻撃がある。
- パスワードは、安全性の低いリポジトリから大量に盗まれる可能性がある。その典型的な例がヤフーの情報流出だ。
- さらに、自社サイトに強固なパスワード・ポリシーを導入したとしても、ユーザーがパスワードを他で再利用しないという保証はない。
このようなデメリットの長すぎるリストが、二要素認証(2FA)として知られる追加認証手段でパスワードを補強することで、パスワードの改修方法の開発に拍車をかけた。しかし、2FAに対する過去のアプローチには、独自のセキュリティ上の問題がある。従来の2FAの手法の多くには設計上の欠陥があり、米国国立標準技術研究所(NIST)のような組織は、非推奨とするよう勧告している。
2FAの最初の試みは、ワンタイムパスワード(OTP)の登場だった。このシナリオでは、ユーザは専用のOTP生成ハードウェア・デバイスを与えられ、携帯する必要がある。しかし、パスワードを入力する(第一の要素)だけでなく、ユーザーはログインのたびに(第二の要素)OTP値をキー入力しなければならない。これによりセキュリティは向上したが、ユーザーは特別なトークン(多くの場合、複数のトークン)を持ち歩き、ある画面から別の画面へと数字を書き写さなければならないため、使い勝手は低下した。これでは、特に携帯電話では、すぐに使い物にならなくなってしまう。認証ソリューションに多くの摩擦がある場合、採用率が低くなり、取引が減少する可能性がある。
この設定は、中間者攻撃(MiTM)やマルウェア攻撃にも脆弱である。これらのシステムは、特定のベンダーにロックされたプロプライエタリな OTP ハードウェア・デバイスを必要とするため、コストが問題となる。秘密鍵に基づくOTPシステムも攻撃の対象となり、大規模な侵害を引き起こす。このような攻撃はRSA社で発生し、トークンの全面交換という救済措置が必要となった。
2FAの別の試みは、専用のOTPデバイスを携帯電話上で動作するアプリに置き換えた。これによってトークンを持ち歩く必要はなくなるが、不便であることに変わりはなく、トークンと同じようなセキュリティ上の問題がある。さらに別の試みは、SMSでOTPを送信することに頼っている。これはユーザー体験を改善する一方で、SMSネットワークの(脆弱な)セキュリティに依存していた。追加の認証手段としてSMSを使用すること自体が攻撃の対象となる。最近、ハッカーはSMSメッセージを傍受することで、いくつかのRedditシステムに侵入した。
パスワードを効果的に補強し、あるいは完全に置き換えるためには、2FAに対する最新のアプローチが必要だ。セキュリティと使いやすさを兼ね備え、中央から攻撃されない方法で認証を分散化し、非独占的で標準的な方法ですべてのデバイス、オペレーティング・システム、ブラウザで動作する分散セキュリティ・インフラを構築する必要がある。最新の2FAは、FIDOやその他のオープン・スタンダードに基づいており、これは特定のベンダーのハードウェアやインフラに縛られない自由を意味する。
最新の2FAアプローチでは、これまでのアプローチの欠点が最終的に解決されている。最初のステップは、対称的な共有秘密を排除し、中央の権威や秘密を必要としない非対称鍵ベースの手法に置き換えることである。これにより、パスワードやワンタイムパスワードにつきものの、共有秘密の傍受や操作の問題が克服される。
第二のステップは、モバイル・デバイス(AndroidではTEE、iOSではSecure Enclave)またはPCラップトップ(TPM)内のセキュア・ハードウェア・エレメントで秘密鍵を保護することである。鍵は、NFCやBluetoothにリンクされた外部ハードウェア・トークンに保存することもできる。サーバーは公開鍵のみを保存し、脆弱性の主な領域を排除する。
このジェスチャーには、単純な生体認証(顔、指、声)から、ウェアラブルやトークン、より複雑なジェスチャーまでさまざまなものがあり、適切なセキュリティ・レベルを達成するために必要な組み合わせの数だけ、自分が持っているものと自分が知っているものと自分が持っているものを組み合わせることができる。重要なのは、どの認証手段を使っても、開発者APIとバックエンドを同じに保つことだ。
また、FIDO のようなプロトコルは、フィッシングや MiTM 攻撃を防ぐために、鍵の保護以外の特別な手段を追加する。
2FAに最新のアプローチを活用することで、クレデンシャルの漏洩による攻撃は過去のものとなる!