このページでは、reCAPTCHA のパスワード漏洩検出機能を使用してパスワード漏洩と認証情報侵害を検出して、アカウントの乗っ取り(ATO)やクルデンシャル スタッフィング攻撃を防止する方法について説明します。reCAPTCHA では、評価の一環としてユーザー認証情報(パスワード)を定期的に監査して、漏洩や侵害が発生していないことを確認できます。この評価を行うために Google ではパスワード チェックアップ機能を使用しています。
始める前に
Make sure that billing is enabled for your Google Cloud project.
reCAPTCHA でパスワード漏洩の検出機能を使用するには、プロジェクトで課金がリンクされ、有効になっている必要があります。課金は、クレジット カードまたは既存の Google Cloud プロジェクトの課金 ID を使用して有効にできます。課金についてサポートが必要な場合は、Cloud Billing サポートまでお問い合わせください。
認証情報の侵害や漏洩の確認
一連の認証情報が侵害されているかどうかを確認するには、暗号関数を使用するか、Docker コンテナを使用します。
Docker コンテナは、エンドユーザーのプライバシーを保護し、パスワード漏洩を安全に検索するために必要なセキュア マルチパーティ計算を実装するオープンソース クライアントです。 詳細については、GitHub リポジトリをご覧ください。 Docker コンテナは、暗号アルゴリズムの実装の複雑さを抽象化し、インストール プロセスを簡素化します。また、インフラストラクチャでコンテナアプリをホストすることもできます。
暗号関数
一連の認証情報が侵害されたかどうか確認するには、ログイン、パスワードの変更、パスワードのリセットなどのアクションの評価を作成するときにパスワード漏洩検出を使用します。
次の手順でパスワードの漏洩や認証情報の侵害を確認します。
リクエスト パラメータを生成する
- ハイ プライバシー プロトコルに必要な暗号関数を使用して、必要なリクエスト パラメータを計算します。reCAPTCHA には、これらのフィールドの生成に役立つ Java ライブラリと TypeScript ライブラリが用意されています。
パスワード チェックの検証を作成するには、
PasswordCheckVerifier
オブジェクトを作成します。PasswordCheckVerifier verifier = new PasswordCheckVerifier();
検証を開始するには、
PasswordCheckVerifier#createVerification
を呼び出します。この方法では、ユーザー名とパスワードを使用してパラメータを計算し、パスワード チェックを実行します。PasswordCheckVerification verification = verifier.createVerification("username", "password").get();
検証パラメータを使用して評価を作成します。
byte[] lookupHashPrefix = verification.getLookupHashPrefix(); byte[] encryptedUserCredentialsHash = verification.getEncryptedUserCredentialsHash();
バイト配列
lookupHashPrefix
とencryptedUserCredentialsHash
には、パスワード チェックAssessment
を開始するために必要なパラメータが含まれています。
パスワード漏洩を検出する評価の作成
projects.assessments.create
メソッドを使用します。
リクエストのデータを使用する前に、次のように置き換えます。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID
- LOOKUP_HASH_PREFIX: ユーザー名のプレフィックス SHA-256 ハッシュ プレフィックス
- ENCRYPTED_USER_CREDENTIALS_HASH: 暗号化されたユーザー認証情報 Scrypt ハッシュ
HTTP メソッドと URL:
POST https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/assessments
リクエストの本文(JSON):
{ "private_password_leak_verification": { "lookup_hash_prefix": "LOOKUP_HASH_PREFIX", "encrypted_user_credentials_hash": "ENCRYPTED_USER_CREDENTIALS_HASH" } }
リクエストを送信するには、次のいずれかのオプションを選択します。
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 レスポンスが返されます。
{ "name": "projects/698047609967/assessments/fb22000000000000", "score": 0, "reasons": [], "privatePasswordLeakVerification": { "lookupHashPrefix": "zoxZwA==", "encryptedUserCredentialsHash": "AyRihRcKaGLj/FA/r2uqQY/fzfTaDb/nEcIUMeD3Tygp", "reencryptedUserCredentialsHash": "Aw65yEbLM39ww1ridDEfx5VhkWo11tzn/R1B88Qqwr/+" "encryptedLeakMatchPrefixes": [ "n/n5fvPD6rmQPFyb4xk=", "IVQqzXsbZenaibID6OI=", ..., "INeMMndrfnlf6osCVvs=", "MkIpxt2x4mtyBnRODu0=", "AqUyAUWzi+v7Kx03e6o="] } }
評価から漏洩した認証情報を検証する
reEncryptedUserCredentials
レスポンスからフィールド encryptedLeakMatchPrefixes
と を抽出し、検証オブジェクトに渡して認証情報が漏洩しているかどうかを判断します。
PasswordCheckResult result = verifier.verify(verification,
result.getReEncryptedUserCredentials(),
result.getEncryptedLeakMatchPrefixes()
).get();
System.out.println("Credentials leaked: " + result.areCredentialsLeaked());
コードサンプル
次のコードサンプルは、Java ライブラリと TypeScript ライブラリを使用してパスワード漏洩検出を実装する方法を示しています。
Java
reCAPTCHA に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Node.js (TypeScript)
reCAPTCHA に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Docker コンテナ
認証情報が漏洩しているかどうかを確認するには、localhost 接続を使用するか、コンテナに HTTPS を設定して、ユーザー名とパスワードの認証情報ペアをコンテナに安全に送信します。コンテナは、reCAPTCHA への API リクエストを行う前にこれらの認証情報を暗号化し、再暗号化された結果をローカルで検証します。
Docker コンテナにリクエストを送信する手順は次のとおりです。
Docker コンテナの実行を準備する
認証戦略を選択します。
コンテナは、アプリケーションのデフォルト認証情報の設定をサポートしています。また、認証に API キーを受け入れることもできます。
HTTPS または localhost 専用のデモモードで実行するように PLD コンテナを構成します。
コンテナは機密性の高いエンドユーザー認証情報(ユーザー名とパスワード)を受け入れるため、HTTPS または localhost 専用のデモモードで実行する必要があります。HTTPS 構成のガイダンスについては、GitHub の README をご覧ください。
次の手順では、API キー認証を使用して、localhost 専用のデモモードでクライアントを実行します。
Docker コンテナをビルドして実行する
リポジトリのクローンを作成します。
git clone github.com/GoogleCloudPlatform/reCAPTCHA-PLD
コンテナを構築します。
docker build . -t pld-local
コンテナを起動します。
docker run --network host \ -e RECAPTCHA_PROJECT_ID=PROJECT_ID \ -e GOOGLE_CLOUD_API_KEY=API_KEY \ pld-local
コンテナが起動され、localhost のポート 8080 でリクエストの処理が開始されます。
localhost リクエストを送信する
リクエストのデータを使用する前に、次のように置き換えます。
- LEAKED_USERNAME: 漏洩した認証情報ペアのユーザー名。
- LEAKED_PASSWORD: 漏洩した認証情報ペアのパスワード。
HTTP メソッドと URL:
POST http://localhost:8080/createAssessment/
リクエストの本文(JSON):
{ "username":"LEAKED_USERNAME", "password":"LEAKED_PASSWORD" }
リクエストを送信するには、次のいずれかのオプションを選択します。
curl
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
curl -X POST \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"http://localhost:8080/createAssessment/"
PowerShell
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
$headers = @{ }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "http://localhost:8080/createAssessment/" | Select-Object -Expand Content
次のような JSON レスポンスが返されます。
{ "leakedStatus":"LEAKED" } OR { "leakedStatus":"NO_STATUS" }
判定を解釈して対処する
評価レスポンスには、認証情報が漏洩したかどうかが表示され、ユーザーを保護するための適切な措置を講じるのに役立つ情報が提供されます。
次の表に、漏洩したパスワードが検出されたときに推奨されるアクションを示します。
漏洩したパスワードが検出された | ユーザーを保護するためのアクション |
---|---|
ログイン中 |
|
アカウントの作成時またはパスワードの再設定時 |
|
サイトでもう MFA プロバイダを使用していない場合は、reCAPTCHA の MFA 機能を使用できます。
次のステップ
- 多要素認証(MFA)の使用方法について学ぶ
- reCAPTCHA アカウント保護機能を使用してユーザー アカウントを保護する方法を確認する