3. 异常检测概述
做了这么多年安全审计,我见过最多的误报就是没搞清楚「什么是异常」就开始跑模型。很多人一上来就套用孤立森林、LOF 这些算法,结果检测出来的全是业务正常波动。所以,在动手之前,先把异常检测的概念捋清楚。这一章我们就聊三个核心问题:异常到底是什么?它有哪些类型?在审计日志里能用在哪?
3.1 异常检测——先搞清楚「异常」是什么
异常检测,说白了就是从一堆正常行为里揪出那些「不对劲」的东西。它不关心正常行为长什么样,只关心谁跟正常不一样。在审计日志的语境下,这个「正常」往往是一个用户、一个系统或一个进程的历史行为基线。
我在早期项目里踩过一个坑——直接用全局统计指标去做检测。比如计算全公司所有员工的登录次数均值,然后认为偏离均值的就是异常。结果呢?运维团队每天几百次正常登录,全被判成异常。真正需要对比的,是「每个用户自己的历史行为」,不是全局平均。
为什么会这样?因为审计日志里的数据天然带有强烈的个体差异。每个用户的工作习惯、每个系统的调用频率都完全不同。所以,异常检测的第一步不是选算法,而是定义好「什么算正常」。
3.2 异常的分类——三种常见形态
在异常检测的理论体系里,异常通常被分成三类:点异常、上下文异常和集体异常。这三种类型在审计日志里都能找到很典型的对应案例。我个人习惯先看数据形态,再决定用哪种检测策略。
| 异常类型 | 定义 | 审计日志案例 | 检测难点 |
|---|---|---|---|
| 点异常 | 单个数据点显著偏离整体分布 | 某用户单日登录失败 200 次(平时 <5 次) | 阈值怎么定才不误报 |
| 上下文异常 | 在特定上下文中异常,其他场景正常 | 凌晨 3 点从海外 IP 登录内网系统 | 上下文维度如何选取 |
| 集体异常 | 一组数据联合表现异常,单个看可能正常 | 同一批账号在 5 分钟内先后从同一 IP 登录 | 群体行为的关联分析 |
3.2.1 点异常——最基础也最直观
点异常是最好理解的一类。单个数据点的取值跟它所属的整体分布差异太大,它就是异常。审计日志里的典型场景就是暴力破解检测。
我处理过一个金融系统的日志,有个普通员工的账号在某天凌晨出现了 327 次登录失败记录,而他过去三个月平均每天只有 1.2 次。这就是典型的点异常。我们用 3-sigma 原则配合滑动窗口就抓到了,后来确认是密码爆破攻击。
但要注意,点异常检测有个前提——你得知道正常分布长什么样。如果数据本身就不是正态分布,直接用均值加减标准差就会闹笑话。我建议先用箱线图或核密度估计看看数据形态,再决定用哪种统计方法。
3.2.2 上下文异常——跟场景绑定的异常
上下文异常更有意思。同一个行为,放在不同场景下,正常和异常的结论完全相反。你想想看,员工在工作时间访问内部 CRM 系统完全正常,但如果是凌晨 2 点从境外 IP 访问呢?
上下文异常通常依赖两个维度的信息:
- 时间上下文:非工作时间、非工作日、节假日等
- 空间上下文:异常地理位置、异常设备、异常网络段
我记得有一次,系统检测到一个管理员的账号在周六凌晨批量下载配置文件。单看操作本身都是合法命令,但结合「周六 + 凌晨 + 管理员非值班」这个上下文组合,立刻就暴露了风险。这就是上下文的威力。
我曾经在一个项目中把上下文维度加得太多——时间、地点、设备、浏览器指纹、网络延迟全塞进去。结果呢?模型变得极其敏感,每天几百个告警,安全团队根本看不过来。上下文不是越多越好,选 2-3 个最关键的就行。
3.2.3 集体异常——团伙行为的照妖镜
集体异常是三种类型里最难检测、但危害最大的。单个数据点单独看完全正常,但把它们放在一起,就能看出明显的异常模式。
审计日志里的经典场景:
- 账号共享:多个不同部门的账号在短时间从同一 IP 登录
- 数据窃取:几个账号先后访问同一份敏感文档,每个只下载一页
- 慢速扫描:多个 IP 轮流扫描同一端口,单个 IP 只扫一次
对付集体异常,传统的点异常检测方法基本没用。你需要用到序列模式挖掘、图分析或者时序关联规则。说白了,得把数据点之间的关系也建模进去。
3.3 异常检测在审计日志中的应用场景
理论讲完了,我们看看实际能在哪些场景落地。审计日志的覆盖面很广,从用户认证到系统调用、从数据访问到网络流量,几乎每个环节都可以用异常检测来发现问题。
| 场景 | 检测目标 | 常见异常类型 | 我见过的真实案例 |
|---|---|---|---|
| 用户认证异常 | 暴力破解、撞库、账号盗用 | 点异常、上下文异常 | 某系统一晚上出现 12 万次登录失败 |
| 权限使用异常 | 越权访问、权限提升、内部威胁 | 上下文异常、集体异常 | 普通员工突然访问 HR 薪资数据库 |
| 数据访问异常 | 批量导出、异常查询、数据泄露 | 点异常、集体异常 | 开发人员在凌晨导出整张用户表 |
| 系统操作异常 | 异常命令执行、计划任务篡改 | 上下文异常 | 非运维时段执行高危 Shell 命令 |
拿「用户认证异常」来说,这是目前落地最成熟的方向。点异常模型可以捕获单账号的登录失败次数突增,上下文异常模型可以捕获非工作时间的异常登录,两者结合效果最好。我在一个项目中把这两类模型做了级联:先用点异常过滤掉明显噪声,再用上下文异常做精细化判断,误报率从 40% 降到了 7%。
「数据访问异常」则更多依赖集体异常。单个用户下载几份文档很正常,但如果一个小组的多个成员同时开始下载同一类敏感文件,就需要引起警惕了。我曾经用图分析方法把用户 - 文件 - 时间三个维度建了一个异构图,检测出了好几起内部数据泄露事件。
3.4 本章知识体系总览
下面这张图把这一章的核心内容串在了一起。从异常检测的概念出发,到三种异常类型的定义和案例,再到审计日志中的落地场景。你可以把它当做后续章节的导航图。
刚开始接触异常检测时,别想着一次搞定所有类型。我自己的经验是:先从点异常入手,用简单的统计方法(比如 IQR 或 3-sigma)把最明显的异常抓出来。等团队对数据有了感觉,再逐步引入上下文异常和集体异常的检测方法。这样既容易落地,也能快速看到效果。