SMS ベースの認証で SMS 通信不正利用防止を有効にする

このドキュメントでは、reCAPTCHA を使用して、電話認証や多要素認証などの Identity Platform SMS ベースのフローを SMS 通信不正利用(SMS ポンピング攻撃とも呼ばれます)から保護する方法について説明します。

概要

アプリが SMS ベースのフローを使用して認証を行う場合は、Identity Platform と reCAPTCHA のインテグレーションの一環として reCAPTCHA SMS 通信不正利用保護機能を有効にできます。有効にすると、ユーザーがアプリまたはサイトから確認 SMS をリクエストしたときに、Identity Platform は次の phoneProvider オペレーションを使用して SMS 通話料金詐欺防止機能を呼び出します。

オペレーション メソッド
電話番号で登録またはログインする sendVerificationCode
MFA の電話番号の登録 mfaSmsEnrollment
MFA の電話番号によるログイン mfaSmsSignIn

その後、reCAPTCHA は、ユーザーの電話番号が SMS 通信不正利用を行う可能性を示すリスクスコアを Identity Platform に提供します。Identity Platform は、このスコアを SMS 通話料金不正使用防止の構成で設定したしきい値と比較し、構成で設定したアクションに基づいてリクエストを処理します。

reCAPTCHA SMS 通信不正利用防止機能の詳細については、SMS 不正行為を検出して防止するをご覧ください。

始める前に

Identity Platform で SMS 通信不正利用防止を有効にする前に、次のタスクを完了します。

reCAPTCHA の電話認証の適用モード

reCAPTCHA SMS 通信不正利用保護を使用するには、reCAPTCHA の電話認証適用を設定する必要があります。この適用には、監査適用の 2 つのモードがあります。

監査モード

電話認証の適用を監査モードに設定すると、Identity Platform はアプリの確認に reCAPTCHA SMS 通信不正利用防止機能を使用します。ユーザー リクエストが通行料不正使用の評価に合格すると、Identity Platform は確認コードを含む SMS メッセージをユーザーのスマートフォンに送信します。リクエストが通行料詐欺の評価で不合格になり、クライアント SDK を使用している場合は、フォールバック確認方法がトリガーされ、電話認証フローが完了します。使用できる代替手段は、アプリのプラットフォームによって異なります。

クライアント SDK は、次のシナリオでフォールバック検証メソッドをトリガーします。

  • reCAPTCHA トークンが見つかりません。
  • reCAPTCHA トークンが無効または期限切れです。
  • reCAPTCHA トークンがスコア基準を満たしていない。
  • reCAPTCHA が正しく設定されていません。

アプリのプラットフォームのフォールバック認証方法が設定され、必要に応じて Client SDK によってトリガーされるように準備されていることを確認します。

ウェブ

最初の通行料不正行為の評価が失敗した場合、監査モードでは reCAPTCHA v2 を使用して確認が行われます。そのため、reCAPTCHA 検証ツール(RecaptchaVerifier)を設定し、次の電話認証オペレーションに渡す必要があります。

  • verifyPhoneNumber
  • signInWithPhoneNumber
  • linkWithPhoneNumber
  • reauthenticateWithPhoneNumber
reCAPTCHA ベリファイアがないと、Identity Platform は reCAPTCHA v2 を開始できず、auth/argument-error を返します。reCAPTCHA ベリファイアの設定の詳細については、Firebase のドキュメントの reCAPTCHA ベリファイアを設定するをご覧ください。

Android

最初の通行料不正行為の評価が失敗した場合、監査モードは Play Integrity API と照らし合わせてアプリを検証します。この検証に失敗すると、reCAPTCHA v2 がトリガーされます。reCAPTCHA v2 は、次のシナリオでトリガーされる場合があります。

  • エンドユーザーのデバイスに Google Play 開発者サービスがインストールされていない場合。
  • (Authentication SDK v21.2.0 以降で)アプリが Google Play ストアを通じて配布されたものでない場合。
  • (Authentication SDK バージョン v21.2.0 より前で)取得した SafetyNet トークンが有効でない場合。
Android アプリの確認の設定の詳細については、Firebase ドキュメントのアプリの確認を有効にするをご覧ください。

iOS

最初の通行料不正行為の評価が失敗した場合、監査モードではサイレント プッシュ通知を使用して確認が行われます。この確認方法では、リクエスト元のデバイスのアプリにサイレント プッシュ通知でトークンを送信します。アプリが通知を正常に受信すると、スマートフォンの認証フローが進みます。アプリがプッシュ通知を受信しなかった場合、reCAPTCHA v2 がトリガーされます。サイレント プッシュ通知が正しく構成されていないと、reCAPTCHA v2 がトリガーされることがあります。

iOS アプリの検証を設定する方法については、Firebase ドキュメントのアプリの検証を有効にするをご覧ください。

自動適用モード

電話認証の適用を適用モードに設定すると、Identity Platform はアプリの確認に reCAPTCHA SMS 通信不正利用保護を使用します。ユーザー リクエストが通行料不正使用の評価に合格すると、Identity Platform は確認コードを含む SMS メッセージをユーザーのスマートフォンに送信します。リクエストが通行料不正使用の評価に失敗した場合、Identity Platform はリクエストをブロックし、確認コードを含む SMS メッセージを送信しません。

適用モードでは、フォールバック検証は必要ないため、アプリに追加の検証方法を設定する必要はありません。ただし、アプリの reCAPTCHA モードを AUDIT または OFF に変更する場合は、ウェブアプリに reCAPTCHA 検証ツールを設定して、reCAPTCHA v2 が有効になるようにすることをおすすめします。

reCAPTCHA SMS 通信不正利用防止を有効にする

SMS 通信不正利用防止を有効にするには、次の操作を行います。

  1. まだ行っていない場合は、プロジェクトで reCAPTCHA Enterprise API を有効にします

  2. reCAPTCHA で SMS 通信不正利用防止を有効にします。手順については、reCAPTCHA のドキュメントの SMS 不正行為の検出と防止ページの始める前にをご覧ください。

  3. プロジェクトで SMS 通話料金詐欺対策を有効にするには、Admin SDK を使用して次のように updateConfig を呼び出します。

      // Update the reCAPTCHA config to enable toll fraud protection
      const updateProjectConfigRequest = {
        recaptchaConfig: {
          phoneEnforcementState: 'ENFORCE_MODE',
          useSmsTollFraudProtection: 'true',
          tollFraudManagedRules: [{ startScore: START_SCORE,
            action: 'BLOCK' }],
        }
      }
      let projectConfig = await getAuth().projectConfigManager().updateProject(updateProjectConfigRequest);
    

    次のように置き換えます。

    • ENFORCE_MODE: reCAPTCHA の電話認証の適用に設定するモード。有効な値は OFFAUDITENFORCE です。SMS 通話料金不正使用防止を有効にするには、このパラメータを AUDIT または ENFORCE に設定し、useSmsTollFraudProtectiontrue に設定する必要があります。

      SMS 通信不正利用防止を初めて有効にする場合は、適用状態を AUDIT に設定し、認証フローが保護されていることを確認してから、ENFORCE に設定することをおすすめします。モードの仕組みの詳細については、reCAPTCHA 電話認証適用モードをご覧ください。

    • START_SCORE: リクエストが失敗する前に許容される通行料不正行為の評価スコアの上限。このスコアは 0.01.0 の範囲で設定できます。設定したしきい値を超えるスコアは、SMS 通話料金詐欺と見なされます。たとえば、しきい値を 0.3 に設定すると、0.4 以上のリクエストはすべて reCAPTCHA によって失敗します。スコアを低く設定すると、ルールが厳しくなります。

  4. ウェブまたは Android で Identity Platform を使用している場合は、Firebase コンソールからアプリを登録します。

    • Android の場合は、Identity Platform を使用する各 Android パッケージ名を登録します。

    • ウェブの場合は、reCAPTCHA を使用する各ドメインに承認済みドメインを追加します。承認済みドメインを追加するには、次の操作を行います。

      1. Google Cloud コンソールで、[Identity Platform] ページに移動します。

        Identity Platform に移動

      2. [設定] > [セキュリティ] に移動します。

      3. [ドメインを追加] をクリックします。

      4. ドメイン名を入力し、[追加] をクリックしてドメインを保存します。

    reCAPTCHA キーのプロビジョニングが完了するまでに数分かかることがあります。

  5. 適用を監査モードに設定している場合は、SMS 通話料金詐欺防止の reCAPTCHA 指標をモニタリングして、フローが保護されていることを確認することをおすすめします。

クライアント SDK を構成する

アプリのプラットフォームに応じて、クライアント SDK を構成します。

Web

  1. 最新バージョンの Web SDK に更新します。

    • ウェブアプリでの メールとパスワードの認証に対する reCAPTCHA のサポートは、JavaScript SDK バージョン 9.20.0 以降で利用できます。
    • ウェブアプリでの電話認証の reCAPTCHA サポートは、JavaScript SDK バージョン 11 以降で利用できます。

    Web SDK をアプリと統合した後、SDK は reCAPTCHA 構成を自動的に取得し、構成したプロバイダの保護を有効にします。

  2. 必要に応じて、次のように reCAPTCHA シグナルを強制的に取得できます。

    import { initializeRecaptchaConfig } from '@firebase/auth';
    
    // Initialize Firebase Authentication
    const auth = getAuth();
    initializeRecaptchaConfig(auth)
      .then(() => {
        console.log("Recaptcha Enterprise Config Initialization successful.")
      })
      .catch((error) => {
        console.error("Recaptcha Enterprise Config Initialization failed with " + error)
      });
    

Android

  1. Android SDK の最新バージョンに更新します。Android アプリでのメールとパスワードの認証と電話認証の reCAPTCHA サポートは、Android SDK バージョン 23.1.0 以降で利用できます。

    また、reCAPTCHA のサポートには、API レベル 23(Marshmallow)以降と Android 6 以降が必要です。

    Android SDK をアプリと統合すると、SDK は reCAPTCHA 構成を自動的に取得し、構成したプロバイダの保護を有効にします。

  2. アプリレベルの build.gradle ファイルの依存関係セクションに、次のビルドルールを追加します。

    implementation 'com.google.android.recaptcha:recaptcha:18.5.1'
    

    reCAPTCHA SDK バージョン 18.5.1 以降を使用していることを確認します。

  3. 必要に応じて、次のように reCAPTCHA シグナルを強制的に取得できます。

    • Kotlin:
    // Initialize Firebase Authentication
    auth = Firebase.auth
    
    auth.initializeRecaptchaConfig().addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            Log.d(TAG, "Recaptcha Enterprise Initialization successful.")
        } else {
            Log.w(TAG, "Recaptcha Enterprise Initialization failed.")
        }
    }
    
    • Java:
    // Initialize Firebase Authentication
    auth = FirebaseAuth.getInstance();
    auth.initializeRecaptchaConfig().addOnCompleteListener(
      this, new OnCompleteListener<void>() {
      @Override
      public void onComplete(@NonNull Task<void> task) {
        if (task.isSuccessful()) {
          Log.d(TAG, "Recaptcha Enterprise Initialization successful.");
        } else {
          Log.w(TAG, "Recaptcha Enterprise Initialization failed.");
        }
      }
    });
    

iOS

  1. iOS SDK バージョン 11.6.0 以降に更新します。iOS SDK をアプリと統合すると、SDK は reCAPTCHA 構成を自動的に取得し、構成したプロバイダの保護を有効にします。

  2. reCAPTCHA iOS SDK をアプリに統合するには、環境を準備するをご覧ください。

  3. -ObjC がリンカーフラグに含まれていることを確認します。[Target] > [Build Settings] > [All] > [Linking] に移動し、Other Linker Flags-ObjC が表示されていることを確認します。

  4. 必要に応じて、次のように reCAPTCHA シグナルを強制的に取得できます。

    • Swift:
    // Initialize Firebase Authentication
    try await Auth.auth().initializeRecaptchaConfig()
    
    • Objective-C:
    // Initialize Firebase Authentication
    [[FIRAuth auth] initializeRecaptchaConfigWithCompletion:^(NSError * _Nullable error) {
      // Firebase Authentication initialization finished
    }];
    

SMS 通信不正利用防止の reCAPTCHA 指標をモニタリングする

reCAPTCHA の適用を適用モードに設定する前に、監査モードを使用してプロジェクトで出力される reCAPTCHA 指標をモニタリングし、SMS ベースの認証フローが保護されていることを確認することをおすすめします。たとえば、これらの指標は、Identity Platform と reCAPTCHA Enterprise API の統合が正しく設定されているかどうかを判断するのに役立ちます。また、ユーザー トラフィックのスコア基準を微調整することもできます。

プロジェクトで Cloud Monitoring に出力される次の指標を調べて、SMS 通話料金不正使用防止機能が機能していることを確認します。

詳細については、reCAPTCHA 指標をモニタリングするをご覧ください。

SMS 通信不正利用防止を適用する

アプリが許容できるユーザー トラフィックを受信していることを確認した後、ユーザーを保護するため reCAPTCHA の適用を有効化できます。古いバージョンのアプリを使用しているユーザーを含む、既存のユーザーを中断しないようにします。

プロジェクトまたはテナントで SMS ベースの認証フローで reCAPTCHA の適用を有効にするには、Admin SDK を使用して次のコマンドを実行します。

  const enforceRequest = {
    recaptchaConfig: {
      phoneEnforcementState:  'ENFORCE',
      useSmsTollFraudProtection: 'true'
    }
  };

SMS 通信不正利用防止を無効にする

SMS 通話料金詐欺対策を無効にするには、Admin SDK を使用して次のコマンドを実行します。

  const disableRequest = {
    recaptchaConfig: {
      phoneEnforcementState:  'OFF',
      useSmsTollFraudProtection: 'false'
    }
  };

ボット対策を使用しているときに SMS 通信不正利用防止を無効にするには、ボット対策を使用しているときに SMS 通信不正利用防止を無効にするをご覧ください。

SMS 通信不正利用防止と bot 保護を併用する

SMS 通信不正利用防止とボット対策を同時に使用できます。両方の保護機能を使用する構成の場合は、次の点を考慮してください。

  • 電話認証の適用状態を監査に設定すると、少なくとも 1 つの評価が満たされると、Identity Platform はリクエストを渡します。reCAPTCHA 指標をモニタリングして、SMS 通信不正利用防止機能と bot 保護の両方が妥当なスコア設定で構成されていることを確認することをおすすめします。
  • 電話認証の適用状態を適用に設定すると、Identity Platform は、両方の評価を満たした場合にのみリクエストを渡します。リクエストが失敗した場合は、別の確認方法にフォールバックせずにクローズされます。

両方の機能を有効にするには、Admin SDK を使用して次のコマンドを実行します。

  const enableBothRequest = {
    recaptchaConfig: {
      phoneEnforcementState:  'ENFORCE_MODE',
      useSmsTollFraudProtection: true,
      useSmsBotScore: true
    }
  };

ENFORCE_MODE は、reCAPTCHA の電話認証の適用に設定するモードに置き換えます。有効な値は OFFAUDITENFORCE です。SMS 通信不正利用防止を有効にするには、このパラメータを AUDIT または ENFORCE に設定する必要があります。SMS 通話料金不正使用防止機能を初めて有効にする場合は、このパラメータを AUDIT に設定し、認証フローが保護されていることを確認してから、ENFORCE に設定することをおすすめします。モードの仕組みについて詳しくは、reCAPTCHA 電話認証適用モードをご覧ください。

ボット保護を使用しているときに SMS 通信不正利用防止を無効にする

SMS 通信不正利用防止と bot 対策の両方を使用している場合に、bot 対策を無効にせずに SMS 通信不正利用防止を無効にするには、Admin SDK を使用して次のコマンドを実行します。

  const disableRequest = {
    recaptchaConfig: {
      phoneEnforcementState:  'ENFORCE_MODE',
      useSmsTollFraudProtection: 'false',
      useSmsBotScore: 'true'
    }
  };

ENFORCE_MODE は、reCAPTCHA の電話認証適用に以前に設定したモードに置き換えます。この値は AUDIT または ENFORCE にする必要があります。モードの仕組みについて詳しくは、reCAPTCHA 電話認証適用モードをご覧ください。

次のステップ