メールの列挙保護を有効または無効にする

このガイドでは、メールの列挙保護機能について説明し、有効または無効にする方法について説明します。2023 年 9 月 15 日以降にプロジェクトを作成した場合、メール列挙保護はデフォルトで有効になっています。

概要

メールの列挙はブルート フォース攻撃の一種です。悪意のある人物が、API にメールアドレスを渡して応答を確認することにより、システム内のユーザーの推測または確認を試みます。

メールの列挙保護がなければ、Identity Platform はメールの列挙攻撃に使用できる情報を返します。

  • システムに存在しないメールアドレスでログインが試行されています。Identity Platform は EMAIL_NOT_FOUND エラーを返します。

  • システムに存在するメールアドレスで登録を試みます。Identity Platform は EMAIL_EXISTS エラーを返します。

Identity Platform のメール列挙保護機能を使用すると、アプリのユーザー アカウントをこれらの攻撃から保護できます。

メール列挙保護が有効になっている場合、プロジェクトは次のように動作します。

  • fetchSignInForEmail API が失敗します。SDK バージョン 22.3.0(Android)または 10.18.0(iOS)または 10.6.0(ウェブ)より前のバージョンでは、匿名の認証済みユーザーをメールアドレスとリンクさせることはできません。

  • createAuthUri REST API またはすべてのプラットフォームで fetchSignInMethodsForEmail クライアント SDK メソッドを呼び出す際に、指定したメールアドレスのログイン方法の一覧は返されなくなります。

  • ユーザーは、最初に新しいアドレスを確認しない限り、メールアドレスを変更できません。たとえば、以下の方法でメールアドレスを変更することができなくなります。update REST API、setAccountInfo REST API、またはすべてのプラットフォームでの updateEmail クライアント SDK メソッド。

    代わりに、ウェブと Android の場合は verifyBeforeUpdateEmail、iOS の場合は sendEmailVerification(beforeUpdatingEmail:) を使用できます。

  • setAccountInfo REST API を使用してメール / パスワード プロバイダを既存のユーザー アカウントにリンクできなくなります。linkWithCredential クライアント SDK メソッドと EmailAuthCredential は、どのプラットフォームでも使用できなくなります。代わりに REST API signUp を使用して、idToken フィールドと、emailpassword フィールドのユーザーの ID トークンを渡してリンクします。

  • リクエスト タイプ VERIFY_AND_CHANGE_EMAIL または PASSWORD_RESETsendOobCode REST API を呼び出した場合、およびすべてのプラットフォームで verifyBeforeUpdateEmail(ウェブおよび Android の場合)、sendEmailVerification(beforeUpdatingEmail:)(iOS の場合)、sendPasswordResetEmail クライアント SDK メソッドを呼び出した場合は、メール確認フローのエラー レスポンスを削除します。

    パスワードの再設定リクエストを行うと、メールアドレスが存在する場合にのみ確認メールが送信されます。メールアドレスの変更リクエストを行うと、そのメールアドレスがまだ存在しない場合にのみ確認メールが送信されます。いずれの場合も、メールが送信されなかったことを示す特定のエラー メッセージはありません。

    メール確認フローなしではユーザーが登録できないようにすることをおすすめします。

  • 無効なログインケースでは、INVALID_LOGIN_CREDENTIALS エラー レスポンスが返されます。無効な登録のケースでは引き続き EMAIL_EXISTS エラーが返されます。次のセクションの推奨事項をご覧ください。

メール列挙保護によって変更された動作のいずれかをアプリに依存している場合は、現在無効にできます。ただし、長期的にはおすすめしません。次のセクションをご覧ください。

セキュリティに関する推奨事項

アカウントの乗っ取り攻撃を実行する最も一般的な方法の 1 つは、漏洩したまたは推測しやすい認証情報を使用して認証情報スタッフィング攻撃を行うことです。メールの列挙を使用して、ユーザーに関する機密情報を取得することや、ユーザーに対するフィッシング攻撃の実行を行うこともできます。このような理由から、Google ではこのような攻撃からアプリを保護するために、メールの列挙保護機能を使用することをおすすめしています。

  • 2023 年 9 月 15 日以降にプロジェクトを作成した場合、メール列挙保護はデフォルトで有効になります。メールの列挙保護を有効のままにし、このガイドの前半の動作に頼らないことをおすすめします。

  • 2023 年 9 月 15 日より前にプロジェクトを作成した場合、メールの列挙保護は自動的に有効になりません。

    アプリでこのガイドで説明している動作に依存していない場合は、すぐにメールの列挙保護を有効にすることをおすすめします。

    アプリが前述の動作のいずれかに依存している場合は、できるだけ早く移行を開始し、メール列挙の保護を有効にすることをおすすめします。

メールの列挙保護に加えて、EMAIL_EXISTS エラーが返されるプロジェクト登録エンドポイントの不正使用を防止する対策を検討してください。以下に、いくつかの方法を示します。

  • App Check を有効にする
  • reCAPTCHA に登録フローに統合する。
  • メールアドレスとパスワードによるログインやメールリンクによるログインを禁止し、Google ログインなどの別の方法を使用する。

メール列挙保護を有効にする

メール列挙保護を有効にする手順は次のとおりです。

Firebase コンソール

  1. Firebase コンソールで、[Firebase Auth Settings] ページに移動します。

    Firebase Authentication の設定に移動

    1. ナビゲーション パネルで [ユーザー アクション] を選択します。

    2. [メール列挙保護(推奨)] を選択します。

  2. [保存] をクリックします。

Node.js

  1. Admin SDK をインストールします。

  2. メール列挙保護を有効にするには、次のいずれかを使用します。

    • プロジェクト レベルでの保護:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().projectConfigManager().updateProjectConfig(
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: true,
          },
        }
      );
      
    • テナントレベルでの保護:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().tenantConfigManager().updateTenant(TENANT_ID,
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: true,
          },
        }
      );
      

      TENANT_ID を、メール列挙保護を有効にするテナント ID に置き換えます。

REST

  1. Google Cloud コンソールで、gcloud auth print-access-token コマンドを使用してプロジェクト ID のアクセス トークンを出力します。

    gcloud auth print-access-token --project=PROJECT_ID
    
  2. Identity Toolkit API を使用して、プロジェクト ID のメールの列挙保護を有効にします。

    curl -X PATCH -d "{'emailPrivacyConfig':{'enableImprovedEmailPrivacy':true}}" \
        -H 'Authorization: Bearer ACCESS_TOKEN' \
        -H 'Content-Type: application/json' -H 'X-Goog-User-Project: PROJECT_ID' \
        "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=emailPrivacyConfig"
    

以下を置き換えます。

  • ACCESS_TOKEN: 先に生成したアクセス トークン。
  • PROJECT_ID: プロジェクト ID

メールの列挙保護を無効にする

メール列挙保護を有効にする手順は次のとおりです。

Firebase コンソール

  1. Firebase コンソールで、[Firebase Auth Settings] ページに移動します。

    Firebase Authentication の設定に移動

    1. ナビゲーション パネルで [ユーザー アクション] を選択します。

    2. [メールの列挙保護(推奨)] をオフにします。

  2. [保存] をクリックします。

Node.js

  1. Admin SDK をインストールします。

  2. メール列挙保護を無効にするには、次のいずれかを使用します。

    • プロジェクト レベルでの保護:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().projectConfigManager().updateProjectConfig(
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: false,
          },
        }
      );
      
    • テナントレベルでの保護:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().tenantConfigManager().updateTenant(TENANT_ID,
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: false,
          },
        }
      );
      

      TENANT_ID を、メール列挙保護を無効にするテナント ID に置き換えます。

REST

  1. Google Cloud コンソールで、gcloud auth print-access-token コマンドを使用してプロジェクト ID のアクセス トークンを出力します。

    gcloud auth print-access-token --project=PROJECT_ID
    
  2. Identity Toolkit API を使用して、メールの列挙保護を無効にします。

    curl -X PATCH -d "{'emailPrivacyConfig':{'enableImprovedEmailPrivacy':false}}" \
        -H 'Authorization: Bearer ACCESS_TOKEN' \
        -H 'Content-Type: application/json' -H 'X-Goog-User-Project: PROJECT_ID' \
        "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=emailPrivacyConfig"
    

以下を置き換えます。

  • ACCESS_TOKEN: 先に生成したアクセス トークン。
  • PROJECT_ID: プロジェクト ID

エラー レスポンスの例

ユーザーが誤ったメールアドレスまたはパスワードでログインを試みた場合や、システムにすでに存在するメールアドレスで登録を試みた場合、Identity Platform は次のようなエラーを返します。

{
"code": "auth/internal-error",
"message": "{\"error\":{\"code\":400,\"message\":\"INVALID_LOGIN_CREDENTIALS\",\"errors\":[{\"message\":\"INVALID_LOGIN_CREDENTIALS\",\"domain\":\"global\",\"reason\":\"invalid\"}]}}"
}