所谓“入侵检测”,顾名思义,就是对入侵行为的发觉。他通过对计算机网络或计算机系统中若干关键点收集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象。”
但实际上,所谓的“违反”和“被攻击”这2个定义,都包含一定的主观性,并且和具体的上下文有关系。因此本文笔者尝试提出建立入侵检测方法论的一些基本准则,在基本准则的指导下应用具体的技术进行具象化实现。
1. 安全策略的描述性定义
首先,开篇明义,安全策略是由具体的人定义的,这个人常常就是计算机的管理员。
这里所指的安全策略是一个泛概念,它包括:
- 网络ACL策略
- in/out限制
- 公网开放限制
- 端口开放限制
- 进程轮廓(proces profile)
- 进程白名单:例如docker环境中只允许某一些指纹的进程启动
- 进程黑名单:例如禁止IIS启动cmd.exe等特定行为
- 文件轮廓(file profile)
- 文件/目录完整性监控:例如web根目录或纯代码目录下,在完成版本变更后是不应该有文件变动的
- 系统配置轮廓(system configuration profile)
- 注册表完整性监控
- 自启动项配置完整性监控
2. 集合论视角下的安全策略
将操作系统运行中产生的每个动作都抽象出来,在每一个CPU时钟周期,当前操作系统所处的状态都可以用一个集合O来表示,例如:
- o1:某某A进程启动了某某B进程
- ..
- o5:某某C进程启动了某某D进程
- ..
- o8:某某A进程发起了一个网络外连
- ...
- on:某某A进程向注册表中添加了一个自启动项
每个集合O代表了一种系统运行状态。
而所谓的”符合安全策略的行为“,可以将其抽象为一组系统运行状态O的集合,
而所谓的“违反安全策略的行为”,可以将其抽象为下列集合,
同时,将整个系统的所有运行状态看成是一个运行状态的超集A,Normal_Strategy是这个超集的一个子集,illegal_Strategy是在全集A下相对Normal_Strategy的差集。
3. 隐马尔科夫链视角下的违反安全策略行为
关于HMM的相关讨论,可以参阅这篇文章。
系统的运行天然是一个时序过程,每个CPU时钟可以看成是一个t,借助HMM的视角,我们将系统的运行生命周期抽象为如下HMM过程,
其中,
- 状态变量 {x1,x2} 表示第 i 时刻的系统状态。通常假定状态变量是隐藏的、不可被观测的,因此状态变量也被称为隐变量(hidden variable)。在入侵检测这个场景下,
- x1代表安全状态
- x2代表异常状态
- 模型在各个隐状态之间的转换概率,称之为状态转移矩阵A,即
- x1 -> x2:系统从安全状态转移到异常状态,代表发生了入侵行为
- x2 -> x1:系统从异常状态转移到安全状态,代表病毒和后门得到了清理,漏洞得到了修复,系统行为链重新回到安全状态下
- 观测变量 {O_1,O_2,....,O_n} 表示第 i 时刻的观测值,这是我们通过各种日志采集技术采集到的系统行为日志,代表了当前系统运行状态
- 在任一时刻,观测变量 O_i 的取值仅依赖于状态变量 x_i,观察变量 O_i 的取值由发射概率矩阵B确定,与其他状态变量及观测变量的取值无关
- 初始状态π 代表系统初始化启动时的系统运行状态,在网络安全领域,π等于x1,即安全状态
一般来说,P(x1->x1) 和 P(x2->x2) 的概率要大于 P(x1->x2) 和 P(x2->x1),
这是网络安全场景里的特殊现象,即:
- 一台机器如果当前处于正常状态,则大概率会长时间保持处于正常状态
- 一台机器如果已经被入侵了处于异常状态,则大概率会在一段时间窗口内持续保持异常状态,因为病毒的运行、持久化的植入,这些都会不断触发新的异常行为,除非管理员和安全产品主动介入,清理了病毒并修复了漏洞,否则这个状态不会转移
- 相比之下,从安全状态到异常状态,以及从异常状态到安全状态的概率就相对较低,因为这都属于偶发事件,是因为漏洞被利用了或者管理员介入清理了病毒导致的
所以,本质上说,安全不是一门追求确定性的自然科学,而是一门追求概率性不确定性的统计学科。
4. HMM下的预测问题/解码问题(观测序列反推隐藏状态序列)- 入侵检测的马尔科夫理论基础
已知模型和观测序列,求对给定观测序列条件概率最大的隐状态序列,对于安全入侵检测需要就是 I 序列的最后一个状态,即下一跳状态。
0x1:零阶马尔科夫假设(朴素.i.i.d.假设)下的入侵检测
零阶马尔科夫假设是一个强假设条件,也即.i.i.d.假设,即:
即每个隐状态转换之间是彼此独立的,⽽独⽴于其他所有之前的所有状态。
这意味着假设系统每一个隐状态 x_i 都与历史上其他的隐状态 x_i-t 没有任何关系,上一秒处于正常状态还是被入侵状态,对当前状态不提供任何信息。
满足零阶马尔科夫假设(.i.i.d.)条件的异常检测,在入侵检测里被称之为“环境独立型的异常检测(environment independent abnormal detection)”。所谓环境独立,即指和具体所处的上下文没有任何关系,当前系统状态 Oi 就可以提供完整的判断信息(概率似然估计),例如:
- 恶意病毒检测:基于文件本身的文本判断该病毒的意图,基于静态或者动态机制判断该文件是否具备恶意攻击性
- 明显黑客意图的系统运行状态:该系统状态本身带有明显的黑客攻击意图,正常管理员,这类异常的检测带有强烈的安全领域知识
基于可观察变量 Oi(常常是系统行为日志),可以借助似然估计得到当前系统状态 x_i 的条件概率,
需要注意的是,对于“环境独立性异常检测”来说,不需要事先知道系统原生安全策略或者基线的,因为环境独立型异常的判断和环境上下文没有关系。
0x2:二阶及以上高阶马尔科夫假设下的入侵检测
所谓二阶及以上高阶马尔科夫假设下的入侵检测,是指每个隐状态 x_i 都和历史上的1个或更多的状态存在依赖关系。
二阶依赖假设,当前系统隐状态只与前一步隐状态有关
高阶依赖假设的极端情况,当前系统隐状态和历史上所有状态都有关
在网络安全领域,N阶马尔科夫假设非常少见,大部分时候只要考虑2阶马尔科夫假设即可,即:
- x1->x2:安全状态->异常状态
- x2->x1:异常状态->安全状态
5. 系统符合安全策略行为集合定义
在甲方企业安全建设中,由于可以通过资产清点与安全策略的预设,最大程度地缩小“符合安全策略的行为集合”的大小,从而预先设定出一个“系统符合安全策略的行为集合”。
建立了这个安全基线之后,之后就可以通过实时的行为监控,将不符合安全策略的行为都筛选出来。
另一方面,在乙方安全能力建设建设中,很多时候是无法准确获得服务器预设的安全策略的,这个时候就需要通过自学习、基线profile等方式来动态地计算服务器的“符合安全策略的行为集合”,但这又往往受限于算力、时效性等方面因素的制约。
6. 乙方能力建设场景中如何判定违反安全策略
在甲方企业安全建设和某些docker环境中,安全基线策略是固定的,判定违反安全策略相对较容易,直接进行diff对比即可。
在乙方安全能力建设场景下,由于很多时候我们无法准确获得系统的初始状态以及精确的安全策略基线。所以仅从单个系统运行状态本身是无法100%断定攻击的,需要进行上下文关联分析,例如
- 攻击者源IP聚类关联:攻击是一个以发起者驱动的行为结果,需要从发起者的视角来组织和串接整个行为链。例如基于RASP技术,对每个攻击者源IP已经该IP对应的操作行为链进行恶意分析
- 进程链聚类关联:通过sid/pid-ppid对进程的生命周期进行串联,本质上是通过”升维“的方式,在进程链的层面进行二分类,提高待分类行为样本的线性可分性
7. 入侵检测系统(intrusion detection system,IDS)建设的一般分类
入侵检测系统(IDS)是一种对网络传输进行即时监视,在发现可疑传输时发出警报或采取主动反映措施的网络安全系统。对各种事件进行分析并从中发现违反安全策略的行为是其核心功能。
根据检测方法和安全策略的差异,IDS分为异常入侵检测、误用入侵检测、概率似然入侵检测。我们下面来分别讨论。
0x1:异常入侵检测(基于异常情况的入侵检测)
通过建立正常行为模型来分辨出不符合该模型的行为入侵。典型的正常行为建模方式有:
- 人为预定义静态安全策略
- 动态窗口区间基线生成
- 动态窗口统计异常检测
该方法论的主要着眼点在于先定义一组正常数值以比对是否符合正常,进而阻挡恶意攻击。
0x2:误用入侵检测(基于标志的入侵检测)
建立不可接受的行为模型,凡是符合该模型的即被判定为入侵。该方法论主要着眼于定义违背安全策略的事件的特征来判别攻击,重在维护一个特征知识库,也就是常说的”脏规则“。
笔者注:
以上这两种策略各有长短,前者漏报率低、误报率高,后者误报率低、漏报高。在实际工程实践中,后者建议可以优先进行,而前者作为补充。
0x3:概率似然入侵检测
基于贝叶斯概率对长序列的入侵行为链进行危险性的概率性推测。