1. 课程导入

欢迎进入《登录Velocity与暴力尝试识别实战》。在开始写第一条检测规则之前,我们需要先建立共同的语言:这门课到底解决什么问题、Velocity在安全语境中意味着什么、一次暴力尝试会留下哪些可观测痕迹,以及我们将用怎样的整体框架把零散日志变成可行动的判断。本章不涉及复杂配置,但会决定你后续29章的学习效率。

一、学习目标:学完本课程你能做什么

本课程面向安全运营、风控研发、后端开发与SOC分析人员。完成全部章节后,你应当具备以下能力:

  • 理解Velocity的业务含义:能区分“登录频率”“失败速率”“尝试速度”与“攻击速度”之间的差异,不再把单一计数当作暴力破解结论。
  • 构建可观测数据基础:能从认证日志、网关日志、应用日志中提取账号、IP、时间戳、结果、User-Agent、设备指纹等关键字段。
  • 设计检测规则:能基于时间窗口、滑动窗口、基线偏离和序列模式,编写可解释、可调优的暴力尝试识别逻辑。
  • 完成实战验证:能使用模拟攻击流量验证规则命中率,并通过误报复盘持续优化阈值。
  • 形成响应闭环:能把检测结果对接到告警、封禁、二次验证与人工研判流程。
学习建议:每章至少准备一份真实或脱敏的登录日志样本。没有数据时,课程会提供模拟日志格式,但真实数据中的噪声才是最好的老师。

二、核心概念:Velocity、暴力尝试与识别边界

在安全领域,Velocity通常指“单位时间内事件发生的速度或变化率”。放到登录场景中,它不只是“一分钟失败几次”,而是包含方向、加速度和分布的综合指标。例如:同一账号在10秒内失败20次,与100个账号在同一IP下各失败1次,两者的Velocity形态完全不同,对应的攻击意图也不同。

暴力尝试(Brute Force Attempt)指攻击者通过反复试错获取有效凭证的行为。它可以是针对单账号的密码喷洒、针对多账号的撞库、针对OTP的验证码爆破,也可以是利用泄露凭证的Credential Stuffing。识别暴力尝试的本质,是在正常用户行为与机器化试错之间找到可量化的分界线。

我们需要区分三个容易混淆的概念:

概念 关注点 典型信号 常见误判
登录频率 某账号/IP在固定窗口内的登录次数 次数突增 共享出口IP导致正常用户被误伤
失败速率 失败次数占总尝试的比例及变化 失败率接近100% 用户忘记密码也会造成高失败率
尝试速度 相邻尝试的时间间隔与节奏 间隔极短且稳定 自动化测试脚本可能被误认为攻击
攻击速度 多账号、多IP、多凭证的协同变化 分布式低频但整体高速 只看单IP会漏掉慢速分布式攻击

因此,本课程所说的“Velocity识别”,不是简单设置一个阈值,而是建立多维度速度画像:谁在尝试、尝试什么、以多快速度、失败如何分布、是否跨越多个账号或IP。

三、整体框架:从日志到响应的五层结构

为了让你在后续章节中始终知道“当前在哪一层”,我们采用五层实战框架。每一层都有明确的输入、处理和输出。

  1. 数据采集层:收集认证日志、网关访问日志、应用审计日志,统一时间格式与字段命名。
  2. 特征提取层:从原始日志中提取账号、源IP、时间戳、登录结果、失败原因、User-Agent、地理位置、设备ID等字段。
  3. Velocity计算层:按账号、IP、设备、ASN等维度计算滑动窗口内的尝试次数、失败率、间隔方差、账号分散度。
  4. 检测判定层:结合静态阈值、动态基线和序列规则,输出风险评分与命中原因。
  5. 响应处置层:触发告警、限流、验证码、临时封禁或人工研判,并记录处置结果用于复盘。
核心原则:检测规则必须可解释。每一条命中都应能回答“为什么判定为暴力尝试”,否则调优和申诉都无从下手。

下面是一段典型的登录日志片段,后续章节会反复使用类似结构。请先观察其中可用于Velocity计算的字段:

2025-03-11T09:12:01Z login_failed account=alice src_ip=203.0.113.45 reason=bad_password ua="python-requests/2.31"
2025-03-11T09:12:02Z login_failed account=alice src_ip=203.0.113.45 reason=bad_password ua="python-requests/2.31"
2025-03-11T09:12:02Z login_failed account=alice src_ip=203.0.113.45 reason=bad_password ua="python-requests/2.31"
2025-03-11T09:12:03Z login_failed account=alice src_ip=203.0.113.45 reason=bad_password ua="python-requests/2.31"
2025-03-11T09:12:04Z login_success account=alice src_ip=203.0.113.45 ua="python-requests/2.31"

这段日志中,账号alice在4秒内连续失败4次后成功,源IP固定,User-Agent为脚本工具。仅凭“失败4次”不足以定性,但结合时间间隔、UA和最终成功,Velocity画像已经非常可疑。后续我们会把它转化为可执行的检测逻辑。

四、案例与场景:三种典型暴力尝试形态

为了让抽象概念落地,先看三个真实场景的简化版:

  • 场景A:单账号高速爆破。攻击者针对一个高价值账号,以每秒5次的速度尝试常见密码。特征是同一账号、同一IP、失败间隔极短、失败原因集中为bad_password。
  • 场景B:密码喷洒。攻击者用同一个弱密码尝试1000个账号,每个账号只试1到2次。单账号看完全正常,但同一IP下账号分散度极高,失败账号数在短时间内激增。
  • 场景C:分布式慢速撞库。攻击者使用代理池,每个IP只尝试少量账号,整体速度被拉长到数小时。单IP阈值无法命中,必须依赖跨IP的全局Velocity和凭证泄露情报。
常见误区:只监控“失败次数”。场景B和场景C的失败次数在单维度上都不高,但账号分散度和跨IP协同速度已经暴露了攻击意图。后续章节会专门讲解如何用熵和分散度指标捕捉这类攻击。

五、误区复盘:初学者最容易踩的四个坑

  1. 把阈值当结论。阈值只是触发器,不是判决书。没有上下文的速度数据容易造成大量误报。
  2. 忽略正常业务节奏。促销、批量导入、移动端重试、共享NAT出口都会制造高Velocity,必须建立业务基线。
  3. 只看单IP或单账号。分布式攻击和密码喷洒会刻意规避单点阈值,必须引入多维度聚合。
  4. 没有闭环验证。规则上线后不跟踪命中样本、不计算误报率、不调整窗口,检测能力会迅速退化。

本课程后续每一章都会围绕“可观测、可计算、可验证、可响应”展开。你不需要一次记住所有指标,但需要先建立一种思维:暴力尝试识别不是寻找一个神奇数字,而是持续维护一套与业务共同演化的速度画像体系。