二要素認証
Two-Factor Authentication (2FA)
概要(サマリー)
二要素認証(Two-Factor Authentication、略称2FA)とは、ログインのときにパスワードだけでなく、もうひとつの方法で「本人確認」を行うセキュリティの仕組みである。
「知っている(パスワード)」と「持っている(スマートフォン)」の2種類の証拠を組み合わせることで、パスワードが漏れても不正ログインを防げる可能性が高まる。GitHubやGoogle・AWSなどの重要なサービスでは二要素認証の設定が強く推奨(または必須化)されている。
詳細解説
二要素認証とは何か
認証には大きく3種類の「要素」がある。
- 知識要素(something you know): パスワード・PIN・秘密の質問など
- 所持要素(something you have): スマートフォン・セキュリティキー・ICカードなど
- 生体要素(something you are): 指紋・顔認証・声紋など
二要素認証は、この3種類の要素のうち2種類を組み合わせる仕組みだ。2種類以上の要素を使う認証全般は多要素認証(MFA)と呼ばれ、二要素認証はその一種である。もっとも一般的なのは「パスワード(知識)+スマートフォンのワンタイムコード(所持)」の組み合わせである。
よく使われる二要素認証の方法
TOTP(Time-based One-Time Password)
認証アプリ(Google Authenticator等)が30秒ごとに生成する6桁の数字を使う。トークンの一種であり、スマートフォンを持っていれば導入しやすく、広く使われている方式である。
SMS認証
ログイン時に登録した電話番号にSMSでコードを送る方式。手軽だがSIMスワップ攻撃、フィッシング、SMSを受け取れない環境への依存といった弱点があるため、高いセキュリティが必要な場面ではTOTPやセキュリティキーの方が望ましい。
ハードウェアセキュリティキー(FIDO2/WebAuthn)
YubiKeyなどの物理デバイスを使う方式。正規サイトのドメインと結びついて認証するためフィッシング耐性が高く、強力な方式とされる。ただし、デバイス紛失のリスクがあるため、予備キーや復旧手段も準備しておく必要がある。
GitHubやAWSでの2FA
GitHubでは、GitHub.comでコードを投稿するユーザーを中心に2FAの有効化が求められている。設定していないとリポジトリへのアクセスや操作に制限がかかる場合がある。AWSの管理コンソールへのアクセスでも、rootユーザーや管理者アカウントにはMFAの設定が強く推奨されている。権限の強いアカウントほど、2FAやMFAの設定は優先度が高い。
二段階認証と二要素認証の違い
「二段階認証」は単にログインを2段階に分けること(パスワード入力 → SMSコード入力など)を指し、必ずしも2つの異なる「要素」を使うとは限らない。「二要素認証」は2種類の要素を使う、より厳密な定義だ。一般的に混同して使われることが多い。
バックアップコードの重要性
2FAを設定するとき、「バックアップコード」が提供されることが多い。スマートフォンを紛失したり壊れたりしたときに、このバックアップコードがないとアカウントにアクセスできなくなる危険がある。必ず安全な場所に保存しておくことがルールだ。
AIコーディングとの関係
WebアプリにTOTP(2FA)機能を実装する際は、AIに「Node.jsでspeakeasy(またはotplib)を使ってTOTPの生成・検証を実装する方法を教えて」のように依頼できる。ただし、2FAの実装はセキュリティに直結するため、ライブラリのバージョンや実装上の注意点(タイムスキューの考慮、バックアップコードの安全な保存など)はAIの出力を鵜呑みにせず確認することが重要だ。
よくある勘違い
二要素認証を設定すれば完全に安全?
二要素認証はセキュリティを大幅に高めるが、完全ではない。SMS認証はSIMスワップ攻撃で突破される可能性がある。フィッシングサイトに自分でコードを入力してしまった場合も意味がない。二要素認証はあくまでも「防御の1層を追加する」ものである。
二段階認証 = 二要素認証?
両者は似ているが厳密には異なる。二段階認証は2ステップのログインプロセスを指し、二要素認証は2種類の異なる要素(知識・所持・生体)を使うことを意味する。「パスワード+秘密の質問」は2段階だが同じ「知識要素」なので二要素認証ではない。
公開鍵認証と二要素認証は別物?
SSH接続で使う公開鍵認証は「所持要素」による認証の一種だが、それ単体で「二要素認証」と呼ぶことは一般的ではない。SSHでも2FA(公開鍵+TOTP)を組み合わせることは可能で、より強固になる。
まとめ
- 二要素認証はパスワード以外の認証要素を追加して不正ログインを防ぐ仕組み
- TOTP(認証アプリ)・SMS・ハードウェアキーなど複数の方法がある
- GitHubやAWSなどの重要なサービスでは2FAやMFAの設定が強く推奨され、対象によっては必須化されている
- バックアップコードを安全な場所に保存しないとアカウントロックアウトのリスクがある
- SMS認証よりTOTPや物理キーの方がセキュリティが高い
情報ソース
より詳しくAIに聞いてみよう
- 二要素認証とは何か、初心者でもわかるように説明してください。
- TOTP・SMS・ハードウェアキーによる2FAの仕組みと使い分けを教えてください。
- WebアプリにTOTPベースの二要素認証を実装する方法(Node.js / Python)を教えてください。
- 二要素認証のセキュリティ上の限界とそれを補う追加対策を教えてください。
- AIに二要素認証機能の実装を依頼するときの効果的な指示の出し方を教えてください。