IDS基本概念
IDS内部结构:事件产生器(传感器/嗅探器);事件分析器(核心);响应单元;事件数据库;
IDS检测技术两大类:1. 基于特征(规则) 2. 基于异常
特征检测和异常检测的区别:
特征检测的准确度高,但是容易产生漏报的情况,因为它只去匹配特征库里的攻击,对于未知的攻击,基本上是无能为力;异常检测的准确率会低一些,因为容易产生误报的情况,把一些不是入侵的也当做入侵处理了,但是它能够识别一些未知的入侵(虽然可能误报,但是宁可错杀也不愿漏杀是吧)。这两种可以理解为互补,一个负责内,一个负责外。
IDS分三大类:
NIDS和HIDS区别:安装位置的不同,NIDS传感器一般是在与服务器相连的集线器/交换机上,HIDS传感器一般是在服务器上;类似于一个是装在走廊的摄像头,一个是装在房间里的摄像头。
-
NIDS
监视着所有服务器和主机(网卡为混杂模式可以监控所有经过的流量):
-
HIDS
只能保护所在的主机(一般是非混杂模式,可以精确制定所需的规则,去掉不相关的,提高效率)
-
DIDS(作为一个IDS的管理平台,管理不同位置的传感器)
IDS产品的高端和低端:高端使用零复制等方式传输数据包,低端使用Libpcap函数库抓包
部署环境:共享式网络、交换式网络(需要流量镜像)
Snort基础
Snort本质上来说是网络数据包嗅探器,价值在于通过规则来处理数据包的过程,属于一个基于规则的NIDS。
需要的组件:Libpcap
网络驱动程序库
Snort 体系结构
插件模式扩展方便,
- 预处理和检测插件
- 报警输出插件…
snort下的文件:
bin:运行文件
doc:说明文档
etc:配置文档
log:日志文件
rules:规则文件
Snot基本组成模块:
- 数据包嗅探器(包解码器)
- 预处理器插件
- 检测引擎和插件
- 报警输出模块
源码对应为:
- snort.c:主代码
- decode.c:包解码器
- detect.c:检测引擎
- log.c:记录引擎
Snort捕获流量的方式:
- 网卡设置为混杂模式
- 利用Libpcap(Linux上)/ Winpcap(Windows上)
包解码器:把捕获到的数据包解码成Snort定义的packet结构
解码函数和顺序存在decode.h
源码文件中;
预处理器:通过启用预处理插件来使数据最终能被探测引擎处理
- 把包规格化/标准化(http解码预处理器…)
- 将分片的数据包进行重组(Frag2预处理器)
通过分片可以骗过基于模式匹配的IDS,分片工具Fragrouter
,分片还能发起DoS攻击 - 使Snort状态化,为每一个会话建立内部表,当检测引擎匹配到的包已经在会话中,则触发报警;还能检测序列号错误(Stream4预处理器)
- 端口扫描来识别服务器和开发的端口,端口扫描预处理器(Portscan2预处理器)
规则解析和探测引擎:
检测引擎包含两个部分:
- 规则建立、翻译
- 基于规则的检测引擎
检测规则要做的事:要检测什么东西?检测到了要怎么做?
Snort定义了5种处理方式(最main的3种):
- alert(发送报警信息)
- log(记录数据包)
- pass(忽略数据包)
Snort的规则语法:
单行文本格式,可分为规则头和规则选项两个部分。
栗子:
ftp.rules
的规则头部分:
alert
表示报警,还可以采取log
,pass
,dynamic
,active
方式TCP
是协议字段,将匹配链表的顶部,还可以是UDP
,IP
,ICMP
$ EXTERNAL_NET
是源IP地址,默认使用任意地址any
,还可以是192.168.1.0/24
形式来指定IP地址any
:是源端口,如果不特别指定就使用any
->
:方向操作符箭头表示会话的方向,包括单向和双向->``<>
,本例子意思是数据流方向从$EXTERNAL
的任意端口到$HOME_NET
的21端口$HOME_NET
:该变量表示内部网络,在snort.conf
上就定义好了,在整个规则中使用21
:攻击的目的端口,21是FTP行为的默认端口
ftp.rules
的规则选项部分:
语法规定:多个Snort规则选项必须用;
隔开;规则和关键字之间用:
隔开
msg:"FTP MDTM overflow attempt"
:这是一条报警信息,如果发现了"content"后面“ ”里的内容相匹配的数据,就发出msg后面的报警信息flow:to_server,established
:包含链接到检测插件的关键字,flow选项链表的第三维表示一个指向客户服务器检测插件的指针。客户服务器插件链接到Stream4预处理器,检测数据包是否含在已经建立的会话中。content:”MDTM“
:snort使用字符串匹配算法将引号中的内容与包进行匹配,可以使用| |
包含十六进制数,比如:content:"00 01 86 a5"
nocase
:表示忽略大小写isdataat:100,relative
:表示数据偏移量,这里是100B的意思reference
:包含第三方对攻击的解释信息,例如网站的bugtraq
或者mcafee
的URL链接和厂商的公告链接
(BugTraq 是网络安全行业最早致力于公开披露安全漏洞的邮件列表之一。今天,BugTraq 宣布将于2021年1月31日关闭。???)classtype:attempted-admin
:攻击往往被分类,优先级通过数字表示,1高,2中,3低sid:2546
:snort规则的独特标识符,所有规则都有的唯一标志,方便快速识别规则rev:5
:表示规则的版本
三维规则链表:
Snort读取规则文件以后,会组装一个类似上面的三维链表,然后从链表头开始查找,如果头匹配,那继续向下查找模糊匹配或者利用一个检测插件来匹配。一共有5个单独的规则链;
5个链下面又有单独的被协议关闭的链表,这一层叫做规则树节点(RTN),下面有几个协议:TCP/UDP/ICMP/IP
;
每个协议下面还有链,也就是规则选项,叫做选项树节点(OTN),比如:content, flow
上面的链表构建好了以后,就要告诉链表怎么处理数据包了,
流程大概是这样的:
数据包到了检测引擎,Snort首先进行规则头的匹配,按照链表头的顺序来,举例子,(我会匹配到aler)先从activation开始寻找,再到dynamic都没有匹配上,然后到alert匹配上了,我再看使用的是啥协议,假设我用的是TCP,那好,进入TCP下面的链,(如果不是TCP,那会继续向后找,直到匹配上)接下来开始在OTN内部寻找匹配的规则选项,snort会检查每一个规则选项,如果匹配到了攻击选项,有以下两种动作选项:1.指向检测插件的指针,也就是三维链表中的第三维,flow插件负责检查数据包是否和已建立的会话匹配,(也就是看是不是重复的数据包);2.利用boyer-moore
快速字符串搜索算法进行搜索的模式。
检测插件:
检测引擎里有很多的检测插件,snort2.x系列有数十个内置检测插件,也可以自己用第三方检测插件,例如Snortsam
报警输出模块
目的是产生记录行为或者产生报警,此模块可以根据指定的保存日志和报警系统产生输出信息的方式来执行不同的动作。通过配置可以实现以下功能:
- 简单的在
/snort/alerts
文件或其他文件中记录日志 - 发送SNMP trap
- 把日志记录到mysql或Oracle等数据库中
- 修改路由器或防火墙的配置