Amazon CognitoのMFA設定で注意すべきパスワードリセットの制約
はじめに
Amazon Cognitoの多要素認証(MFA)とパスワードリセット機能の間には重要な制約があります。この記事では、特にEメールをMFAとして使用する場合のパスワードリセット機能への影響と、マネージドログインページにおける実装パターンについて解説します。
MFAとパスワードリセットの技術的制約
Cognitoでは、セキュリティ設計上の理由から、同一チャネル(EメールまたはSMS)をMFAとパスワードリセットの両方に使用することができません。
公式ドキュメントには次のように明記されています。
ユーザーは、同じEメールアドレスまたは電話番号でMFAとパスワードのリセットコードを受け取ることはできません。MFAのEメールメッセージからワンタイムパスワード(OTPs)を使用する場合は、アカウントの復旧にSMSメッセージを使用する必要があります。MFAにSMSメッセージからのOTPsを使用する場合は、アカウントの復旧にEメールメッセージを使用する必要があります。
https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-mfa.html
この制約は、単一チャネルの侵害によって複数の認証要素が同時に無効化されるリスクを防ぐための重要なセキュリティ対策です。例えば、SMS経由で電話番号が乗っ取られた場合(SIMスワッピング攻撃など)、同じチャネルを認証とリカバリの両方に使用していると、アカウントへの不正アクセスのリスクが高まります。
実装上の注意点
技術的な制約の影響
- Eメール MFA 使用時 → パスワードリセットは SMS のみ可能
- SMS MFA 使用時 → パスワードリセットは Eメール のみ可能
これらの制約を考慮せずにMFAを実装すると、ユーザーがパスワードリセットを行えなくなる可能性があります。特に、ユーザーが両方の連絡手段(EメールとSMS)を登録していない場合に問題が発生します。
また、公式ドキュメントでは、ユーザーがMFAを完了した際に、Amazon Cognitoは自動的にそのphone_number_verified
またはemail_verified
属性をtrue
に設定することも明記されています。この機能により、MFAの使用は属性検証のプロセスも同時に完了させるという利点がありますが、前述の制約により、ユーザーに常に複数のコミュニケーションチャネル(EメールとSMS)を提供させるよう設計することが重要です。
マネージドログインページでのMFA実装パターン
Cognitoの「マネージドログインページ」(ホスティングされたログインインターフェース)でMFAを使用する場合の実装パターンについて説明します。
1. 最適なパターン:複数チャネルの設定
AWSコンソールでユーザープールを作成する際に、必須属性としてemail
とphone_number
の両方を設定し、「ユーザーディレクトリを作成する」をクリックします。
左側のナビゲーションメニューから「サインイン」を選択し、「多要素認証」編集画面を開きます。
「MFAを必須にする」を選択し、MFAの方法として「SMSメッセージ」を選択すると、「SMS 設定は必須です」と表示されるので、SMSメッセージを送信するためのIAMロールを作成します。
IAMロールを作成します。
IAMロールの作成後、再度「多要素認証」編集画面に戻り、「MFAを必須にする」オプションを選択し、「SMSメッセージ」が選択されていることを確認したら、「変更を保存」をクリックして設定を適用します。
再度、左側のナビゲーションメニューから「サインイン」を選択し、「ユーザーアカウントの復旧」編集画面を開きます。
ユーザーアカウント復旧メッセージの配信方法として「Eメールのみ」を選択し、「変更の保存」をクリックして設定を適用します。
この設定パターンを採用することで、SMS MFAを使用するユーザーは、MFAとは異なるチャネル(Eメール)でパスワードリセットができるようになります。ユーザーが「パスワードをお忘れですか?」フローを利用すると、自動的にEメールにコードが送信されます。この構成により、単一チャネルの侵害によるセキュリティリスクを防ぎつつ、ユーザーがパスワードリセットを行える環境を提供できます。
2. 単一チャネルしか収集できない場合の対応パターン
ユーザーが片方のチャネル(Eメールのみで電話番号なし)しか提供できない場合、以下のような対応が考えられます。
- TOTP MFAの利用
- MFA方法として「Authenticator apps」(TOTP)を有効化
- ユーザーはスマートフォンのアプリ(Google Authenticatorなど)を使用してMFAを完了
- ユーザーはEメールを使用してパスワードリセットを実行
- 管理者による介入フロー
- ユーザーがパスワードを忘れた場合に管理者に通知するフローを構築
- AWSコンソールの「ユーザー」タブから該当ユーザーを選択し、「アクション」→「パスワードのリセット」を実行
まとめ
Cognitoの認証設計においては、MFAとパスワードリセットのチャネル分離を考慮した実装が必須です。
MFAを必須にすることで、すべてのユーザーに対してより高いセキュリティレベルを提供できます。これはセキュリティが最優先事項のアプリケーションやコンプライアンス要件(PCI DSS、HIPAA、GDPRなど)がある場合に特に重要です。適切に実装することで、セキュリティを確保しつつユーザーのアカウントアクセス障害を最小限に抑えることができます。