Amazon Cognito のユーザー存在エラーの防止設定について詳しく知りたいです。
簡単な説明
ユーザー列挙は、悪意のある攻撃者がブルートフォース技術を使用してシステム内の有効なユーザーを推測または確認するウェブアプリケーションの脆弱性です。Amazon Cognito には、攻撃者が Amazon Cognito ユーザープール内で有効なユーザーを見つけられないようにするセキュリティ機能が備わっています。このセキュリティ機能は、ユーザー列挙が行われる最も一般的な領域で使用できます。
- ユーザー認証
- ユーザー確認
- パスワード回復
- ユーザー登録
解決方法
ユーザー認証
存在しないユーザーのユーザー名とパスワードを入力すると、Amazon Cognito は UserNotFoundException という名前の例外を返して応答します。このユーザー存在エラーは、入力されたユーザー名が存在しないことを明示的に示しています。このエラー応答に基づいて、悪意のある攻撃者はブルートフォース攻撃を仕掛け、ユーザープール内の有効なユーザーを推測できます。
ユーザー存在エラーの防止設定をオンにすると、Amazon Cognitoアプリクライアントは、存在しないユーザーサインインリクエストに対して一般的なメッセージを返します。その一般的なメッセージでは、ユーザー名またはパスワードが間違っている旨が表示されます。ユーザー存在エラーの防止設定は、エラーメッセージによってユーザーの存在が明らかにならないため、認証情報を推測する攻撃を防ぐのに役立ちます。
存在しないユーザーがログインを試みた場合のエラー応答の例
以下は、存在しないユーザーがログインを試みた場合のエラー応答の例です。
$ aws cognito-idp initiate-auth --client-id 12ab34cd56ef78gh91ij23kl45m --auth-flow USER_PASSWORD_AUTH --auth-parameters USERNAME="myuser",PASSWORD="password"
ユーザー存在エラーの防止設定がオフの場合:「InitiateAuth 操作を呼び出すときにエラーが発生しました (UserNotFoundException): ユーザーは存在しません」。
ユーザー存在エラーの防止設定がオンになっている場合:「InitiateAuth 操作を呼び出すときにエラーが発生しました (NotAuthorizedException)。ユーザー名またはパスワードが正しくありません」。
ユーザー確認
ユーザー存在エラーの防止設定がオンになっていて、ユーザーが非アクティブ化されているか見つからない場合、Amazon Cognito は CodeDeliveryDetails を返します。コード配信の詳細は、UserNotFoundException という名前の例外を返す代わりに、シミュレートされた配信メディアを使用してユーザーに返されます。ユーザーがユーザープールに存在する場合、Amazon Cognito はユーザーの既存の E メールアドレスまたは電話番号に確認コードを送信します。シミュレートされる配信メディアは、ユーザー名の入力形式とユーザープールの検証設定によって決まります。
存在しないユーザーが確認コードを再送信した場合のエラー応答の例
次に、ユーザープールに存在しないユーザーに確認コードを再送信する場合のエラー応答の例を示します。
$ aws cognito-idp resend-confirmation-code --client-id 12ab34cd56ef78gh91ij23kl45m --username "myuser"
ユーザー存在エラー防止設定がオフになっている場合:「ResendConfirmationCode 操作を呼び出すときにエラーが発生しました (UserNotFoundException): ユーザー名とクライアント ID の組み合わせが見つかりません」。
ユーザー存在エラーの防止設定をオンにすると、E メールアドレスはランダムになり、次のように配信メディアはシミュレートされます。
{
"CodeDeliveryDetails": {
"Destination": "n****@g****.com",
"DeliveryMedium": "Email",
"AttributeName": "email"
}
}
パスワード回復
ユーザー存在エラーの防止設定がオンになっていて、ユーザーが非アクティブ化されている、見つからない、またはパスワードを回復できない場合、Amazon Cognito は CodeDeliveryDetails を返します。コード配信の詳細は、UserNotFoundException という名前の例外を返す代わりに、ユーザーにシミュレートされた配信メディアを提供します。シミュレートされた配信メディアは、ユーザー名の入力形式とユーザープールの回復設定によって決まります。
コードリカバリーの詳細を見ると、リカバリーコードがランダムにシミュレートされた E メールアドレスまたは電話番号に送信されていることがわかります。このシミュレートされた配信メディアにより、攻撃者は有効なユーザーと無効なユーザーを区別することが困難になります。
Amazon Cognito は、パスワードリセットフローでシミュレートされた配信メディアを使用して CodeDeliveryDetails を返します。ただし、パスワードリセットコードは実際にはシミュレートされた配信媒体に送信されません。これは、未確認の E メールアドレスや電話番号へのスパム送信を防ぐためのセキュリティ対策です。
存在しないユーザーパスワード回復のエラー応答の例
以下は、ユーザープールに存在しないユーザーのパスワード回復のエラー応答の例です。
$ aws cognito-idp forgot-password --client-id 12ab34cd56ef78gh91ij23kl45m --username "myuser"
ユーザー存在エラーの防止設定がオフの場合:「ForgotPassword 操作を呼び出すときにエラーが発生しました (UserNotFoundException)。ユーザー名とクライアント ID の組み合わせが見つかりません」。
ユーザー存在エラーの防止設定をオンにすると、電話番号はランダムになり、配信メディアはシミュレートされます。
{
"CodeDeliveryDetails": {
"Destination": "+*******0874",
"DeliveryMedium": "SMS",
"AttributeName": "phone_number"
}
}
ユーザー登録
ユーザー名が既に使用されている場合、SignUp 操作は UsernameExistsException を返します。サインアップ時に E メールアドレスまたは電話番号に UsernameExistsException エラーが発生するのを防ぐには、検証ベースのエイリアスを使用してください。
既に使用中の別のアカウントから E メールアドレスまたは電話番号がエイリアスとして提供されると、登録は成功します。ユーザーがこの E メールアドレスまたは電話番号と有効な確認コードを使用してアカウントを確認しようとすると、AliasExistsException エラーが返されます。このエラーは、この E メールアドレスまたは電話番号のアカウントが存在することをユーザーに示します。
ユーザーの存在エラーは有効なコードを入力して初めて明らかになるため、このプロセスにより、悪意のあるユーザーが有効なユーザーを特定するリスクが排除されます。検証ベースのエイリアスの詳細については、「ユーザープール属性」を参照し、「サインイン属性のカスタマイズ」タブを選択してください。
Amazon Cognito のユーザー存在エラーの防止設定を変更する方法を教えてください。
ユーザー存在エラーの防止設定を変更するには、次の手順に従います。
- [Amazon Cognito コンソール] にサインインします。
- リストから既存のユーザープールを選択します。
- [アプリケーションの統合] セクションを選択します。
- [アプリケーションクライアント] で、リストからアプリケーションクライアントを選択します。
- [アプリケーションクライアントに関する情報] セクションで、[編集] ボタンを選択します。
- 一番下までスクロールすると、[高度なセキュリティ設定] で [ユーザー存在エラーの防止設定] が表示されます。このオプションを選択または選択解除します。
- 変更を保存します。
エラーレスポンスの詳細については、「エラーレスポンスの管理」を参照してください。