检测并防范账号盗用

借助 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) 中传递稳定的账号标识符。如果账号标识符仅在身份验证后可用,请在调用 AnnotateAssessment 时传递 account_id。

检测泄露的密码

由于 ATO 经常依赖于使用密码转储中泄露的凭据进行撞库攻击,因此请在登录、密码更改和重设密码流程中使用 Password Defense 来检测泄露的凭据。

当您在评估期间检查凭证时,Password Defense 会根据已知的数据泄露事件评估规范化的用户名和密码哈希前缀,而不会向 Google 泄露明文凭证。调用 CreateAssessment 时,在 privatePasswordLeakVerification 中传递用户名 (credentials.username) 哈希前缀 (lookupHashPrefix) 和加密凭据哈希 (encryptedUserCredentialsHash)。如果判定结果 (leakedPasswordVerdict) 指示凭据已泄露,则要求重设密码或触发升级 MFA 验证。

使用基于得分的密钥和升级版 MFA

当 ATO 风险评分 (accountDefenderAssessment.accountTakeoverVerdict.risk) 或机器人评分 (riskAnalysis.score) 表明风险升高时,请使用基于评分的密钥在应用中触发升级身份验证或多重身份验证 (MFA) 作为强制执行机制。例如,提示用户提供额外的验证因素、要求重新进行身份验证,或触发动态密码 (OTP) 验证。

如需实现基于评分的密钥和升级 MFA,请完成以下步骤:

  • 安装基于分数的密钥,以收集会话信号并检测大规模 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>

后续步骤