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。
三、整体框架:从日志到响应的五层结构
为了让你在后续章节中始终知道“当前在哪一层”,我们采用五层实战框架。每一层都有明确的输入、处理和输出。
- 数据采集层:收集认证日志、网关访问日志、应用审计日志,统一时间格式与字段命名。
- 特征提取层:从原始日志中提取账号、源IP、时间戳、登录结果、失败原因、User-Agent、地理位置、设备ID等字段。
- Velocity计算层:按账号、IP、设备、ASN等维度计算滑动窗口内的尝试次数、失败率、间隔方差、账号分散度。
- 检测判定层:结合静态阈值、动态基线和序列规则,输出风险评分与命中原因。
- 响应处置层:触发告警、限流、验证码、临时封禁或人工研判,并记录处置结果用于复盘。
下面是一段典型的登录日志片段,后续章节会反复使用类似结构。请先观察其中可用于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和凭证泄露情报。
五、误区复盘:初学者最容易踩的四个坑
- 把阈值当结论。阈值只是触发器,不是判决书。没有上下文的速度数据容易造成大量误报。
- 忽略正常业务节奏。促销、批量导入、移动端重试、共享NAT出口都会制造高Velocity,必须建立业务基线。
- 只看单IP或单账号。分布式攻击和密码喷洒会刻意规避单点阈值,必须引入多维度聚合。
- 没有闭环验证。规则上线后不跟踪命中样本、不计算误报率、不调整窗口,检测能力会迅速退化。
本课程后续每一章都会围绕“可观测、可计算、可验证、可响应”展开。你不需要一次记住所有指标,但需要先建立一种思维:暴力尝试识别不是寻找一个神奇数字,而是持续维护一套与业务共同演化的速度画像体系。