clip_p_w_picpath002

clip_p_w_picpath004

clip_p_w_picpath006

snort 是一个基于libpcap的数据包嗅探器并可以作为一个轻量级的网络***检测系统( NIDS)。所谓的轻量级是指在检测时尽可能低地影响网络的正常操作,一个优秀的轻量级的NIDS应该具备跨系统平台操作,对系统影响最小等特征并且管理员能够在短时间内通过修改配置进行实时的安全响应,更为重要的是能够成为整体安全结构的重要成员。

IDS:

IDS是英文“Intrusion Detection Systems”的缩写,中文意思是“***检测系统”。专业上讲就是依照一定的安全策略,通过软、硬件,对网络、系统的运行状况进行监视,尽可能发现各种***企图、***行为或者***结果,以保证网络系统资源的机密性、完整性和可用性。做一个形象的比喻:假如防火墙是一幢大楼的门锁,那么IDS就是这幢大楼里的监视系统。一旦小偷爬窗进入大楼,或内部人员有越界行为,只有实时监视系统才能发现情况并发出警告。

HIDS :基于主机的***检测系统。在需要监测的服务器上安装相应的软件。

缺点:需要多个软件,价格总体较高

优点:应用层监控。控制力度高,可以基于内容进行监测

NIDS: 基于网络的***检测系统。硬件设备,连接在hub或交换机上(端口镜像)

缺点:3层或4层过滤。控制力度低,只能基于协议、ip端口号进行过滤

优点:整个网络中需要的数量较少,总成本低

IPS:跟高级的ids

***预防系统(IPS: Intrusion Prevention System)是电脑网络安全设施,是对防病毒软件(Antivirus Programs)和防火墙(Packet Filter, Application Gateway)的补充。 ***预防系统(Intrusion-prevention system)是一部能够监视网络或网络设备的网络资料传输行为的计算机网络安全设备,能够即时的中断、调整或隔离一些不正常或是具有伤害性的网络资料传输行为。

***检测系统工作原理:

一、信息收集

收集流量的内容、用户连接的状态和行为

二、信息分析

通过模式匹配、统计分析和完整性分析三种手段进行分析

模式匹配:类似于查病毒,查看内容是否符合***的条件。最精确

统计分析:针对某个对象的行为进行记录,若行为发生变化,就认为***。误报率高

完整性分析:针对文件,防止文件被篡改

一般在网络中是将HIDS与NIDS向互结合来使用。重要的服务器上安装HIDS用来保护该台服务器,然后在网络中再安装一台NIDS,进行互补

Snort作为其典型范例,首先可以运行在 多种操作系统平台,例如UNIX系列和Windows 9X.(需要libpcap for Win32的支持),与很多商业产品相比,它对操作系统的依赖性比较低。其次用户可以根据自己的需要及时在短时间内调整检测策略。就检测***的种类来说,据最新数据表明(2000/12/4)snort共有21类(???)1271条检测规则,其中包括对缓冲区溢出,端口扫描和CGI***等等。SNORT 集成了多种告警机制来提供实时告警功能,包括:syslog、用户指定文件、UNIXSocket、通过SMBClient使用WinPopup对 Windows客户端告警。 Snort的现实意义维作为开源软件填补了只有商业***检测系统的空白,可以帮助中小网络的系统管理员有效地监视网络流量和检测***行为。

snort有三种工作模式:

嗅探器

数据包记录器

网络***检测系统

嗅探器模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上。

数据包记录器模式把数据包记录到硬盘上。

网路***检测模式是最复杂的,而且是可配置的。我们可以让snort分析网络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作

所谓的嗅探器模式就是snort从网络上读出数据包然后显示在你的控制台上。首先,我们从最基本的用法入手。如果你只要把TCP/IP包头信息打印在屏幕上,只需要输入下面的命令:

./snort -v

clip_p_w_picpath008

使用这个命令将使snort只输出IP和TCP/UDP/ICMP的包头信息。如果你要看到应用层的数据,可以使用:

./snort -vd

这条命令使snort在输出包头信息的同时显示包的数据信息。如果你还要显示数据链路层的信息,就使用下面的命令:

./snort -vde

注意这些选项开关还可以分开写或者任意结合在一块。例如:下面的命令就和上面最后的一条命令等价:

./snort -d -v –e

数据包记录器:

如果要把所有的包记录到硬盘上,你需要指定一个日志目录,snort就会自动记录数据包:

./snort -dev -l ./log

当然,./log目录必须存在,否则snort就会报告错误信息并退出。当snort在这种模式下运行,它会记录所有看到的包将其放到一个目录中,这个目录以数据包目的主机的IP地址命名,例如:192.168.10.1

如果你只指定了-l命令开关,而没有设置目录名,snort有时会使用远程主机的IP地址作为目录,有时会使用本地主机IP地址作为目录名。为了只对本地网络进行日志,你需要给出本地网络:

./snort -dev -l ./log -h 192.168.1.0/24

这个命令告诉snort把进入C类网络192.168.1的所有包的数据链路、TCP/IP以及应用层的数据记录到目录./log中。

如果你的网络速度很快,或者你想使日志更加紧凑以便以后的分析,那么应该使用二进制的日志文件格式。所谓的二进制日志文件格式就是tcpdump程序使用的格式。使用下面的命令可以把所有的包记录到一个单一的二进制文件中:

./snort -l ./log -b

***检测系统:

snort最重要的用途还是作为网络***检测系统(NIDS),使用下面命令行可以启动这种模式:

./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf

    snort.conf是规则集文件。snort会对每个包和规则集进行匹配,发现这样的包就采取相应的行动。如果你不指定输出目录,snort就输出到/var/log/snort目录。

注意:如果你想长期使用snort作为自己的***检测系统,最好不要使用-v选项。因为使用这个选项,使snort向屏幕上输出一些信息,会大大降低snort的处理速度,从而在向显示器输出的过程中丢弃一些包。

此外,在绝大多数情况下,也没有必要记录数据链路层的包头,所以-e选项也可以不用:

./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf

这是使用snort作为网络***检测系统最基本的形式,日志符合规则的包,以ASCII形式保存在有层次的目录结构中。

编写snort 规则

snort使用一种简单的,轻量级的规则描述语言,这种语言灵活而强大。在开发snort规则时要记住几个简单的原则。

第一,大多数snort规则都写在一个单行上,或者在多行之间的行尾用/分隔。Snort规则被分成两个逻辑部分:规则头和规则选项。规则头包含规则的动作,协议,源和目标ip地址与网络掩码,以及源和目标端口信息;规则选项部分包含报警消息内容和要检查的包的具体部分。
下面是一个规则范例:

    alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";)

规则动作 协议 源ip 地址 源端口号 -> 目标ip地址 目标端口号 (规则选项)

第一个括号前的部分是规则头(rule header),包含的括号内的部分是规则选项(rule options)。规则选项部分中冒号前的单词称为选项关键字(option keywords)。注意,不是所有规则都必须包含规则选项部分,选项部分只是为了使对要收集或报警,或丢弃的包的定义更加严格。组成一个规则的所有元素对于指定的要采取的行动都必须是真的。当多个元素放在一起时,可以认为它们组成了一个逻辑与(AND)语句。同时,snort规则库文件中的不同规则可以认为组成了一个大的逻辑或(OR)语句。

规则动作:

规则的头包含了定义一个包的who,where和what信息,以及当满足规则定义的所有属性的包出现时要采取的行动。规则的第一项是"规则动作"(rule action),"规则动作"告诉snort在发现匹配规则的包时要干什么。在snort中有五种动作:alert、log、pass、activate和dynamic.

1、Alert-使用选择的报警方法生成一个警报,然后记录(log)这个包。
2、Log-记录这个包。
3、Pass-丢弃(忽略)这个包。
4、activate-报警并且激活另一条dynamic规则。
5、dynamic-保持空闲直到被一条activate规则激活,被激活后就作为一条log规则执行。
你可以定义你自己的规则类型并且附加一条或者更多的输出模块给它,然后你就可以使用这些规则类型作为snort规则的一个动作。

协议

规则的下一部分是协议。Snort当前分析可疑包的ip协议有四种:tcp 、udp、icmp和ip。将来可能会更多,例如ARP、IGRP、GRE、OSPF、RIP、IPX等。

Ip地址

规则头的下一个部分处理一个给定规则的ip地址和端口号信息。关键字"any"可以被用来定义任何地址。Snort没有提供根据ip地址查询域名的机制。地址就是由直接的数字型ip地址和一个cidr块组成的。Cidr块指示作用在规则地址和需要检查的进入的任何包的网络掩码。/24表示c类网络, /16表示b类网络,/32表示一个特定的机器的地址。例如,192.168.1.0/24代表从192.168.1.1到192.168.1.255的地址块。在这个地址范围的任何地址都匹配使用这个192.168.1.0/24标志的规则。这种记法给我们提供了一个很好的方法来表示一个很大的地址空间。

有一个操作符可以应用在ip地址上,它是否定运算符(negation operator)。这个操作符告诉snort匹配除了列出的ip地址以外的所有ip地址。否定操作符用"!"表示。下面这条规则对任何来自本地网络以外的流都进行报警。

alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content: "|00 01 86 a5|"; msg: "external mountd access";)

这个规则的ip地址代表"任何源ip地址不是来自内部网络而目标地址是内部网络的tcp包"。
你也可以指定ip地址列表,一个ip地址列表由逗号分割的ip地址和CIDR块组成,并且要放在方括号内“[”,“]”。此时,ip列表可以不包含空格在ip地址之间。下面是一个包含ip地址列表的规则的例子。

alert tcp ![192.168.1.0/24,10.1.1.0/24] any -> [192.168.1.0/24,10.1.1.0/24] 111 (content: "|00 01 86 a5|"; msg: "external mountd access";)

端口号

端口号可以用几种方法表示,包括"any"端口、静态端口定义、范围、以及通过否定操作符。"any"端口是一个通配符,表示任何端口。静态端口定义表示一个单个端口号,例如111表示portmapper,23表示telnet,80表示http等等。端口范围用范围操作符":"表示。范围操作符可以有数种使用方法,如下所示:

log udp any any -> 192.168.1.0/24 1:1024
记录来自任何端口的,目标端口范围在1到1024的udp流

log tcp any any -> 192.168.1.0/24 :6000
记录来自任何端口,目标端口小于等于6000的tcp流

log tcp any :1024 -> 192.168.1.0/24 500:
记录来自任何小于等于1024的特权端口,目标端口大于等于500的tcp流

端口否定操作符用"!"表示。它可以用于任何规则类型(除了any,这表示没有,呵呵)。例如,由于某个古怪的原因你需要记录除x windows端口以外的所有一切,你可以使用类似下面的规则:
log tcp any any -> 192.168.1.0/24 !6000:6010

方向操作符

方向操作符"->"表示规则所施加的流的方向。方向操作符左边的ip地址和端口号被认为是流来自的源主机,方向操作符右边的ip地址和端口信息是目标主机,还有一个双向操作符"<>"。它告诉snort把地址/端口号对既作为源,又作为目标来考虑。这对于记录/分析双向对话很方便,例如telnet或者pop3会话。用来记录一个telnet会话的两侧的流的范例如下:

log !192.168.1.0/24 any <> 192.168.1.0/24 23

Activate 和 dynamic 规则:

注:Activate 和 dynamic 规则将被tagging 所代替。在snort的将来版本,Activate 和 dynamic 规则将完全被功能增强的tagging所代替。

Activate 和 dynamic 规则对给了snort更强大的能力。你现在可以用一条规则来激活另一条规则,当这条规则适用于一些数据包时。在一些情况下这是非常有用的,例如你想设置一条规则:当一条规则结束后来完成记录。Activate规则除了包含一个选择域:activates外就和一条alert规则一样。Dynamic规则除了包含一个不同的选择域:activated_by 外就和log规则一样,dynamic规则还包含一个count域。

Actevate规则除了类似一条alert规则外,当一个特定的网络事件发生时还能告诉snort加载一条规则。Dynamic规则和log规则类似,但它是当一个activate规则发生后被动态加载的。把他们放在一起如下图所示:

activate tcp !$HOME_NET any -> $HOME_NET 143 (flags: PA; content: "|E8C0FFFFFF|/bin"; activates: 1; msg: "IMAP buffer overflow!";)
dynamic tcp !$HOME_NET any -> $HOME_NET 143 (activated_by: 1; count: 50;)

需要的软包如下:

adodb514.zip 数据库优化

base-1.4.5.tar.gz ***检测的显示页面

snort-2.8.0.1-1.RH5.i386.rpm snort主程序

snort-mysql-2.8.0.1-1.RH5.i386.rpm 将数据放到mysql数据库中,用于监测

snortrules-snapshot-2.8.tar.gz ***规则库

安装snort主程序

[root@localhost ~]# rpm -ivh snort-2.8.0.1-1.RH5.i386.rpm

配置文件,include 包含的文件.rules 都为规则文件。

[root@localhost ~]# vim /etc/snort/snort.conf

include $RULE_PATH/local.rules

916 include $RULE_PATH/bad-traffic.rules

917 include $RULE_PATH/exploit.rules

918 include $RULE_PATH/scan.rules

919 include $RULE_PATH/finger.rules

920 include $RULE_PATH/ftp.rules

921 include $RULE_PATH/telnet.rules

922 include $RULE_PATH/rpc.rules

923 include $RULE_PATH/rservices.rules

# yum install php php-gd php-mysql php-pear mysql-server httpd libpcap

php-gd :绘图软件

php-pear:数据存储

libpcap:抓包

启动httpd mysqld ,设置为开机自启动,并为mysql设置管理密码

[root@localhost ~]# service httpd start

[root@localhost ~]# service mysqld start

[root@localhost ~]# chkconfig --level 2345 httpd on

[root@localhost ~]# chkconfig --level 2345 mysqld on

[root@localhost ~]# mysqladmin -u root -p password '123'

创建数据库snort

[root@localhost ~]# mysql -u root -p

mysql> create database snort;

将模版表格导入数据库

mysql> use snort

Database changed

mysql> source /usr/share/snort-2.8.0.1/schemas/create_mysql

/etc/snort/rules 用来存放规则文件,但是默认为空,此时只能使用snort的嗅探器和数据包记录器,不能使用***检测系统模式

snortrules-snapshot-2.8.tar.gz 为规则文件,将其解压到/etc/snort下即可,他将自动进入了rule目录

[root@localhost ~]# tar -zxvf snortrules-snapshot-2.8.tar.gz -C /etc/snort/

此时rules下将有很多规则文件

clip_p_w_picpath010

base文件为显示***的一个页面,可以做成物理目录

将base压缩包解压到物理目录下

[root@localhost ~]# tar -zxvf base-1.4.5.tar.gz -C /var/www/html/

[root@localhost html]# mv base-1.4.5/ base

为base目录添加other 用户的w权限

[root@localhost ~]# chmod o+w /var/www/html/base/

修改base内的符号链接

[root@localhost ~]# ln -s /etc/snort/doc/signatures/ /var/www/html/base/signatures

adodb514.zip 包为数据库优化包

[root@localhost ~]# unzip adodb514.zip

[root@localhost ~]# mv adodb5 /var/www/html/adodb

升级软件pear(需要网络的联通)

#pear install --force PEAR-1.8.1]

更新该软件

#pear upgrade pear

安装pear的插件

pear install Image_Graph-alpha Image_Canvas-alpha Image_Color Number_Roman Mail_Mime Mail

[root@localhost base]# cd /var/www/html/base/

[root@localhost base]# cp world_map6.png world_map6.txt /usr/share/pear/Image/Graph/Images/Maps

此时可以访问网页

http://192.168.101.199/base/,提示php的日志级别太高,可以修改php.ini文件的 'error_reporting' 'E_ALL & ~E_NOTICE'

[root@localhost ~]# vim /etc/php.ini

禁用第360行 error_reporting = E_ALL,开启第348行 error_reporting = E_ALL & ~E_NOTICE

clip_p_w_picpath012

重新启动httpd访问

[root@localhost ~]# service httpd restart

clip_p_w_picpath014

选择 安装语言,并指明adodb的位置

clip_p_w_picpath016

clip_p_w_picpath017

输入管理员用户名和密码

clip_p_w_picpath019

clip_p_w_picpath021

clip_p_w_picpath021[1]

安装完成后,出现监测页面,如果此时ping该主机,数据将不会出现任何变化

clip_p_w_picpath023

这是因为base是从mysql数据库中读取的数据,但是snort并没有将截获的数据写入mysql数据库。修改snort的配置文件,指明将数据存放到哪个数据库。

[root@localhost ~]# vim /etc/snort/snort.conf

在793行处指明将数据输出选项

修改用户名、密码、dbname等数据

793 output database: log, mysql, user=root password=123 dbname=snort host=localhost

按照snort.conf中的***规则来检测数据。并将数据存放到数据库中

[root@localhost ~]# snort -dev -c /etc/snort/snort.conf

出现错误,这个snort的版本没有编译包含mysql的支持

clip_p_w_picpath025

此时需要snort和mysql的连接器件snort-mysql

[root@localhost ~]# rpm -ivh snort-mysql-2.8.0.1-1.RH5.i386.rpm

然后再次收集数据到数据库,base将会读取到很多数据。由于snort要将实时数据保存到数据库以便基本安全分析引擎(base)读取到数据库中的数据,所以snort -dev -c /etc/snort/snort.conf 要一直运行着

[root@localhost ~]# snort -dev -c /etc/snort/snort.conf

clip_p_w_picpath027