管理者側でAmazon Cognito ユーザープールのユーザーパスワードをリセットしてみた

管理者側でAmazon Cognito ユーザープールのユーザーパスワードをリセットしてみた

Clock Icon2024.10.17

はじめに

以前、管理者主導でユーザー登録を行う運用ケースにおいて、Amazon Cognito ユーザープールを作成しました。

https://dev.classmethod.jp/articles/amazon-cognito-user-pool-admin-managed-registration/

構成は以下の通りです。

cm-hirai-screenshot 2024-09-25 11.11.06

今回は、ユーザーがパスワードを忘れた場合、管理者側で一時的な新しいユーザーパスワードを作成して、ユーザーが新しいパスワードに変更する方法をご紹介します。

前提として、ユーザープールは先ほど紹介した記事の通りに作成済みとします。
また、このユーザープールでは、セルフサービスのパスワードリセット機能の設定を有効にしていましたが、ユーザーが自身でパスワードをリセットできないようにする要件が発生したと仮定し、今回はこの機能を無効にします。

cm-hirai-screenshot 2024-09-26 8.57.49

ユーザーを作成

まず、ユーザーを作成してからメールでの招待までを解説します。

管理者がAWSマネジメントコンソール上のCognito ユーザープールからユーザーを作成します。

cm-hirai-screenshot 2024-09-06 17.34.29

ユーザー名とEメールを記載し、Eメールで招待を送信します。
[E メールアドレスを検証済みとしてマークする]のチェックは、今回の操作には影響しません。

cm-hirai-screenshot 2024-09-09 15.51.59

指定したメールアドレスにユーザー名と仮パスワードが送信されます。

cm-hirai-screenshot 2024-09-06 17.35.35

ログイン

それでは、新規作成されたユーザーでのログインをします。

ユーザー名と仮パスワードを入力します。

cm-hirai-screenshot 2024-09-09 16.28.37

初回ログイン時、自動的にパスワード変更を要求されます。パスワードポリシーに従って、新しいパスワードを設定します。

cm-hirai-screenshot 2024-09-06 17.36.12

MFAアプリケーションで登録します。
cm-hirai-screenshot 2024-09-06 17.36.49

設定後、アプリケーションにログインできます。

ログイン後のユーザーステータスは、以下の通りです。

  • 確認ステータス:確認済み

cm-hirai-screenshot 2024-09-26 8.37.44

パスワードを再作成

ユーザーがパスワードを忘れたと管理者に連絡があったと仮定し、管理者がパスワードを再発行します。
以下の2つのパターンでそれぞれ解説します。

  • 管理者側で一時的なパスワードを作成
  • 管理者側で永続的なパスワード作成

一時的なパスワードを作成

管理者は、AWS CloudShellで以下のコマンドを実行することで一時的なパスワードを作成できます。このコマンドは成功時に返り値を返しません。

$ aws cognito-idp admin-set-user-password \
  --user-pool-id example_user_pool_id \
  --username example_user_name \
  --password example_password \
  --no-permanent

// コマンド実例
$ aws cognito-idp admin-set-user-password \
  --user-pool-id ap-northeast-1_7qJb82oGZ \
  --username test \
  --password NewPassword123! \
  --no-permanent

--no-permanentによって、設定されたパスワードは一時的なものとなり、ユーザーは次回ログイン時に新しいパスワードの設定を強制されます。

コマンド実行後のユーザーステータスは、以下の通りです。一時的なパスワードを作成したため、パスワードを強制的に変更となります

  • 確認ステータス:パスワードを強制的に変更

cm-hirai-screenshot 2024-09-26 8.32.46
それではログインしてみます。パスワードは、管理者側で作成したNewPassword123!を入力します。

cm-hirai-screenshot 2024-09-26 8.17.17
自動的にパスワード変更を要求されます。パスワードポリシーに従って、新しいパスワードを設定します。
cm-hirai-screenshot 2024-09-26 8.35.05

MFAのパスコードを入力すると、ログイン完了します。
cm-hirai-screenshot 2024-09-26 8.35.16

永続的なパスワード作成

管理者は、AWS CloudShellで以下のコマンドを実行することで永続的なパスワードを作成できます。このコマンドも成功時に返り値を返しません。

$ aws cognito-idp admin-set-user-password \
  --user-pool-id example_user_pool_id \
  --username example_user_name \
  --password example_password \
  --permanent

// コマンド実例
$ aws cognito-idp admin-set-user-password \
  --user-pool-id ap-northeast-1_7qJb82oGZ \
  --username test \
  --password NewPassword123! \
  --permanent

--permanentによって、設定されたパスワードは永続的なものとなり、ユーザーは次回ログイン時にパスワードの変更を強制されません。

コマンド実行後のユーザーステータスは、以下の通りです。ユーザーは次回ログイン時にパスワードの変更を強制されませんので、確認ステータスは変わりません。

  • 確認ステータス:確認済み

cm-hirai-screenshot 2024-09-26 8.37.44

それではログインしてみます。パスワードは、管理者側で作成したNewPassword123!を入力します。

cm-hirai-screenshot 2024-09-26 8.17.17

パスワード変更画面はなく、MFAのパスコードを入力すると、ログイン完了します。
cm-hirai-screenshot 2024-09-26 8.35.16

AdminResetUserPasswordは利用不可

今回のケースですと、AdminResetUserPassword APIは利用できず、エラーになります。

$ aws cognito-idp admin-reset-user-password \
--user-pool-id ap-northeast-1_7qJb82oGZ \
--username test

An error occurred (NotAuthorizedException) when calling the AdminResetUserPassword operation: This userpool does not have password recovery mechanism, the administrator must set a new password.

日本語訳
「AdminResetUserPassword 操作を呼び出す際に NotAuthorizedException エラーが発生しました:このユーザープールにはパスワード回復メカニズムがありません。管理者が新しいパスワードを設定する必要があります。」

このエラーメッセージは、ユーザープールの設定でセルフサービスのパスワードリセット機能が有効になっていないことを示しています。この場合、ユーザー自身がパスワードをリセットすることはできず、代わりに管理者が直接新しいパスワードを設定する必要があります。

AWS ドキュメントにも記載されています。

To use this API operation, your user pool must have self-service account recovery configured. Use AdminSetUserPassword if you manage passwords as an administrator.
(日本語訳:このAPI操作を使用するには、ユーザープールでセルフサービスアカウント回復が設定されている必要があります。管理者としてパスワードを管理する場合は、AdminSetUserPasswordを使用してください。)
https://docs.aws.amazon.com/ja_jp/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html

マネジメントコンソールでも同様にパスワードリセットできません。
cm-hirai-screenshot 2024-09-26 9.20.52

セルフサービスのパスワードリセット機能が有効化されている場合、可能です。
cm-hirai-screenshot 2024-09-26 9.22.03

対処方法としては、今回紹介しましたadmin-set-user-password コマンドを使用して管理者が直接新しいパスワードを設定することになります。

最後

本記事では、Amazon Cognito ユーザープールにおいて、管理者がユーザーのパスワードをリセットする方法について解説しました。主なポイントは以下の通りです。

  1. セルフサービスのパスワードリセット機能を無効にした場合、管理者がパスワードリセットを行う必要があります。

  2. パスワードリセットには admin-set-user-password コマンドを使用します。

  3. このコマンドには2つのオプションがあります。

    • --permanent:設定されたパスワードは永続的となり、ユーザーは次回ログイン時にパスワード変更を強制されません。
    • --no-permanent:設定されたパスワードは一時的となり、ユーザーは次回ログイン時に新しいパスワードの設定を強制されます。
  4. AdminResetUserPassword APIは、セルフサービスのパスワードリセット機能が無効の場合は使用できません。

これらの方法を適切に使用することで、ユーザーのパスワード管理をより柔軟かつセキュアに行うことができます。組織のセキュリティポリシーや運用方針に応じて、最適な方法を選択してください。

参考

https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-set-user-password.html?highlight=admin set user password#output

https://repost.aws/ja/knowledge-center/cognito-reset-password-with-aws-cli

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.