偵測並防範帳戶盜用

Google Cloud Fraud Defense 可偵測及防範網站和行動應用程式中的帳戶入侵 (ATO) 行為。為防範帳戶遭到憑證填充和自動化入侵,您可以結合 Account Defense 的帳戶層級行為分析、Password Defense 的外洩憑證檢查,以及升級多重驗證 (MFA)。

ATO 攻擊 (例如憑證填充) 通常發生在攻擊者使用資料侵害和密碼轉儲中外洩的憑證傳送登入要求時。使用者經常在不相關的網站重複使用密碼,因此除非您評估行為風險和外洩憑證,否則自動填充攻擊即使在正確設定的驗證端點上也能成功。

事前準備

準備 Google Cloud Fraud Defense 環境。

偵測及防範 ATO

Fraud Defense 提供下列功能,可偵測及防範 ATO:

使用 Account Defense 和 ATO 風險評分

Account Defense 是偵測及防範網站和行動應用程式 ATO 的主要功能。

Account Defense 提供專屬的 ATO 風險分數 (accountDefenderAssessment.accountTakeoverVerdict.risk,範圍從 0.0 到 1.0) 和可解釋性信號 (riskReasons 和 trustReasons)。這些信號會評估帳戶層級的行為記錄和工作階段信號,ATO 偵測精確度約為單獨使用機器人分數的四倍。

如要整合 Account Defense,請在呼叫 CreateAssessment 時,於 user_info.account_id 欄位 (event.userInfo.accountId) 傳遞穩定的帳戶 ID。如果帳戶 ID 只能在驗證後取得,請在呼叫 AnnotateAssessment 時傳遞 account_id。

偵測外洩的密碼

由於 ATO 經常仰賴憑證填充,使用密碼轉儲中外洩的憑證,因此請在登入、變更密碼和重設密碼流程中使用 Password Defense,偵測遭入侵的憑證。

在評估期間檢查憑證時,Password Defense 會根據已知資料侵害事件,評估標準化使用者名稱和密碼雜湊前置字串,不會向 Google 揭露明文憑證。呼叫 CreateAssessment 時,請在 privatePasswordLeakVerification 中傳遞使用者名稱 (credentials.username) 雜湊前置字元 (lookupHashPrefix) 和加密憑證雜湊 (encryptedUserCredentialsHash)。如果判定結果 (leakedPasswordVerdict) 指出憑證遭盜用,請要求重設密碼或觸發多重驗證 (MFA) 驗證。

使用分數型金鑰和多重驗證升級

當 ATO 風險分數 (accountDefenderAssessment.accountTakeoverVerdict.risk) 或機器人分數 (riskAnalysis.score) 顯示風險升高時,請使用分數型金鑰,在應用程式中觸發升級驗證或多重驗證 (MFA),做為強制執行機制。例如,提示使用者提供額外因素、要求重新驗證,或觸發動態密碼 (OTP) 驗證。

如要實作分數型金鑰和升級多重驗證,請完成下列步驟:

  • 安裝評分式金鑰,收集工作階段信號,並偵測大規模 ATO 中的自動化行為:

  • 當 accountTakeoverVerdict.risk 超過風險門檻,或 riskAnalysis.score 低於機器人門檻時,請在識別資訊提供者中觸發逐步驗證或多重驗證 (MFA) 驗證,在登入或執行機密動作時驗證帳戶擁有權。只在風險較高的要求觸發驗證問題,可減少正當使用者的操作障礙。

以下範例說明如何在登入工作流程中整合分數型金鑰:

function submitForm() {
  grecaptcha.enterprise.ready(function() {
    grecaptcha.enterprise.execute(
      'reCAPTCHA_site_key', {action: 'account_login'}).then(function(token) {
       document.getElementById("token").value = token;
       document.getElementByID("loginForm").submit();
    });
  });
}
<form id="loginForm" action="?" method="POST">
  Username: <input type="text" name="username"/><br/>
  Password: <input type="password" name="password"/><br/>
  <input type="hidden" id="token" name="recaptcha_token"/>
  <button onclick="submitForm()">Login</button>
</form>
<script src="https://www.google.com/recaptcha/enterprise.js" async defer></script>

您可以按一下程式碼視窗右上角的 <> 圖示,在 JSFiddle 中測試這個程式碼。

<html>
  <head>
    <title>Account Login - Score</title>
    <script src="https://www.google.com/recaptcha/enterprise.js"></script>
    <script>
    function submitForm() {
      grecaptcha.enterprise.ready(function() {
        grecaptcha.enterprise.execute(
          'reCAPTCHA_site_key', {action: 'account_login'}).then(function(token) {
           document.getElementById("token").value = token;
           document.getElementByID("loginForm").submit();
        });
      });
    }
    </script>
  </head>
  <body>
    <form id="loginForm" action="?" method="POST">
      Username: <input type="text" name="username"/><br/>
      Password: <input type="password" name="password"/><br/>
      <input type="hidden" id="token" name="recaptcha_token"/>
      <button onclick="submitForm()">Login</button>
    </form>
  </body>
</html>

後續步驟