二段階認証とは - パスワードだけでは守れない理由

パスワードは「知識」という単一の要素に依存しています。どれほど複雑なパスワードを設定しても、フィッシングで盗まれれば一瞬で突破されます。二段階認証 (2FA) は、パスワードに加えて「所持」や「生体」という別の要素を組み合わせることで、たとえパスワードが漏洩しても不正アクセスを防ぐ仕組みです。

認証の 3 要素は以下のとおりです。

  • 知識要素: パスワード、PIN、秘密の質問など「知っていること」
  • 所持要素: スマートフォン、セキュリティキー、IC カードなど「持っているもの」
  • 生体要素: 指紋、顔認証、虹彩など「身体的特徴」

二段階認証はこのうち 2 つ以上を組み合わせます。厳密には「二要素認証 (2FA)」と「二段階認証」は異なる概念ですが、一般的にはほぼ同義で使われています。二要素認証の詳細も参照してください。

SMS 認証 - 手軽だが脆弱性がある方式

SMS 認証は、ログイン時に携帯電話番号宛てに 6 桁程度のワンタイムコードを送信し、そのコードを入力させる方式です。追加のアプリが不要で導入が容易なため、多くのサービスが採用しています。

しかし、SMS 認証には深刻な脆弱性が存在します。

  • SIM スワッピング: 攻撃者が携帯キャリアを騙して被害者の電話番号を別の SIM に移し替える手口。SIM スワッピングの詳細で解説しています
  • SS7 プロトコルの脆弱性: 電話網の基盤プロトコルである SS7 には設計上の欠陥があり、SMS の傍受が技術的に可能
  • フィッシングによるリアルタイム中継: 攻撃者が偽サイトで被害者にコードを入力させ、リアルタイムで正規サイトに中継する手口 (Adversary-in-the-Middle)
  • マルウェアによる SMS 読み取り: Android 端末のマルウェアが SMS の読み取り権限を悪用してコードを窃取

NIST (米国国立標準技術研究所) は 2016 年の SP 800-63B で SMS 認証を「制限付き」の認証手段と位置づけ、より安全な方式への移行を推奨しています。SMS 認証は「ないよりはまし」ですが、高いセキュリティが求められるアカウントには不十分です。

認証アプリ - TOTP の仕組みと推奨アプリ

認証アプリは TOTP (Time-based One-Time Password) というアルゴリズムに基づいて、30 秒ごとに新しい 6 桁のコードを生成します。サーバーとアプリが同じ秘密鍵 (シード) を共有し、現在時刻と秘密鍵から HMAC-SHA1 でハッシュを計算してコードを導出します。

TOTP の技術的な流れは以下のとおりです。

  1. サービス登録時に、サーバーが秘密鍵を生成し QR コードとして表示
  2. 認証アプリが QR コードを読み取り、秘密鍵をローカルに保存
  3. ログイン時、アプリは「秘密鍵 + 現在の UNIX タイムスタンプ (30 秒単位)」から HMAC-SHA1 を計算
  4. ハッシュ値の一部を切り出して 6 桁の数値に変換 (Dynamic Truncation)
  5. サーバー側も同じ計算を行い、一致すれば認証成功

主要な認証アプリの比較です。

アプリ クラウド同期 エクスポート オープンソース
Google Authenticatorあり (Google アカウント)QR コード転送いいえ
Microsoft Authenticatorあり (Microsoft アカウント)クラウドバックアップいいえ
Authyあり (暗号化)マルチデバイス同期いいえ
Aegis (Android)なし暗号化バックアップはい

クラウド同期は端末紛失時の復旧に便利ですが、同期先のアカウントが侵害されると全ての TOTP シードが漏洩するリスクがあります。セキュリティを最優先するなら、ローカル保存のみのアプリを選び、暗号化バックアップを別途保管するのが理想です。

セキュリティキー - FIDO2/WebAuthn による最強の認証

セキュリティキー (YubiKey、Google Titan Key など) は、FIDO2/WebAuthn プロトコルに基づくハードウェア認証デバイスです。公開鍵暗号方式を使い、秘密鍵がデバイス内に閉じ込められているため、フィッシングや中間者攻撃に対して原理的に耐性があります。

WebAuthn の認証フローは以下のとおりです。

  1. 登録時: セキュリティキーが公開鍵と秘密鍵のペアを生成し、公開鍵をサーバーに送信。秘密鍵はキー内部に保存され、外部に取り出せない
  2. 認証時: サーバーがランダムなチャレンジ (ナンス) を送信
  3. セキュリティキーがチャレンジに秘密鍵で署名し、署名をサーバーに返送
  4. サーバーが公開鍵で署名を検証し、一致すれば認証成功

フィッシングに強い理由は、WebAuthn がオリジン (ドメイン名) を認証プロセスに組み込んでいるためです。偽サイトのドメインが正規サイトと異なれば、セキュリティキーは署名を拒否します。SMS 認証や TOTP にはこの仕組みがないため、フィッシングサイトにコードを入力してしまうリスクがあります。

パスキー (Passkey) は FIDO2 の発展形で、スマートフォンの生体認証をセキュリティキーの代わりに使えるようにした技術です。Apple、Google、Microsoft が対応を進めており、今後の主流になると見込まれています。

主要サービスでの設定手順

二段階認証の設定方法はサービスごとに異なりますが、基本的な流れは共通しています。パスワードの強化と合わせて設定しましょう。

Google アカウント

  1. myaccount.google.com にアクセスし「セキュリティ」を選択
  2. 「2 段階認証プロセス」をクリックし、電話番号を登録 (初回のみ)
  3. 「認証システムアプリ」を選択し、QR コードを認証アプリで読み取る
  4. セキュリティキーを追加する場合は「セキュリティ キーを追加」から USB キーを登録

Apple ID

  1. iPhone の「設定」→ 自分の名前 → 「サインインとセキュリティ」→「二要素認証」
  2. 信頼できる電話番号を登録 (SMS または音声通話で確認コードを受信)
  3. iOS 16.3 以降ではセキュリティキーの登録にも対応

Amazon

  1. 「アカウントサービス」→「ログインとセキュリティ」→「2 段階認証の設定」
  2. 認証アプリの QR コードを読み取り、表示されたコードを入力して確認
  3. バックアップ手段として電話番号を登録

どのサービスでも、設定時に表示されるリカバリーコード (バックアップコード) は必ず安全な場所に保管してください。端末を紛失した場合、リカバリーコードがなければアカウントにアクセスできなくなります。

二段階認証の導入で注意すべきポイント

二段階認証は強力な防御手段ですが、導入時にいくつかの落とし穴があります。

  • リカバリーコードの保管: 紙に印刷してオフラインで保管するか、パスワードマネージャーの暗号化ストレージに保存する。スマートフォンのスクリーンショットだけでは端末故障時に復旧できない
  • バックアップ手段の確保: 認証アプリを使う場合、端末の機種変更時にシードを移行する手順を事前に確認しておく
  • SMS 認証からの移行: 可能な限り認証アプリまたはセキュリティキーに移行する。SMS 認証を残す場合でも、主要な認証手段にはしない
  • 全アカウントへの展開: メール、クラウドストレージ、SNS、金融サービスなど、重要なアカウントすべてに二段階認証を設定する

二段階認証の設定と合わせて、IP 確認さんでブラウザフィンガープリントや接続元の情報を確認し、普段と異なるアクセスがないかチェックする習慣をつけておくと安心です。

セキュリティ対策を体系的に学びたい方には、セキュリティ対策の関連書籍 も参考になります。

この記事の関連用語

二要素認証 (2FA) 2 つの異なる認証要素を組み合わせて本人確認を行うセキュリティ手法。 フィッシング 偽サイトやメールで認証情報を騙し取る攻撃手法。二段階認証で被害を軽減できる。 パスワード 知識要素に基づく認証手段。単独では脆弱なため、二段階認証との併用が推奨される。