1. 导论
随着上网行为的多样化,人们生活越来越多的向互联网偏移,与之同生的黑客行为就变的越来越猖獗,保护互联网企业内部免受黑客攻击的挑战越来越严峻。在互联网企业内部建立一个检测黑客入侵行为入侵检测系统刻不容缓。这也是一个任安全公司必备的一项工作。
Snort作为一款非常优秀的开源工具,支持多平台,被很多安全公司拿来用做入侵检测模块的核心引擎。
本文就对当前最著名的开源网络入侵检测系统Snort的工作原理做一些简单的介绍,同时做出部分配置说明。
2. Snort工作原理
Snort是基于模式匹配的网络入侵检测系统,简单的说可以分成两个模块,一是基于libpcap的嗅探器,二是规则拆分引擎和规则匹配。
Snort基于libpcap的嗅探器并没有什么特别的,unix/linux平台下大部分嗅探器都是基于此。当网卡工作在混淆模式下可以截获当前网段下所有数据包。需要说明的是,只有处于HUB集线器环境下的机器snort是可以嗅探到所有流经该网段的数据,此时snort可以并行连接于该网段任一机器;但是现今的网络HUB集线器多被交换机取代,而此时需要将snort串行于需要服务的网络,snort才可以接受并处理该网段数据,如果仍想并行于网络,可以通过arp欺骗来达到接收并处理其他机器数据包的方式。当然在企业内部建设一个稳定的NIDS不可能使用hub以及arp欺骗,更可靠的方案是使用流量镜像的方式将流量从核心交换机将流量“镜像”到IDS服务器上,然后启动snort处理流量。
Snort对规则的初始化做出过比较多的改进工作,如今其合理的组织分类大大的提高了检测匹配效率。如今snort版本到了2.9.4.1,我们所用版本是2.9.3.1其对于规则的初始化部分应该没有做太大的改动。看如下数据结构,
代码 1 src/rules.h 定义数据结构如下
typedef struct_ListHead
{
struct_OutputFuncNode *LogList;
struct _OutputFuncNode *AlertList;
struct _RuleListNode *ruleListNode;
} ListHead;
typedef struct_RuleListNode
{
ListHead *RuleList; /* The rule list associated with thisnode */
RuleType mode; /* the rule mode */
int rval; /* 0 == no detection, 1 ==detection event */
int evalIndex; /* eval index for this rule set*/
char *name; /* name of this rule list (fordebugging) */此为链表头,动作
struct _RuleListNode *next; /* the nextRuleListNode */
} RuleListNode;
代码 2 src/treenodes.h 定义数据结构如下
typedef struct_RuleTreeNode
{
RuleFpList *rule_func; /* match functions..(Bidirectional etc.. ) */
int head_node_number;
RuleType type;
—省略部分
struct _ListHead *listhead; 链接于listhead
unsigned int otnRefCount;
} RuleTreeNode;
Snort2.9是建立一个二维链表,首先是以动作创建表头,再以RTN(规则的协议头RuleTreeNode)链接,到最后一个再以规则内容(OTN)进行分配,看上去是更加结构化更加合理。数据结构建立好,之后进行的匹配就是按照链表依次匹配,先判断动作然后继续依据规则头的内容进行匹配,这样就加快了匹配的效率,减少了很多的无用功。其实在2.3版本上是建立了一级按协议分类链表,也就是某种三维的链表结构,但是后来去掉了,应该是过于冗余反而影响了效率。如今是如下的链表结构
RuleListNode→ListHead→RTN→OTN
↓
RuleListNode→ListHead→RTN→OTN
以上是Snort对读入规则的拆分,之后就是创建和建立链表。
Snort在初始化完成之后会对嗅探接收到的数据包,与初始化后的规则链表来进行查找匹配。如果匹配中了则会执行相应规则中的动作比如丢包或者报警。
3. 一个基于BASE的图形化入侵检测系统
BASE(Basic Analysis and Security Engine)是基于PHP的广泛使用的一种高效Snort分析查询系统,可以方便的查询snort存储于mysql中的报警。一言以蔽之,以图形化的界面代替了普通文本的显示。
syslog-ng是syslog的替代工具,可以作为syslog日志服务器,接收其他客户端发送的日志,本文用起接收各个Sensor发送的日志。
利用snort和base可以快速建立起一个分布于公司各网络边界的、有效的、可集中管理的网络入侵检测系统。利用syslog-ng实时接收报警日志,并且对其进行实时处理可以建立起一个实时报警的监控系统。
A. Snort部署
安装库:
1)安装mysql的开发包,apt-get install libmysqlclient-dev,安装php5-mysql等
2)apt-get install flex bison build-essentialcheckinstall libpcap0.8 libnetfilter-queue-dev libnfnetlink-devlibnfnetlink0 libdumbnet-dev libdumbnet1
注:安装过程中如果缺少什么库,需根据提示安装
【安装Snort】
带mysql支持编译,即可。
【安装Web】
1)将Base文件夹放在 /var/www/
2)将Adodb5 放在Base下
之后在web浏览器下一步步安装即可。
安装完成后,文件结构目录如下
Snort文件目录结构:
/usr/local/lib 下面三个文件夹
snort_dynamicengine
snort_dynamicpreprocess
snort_dynamicrules
/usr/local/bin 下面一个可执行程序
snort
/etc/snort 下面一堆snort的配置文件+一个规则库文件夹
rules
snort.conf
classification.config
reference.config
….其他一些不是非常重要的配置文件
/var/log/snort 空
【Snort.conf配置】
修改相对路径等成为你配置的情况,Include 规则库,如果不支持ipv6 则将文件中ipvar替换为var(共11处)
对网络主机的监控可以通过修改
HOME_NET (被监控主机,目的主机) –>var HOME_NET[1.1.1.1,2.2.2.0/24,![2.2.2.2,2.2.2.3]] 表示保护地址为1,1,1,1 与2.2.2.0–2.2.2.255 同时去掉 2.2.2.2 与2.2.2.3的主机。
EXTERNAL_NETEXTERNAL_NET (外网主机, 源攻击主机) –>
一般是 var EXTERNAL_NET any 或者 var EXTERNAL_NET !$HOME_NET (HOME_NET不能为any)
其他一些设置,如果需要可以进行相应修改。
B. Snort规则
Snort规则是检测入侵的核心,故而规则优化、剪裁是建设NIDS系统的重点。
一般来说,Snort规则来源于以下几种方式:
1)Snort自带
2)第三方规则库 如 http://www.bleedingsnort.com/
3)BackTrack5系统中自带有部分筛选后的规则库,可酌情参考。
这些规则库各有优缺点,如Snort自带的库大多是过时的,我们应该将其进行筛选,删掉无用的规则,否则会引起特别多的误报。有的规则且适用于不同的边界,比如木马检测适用于办公网出口的部署;针对web服务器的保护规则适用于IDC出口。
除了对以上规则进行筛选、修改外, 安全工程师应该依靠自己对入侵手段的了解,编写对应的规则,并且持续对其进行更新。
C. 实时报警
Base的优势是可以展示这些报警,但是安全工程师不可能每天盯着这些,故而一种实时报警的机制,将报警以短信、邮件的形式发给安全工程师。
我们的方案是将snort的syslog日志集中收集起来,实时处理,将高危、严重的报警实时发出来。
使用syslog-ng收集日志后,将snort相关日志过滤到指定文件如var/log/snort.log。
此时可以对日志进行处理,将高危的报警通过邮件发送出来。
以上便是一个可用于网络安全监控的相对完善的入侵检测系统。
4. Snort的一些发展
在实践过程中,感觉snort不仅仅可以作为一个入侵检测系统,也可以作为一个上网行为检测的设备,因为同是属于规则匹配模式,只需要开发相应的规则即可完成。如下举个封锁某网站登录的规则开发流程。
多次抓包后寻找共同特征,多次抓包发现特征均如下:
则可以提取其特征”POST /ajaxLogin/login?” 同时其相关部分特征端口,80,len>500(这个包长度为1006)
pass tcp any any -> any 80(msg:”unlogin”;dsize:>500; content:”POST /ajaxLogin/login?”; offset:0; depth:22;check_num:1; sid:1;)
5.后记
不管一套入侵检测系统做的如何完善,安全是不可能一蹴而就的。解决安全问题的途径还是依靠人们不断提高的安全意识。
Copied from https://anquan.163.com/module/pedia/article-00034.html