snort安装配置与使用(2)

技术分享 Story 78浏览 0评论

snort安装配置与使用(2)

Snort的使用

一、命令行参数

Snort 的命令行参数很多,可以使用snort -?命令列出这些参数及其简单的解释,详细的解释可以使用man snort 命令查看帮助页。这里只罗列几个重要的参数:

 -c <cf>:使用配置文件<cf>

 -d:显示应用层数据。

 -D:以守护进程形式(Daemon)运行。

 -h <hn>:设置"home network"<hn>

 -i <if>:在网络接口<if>上监听。

 -l <ld>:将日志文件放到目录<ld>中。

 -?:显示snort 的简要使用说明,然后退出。

二、Snort 的规则

Snort 的规则在逻辑上分成两部分:规则头和规则选项。规则头定义了规则的行为、所匹配网络报文的协议、源地址、目标地址机器网络掩码、源端口和目标端口等信息;规则选项部分则包含了所要显示给用户查看的警告信息以及用来判定此报文是否为攻击报文的其他信息。规则分类存放在规则文件中,规则文件是普通的文本文件,默认的规则命名方式是

"类名.rules"/etc/snort/snort.conf 也是规则文件。

shell 脚本文件一样,规则文件中也是以"#"引导注释。Snort 允许定义变量,格式为:var : <name> <value>,在规则中可以使用$<name>,需要时变量名解释器会使用<value>替代$<name>,如:

var MY_NET [192.168.1.0/24, 10.1.1.0/24]

alert tcp any any -> $MY_NET any (flags: S; msg: "SYN packet";)

另外,在规则文件中允许使用关键字include,其工作方式与C 语言的"#include"类似,其作用是将规则文件引入其他的规则文件,并放到当前位置,具体语法为:

include : <include file path/name>

1. 规则头

规则头包含一个报文关键的地址信息、协议信息以及当报文符合此规则时各元素应该采取的行动。规则头的第一个字段是规则行为,snort 共定义了五种可选的行为:alertlogpassactivatedynamic,其语义定义如下,具体使用方法请用man snort 命令参阅snort 使用手册:

 alert:使用设定的警告方法生成警告信息,并记录这个报文。

 log:使用射雕的记录方法记录这个报文。

 pass:忽略这个报文。

 activate:进行alert,然后激活另一个dynamic 规则。

 dynamic:等待被一个activate 规则激活,然后进行log

规则头的下一个域是协议字段,当前snort 支持三种IP 上的协议——TCPUDP ICMP,这个字段中可能的值包括tcpudp icmp

规则头的下一部分是描述规则的IP 地址和端口信息,关键字any 用来定义任意IP 地址或任意端口号。IP 地址的指定如192.168.3.0/24 所示,表示一个从192.168.3.1 192.168.3.255IP 地址范围,如果网络有多个网段组成,则可以写出[10.1.1.0/24192.168.1.0/24]的形式。

负操作符"!"可以应用到IP 地址列表,表示除了此IP 地址范围外所有的地址。端口号部分可以使用关键字any 来说明任意端口,或者一个数字指定静态的端口,或者使用帽徽隔开的两个数字表示端口的范围,如1:1024 表示从1 1024 的端口,同样端口号也可以使用负操作符"!"

另外,还可以使用方向操作符来限制数据包的流向。"->"表示从左端流向右端的数据报文,"<-"则反之,而"<>"用来匹配双向的数据流。下面的规则记录以某个范围内的主机作为服务器的所有telnet 会话的双向数据流:

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

2. 规则选项

下面简单介绍几项规则头选项的含义,更详细的解释请查阅snort 手册。

 msg:打印一条警告信息到警告或日志中。

 ttl:检查IP 报文的TTL 域的值。

 itype:检查ICMP 协议的类型域的值

 session:对一个指定的会话记录其应用层数据。

 sid:用来唯一标识snort 的规则。

 rev:表示版本修订的次数,总是和sid 联合使用。

 classtype:制定这个攻击的类型,不同的类型有不同的级别,如attenpted-recon(表示可能存在信息泄漏),attempted-dos(拒绝服务攻击的企图)等。

 priority:指定此规则的严重级别。

下面举一个例子说明上述的snort 语法。

alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 23 any(msg : "External net attempt to access

internal telnet server";classtype: attempt-recon;)

上例描述了这样一个规则:当外部网络(!192.168.1.0/24)试图访问内部网络的telnet服务器(协议类型为TCP,端口号为23)时,打印警告信息"External net attempt to access internal telnet server"到警告或日志文件中,这个攻击类型为"可能存在信息泄漏"

三、利用snort 发现入侵企图

假设本机上开了apache server,但是该server只让本机使用,不允许从其他机器访问,从前面的实验原理中,我们已经得知,可以增加一条规则来发现这种异常的访问:alert tcp $EXTERNAL_NET any -> 127.0.0.1 80

下面根据上述原理进行如下实验:

1
编辑/etc/snort/rules/local.rules 文件,在文件的最后面添加如下规则:

alert tcp $EXTERNAL_NET any -> 127.0.0.1 80

2、运行snot 命令进行入侵检测:

$snort –c snort.conf –D

此时,运行ps –aux|grep snort 可看到snort 已经在后台运行:

$ps –aux|grep snort

3、让其他机器的同学试图通过80端口访问到机器上。

4、用snort用户登陆mysql察看snortdb库的signature表,可以看到连接请求已被记录下来。

mysql>select * from signature;

5、利用kill 命令杀死snort 进程。

$kill [snort_pid]

root@ubuntu:/home/jason# snort -c /etc/snort/snort.conf -D

root@ubuntu:/home/jason# mysql -usnort

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 23

Server version: 5.0.45-Debian_1ubuntu3-log Debian etch distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use snortdb

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select * from signature;

+--------+------------------------------+--------------+--------------+---------+---------+---------+

| sig_id | sig_name                     | sig_class_id | sig_priority | sig_rev | sig_sid | sig_gid |

+--------+------------------------------+--------------+--------------+---------+---------+---------+

|      3 | BAD-TRAFFIC IP Proto 103 PIM |            2 |            2 |       3 |    2189 |       1 |

+--------+------------------------------+--------------+--------------+---------+---------+---------+

1 row in set (0.00 sec)

下面是演示示例的截图


四、使用web服务器和mysql数据库配合acid提高snort使用效率

实际上前面的使用方式并不简便,可以通过使用phpMyAdmin以及acid来更加直观和方便的管理snort及日志数据库。phpMyAdmin是一个基于webMySQL数据库管理工具。它能够创建和删除数据库,创建/删除/修改表格,删除/编辑/新增字段,执行SQL脚本等。ACID(Analysis Console for Incident Databases)snort使用的标准分析员控制台软件。它由CERT Coordination Center开发,是AIRCERT工程的一部分。ACID是一个基于PHP的分析引擎,它能够搜索、处理snort产生的数据库。下面是安装及配置过程。

1、安装phpmyadmin

下载最新版本的phpMyAdmin,解压后得到一个phpMyAdmin的目录(可以改名

找到目录里的config.inc.php文件,打开,确认并修改以下各项:

$cfg['blowfish_secret'] = '123456';(可以自定义)

$cfg['Servers'][$i]['auth_type'] = 'cookie';

$cfg['Servers'][$i]['host'] = 'localhost';

$cfg['Servers'][$i]['connect_type'] = 'tcp';

$cfg['Servers'][$i]['compress'] = false;

$cfg['Servers'][$i]['extension'] = 'mysql';

保存退出。

2、安装配置acid

下载相应的软件包,通过tooold搜索。

acid-0.9.6b23.tar.gz

jpgraph_1.13.tar.gz(下载地址http://www.aditus.nu/jpgraph/old_versions/jpgraph-1.13.tar.gz

libphp-adodb_4.96.orig.tar.gz

把它们放到网页根目录,进入目录分别解压,命令如下:

tar zxvf libphp-adodb_4.96.orig.tar.gz

tar zxvf jpgraph_1.13.tar.gz

mv jpgraph-1.13 jpgraph

tar zxvf acid-0.9.6b23.tar.gz

cd acid

vi acid_conf.php

"$DBlib_path = "";" 改成"$DBlib_path="/根目录/adodb""

$alert_dbname="snort_log";//改成snortdb

$alert_host="localhost";

$alert_port="";

$alert_user="root";

$alert_password="mypassword";//改成数据库密码

/*Archive DB connection parameters*/

$archive_dbname="snort_archive";//改成snortdb

$archive_host="localhost";

$archive_port="";

$archive_user="root";

$archive_password="mypassword";"//改成数据库密码

"$ChartLib_path="";"改成"$ChartLib_path="/根目录/jpgraph/src";"

修改完毕后,保存退出。

3、进入web界面访问acid检测snort的记录:

http://127.0.0.1/acid/acid_main.php,点"Setup Page"链接 ->;Create Acid AG

访问http://127.0.0.1/acid/acid_main.php将会看到ACID界面

如下图所示:


现在运行snort

#snort -c /etc/snort/snort.conf -D

然后让别的机器nmap扫描本机,可以看到snort已经记下了扫描信息。如下:


可以看出,来自202.38.75.45的数据包被记录下来,记录的4层协议为Raw IP,此即为nmap端口扫描所用的数据包类型(IP选项为空的IP)。而完成这些记录和告警的规则是snort自带的规则。使用acid甚至可以方便的看记录下来数据包的内容,见下图:


有了phpMyAdmin就可以方便的查看和管理mysql数据库。在上面的扫描攻击被检测出之后,我们可以登录phpMyAdmin的页面查看数据库中的记录。

打开http://127.0.0.1/phpMyAdmin/

输入数据库密码认证,选择snortdb数据库,可看到已经有的表项:


从左边列表选择signature表,看到如下记录:


点左上方的浏览,可以看到表的内容:


可以看到,已经记录下了符合默认规则的攻击信息:

在表acid_event中记录了攻击事件的详情,而在acid_ip_cache中记录了源IP地址。

/etc/snort/rules目录中,已经有大量的规则文件,以应对可能的安全攻击,列举如下:


snort就是根据这些规则文件进行入侵检测的,结果存入mysql数据库,通过acid方便的查看这些日志信息,以及时的了解系统网络的安全情况。在各个系统不同情况下,用户需要定制规则,甚至自己编写规则以满足实际入侵检测的需要。

五、获取Snort规则的四个途径

一旦安装、配置并开始使用Snort,接下来要考虑的是如何获得想要的规则。Snort规则定义了它要发现的网络中恶意通信的模式和标准。没有这些规则,Snort就是另一个嗅探器。有四个地方可以找到需要的Snort规则。

1、从Snort.org下载正式规则

Snort.org网站上的正式规则通过tarball快照http://www.snort.org/dl/rules/)或匿名CVShttp://cvs.snort.org/viewcvs.cgi/snort/rules/)提供。如果为运行的Snort引擎选择了正确的快照,正如下载页面上所说,这些规则保证可以工作。如果选择错了,Snort可能无法启动,改变使用的Snort版本(实际上,选择最新版本即可)并再试一次。正式规则中有一些遗留下来的规则不精确或没有文件说明,从Brian Caswell担任规则管理员后,规则开始精确并且有好的文件说明。强烈建议从这些规则开始并向这些规则学习。

2、订阅Snort-Sigs清单

订阅正式的Snort-Sigs邮件清单会通过Brian和其他专家提供"Snort规则的讨论和发展"。在http://www.snort.org/lists.html上获取订阅信息和网页存档。

3、使用Bleeding Snort规则

如果喜欢新生事务,使用Bleeding Snort规则会达到两个目标。第一,这个站点是最新试验规则和概念的交换所。这些规则可能有反作用,有时不像预期地那么有效,他们升级非常频繁。第二,他们的最终目标是产生许多可靠的、准确的规则,当它们最终被正式的Snort.org采用就会有长期价值。实际上Bleeding Snort规则是测试版规则,更适用于具备测试环境的机构。

4、定制和共享的规则

如果发现缺少什么,不要局限于编写规则。可以快速简便地将一些规则组合起来。还能通过Bleeding Snort规则或邮件清单再把他们贡献给Snort社团。这项工作会对有相似问题的人有帮助。

注意下载Snort规则的站点

最后,尽管互联网上有其他地方可以找到Snort规则,建议避免这样做,除非真正理解所做的。规则的语法已经可以为达成特定目标提供更好的方法,例如在许多情况下,用"已确定的"关键字代替查看TCP标识的老方法。在任意的站点上找到的McRule可能不能正常工作,为了安全应该避免这样做。

六、量身打造自己的Snort规则

Snort规则是有效、灵活、制订相对容易的。首先,从Snort.org网站上下载最新的规则,阅读修改并试用(当然是在实验环境里)。如果有的规则与预期不符,改变它。这里是修改的方法。

所有Snort规则遵循一个非常简单的格式,这值得研究。首先是关于SIDRec(修订)的注释。SIDSnort规则的ID(又叫做签名ID),Snort.orgSourcefire保留了所有小于一百万的数字用于官方规则。如果修改了一个规则,把SID加上一百万,这样可以与起源保持一致。如果创建了一个新规则,使用起始于九百万的SID。只要有改变或者规则变更控制结束就要增加revision

Snort.org规则与一个空的local.rules文件一起产生。不要使用它,以免下一次安装新规则时的习惯规则被这个空文件覆盖。创建一两个其他的文件,例如company_prod.rulescompany_test.rules,并在snort.conf文件中添加内容说明。可以在一个机器和接口上运行多于一个实例,这对测试规则有帮助,但是在一台老旧的PC和产品盒上同时运行测试更简单安全。

这是一个简单的Snort规则:

alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP PING NMAP"; dsize:0; itype:8; reference:arachnids,162; classtype:attempted-recon; sid:469; rev:3;)

这段代码的意思是,满足下列条件的ICMP包将被记录并发出警告:来自$EXTERNAL_NET的任意端口,发往$HOME_NET的任意端口,数据大小(dsize)是0ICMP类型(itype)是8(这是回应(request))。这个规则的使用可以检测出NMAP扫描工具所发出的ICMP PING扫描数据包。

上例不是一个非常好的规则。它产生了许多负面影响,因为它太宽松了。除NMAP之外的其它应用程序也会发送没有负荷的请求应答包,并且没有其他的标准使这个规则更严谨或更明确。

一个更好的例子是:

alert udp $EXTERNAL_NET any -> $SQL_SERVERS any (msg:"MS-SQL probe response overflow attempt"; content:"|05|"; depth:1; byte_test:2,>,512,1; content:"|3B|"; distance:0; isdataat:512,relative; content:!"|3B|"; within:512; reference:bugtraq,9407; reference:cve,2003-0903; reference:url,www.microsoft.com/technet/security/bulletin/MS04-003.mspx; classtype:attempted-user; sid:2329; rev:6;)

这个规则的作用是检测如下条件的udp数据包并告警:从$EXTERNAL_NET任意端口发往$SQL_SERVERS 任意端口,深度为1时搜索到净荷包含数据|05|,从净荷中偏移为1处搜索2个字节的值如果大于512,相对上次匹配偏移512字节搜索到净荷包含数据|3B|,确保存在512字节的净荷搜索不到数据|3B|。这个规则可以用于检测特定内容的发往SQL数据库服务器的udp数据包,符合特征的数据包可能存在攻击威胁。

 


转载请注明:成长的对话 » snort安装配置与使用(2)