SMS 不正利用を検出して防止する

このドキュメントでは、reCAPTCHA SMS 通信不正利用保護を使用して、ビジネスにおける SMS ポンピング攻撃を検出して防止する方法について説明します。SMS 通信不正利用は、2 要素認証(2FA)または電話認証で SMS に依存している企業を潜在的なターゲットとしています。

SMS ベースの認証(2 要素認証とログイン)は、ログインと登録のセキュリティに関する業界標準ですが、SMS 通信不正利用や SMS ポンピング詐欺に対する保護は提供していません。SMS を送信する前に、reCAPTCHA SMS 通信不正利用保護により、その電話番号が SMS 通信不正利用を行う可能性を示すリスクスコアが提供されます。このスコアに基づいて、不正な SMS メッセージが SMS プロバイダに送信される前に許可またはブロックできます。

詳細については、reCAPTCHA SMS 通信不正利用防止機能に関するブログをご覧ください。

始める前に

reCAPTCHA の既存のユーザーか、reCAPTCHA を初めて使用するかに応じて、該当するタブの手順に沿って操作します。

既存の reCAPTCHA ユーザー

既存の reCAPTCHA ユーザーの場合は、Google Cloud プロジェクトで reCAPTCHA SMS 通信不正利用保護を有効にします。

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

    [reCAPTCHA] に移動

  2. リソース セレクタにプロジェクトの名前が表示されていることを確認します。

    プロジェクトの名前が表示されない場合は、リソース セレクタをクリックしてプロジェクトを選択します。

  3. [設定] をクリックします。

  4. [SMS 通信不正利用の保護] ペインで [構成] をクリックします。

  5. [有効にする] 切り替えをクリックし、[保存] をクリックします。

    SMS 通信不正利用防止を有効にすると、アカウント保護機能が有効になります(まだ有効になっていない場合)。

    reCAPTCHA SMS 通信不正利用保護の有効化がシステムに反映されるまでに数分かかることがあります。機能の有効化が Google のシステムに反映されると、評価の一環として reCAPTCHA SMS 通信不正利用保護に関連するレスポンスを受信し始めます。

新規の reCAPTCHA ユーザー

reCAPTCHA を初めて使用する場合は、次の手順を行います。

  1. ウェブサイトまたはモバイルアプリで reCAPTCHA SMS 通信不正利用保護を使用するかどうかに応じて、次の手順で reCAPTCHA を統合します。

  2. Google Cloud プロジェクトで reCAPTCHA SMS 通信不正利用保護を有効にします。
    1. Google Cloud コンソールで、[reCAPTCHA] ページに移動します。

      [reCAPTCHA] に移動

    2. リソース セレクタにプロジェクトの名前が表示されていることを確認します。

      プロジェクトの名前が表示されない場合は、リソース セレクタをクリックしてプロジェクトを選択します。

    3. [設定] をクリックします。

    4. [SMS 通信不正利用の保護] ペインで [構成] をクリックします。

    5. [有効にする] 切り替えをクリックし、[保存] をクリックします。

      SMS 通信不正利用防止を有効にすると、アカウント保護機能が有効になります(まだ有効になっていない場合)。

      reCAPTCHA SMS 通信不正利用保護の有効化がシステムに反映されるまでに数分かかることがあります。機能の有効化が Google のシステムに反映されると、評価の一環として reCAPTCHA SMS 通信不正利用保護に関連するレスポンスを受信し始めます。

電話番号で評価を作成する

reCAPTCHA SMS 通信不正利用保護の場合、execute() 関数によって生成されたトークンと電話番号を使用して、バックエンドからの reCAPTCHA クライアント ライブラリまたは REST API を使用して評価を作成します。

このドキュメントでは、REST API を使用して評価を作成する方法について説明します。 クライアント ライブラリを使用して評価を作成する方法については、評価を作成するをご覧ください。

評価を作成する前に、次の操作を行います。

  • reCAPTCHA に対する認証を設定します。

    選択する認証方式は、reCAPTCHA が設定されている環境によって異なります。次の表は、認証を設定するために、適切な認証方法とサポートされているインターフェースを選択する際に有用です。

    環境 インターフェース 認証方法
    Google Cloud
    • REST
    • クライアント ライブラリ
    関連付けられているサービス アカウントを使用します。
    オンプレミスまたは別のクラウド プロバイダ REST API キー または Workload Identity 連携を使用します。

    API キーを使用する場合は、API キーの制限を適用して API キーを保護することをおすすめします。

    クライアント ライブラリ

    以下を使用します。

  • ユーザーが頻繁に変更しない固定のアカウント ID accountId を選択し、 projects.assessments.create メソッドで評価を指定します。この固定アカウント ID は、同じユーザーに関連するすべてのイベントで同じ値にする必要があります。アカウント ID として、以下を指定できます。

    ユーザー識別子

    すべてのアカウントを、固定のユーザー名、メールアドレス、電話番号に一意に関連付けることができる場合は、accountId として使用できます。このようなクロスサイト ID(サイト間で再利用できる ID)を指定すると、reCAPTCHA はこの情報を使用して、不正なアカウント ID にフラグを立て、こうした識別子に関連するクロスサイト不正行為のパターンに関する知識を活用することで、クロスサイト モデルに基づいてユーザー アカウントの保護を強化します。

    あるいは、各アカウントに一意に関連付けられた内部ユーザー ID がある場合は、それを accountId として指定できます。

    ハッシュ化と暗号化

    各アカウントに一意に関連付けられた内部ユーザー ID がない場合は、安定した識別子を不透明なサイト固有のアカウント識別子にできます。この識別子は、reCAPTCHA のアカウント保護機能がユーザー アクティビティ パターンを把握して異常な動作を検出するために引き続き必要ですが、他のサイトと共有されることはありません。

    任意の固定アカウント ID を選び、暗号化またはハッシュ化を使用して、reCAPTCHA に送信する前に不透明化します。

    • 暗号化(推奨):安定した暗号テキストを生成する決定的な暗号化方法を使用して、アカウント ID を暗号化します。詳細な手順については、データを確定的に暗号化するをご覧ください。ハッシュ化ではなく対称暗号化を選択した場合、ユーザー ID と対応する不透明なユーザー ID とのマッピングを維持する必要はありません。reCAPTCHA から返される不透明な ID を復号して、ユーザー ID に変換します。

    • ハッシュ化: SHA256-HMAC メソッドを使用して、任意のカスタム ソルトでアカウント ID をハッシュ化することをおすすめします。ハッシュは一方向のため、生成されたハッシュとユーザー ID の間のマッピングを維持する必要があります。これにより、元のアカウントに返されるハッシュ化されたアカウント ID をマッピングできます。

accountId パラメータと E.164 形式の電話番号を UserId として追加し、projects.assessments.create メソッドの評価で確認します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。
  • TOKEN: grecaptcha.enterprise.execute() 呼び出しから返されたトークン。
  • KEY_ID: ウェブサイトにインストールしたスコアベース キー。
  • ACCOUNT_ID: ウェブサイトに固有のユーザー アカウントの ID。
  • PHONE_NUMBER: 不正なものかどうかを確認する必要がある電話番号。電話番号は E.164 形式にする必要があります。ハッシュ化または暗号化しないでください。

HTTP メソッドと URL:

POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments

リクエストの本文(JSON):


{
  "event": {
    "token": "TOKEN",
    "siteKey": "KEY_ID",
    "userInfo": {
      "accountId": "ACCOUNT_ID",
      "userIds": [
        {
          "phoneNumber": "PHONE_NUMBER"
        }
      ]
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。


{
  "event": {
     …
  },
  "name": "ASSESSMENT_ID",
  "phoneFraudAssessment": {
    "smsTollFraudVerdict": {
      "risk": 0.3
    }
  }
}

レスポンスには、phoneFraudAssessment.smsTollFraudVerdict フィールドに risk スコアが含まれます。スコアが高いほど、電話番号が危険である可能性が高くなり、スコアが低いほど、電話番号が正当である可能性が高くなります。

評価に基づいて実行するアクションは、お客様の責任となります。最も簡単な統合の場合、phoneFraudAssessment.smsTollFraudVerdict.risk でしきい値を設定して判断に役立たせることができます。

評価にアノテーションを付ける

SMS トラフィックを追跡し、不正行為の検出を改善するには、SMS の送信後または電話番号の確認が正常に行われた後、10 分以内に評価にアノテーションを付ける必要があります。

評価にアノテーションを付けるには、評価 ID を使用して projects.assessments.annotate メソッドにリクエストを送信します。そのリクエストの本文の phoneAuthenticationEvent フィールドに、E.164 形式の電話番号を含めます。

評価にアノテーションを付けるには、次のようにします。

  1. ユースケースに応じて、リクエストの JSON 本文に追加する情報とラベルを決定します。

    次の表では、イベントにアノテーションを付けるために使用できるラベルと値を示します。

    ラベル 説明 リクエストの例
    reasons

    必須。評価をサポートするラベル。

    リアルタイムの検出に影響するため、イベント後数秒または数分で reasons ラベルにリアルタイムのイベントの詳細が提供されます。

    値は次のいずれかです。

    • INITIATED_TWO_FACTOR: SMS で確認コードが送信されます。
    • PASSED_TWO_FACTOR: 確認コードが正常に確認されました。
    • FAILED_TWO_FACTOR: 確認コードが無効です。
        {
        "reasons": ["INITIATED_TWO_FACTOR"],
        "phoneAuthenticationEvent": {
          "phoneNumber": "+18005550175"
        }
      }
    annotation

    省略可。評価の正当性を示すラベル。

    ログイン イベントと登録イベントに関する事実を提供して、annotation ラベルでリスク評価を検証または修正します。

    有効な値は LEGITIMATE または FRAUDULENT です。

    リアルタイムの検出に影響するため、この情報はイベント後数秒または数分で送信することをおすすめします。

      {
       "annotation": "LEGITIMATE"
      }
      
  2. 適切なラベルを使用してアノテーション リクエストを作成します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • ASSESSMENT_ID: projects.assessments.create 呼び出しから返された name フィールドの値。
    • ANNOTATION: 省略可。評価が正当か不正かを示すラベル。
    • REASONS: アノテーションをサポートする理由。有効な値については、理由の値をご覧ください。
    • PHONE_NUMBER: 評価された電話番号。電話番号は E.164 形式にする必要があります。ハッシュ化または暗号化しないでください。

    HTTP メソッドと URL:

    POST https://recaptchaenterprise.googleapis.com/v1/ASSESSMENT_ID:annotate

    リクエストの本文(JSON):

    {
      "annotation": ANNOTATION,
      "reasons": REASONS,
      "phoneAuthenticationEvent": {
        "phoneNumber": "PHONE_NUMBER"
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを選択します。

    curl

    リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://recaptchaenterprise.googleapis.com/v1/ASSESSMENT_ID:annotate"

    PowerShell

    リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://recaptchaenterprise.googleapis.com/v1/ASSESSMENT_ID:annotate" | Select-Object -Expand Content

    成功したことを示すステータス コード(2xx)と空のレスポンスが返されます。

次のステップ