多要素認証
パスワードに加えて追加の認証要素を要求し、アカウントの不正アクセスを防ぐセキュリティ手法
認証セキュリティ
多要素認証とは
多要素認証 (Multi-Factor Authentication, MFA) は、認証時にパスワード (知識要素) に加えて、追加の認証要素を要求するセキュリティ手法である。パスワードが漏洩しても、追加の要素がなければログインできないため、不正アクセスリスクを 99.9% 低減する (Microsoft の調査)。
認証の 3 要素
| 要素 | 説明 | 例 |
|---|---|---|
| 知識 (Something you know) | 本人だけが知っている情報 | パスワード、PIN、秘密の質問 |
| 所持 (Something you have) | 本人だけが持っている物 | スマートフォン、ハードウェアキー |
| 生体 (Something you are) | 本人の身体的特徴 | 指紋、顔認証、虹彩 |
MFA は 2 つ以上の異なる要素を組み合わせる。パスワード + SMS コードは「知識 + 所持」の 2 要素認証 (2FA) だ。
MFA の方式
| 方式 | セキュリティ | 利便性 | 推奨度 |
|---|---|---|---|
| FIDO2 / WebAuthn | 最高 (フィッシング耐性) | 高い | 最推奨 |
| TOTP (認証アプリ) | 高い | 中程度 | 推奨 |
| SMS コード | 中程度 (SIM スワップ攻撃のリスク) | 高い | 許容 |
| メールコード | 低い (メール漏洩リスク) | 高い | 非推奨 |
TOTP (Time-based One-Time Password)
Google Authenticator や Authy が生成する 6 桁のコード。30 秒ごとに変わる。
import { authenticator } from 'otplib';
// シークレットの生成 (ユーザー登録時)
const secret = authenticator.generateSecret();
const otpauth = authenticator.keyuri(email, 'MyApp', secret);
// → QR コードとして表示
// コードの検証 (ログイン時)
const isValid = authenticator.verify({ token: userInput, secret });
FIDO2 / WebAuthn
ハードウェアキー (YubiKey) やデバイスの生体認証を使う。フィッシングサイトでは認証が成功しないため、最も安全だ。
OFF: MFA なしOPTIONAL: ユーザーが任意で有効化ON: 全ユーザーに MFA を強制
AWS IAM での MFA
IAM ユーザーと root アカウントには MFA を必ず設定する。IAM ポリシーで MFA を強制できる。
{
"Condition": {
"BoolIfExists": { "aws:MultiFactorAuthPresent": "true" }
}
}
パスキー (Passkey) の台頭
パスキーは FIDO2/WebAuthn をベースにした次世代認証で、パスワードそのものを不要にする。Apple、Google、Microsoft が対応し、パスワード + MFA の組み合わせを 1 ステップの生体認証に置き換える。
全体像を把握するには関連書籍も有用。