ウェブサイトでのアカウント関連の不正行為の検出と防止

このドキュメントでは、アカウント保護を使用して、ウェブサイトでのアカウント関連の不正行為を検出して防止する方法について説明します。

Fraud Defense は、ログインや購入手続きなど、重要なアクションの保護に役立ちます。ただし、ウェブサイトでの特定のユーザーの行動を一定期間にわたって観察することで検出できる、アカウントの不正使用の微妙な形態は数多く存在します。Fraud Defense の機能であるアカウント防御は、ウェブサイトのサイト固有のモデルを作成して、疑わしい行動の傾向やアクティビティの変化を検出することで、このような微妙な不正行為を特定するのに役立ちます。サイト固有のモデルを使用すると、アカウント防御によって次の検出が容易になります。

  • 不審なアクティビティ
  • 類似した動作のアカウント
  • 特定のユーザーに対して信頼できるとマークされたデバイスからのリクエスト

アカウント保護とサイト固有のモデルの分析に基づいて、次のことを行えます。

  • 不正なアカウントを制限または無効にする。
  • アカウントの乗っ取りの試みを防ぐ。
  • 正常なアカウントの乗っ取りを軽減する。
  • 正当なユーザー アカウントからのリクエストにのみアクセスを許可する。
  • 信頼できるデバイスからのユーザー ログインをスムーズにする。

始める前に

  1. Google Cloud Fraud Defense の環境を準備します
  2. スコアベースのサイトキーを作成します

アカウント保護用にウェブページを構成する

アカウント保護では、効果的な検出を可能にするために、アカウント アクティビティを包括的に理解する必要があります。アカウント関連のアクティビティをアカウント防御にフィードし、サイト固有のモデルを作成して改善するには、次の手順を行います。

  1. 水平テレメトリー データの収集を有効にします
  2. 重要なユーザー アクションに関するレポートを行う
  3. 重要なユーザー イベントを評価する
  4. ユーザー イベントにアノテーションを付け、サイト固有のモデルを調整する

水平テレメトリー データの収集を有効にする

アカウント保護では、ユーザーがログインしているか、あるいはログインしようとしているかなど、ユーザーの操作をすべて確認できます。アカウント保護による水平テレメトリー データのパッシブ収集を有効にするには、ユーザーワークフローの一部であるすべてのウェブページのバックグラウンドで作成したスコアベースのサイトキーを使用して、reCAPTCHA JavaScript のスクリプトを読み込みます。

次の例では、reCAPTCHA JavaScript のスクリプトをウェブページに読み込む方法を示します。

    <head>
    <script src="https://www.google.com/recaptcha/enterprise.js?render=KEY_ID"></script>
    ....
    </head>

重要なユーザー アクションに関するレポートを行う

不審なアクティビティのパターンを検出し、サイトの一般的なアクティビティ パターンのより優れたモデルを構築するには、アカウント保護で重要なユーザー アクションに関する情報が必要です。したがって、これらの重要なユーザー アクションに対して grecaptcha.enterprise.execute() を呼び出して、ウェブページで重要なユーザー アクションのレポートを行います。

追加のシグナルの収集に役立つため、重要なユーザー アクションをすべてレポートすることをおすすめします。レポートするユーザー アクションごとに、grecaptcha.enterprise.execute()action パラメータの値を、ユーザー アクションを表すアクション名に置き換えます。

次の表に、重要なユーザー アクションをレポートする際に使用できるアクション名を示します。

アクション名 ユーザーが開始したイベントまたはユーザー アクション
LOGIN

ウェブサイトへのログイン。

REGISTRATION ウェブサイトでの登録。
SECURITY_QUESTION_CHANGE セキュリティ保護用の質問を変更するためのリクエスト。
PASSWORD_RESET パスワード再設定のリクエスト。
PHONE_NUMBER_UPDATE 電話番号の更新のリクエスト。
EMAIL_UPDATE メールアドレスの更新のリクエスト。
ACCOUNT_UPDATE 連絡先情報など、アカウントの関連情報の更新のリクエスト。
TRIGGER_MFA MFA チャレンジをトリガーするアクション。
REDEEM_CODE コードの利用のリクエスト。
LIST_PAYMENT_METHODS お支払い方法のリストの取得。

次の例では、電話番号の更新で grecaptcha.enterprise.execute() を呼び出す方法を示します。

    <script>
    function onClick(e) {
      e.preventDefault();
      grecaptcha.enterprise.ready(async () => {
        const token = await grecaptcha.enterprise.execute('KEY_ID', {action: 'PHONE_NUMBER_UPDATE'});
      });
    }
    </script>
    

重要なユーザー イベントを評価する

ユーザー アクションで grecaptcha.enterprise.execute() を呼び出すと、トークンが生成されます。ログインの成功 / 失敗、登録、ログインしているユーザーのアクションなどの重要なユーザー イベントについては、grecaptcha.enterprise.execute() 呼び出しの結果を診断する評価を作成します。この評価によって、起こり得る不正行為の処理方法を決定する際の基準となるリスク判定が得られます。実行できるアクションには、不審なリクエストのブロック、リスクの高いログインへの疑い、関心のあるアカウントの調査などがあります。

アカウント保護機能では、評価を行い、ユーザー アクティビティ(ログイン リクエスト、ログイン済みリクエスト、登録リクエストなど)を特定のアカウントに関連付けるために、安定したアカウント ID を指定する必要があります。これにより、アカウント保護機能では、ユーザー アクティビティ パターンを処理して、アカウントごとにアクティビティ モデルを構築し、異常なトラフィックや不正なトラフィックをより適切に検出できます。

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

ユーザー識別子

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

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

ハッシュ化と暗号化

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

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

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

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

アカウント関連のすべてのリクエストに安定したアカウント ID を提供するだけでなく、一部の特定のリクエストには変更できない可能性のある追加アカウント ID を指定できます。accountId に加えて提供されるコンテキスト固有のアカウント ID は、アカウント保護がユーザー アクティビティをより深く分析し、ユーザー アカウントを安全に保つためのアカウントの乗っ取りの試みを検出するのに役立ちます。追加の ID を指定すると、Google Cloud Fraud Defense はこの情報を使用して、不正なアカウント ID にフラグを立て、これらの識別子に関連するクロスサイトへの不正行為パターンの知識を活用することで、クロスサイト モデルに基づいてユーザー アカウントの保護を強化します。たとえば、次の情報を指定できます。

  • ログイン リクエストのログイン ハンドルとして使用されたユーザー名、メールアドレス、電話番号

  • 多要素認証リクエスト用の確認済みのメールアドレスまたは電話番号

  • アカウントの更新リクエスト時にユーザーから提供されたメールアドレスまたは電話番号(メインまたはサブ)

  • 登録リクエスト時にユーザーから提供されたメールアドレスと電話番号

アカウント関連のすべてのリクエストについて、選択した安定したアカウント ID を projects.assessments.create メソッドの accountId パラメータに追加します。必要に応じて、評価の userIds フィールドを使用して、関連するリクエストの追加アカウント ID を指定します。

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

  • PROJECT_ID: 実際の Google Cloud プロジェクト ID
  • TOKEN: grecaptcha.enterprise.execute() 呼び出しから返されたトークン
  • KEY_ID: サイトに関連付けられている reCAPTCHA キー
  • ACCOUNT_ID: ユーザー アカウントとウェブサイトの関連付けのためにユーザー アカウントに一意に関連付けられた不透明な識別子
  • EMAIL_ADDRESS: 省略可。このリクエストに関連付けられているメールアドレス(該当する場合)
  • PHONE_NUMBER: 省略可。このリクエストに関連付けられている電話番号(該当する場合)
  • USERNAME: 省略可。このリクエストに関連付けられているユーザー名(該当する場合)

HTTP メソッドと URL:

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

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

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

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

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 レスポンスが返されます。

{
  "tokenProperties": {
    "valid": true,
    "hostname": "www.google.com",
    "action": "login",
    "createTime": "2019-03-28T12:24:17.894Z"
  },
  "riskAnalysis": {
    "score": 0.6,
  },
  "event": {
    "token": "TOKEN",
    "siteKey": "KEY",
    "userInfo": {
      "accountId": "ACCOUNT_ID"
    }
  },
  "name": "projects/PROJECT_NUMBER/assessments/b6ac310000000000",
  "accountDefenderAssessment": {
    "labels": ["SUSPICIOUS_LOGIN_ACTIVITY"]
  }
}

コードサンプル

Java

Fraud Defense に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。


import com.google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseServiceClient;
import com.google.protobuf.ByteString;
import com.google.recaptchaenterprise.v1.AccountDefenderAssessment.AccountDefenderLabel;
import com.google.recaptchaenterprise.v1.Assessment;
import com.google.recaptchaenterprise.v1.CreateAssessmentRequest;
import com.google.recaptchaenterprise.v1.Event;
import com.google.recaptchaenterprise.v1.ProjectName;
import com.google.recaptchaenterprise.v1.RiskAnalysis.ClassificationReason;
import com.google.recaptchaenterprise.v1.TokenProperties;
import com.google.recaptchaenterprise.v1.UserId;
import com.google.recaptchaenterprise.v1.UserInfo;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.UUID;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class AccountDefenderAssessment {

  public static void main(String[] args)
      throws IOException, NoSuchAlgorithmException, InvalidKeyException {
    // TODO(developer): Replace these variables before running the sample.
    // projectId: Google Cloud Project ID
    String projectId = "project-id";

    // recaptchaSiteKey: Site key obtained by registering a domain/app to use recaptcha
    // services.
    String recaptchaSiteKey = "recaptcha-site-key";

    // token: The token obtained from the client on passing the recaptchaSiteKey.
    // To get the token, integrate the recaptchaSiteKey with frontend. See,
    // https://cloud.google.com/recaptcha-enterprise/docs/instrument-web-pages#frontend_integration_score
    String token = "recaptcha-token"