はじめに
Cognito の Managed Login が追加され、リッチな認証画面が提供されました。ALB と Cognito を連携することで、比較的簡単に認証機能を追加できるうれしさがあります。セキュリティをより高めるために、Cognito の MFA を利用したくなります。
今回の記事では、Cognito の MFA として Email を利用したときの Managed Login の利用方法を確認してみようと思います。
User Pool
適当に User Pool を作成します。
Create
SES の連携設定
Cognito の MFA を Email にするときに、SES との連携設定が必要です。Edit を押します。
この記事の手順では、事前に SES でドメイン sugiaws.tokyo
を登録しており、これを利用します。
FROM sender name は 表示名 <送信元メールアドレス>
の形式で指定すると良いです。
MFA を有効化
MFA を有効化します。
User Pool の単位では、Optional MFA として、 Email message を有効化します。
この画面で指定する User Pool の Optional MFA の意味は、User Pool の中で MFA を利用するユーザーと利用しないユーザーの混在を許すという意味です。「MFA を必須にしたいんだ」ということを考えると思うのですが、その場合は、Optional MFA を選択したうえで、MFA を必須にしたいユーザー単位で MFA を有効化すれば大丈夫です。
Callback
Cognito と連携する Web アプリケーションの Callback URL を設定します。
こんな感じに、Web アプリケーションの ドメイン名の末尾に、/oauth2/idpresponse
を追記した URL を設定します。これは、ALB と Cognito の連携で必要な設定です。
ALB と Cognito を紐づける
ALB の HTTPS Listener を Cognito と紐づけます。
上の手順で作成した Cognito Userpool を選択します。
Self sign-up の停止
Self sign-up は停止します。
チェックを外します。
招待メールを設定
ユーザーの招待メールを、わかりやすく日本語で送信できます。
こんな感じのメッセージをテンプレートとして登録できます。
{username} に一時パスワードを送付します。<br>
一時パスワード : {####} <br>
以下のサイトにアクセスしてください <br>
https://coginito-mfa-test01.sugiaws.tokyo/
管理者が招待
では、管理者としてユーザーを招待してみましょう。Create user を押します。
メールアドレスを入れて、Create User を押します。
作成したユーザーは MFA は無効化されているので、有効化をします。ユーザーの詳細画面を開きます。
Update MFA configuration を押します。
Email の MFA を有効化します。
ユーザーに届くメール
ユーザーのメールアドレスに次のようなメールが届きます。
ログインします。
パスワードを入れます。
パスワードを変更します。
メールに MFA としてのコードが送られます。
こんな感じのメールが届きます。
コードを入れます。
ログインできました。
パスワードを忘れたとき
この手順では、Managed Login 上のセルフサービスのパスワードをリセットする機能の「パスワードをお忘れですか?」は動作しません。
Email を利用した MFA の場合、パスワードリセットの手法を Email にはできない仕様の制限事項があるためです。
ユーザーは、同じ E メールアドレスまたは電話番号で MFA とパスワードのリセットコードを受け取ることはできません。MFA の E メールメッセージからワンタイムパスワード (OTPs) を使用する場合は、アカウントの復旧に SMS メッセージを使用する必要があります。
Email の MFA を利用する場合は、SMS が利用できるように、UserPool の必須属性に電話番号を入れておくと良いと思います。
ただ、電話番号を利用していない場合は、別の手法でパスワードをリセットできます。管理者側で作業を行います。リセットしたいユーザーを選択します。
Update MFA configuration を押します。
一時的に MFA を無効化します。
これで、ユーザー側のセルフサービスでパスワードのリセットが可能です。Managed Login の画面で「パスワードをお忘れですか?」を選択します。
コードが送られます。
コードが送られます。
コードを入れてパスワードをリセットします。
これでパスワードがリセットされログインができるようになります。
なお、このままでは MFA が無効化されているので、例えば、1 日後に管理者が MFA で Email を有効化すると良いでしょう。(もしかしたら、Lambda 連携でリセット後に MFA 自動有効化が出来るかも)
検証を通じてわかったこと
-
Cognito の MFA には、Email、TOTP (Time-based One-time Password)、SMS の 3 種類が選択できる
-
TOTP の選択肢は、MFA のデバイスを紛失したときの MFA リセットが直接的には出来なさそうだった。
- こちらの記事 では、MFA の選択肢として SMS を利用できるようにしたうえで、TOTP の Device を紛失したときに、一時的に SMS に切り替えたうえで、Access Token を基に再度 TOTP Device を登録する手順が説明されている。
- また別の記事 では、Cognito User Pool の MFA 設定を Require (必須) ではなく、Option にすることで、管理者側がユーザーの Access Token を取得する手順が説明されている。しかし、Option にすると、Managed Login でユーザーがサインアップする際に、MFA デバイスの登録画面が出てこなくて、独自の Web アプリケーション側で TOTP 登録画面を提供する必要があり、少し面倒。
- このことを踏まえると、Email を利用した MFA では、デバイスを紛失する心配がなくなりよさそうに思う。登録したメールアドレスが利用できなくなってしまう場合が考えられるが、社内でユースケースではメールアドレスの紛失は基本考えなくてよいと思う。
-
Email を利用した MFA の場合、パスワードリセットの手法を Email にはできない仕様の制限事項がある。Email の MFA を利用する場合は、SMS が利用できるように、UserPool の必須属性に電話番号を入れておくと良いと思う。(この記事の手順ではやってないけど)
-
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-settings-mfa.html
-
ユーザーは、同じ E メールアドレスまたは電話番号で MFA とパスワードのリセットコードを受け取ることはできません。MFA の E メールメッセージからワンタイムパスワード (OTPs) を使用する場合は、アカウントの復旧に SMS メッセージを使用する必要があります。
-