Cognitoのアドバンスドセキュリティ機能(ASF:Advanced Security Feature)とは
Cognitoの「アドバンスドセキュリティ機能」はユーザープールのオプションの一つで
対象のCognitoユーザープールに
・リスクベースの適応認証
のセキュリティ機能を追加できるオプションになります。
下記のようにCognitoのユーザープールの「全般設定」に「アドバンスドセキュリティ」の項目があります。
「侵害された資格情報の保護」の機能
「侵害された資格情報の保護」機能は、他のWebサイトなどで漏洩した資格情報(ユーザー名とパスワードのペア)を再利用できないようにすることで、ユーザーのアカウントを保護する機能です。
複数のWebサイトやスマホアプリ等で、同じユーザー名とパスワードのペアを使っていると、ある一つのサイトでそのユーザー名とパスワードのペアが流出してしまった場合に、そのリストを取得した悪意のある第三者にアカウントを乗っ取られてしまう危険があります。
こういった、パスワードリスト攻撃(リスト型攻撃/アカウントリスト攻撃)から、Cognitoユーザープールを保護するための機能が「侵害された資格情報の保護」の機能になります。
設定方法はアドバンスドセキュリティの設定項目にある
・侵害された認証情報にどのように対処しますか?
で「許可」または「ブロック使用」を選択
※「許可」を選択している場合でも、侵害された認証情報を使おうとするすべてのログイン試行がCloudWatchに記録されます。
・どのイベントを使用して認証情報の侵害のチェックをトリガーしますか?
で「サインアップ」「サインイン」「パスワード変更」のそれぞれをチェック
するだけです。
「侵害された資格情報の保護」でブロックを有効にしている場合、他のWebサイトで侵害されたと認識されたユーザー名とパスワードのペアで「サインアップ」「サインイン」「パスワード変更」をしようとすると、Cognitoは「別のパスワードを使うように変更を促すエラーメッセージ」と「PasswordResetRequiredException」や「InvalidPasswordException」を返すような動作をします。
AWSサポートに問い合わせた時の回答では「InitiateAuth」「SignUp」「ChangePassword」のAPI操作ではそれぞれ下記のようなメッセージとExceptionを返すような動作をするとの情報を頂きました。
■ サインイン時
$ aws cognito-idp initiate-auth \ --client-id "xxxxxx" \ --auth-flow USER_PASSWORD_AUTH \ --auth-parameters "USERNAME=xxxxxx,PASSWORD=xxxxxx" An error occurred (PasswordResetRequiredException) when calling the InitiateAuth operation: Password reset required for the user
■ サインアップ時
$ aws cognito-idp sign-up \ --client-id "xxxxxx" \ --username xxxxxx \ --password xxxxxx An error occurred (InvalidPasswordException) when calling the SignUp operation: Provided password cannot be used for security reasons.
■ パスワード変更時
$ aws cognito-idp change-password \ --previous-password xxxxxx \ --proposed-password xxxxxx \ --access-token xxxxxx An error occurred (InvalidPasswordException) when calling the ChangePassword operation: Provided password cannot be used for security reasons.
「リスクベースの適応認証」の機能
「リスクベースの適応認証」は、悪意のある第三者がユーザーアカウントを侵害しようとする試みからユーザーを保護する機能になります。
Cognitoは、各ユーザープールのサインイン試行を調べ、そのリクエストが悪意のある攻撃者からのものであるかどうかをリスク評価します。
・同じ場所またはIPアドレスからサインインしたか
など、いくつかの要因を元にリスクを「低」「中」「高」の3段階に評価します。
また、それぞれのリスクに対して、どのようにアクションするかを決定することができます。
例えば、対象のユーザープールに対するサインイン試行において、
・リスクレベルが「高」の場合は「MFA が必要」とする
→ 多要素認証(MFA)を要求し、設定されていないユーザーはブロックされる
・リスクレベルが「中」の場合は「オプションの MFA」
→ MFAが設定されているユーザーにはMFAを要求し、設定されていないユーザーはログインを許可する
・リスクレベルが「低」の場合は「許可」
→ すべてのログインを許可する
といったような個別設定が可能になっています。
また「ユーザーに通知」にチェックを入れることで、リスクが検知されたログイン試行があったことをユーザーにメール通知することができます。(ログインが必要なサービスを利用していると「ログイン通知」メールが来るアレですね)
メール通知を行う場合は、Simple Email Service (SES) を利用することになるので、SESが利用できるリージョンで
・メール通知に使うEメールアドレスの検証
・SESサンドボックスの外への移動
を行っておく必要があります。
(参考)Amazon SES での E メールアドレスの検証
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/verify-email-addresses.html
(参考)Amazon SES サンドボックスの外への移動
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/request-production-access.html
Cognitoのアドバンスドセキュリティ側の設定画面では
・利用するSESのリージョン
・利用するEメールアドレス(検証済みEメールアドレスのソースARNが選択可能)
などを設定します。
また、メール通知時のメール文面は
・サインインが許可されている場合のメッセージ (リスクを検出したが MFA を必須とせずブロックされていない場合)
・サインインで MFA を必須とする場合のメッセージ
・サインインがブロックされている場合のメッセージ
でそれぞれカスタマイズできるようになっています。(HTML・プレーンテキスト)
例えば「サインインが許可されている場合のメッセージ」ではデフォルトでは下記のような文面になっています。
件名:新しいサインイン試行 次の情報を使用した、お客様のアカウントでの認識できないサインインを検出しました。
時間: {login-time}
デバイス: {device-name}
場所: {city}、{country}
このサインインは他のユーザーにより行われたものである場合は、パスワードを変更し、次のリンク先をクリックしてお知らせください。 {one-click-link-invalid}
このサインインがご自分によるものである場合は、 {one-click-link-valid} を使用してお知らせください
メール文面内の中括弧で囲まれたプレースホルダー部分は自動的に値が入るようになっています。
(参考)メッセージテンプレート
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pool-settings-message-templates.html
また、デフォルトのメール文面には、メール通知を受け取ったユーザーが自分がログインしたものか否かをCognitoにフィードバックし学習精度を向上させるためのリンクも含まれています。
このフィードバック用リンクのURLにはユーザープールのドメイン名が入るため、予めCognitoユーザープールのドメイン名を設定しておく必要があります。
(参考)Configuring a User Pool Domain
https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-assign-domain.html
Cognitoのアドバンスドセキュリティのその他の機能
Cognitoのアドバンスドセキュリティのその他の機能として、
・IPアドレスによる許可・ブロック機能
・アドバンスドセキュリティのメトリクス
・ユーザーイベント履歴の表示
といった機能があります。
IPアドレス指定による許可・ブロック機能
アドバンスドセキュリティには、IPアドレス指定による許可・ブロック機能があり、CIDR表記 (例:192.168.100.0/24)でIPアドレスを指定することで、「常に許可」「常にブロック」するIPアドレスを指定することができます。
例えば、開発やテストを行う環境からのアクセスについては、そのアクセス元のIPアドレス範囲を「常に許可」のリストに含めて、アドバンスドセキュリティのリスク評価に関係なく、常にアクセスを許可させるような設定ができるようになっています。
アドバンスドセキュリティのメトリクス
アドバンスドセキュリティの各メトリクスはCloudWatchから参照することができます。
Cognitoで漏洩した認証情報が検出されたリクエスト(CompromisedCredentialsRisk)やCognitoでアカウントの乗っ取りリスクを検出されたリクエスト(AccountTakeOverRisk)などのメトリクスをCloudWatchから確認できるようになっています。
アドバンスドセキュリティのメトリクスの詳細については下記を参照ください。
(参考)アドバンスドセキュリティのメトリクスの表示
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-settings-viewing-advanced-security-metrics.html
ユーザーイベント履歴の表示
Cognitoコンソールの「ユーザーとグループ」のユーザー一覧から、ユーザー名のリンクをクリックすると、そのユーザーのサインイン履歴を表示することができます。
「ユーザーイベント履歴」の詳細については下記のリンクに画像付きで説明がありますが、日付、時刻、イベントタイプ、検出されたリスク、場所など、ユーザーのイベントに関する情報を確認することができます。このユーザーイベント履歴は2年間保持されるとのことです。
Cognitoのアドバンスドセキュリティ機能の料金
Cognitoの「アドバンスドセキュリティ機能」を有効にすると、Cognitoの料金に加え、月間アクティブユーザー(MAU)に対して追加料金が発生します。
Cognitoにおける「月間アクティブユーザー(MAU)」とは、その暦月に、サインアップ、サインイン、トークンの更新またはパスワードの変更など、当該ユーザーに関わる「ID操作」が発生した場合、そのユーザーはMAU としてカウントされます。
アドバンスドセキュリティ機能を有効にした場合の料金は、Amazon Cognito の料金「高度なセキュリティ機能」の部分に記載されていますので対象のリージョンの料金を参照してください。
また、アドバンスドセキュリティを「監査モード(監査のみ)」を選択した場合でも同様の料金がかかると記載があります。
(参考)Amazon Cognito の料金「高度なセキュリティ機能」 を参照
https://aws.amazon.com/jp/cognito/pricing/
Cognitoユーザープールのアドバンスドセキュリティ機能まとめ
・アドバンスドセキュリティはCognitoユーザープールに高度なセキュリティ機能を追加できるオプション(別途料金)
・「侵害された資格情報の保護」では、他のWebサイトなどで漏洩した資格情報(ユーザー名とパスワードのペア)を利用させないことで、アカウントリスト攻撃などからCognitoユーザープールを保護することが可能
・「リスクベースの適応認証」では、「ユーザーが以前に同じデバイスを使用したことがあるか」「同じ場所またはIPアドレスからサインインしたか」など、いくつかの要因からリスクを「低・中・高」の3段階に評価し、それぞれに応じたアクションや通知を設定することが可能
以上、これからCognitoを使ってユーザ認証の仕組みやセキュリティ対策を検討される方のご参考になれば幸いです。
Amazon Cognitoのセキュリティ については下記のエントリもご参考ください。
http://blog.serverworks.co.jp/tech/2020/02/19/cognito-account-lock-out/
(参考)AWS Security Blog How to Use New Advanced Security Features for Amazon Cognito User Pools
https://aws.amazon.com/jp/blogs/security/how-to-use-new-advanced-security-features-for-amazon-cognito-user-pools/