6.1什么是ACID?
ACID包括一些PHP脚本和配置文件,它们可以收集和分析数据库中的信息并通过web页面表示。用户通过web浏览器与ACID交互。为使ACID能够使用,你的系统中需要web服务器,MySQL以及PHP,这些都随RedHat一起分发。ACID的最近版本可以在http://www.cer.org/kb/acid下载。
ACID具有很多特性:
可以进行基于多种条件的查询,如源和目的地址、端口,时间等等,如图6-7所示。
包头部及载荷内容的察看,如图6-6所示的ICMP包。
告警可以按产生类别管理,输出,删除,或发送到某个e-mail地址。
可以基于时间、协议、IP地址、段口号等产生可视化图表。
可以产生数据库的快照,例如察看最后24小时的告警,单独的告警以及某种频率的告警等等,如图6-7所示。
可以通过Internet的whois数据库察看IP地址的所有者,如果某个IP正在攻击你,你可以联系负责人以采取措施。
你可以通过URL来访问ACID,例如http://www.conformix.com/acid/,ACID需要GD库和PHPLOT的支持,它们是用来绘图的。PHP连接到MySQL后台数据库并取得及更新数据,因此,你需要提供数据库的用户名和密码。
为了更好的表述,我们现在来看看当某个人试图入侵时,系统会发生一些什么:
入侵者试图进入你的网络
Snort探测器根据规则检测到入侵行为,根据snort.conf的设置,将信息记录到MySQL数据库。
用户启动浏览器,连接到MySQL所在的web服务器,并请求PHP页面。
PHP引擎连接到数据库,并从数据库服务器获取信息。
Web服务器处理信息,并向浏览器发送页面,这样用户就可以看到入侵信息。
这时用户可以通过web页面对数据进行各种操作。本章的后面叙述这些工具的安装和配置。

6.2安装和配置
ACID需要PHPLOT,GD库才能正常工作。幸好,这些组件是相互独立的,你可以在安装的时候不需要考虑安装顺序。下面是安装步骤:
安装并测试Snort。
安装并测试MySQL,建立相关的数据库和表。
安装Apache。
http://www.cert.org/kb/acid下载ACID,并解压到/var/www/html目录,在这个目录中会产生一个名为acid的目录。/var/www/html目录是apache服务器用来存放页面的,根据版本的不同,这个目录也许会不同。
安装PHP,你可以在http://www.php.net下载或者用RedHat的RPM包安装。将/etc/php.ini中的display_errors变量值设为off,如果你用rpm安装的Apache,那么PHP可能已经作为模块安装好了。
http://www.boutell.com/gd/下载并安装GD库,也可以用RedHat的rpm包安装,它被安装为/usr/lib.libgd.so文件。
http://www.phplot.com下载PHPLOT并解压到/var/www/html目录,它用来在web页面中产生图形。
http://php.weblogs.com/adodb下载ADODB并安装到/var/www/html目录,ADODB是用PHP写的面向对象的库,用来连接数据库。可以参考http://php.weblogs.com/adodb.com/adodb_faq来获得更多信息。

现在我们详细叙述安装过程,我假定你已经作了以下的事情:
MySQL数据库服务器已被安装。
Snort已经安装完成并配置好与数据库的接口。
已经安装完成Apache,GD库和PHP。

现在我们就可以下载并安装下面的软件
下载ACID文件并放在/opt目录下。
下载ADODB文件并放在/opt目录下。
下载PHPLOT文件并放在/opt目录下。
切换当前目录到/var/www/html目录。
运行命令“tar zxvf /opt/acid-0.9.6b21.tar.gz.”,这样会创建/var/www/html/acid目录,并将ACID文件存放至此。
切换当前目录到/var/www/html/acid。
运行命令“tar zxvf /opt/adodb221.tgz”将ADODB文件释放到/var/www/html/acid/adodb目录中。
用命令“tar zxvf /opt/phplot-4.4.6.tar.gz”释放PHPLOT文件到目录/var/www/html/acid/phplot-4.4.6中。
在mysql客户端中用命令“create database snort_archive;”创建一个新的数据库,这个数据库被ACID用来存放就得数据。Snort本身并不需要它来存放数据。如果你不需要备份旧的数据,可以跳过这一步。
把刚才创建的数据库的管理权限赋予用户,例如rr,在客户端用命令: “grant CREATE,INSERT,DELETE,UPDATE,SELECT on snort_archive.* to rr@localhost;”。
用命令“mysql -u rr –p snort_archive <contrib/create_mysql”为数据库创建所用到的表。
将/etc/php.ini中的display_errors变量的值设为off。

现在要配置ACID使之能够与MySQL数据库交互,并使Snort能够使用PHPLOT软件包。我们需要修改配置文件acid_conf.php中的一些参数,这个文件在你释放ACID文件的目录,你需要做以下设置:
ADODB文件的位置在这里是./adodb,你可以根据自己的情况修改。
数据库服务器的类型,在这里是mysql。
MySQL记录Snort数据的数据库名。
MySQL数据库服务器名称或者IP地址。
MySQL数据库用户名和口令。
备份数据库的名称,如果你备份数据的话。
备份数据库的服务器主机名或者IP地址,在这里,是与snort数据库相同的,都是localhost。
PHPLOT文件的位置,在这里是./phplot-4.4.6。
这些信息在acid_conf.php文件的开始部分,下面是一个实例:
<?php
$ACID_VERSION = “0.9.6b21″;
/* Path to the DB abstraction library
* (Note: DO NOT include a trailing backslash after the
* directory)
* e.g. $foo = “/tmp” [OK]
* $foo = “/tmp/” [OK]
* $foo = “c:\tmp” [OK]
* $foo = “c:\tmp\” [WRONG]
*/
$DBlib_path = “./adodb”;
/* The type of underlying alert database
*
* MySQL : “mysql”
* PostgresSQL : “postgres”
* MS SQL Server : “mssql”
*/
$DBtype = “mysql”;
/* Alert DB connection parameters
* – $alert_dbname : MySQL database name of Snort
: alert DB
* – $alert_host : host on which the DB is stored
* – $alert_port : port on which to access the DB
* – $alert_user : login to the database with
: this user
* – $alert_password : password of the DB user
*
* This information can be gleaned from the Snort database
* output plugin configuration.
*/
$alert_dbname = “snort”;
$alert_host = “localhost”;
$alert_port = “”;
$alert_user = “rr”;
$alert_password = “rr78x”;
/* Archive DB connection parameters */
$archive_dbname = “snort_archive”;
$archive_host = “localhost”;
$archive_port = “”;
$archive_user = “rr”;
$archive_password = “rr78x”;
/* Type of DB connection to use
* 1 : use a persistant connection (pconnect)
* 2 : use a normal connection (connect)
*/
$db_connect_method = 1;
/* Path to the graphing library
* (Note: DO NOT include a trailing backslash after the
directory)
*/
$ChartLib_path = “./phplot-4.4.6″;
在这里,我们设置的用户名、口令和数据库名和在snort.conf中是相同的,下面是对配置文件的解释:
下面的一行用来设置ADODB文件的路径:
$DBlib_path = “./adodb”;
下面的一行用来设置数据库的类型:
$DBtype = “mysql”;
下面的几行用来设置Snort的主数据库信息:
$alert_dbname = “snort”;
$alert_host = “localhost”;
$alert_port = “”;
$alert_user = “rr”;
$alert_password = “rr78x”;
下面的几行用来设置Snort备份数据库信息:
$alert_dbname = “snort_archive”;
$alert_host = “localhost”;
$alert_port = “”;
$alert_user = “rr”;
$alert_password = “rr78x”;
下面的一行用来这是PHPLOT文件的路径:
$ChartLib_path = “./phplot-4.4.6″;
配置完成后,你就可以用web界面访问ACID了。

6.3使用ACID
完成前面的工作后,你可以用URL来访问ACID了: http://<你的web服务器>/acid/。例如,我的web服务器的地址是192.168.1.2,因此,我就用http://192.168.1.2/acid/
第一次访问的时候,你还需要通过web界面做一些设置,如图6-1所示。
在这个窗口,点击Setup页面连接,页面就会转到DB设置页面,如图6-2所示。
在这个页面,点击“Create ACID AG”连接,ACID就会在snort数据库中创建一些自己所需要的表,以支持Snort。图6-3显示了创建新表的结果。
在图6-3所示的页面,你可以点击“Main Page”到主页面。
6-1,6-2,6-3页面在你下一次使用ACID的时候就不会出现了。
6.3.1ACID主页面
ACID主页面显示当前数据的概要。它用不同的部分分组显示信息。你可以看到各个协议的流量概况,取得某个Snort感应器的快照信息,搜索数据等等,如图6-4所示。

点击图6-4上面的连接,你可以看到大量的信息。

向数据库记录数据的探测器列表。
告警的数量及详细信息。
所捕获的包的源地址,你可以从中察看谁在试图攻击你的网络。你也可以通过相关连接来察看whois数据库。
所捕获的包的目的地址。
源和目的端口。
与特定协议相关的告警,如TCP、UDP、ICMP告警。
查找特定类型的告警和日志条目。
频率最高的告警。
告警数据的图表,目前这个功能还在实验中。

在下面的屏幕截图中你可以了解一些重要的信息,但通过实践你可以了解,ACID能够提供给你更多的有用信息。
6.3.1协议相关数据列表
在主页面,你可以点击一个协议来取得所记录的关于这个协议的包的信息。图6-5显示的是关于ICMP协议信息的屏幕截图。在屏幕的下面,你可以看到15个包的信息被记录到数据库。你可以点击其中任意一个来获得关于这个包的详细信息。
6.3.3告警信息细节
图6 -6显示了某个你在图6-5看到的ICMP包的细节,其中包含很多部分,每部分显示了数据包的一个层面,最上面的部分是关于这个告警的总体信息。IP部分 显示了IP头部的所有部分,ICMP头部显示了ICMP数据,接着是载荷。载荷同时以16进制和ASCII码形式表示。
6.3.4 查询
ACID的一个重要特性是可以用一些参数来查询日志和告警,例如:
某个探测器
开始和结束的时间
源和目的地址
IP头部的不同字段
传输层协议
IP包载荷中的字符

如图6-7,执行查询是非常简单的,你只要点击“Query DB”就可以显示所查询的数据。
例如,如果你想在所有的告警信息中查询包含字符“ATTACK RESPONSE”的包,你可以像图6-8那样填充信息。
查询结果如6-9所示。
6.3.查询whois数据库
你可以点击任何一个IP地址并选择某个whois数据库来查询whois信息,例如你可以通过位于http://www.arin.net的ARIN,例如图6-11所示的66.236.16.52的查询结果。
在处理网络安全问题的时候,这种信息是非常有用的,往往在发生相关问题的第一步,你要查询入侵者是谁,这种信息会给你一些有用的帮助。
6.3.6产生图表
ACID的绘图功能仍然在实验中,ACID提供一个连接用来产生图表,你需要选择数据和图表类型。例如,你可以产生最近5天的告警的线图或者直方图,图6-12是一个实例。
PHPLOT被用来在后台产生图表,你也可以用其他如JPRAPH来代替它。
6.3.7Snort数据库存档
数据库snort_archive用来从主数据库存档数据,利用ACID,你可以将告警从主数据库复制或者移动到存档数据库。
你可以选择将整个关于数据库的查询存档或者存档某些查询。
6.3.8ACID的表
当你第一次运行ACID的时候,它在Snort数据库中创建了一些自己的表,这些表用作ACID的管理功能。
下面是运行ACID前后MySQL的snort数据库中表的对比:
之前:
mysql> show tables;
+——————+
| Tables_in_snort |
+——————+
| data |
| detail |
| encoding |
| event |
| flags |
| icmphdr |
| iphdr |
| opt |
| protocols |
| reference |
| reference_system |
| schema |
| sensor |
| services |
| sig_class |
| sig_reference |
| signature |
| tcphdr |
| udphdr |
+——————+
19 rows in set (0.01 sec)
mysql>

之后:
mysql> show tables;
+——————+
| Tables_in_snort |
+——————+
| acid_ag |
| acid_ag_alert |
| acid_event |
| acid_ip_cache |
| data |
| detail |
| encoding |
| event |
| flags |
| icmphdr |
| iphdr |
| opt |
| protocols |
| reference |
| reference_system |
| schema |
| sensor |
| services |
| sig_class |
| sig_reference |
| signature |
| tcphdr |
| udphdr |
+——————+
23 rows in set (0.00 sec)
mysql>
前面4个表是ACID新建立的。

6.4SnortSnarf
SnortSnarf是另外一个用web界面来显示Snort数据的工具。你可以在http://www.silicondefense.com/software/snortsnarf/index.htm找 到这个软件。它基本上是一个Perl脚本,你可以下载后直接运行,不需要任何的编译过程。它也可以从MySQL数据库提取并分析Snort数据。下面的命 令可以从/var/log/snort/alert文件中分析数据,并在/var/www/html/snortsnarf目录中生成新的网页,你可以通 过web浏览器来察看。
snortsnarf.pl /var/log/snort/alert -d /var/www/html/snortsnarf
下面的命令从localhost上的MySQL数据库提取数据,它用到了前面我们设置的用户名和口令。
snortsnarf.pl rr:rr78x@snort@localhost -d /var/www/html/snortsnarf
你可以用cron来使SnortSnarf定期运行,图6-15显示了SnortSnarf产生的主页面,它提供了告警信息的基本情况。
图6-16是关于某个告警的信息,你可以点击6-15所示的告警条目来得到这样的信息。
图6-17是whois查询的屏幕截图。

7第七章 其他一些工具
本章将介绍其他一些工具,并试图让你了解如何使系统更加安全。下面我们来介绍这些工具。

IDS Manager是基于Windows图形界面的Snort规则和配置管理工具,通过它你可以:

从一个正在工作的Snort探测器上下载当前的配置文件snort.conf和规则。
修改配置文件和规则。
将配置文件和规则上载到探测器上。

用IDS Manager你可以管理多个探测器,唯一要注意的事,你需要在Snort探测器上运行SSH服务器。

SnortSam是另外一个工具,它可以将Snort与防火墙整合在一起,通过它和Snort一起工作,你可以修改防火墙的设置。但是这个功能仍有很多争论,因为它可能会使防火墙遭受Dos攻击。

本章的另外一个论题是安装ACID的web服务器的安全性,到现在为止,我们还没有涉及到如何加强这个服务器的安全性,任何人都可以访问ACID控制台并删除Snort所收集的信息,我们稍后会解决这个问题。

7.1 SnrotSam
SnortSam可以使Snort与最常见的一些防火墙协同工作,提供防火墙/IDS整合解决方案。在IDS探测到入侵的时候,它可以设置防火墙来阻止恶意的数据或者IP地址。在http://www.snortsam.net/你可以得到最近的信息。这个工具包括两个部分:
一个安装到Snort探测器上的Snort输出插件。
一个安装到靠近防火墙或防火墙本身所在的机器上的代理。Snort通过安全连接与这个代理通讯。
到目前为止,这个工具支持以下的防火墙:
• 基于 IP filter的防火墙
• Checkpoint Firewall-1
• Cisco PIX
• Netscreen

它的输出插件需要与Snort一起编译,它会提供一些新的关键字,可以用来控制防火墙的行为。
在一个用CheckPiont防火墙的典 型方案中,你可以在防火墙本身运行SnortSam代理。如图7-1所示,一个Snort探测器正在控制两个CheckPoint防火墙。 CheckPoint防火墙可以运行在Linux、Windows和其他一些它所支持的Unix系统上。
如果你的防火墙并非CheckPoint这样的软件防火墙,你可以在靠近防火墙的机器上运行代理,为这个代理安装某种插件来控制一种特定的防火墙。例如,如果你需要控制Cisco路由器的访问列表,你可以在SnortSam网站上下载相关的插件。参见图7-2。
关于SnortSam的文档、示例以及如何安装的信息可以在它的网站找到。但是请注意如果配置不当,用这样的工具可能会导致DoS攻击,例如,某人发送构造特殊的信息,可能会使防火墙阻止合法的服务器的通讯,比如你的DNS服务器等。
7.2 IDS Policy Manager
IDS Policy Manager是基于Windows图形界面的工具它可以用来管理Snort配置文件和规则。你可以在http:// activeworx.com/idspm/下载。启动这个软件,你可以看到图7-3所示的窗口。
开始的时候,这个窗口是空白的,下面有3个标签,分别是:

“Sensor Manager”标签页,显示你用这个工具所管理的探测器。开始的时候,列表中没有,因为你并没有添加任何探测器。启动的时候,这个页面是默认页面。
“Policy Manager”标签页,显示所配置的策略。策略包括snort.conf参数和关于这个策略的规则列表。
“Logging”标签页显示日志信息

点击标签可以切换到相应的标签页。你可以点击Sensor菜单并选择“Add Sensor”来添加探测器,会出现一个如图7-4所示的弹出窗口,在这里你可以填充关于探测器的信息。

你需要输入下面的信息
探测器的名称,你可以填写你所需要的名字以方便管理
探测器的IP地址
IDS System文本框用来指定Snort的版本,因为Snort不同的版本的参数和插件以及关键字有一点不同,因此这个信息的正确性也是比较重要的。
“Upload Information”包括一些和探测器之间传输文件的参数。
SCP方式是登录探测器上的SSH服务器。“Upload Directory”指定Snort探测器上的snort.conf的位置。

在输入这些信息以后点击OK就添加了一个探测器。后面的第一项任务就是从你刚才添加的探测器上面下载策略。在Sensor菜单中选择 Download Policy from Sensor来实现这个目的。下载完成后,点击窗口下方的Policy Manager标签,你可以看到当前的策略的列表并在这里编辑策略,双击策略名字,就出现一个策略编辑窗口,如图7-5所示。

7.3加强ACID web控制台的安全性
第6章中,我们提到ACID还有一些安全问题,如果不采取相应的措施,那么可能任何人都能修改ACID所访问的数据库。
在ACID的配置文件acid_conf.php中,用户名和口令都已经经过高强度加密,所以任何访问ACID网页的人都无从知道数据库的用户名和口令。
我们有一些方法能使ACID得到安全的应用。
7.3.1 采用专用网络
防止ACID被任意访问的其中一个方法就是将IDS系统以及数据库放在一个专用网络中,并分配私网IP地址,这样它们对Internet是不可访问的。 但是这种方案仍然有些问题,就是内部网络用户可以任意的访问ACID并修改信息。
7.3.2 在防火墙上阻止外部对Web服务器的访问
另外一个方法就是阻止Internet用户对ACID的web服务器的访问,同上个方案一样,这个方案使系统容易受到内部的攻击。
7.3.3 iptables
另外一个方法就是用iptables使web服务器只供管理人员访问。这是最安全的方案之一,不仅可以阻止外来攻击,也可以防止内部的攻击。
例如,如果网络管理员的机器的IP地址是192.168.1.100,我们可以增加这样一条Iptables规则:
iptables -A INPUT -s ! 192.168.1.100 -j DROP
这样就会阻止所有不是来自192.168.1.100的连接。

4.1预处理器
当Snort接收到数据包的时候,主探测引擎并不能对它们进行处理和应用规则,比如,数据包有可能是分片的,需要重新组 装,预处理器就是做这样的工作,使数据能够被探测引擎处理,另外,一些预处理器还可以做一些其它工作,比如探测包中的一些明显错误。下面给你介绍预处理器 如何工作。
在安装过程中,你可以在编译的时候选择对各种预处理器的支持。各种预处理器的配置参数在snort.conf中调整,你可以在通过这个文件打开或者关闭某个预处理器。
捕获的包要经过所有已经打开的预处理器,不能跳过,因此如果你如果打开了大量的预处理器,就会降低Snort的运行速度。
在snort.conf中,你可以用preprocessor关键字打开预处理器,格式如下:
preprocessor <name of preprocessor>[: parameters]
后面的参数通常是可选项。
你也可以编写自己的预处理器,察看Snort源代码doc目录中的README.PLUGIN文件,你可以获得相关的资料,也可以在templates目录中查看源代码示例。
4.1.1HTTP解码
Snort可以对HTTP协议各种形式的编码进行解码,并从中找出已知的攻击特征。你可以将HTTP服务器的端口列表作为HTTP解码预处理器的参数。例如下面的命令可以对在80,8080和443端口的HTTP相关数据包进行解码,以便探测引擎处理:
preprocessor http_decode: 80 8080 443
尤其重要的是,如我们前面所提到的,关于HTTP的攻击也常用各种变换形式,如果应用HTTP解码预处理器,就可以更有效的探测到这些企图。

4.1.2端口扫描
端口扫描是用来发现网络上主机开放的端口的方法。任何入侵者的第一个行动通常都是找出网络上在运行一些什么样的服 务。一旦入侵者找到了这样的信息,就可以尝试针对相关服务弱点的攻击了。端口扫描预处理器的作用是监测端口扫描的活动,这种预处理器可以将端口扫描行为记 录到指定的位置或者标准的日志。黑客们使用很多种扫描方式,你也可以查看nmap的文档来获得更多的信息。
下面是在snort.conf中应用端口扫描预处理器的大体格式:
preprocessor portscan: <address> <ports> <time period> <file>
这个预处理器有4个相关的参数
所监控的地址范围,采用CIDR规格。
在一个时间段内访问的端口数目,例如这个参数取5表示在一个时间段内,如果超过5个端口被扫描,则产生告警。
时间段,用来配合上个参数的门限时间范围,用秒表示。
记录日志的文件路径。

下面是个配置实例,用来监测针对网络192.168.1.0/24的端口扫描,并将日志记录到/var/log/snort/portscan.log文件中。
preprocessor portscan: 192.168.1.0/24 5 10 \
/var/log/snort/portscan.log

端口扫描活动是针对TCP和UDP端口的。端口扫描预处理器可以监测正常端口和隐秘端口的扫描。针对隐秘端口的扫描,可以查看nmap的相关文档或网站。端口扫描的主要方法如下:

TCP端口连接扫描。这种方式试图对某个端口进行标准的TCP连接,如果连接建立,则表示这个端口是打开的。

SYN扫描。入侵者发送一个带有SYN标志的TCP包到某个端口,如果收到了带有SYN和ACK标志的回应,那么这个端口是打开的,如果收到了带有RST标志的包,这个端口就是关闭的。

NULL端口扫描,FIN端口扫描,XMAS端口扫描,这是几个比较类似的扫描方式。入侵者发送一个TCP包出去,如果收到带有RST标志的包,表示端口是关闭的,如果什么包也没有收到,就有端口打开的可能性。

还有一种预处理器,可以和这种预处理器一同工作,它叫做端口扫描忽略预处理器,用来忽略针对某些主机的扫描行为,用法如下例所示:

preprocessor portscan-ignorehosts: 192.168.1.10/32 \
192.168.1.13/32

4.1.3 frag2模块
这个预处理器用来组装包的分片,老版本的Snort用defrag。
应用frag2的时候,你可以配置组装分片的超时和内存上限。默认情况下是4M的内存和60秒的超时界限。如果在这个时间段内没有完成,就把包丢弃。下面的命令用默认参数打开frag2:
preprocessor frag2
下面的命令将frag2配置为2M的内存上限和30秒的超时。
在一个高速的网络中,你应该用更多的内存上限。

4.1.4 stream4模块

这个模块用来代替老版本的Stream模块,它有两个基本功能:
Tcp数据流的组装
状态监测

为了使Stream4正常工作,你必须在snort.conf中配置两个预处理器,分别是“stream4”和“stream4_reassemble.”它们都有很多的参数,如果你不配置这些参数,系统就会采用默认值。Stream4预处理器的大体格式如下:
preprocessor stream4: [noinspect], [keepstats], \
[timeout <seconds>], [memcap <bytes>], [detect_scan], \
[detect_state]

下面是关于各个参数的描述和默认值

参数 表述 默认值
Noinspect 关闭状态监测 ACTIVE
Keepstats 将会话概要记录到session.log文件中 INACTIVE
Timeout 保持一个活动会话的超时 30秒
Memcap 这个模块利用的最大内存 8MB
Detect_scan 监测端口扫描活动 INACTIVE
Detect_state_problems 监测TCP流相关的各种问题 INACTIVE
下面是stream4_reassemble预处理器的主要格式:
preprocessor stream4_reassemble: [clientonly],
[serveronly],[noalerts],[ports<portlist>]
下面是这个预处理器的主要参数的描述

参数 表述
Clientonly 仅仅组装客户端的数据流
Severonly 仅仅组装服务器端的数据流
Noalerts 在遇到逃避和嵌入式攻击时不告警
Ports 组装关于特定端口的数据流的端口列表,用空格分隔,all表示端口21,23,25,53,80,110,111,143和513。指定少数的端口可以节省CPU时间。
4.1.5 spade模块
SPADE是统计包异常探测引擎的缩写,你可以在http://www.silicondefense.com/software/spice/index.htm看到相关信息。它被用来在IP包中探测异常情况。这个预处理器有很多相关的关键字,在snort.conf模板中可以找到相关的描述。SPADE保存历史数据的记录,并用门限值来报告异常情况。
要记住SPADE对系统的要求比较高,尤其是在高负荷的网络上,因此要小心使用。
4.1.6 ARP欺骗
ARP用来获得某个IP地址相关的MAC地址。
ARP协议也被很多人用来攻击,探测和欺骗。ARP欺骗可以将到某个主机的通信重定向到别的地方。
Arpspoof预处理器用来探测ARP包中的异常,它可以做以下的事情:
对于所有的ARP请求,如果源MAC地址与发送者的MAC地址不同,就产生告警。
对于APR回应包,如果源MAC地址与发送者的MAC地址不同,或目的MAC地址与接收者的MAC地址不同,就会产生告警。
对于单播ARP请求,若目的MAC不是广播地址(FF:FF:FF:FF:FF:FF),就产生告警。为了实现这个功能,你需要在snort.conf中加入这样一行:as “preprocessor arpspoof: -unicast”。
你可以在Snort内部缓存中预先存放MAC-IP映射对,如果遇到不匹配,系统就会产生告警。
下面的一行添加一个IP-MAC对,可以用来探测ARP欺骗的企图。
preprocessor arpspoof_detect_host: 192.168.1.13 \
34:45:fd:3e:a2:01

4.2输出模块

输出模块用来控制Snort探测引擎的输出,你可以将输出的信息送到各种目标。比如:
数据库
SMB弹出窗口
系统日志
XML或者CSV文件。

在snort.conf中配置输出模块的命令大体如下所示:
output <module_name>[: arguments]
比如你希望将信息记录到名为snort的MySQL数据库,可以采用如下的配置:
output database: log, mysql, user=rr password=rr \
dbname=snort host=localhost
一旦你在配置输出模块加入上面着一行,所有的告警都送到MySQL数据库中,在日志文件中就不会出现了,也有一些方法可以将告警送到不同的目标。

下面的例子是将SMB弹出窗口送到workstation.list文件中列举的主机上:
output alert_smb: workstation.list
有时候你可能需要将告警发到多种目标,那么用ruletype关键字自定义动作时一个好主意。例如,下面豫剧定义了一个动作,将告警同时发送到数据库和SMB弹出窗口。
ruletype smb_db_alert
{
type alert
output alert_smb: workstation.list
output database: log, mysql, user=rr password=rr \
dbname=snort host=localhost
}
下面的规则应用了上面的自定义动作。
smb_db_alert icmp any any -> 192.168.1.0/24 any \
(fragbits: D; msg: “Dont Fragment bit set”;)

4.2.1 alert_syslog输出模块
几乎所有的UNIX系统中都有系统日志守护进程syslog,它的配置文件是/etc/syslog.conf。你可以查看syslogd和syslog.conf的手册来获得更多信息。
Alert_syslog模块使你能够将告警发送到系统日志钟。如果你需要的话,系统日志守护进程也可以将告警发送到其他的主机。下面是这个模块的配置格式:
output alert_syslog: <facility> <priority> <options>
其中,facility可以取得值包括:
• LOG_AUTH
• LOG_AUTHPRIV
• LOG_DAEMON
• LOG_LOCAL0
• LOG_LOCAL1
• LOG_LOCAL2
• LOG_LOCAL3
• LOG_LOCAL4
• LOG_LOCAL5
• LOG_LOCAL6
• LOG_LOCAL7
• LOG_USER
priority的取值包括:
• LOG_EMERG
• LOG_ALERT
• LOG_CRIT
• LOG_ERR
• LOG_WARNING
• LOG_NOTICE
• LOG_INFO
• LOG_DEBUG
这里LOG_EMERG是最高优先级的,而LOG_DEBUG是最低优先级的。
Options的取值可以是:
• LOG_CONS
• LOG_NDELAY
• LOG_PERROR
• LOG_PID
4.2.2 alert_full输出模块
这个模块用来想文件记录详尽的告警信息。下面的配置让系统把日志记录到Snort日志目录的alert_detailed文件中:
output alert_full: alert_detailed
尽管这个模块可以使你得到详细的信息,但是也会导致系统资源的大量消耗,在一个高负载的网络环境中,可能导致系统来不及响应而使探测引擎忽略一些数据包。
4.2.3 alert_fast输出模块
如前面所提到的,记录详细的信息可能导致系统资源的过度消耗,因此Snort提供快速记录简要信息的输出模块,每个信息只有一行,这个模块的配置如下所示:
output alert_fast: alert_quick
4.2.4 alert_smb模块
这个模块用linux的SAMBA客户端smbclient程序向Windows工作站发送SMB告警,使用之前确定smbclient程序的路程在PATH环境变量中。
下面是一个示例:
output alert_smb: workstation.list
每个工作站的SMB名称都要分行列在workstation.list文件中。SMB名称就是Windows机器的计算机名称。客户端程序会自己解析这个名称。

4.2.5 log_tcpdump模块
这个模块用来将告警数据存放为tcpdump格式,这种方法便于高负荷网络中提高分析数据的速度。下面是配置格式:
output log_tcpdump: <filename>
下面是一个示例:
output log_tcpdump: /var/log/snort/snort_tcpdump.log
4.2.6 XML输出模块
Snort可以用SNML(Simple Network Modeling Language)来输出告警以便基于XML的解释器或浏览器阅读。
通过这个插件,你可以将XML数据存放在本地机器上或者通过HTTP及HTTP协议传送到Web服务器上。
XML输出模块的基本用法如下:
output xml: [log | alert], [parameter list]
你可以选择用XML记录告警或者日志,其他的参数如下表所示:

参数 描述
File 将数据储存到XML文件中
Protocol 将信息记录到其他机器上用的协议如HTTP,HTTPS。
Host 记录信息的远程主机
Port 记录信息的远程主机的端口
Cert Https用到的证书
Key 客户端私钥
Ca 认证证书的服务器
Server X.509证书的CN

4.2.6.1例子
将日志记录到本地主机上的文件“xmlout”:
output xml: log, file=xmlout
文件名字会添加时间和日期作为后缀,这样的目的是为多个Snort进程服务。

将日志记录用HTTP协议到snort.conformix.com的xmlout文件上:
output xml: alert, protocol=http \
host=snort.conformix.com file=xmlout
将日志记录用HTTPS协议到snort.conformix.com的xmlout文件上:
output xml: alert, protocol=https \
host=snort.conformix.com file=xmlout cert=conformix.crt \
key=conformix.pem ca=ca.crt server=Conformix_server
将日志记录到监听5555端口的TCP服务器snort.conformix.com上:
output xml: alert, protocol=tcp \
host=snort.conformix.com port=5555
典型的输出XML文件如下:
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE snort-message-version-0.2>
<file>
<event version=”1.0″>
<sensor encoding=”hex” detail=”full”>
<interface>eth0</interface>
<ipaddr version=”4″>192.168.1.2</ipaddr>
<hostname>conformix.conformix.net</hostname>
</sensor>
<signature>ICMP Packet with TTL=100</signature>
<timestamp>2002-07-23 17:48:31-04</timestamp>
<packet>
<iphdr saddr=”192.168.1.100″ daddr=”192.168.1.2″ proto=”1″ ver=”4″
hlen=”5″ len=”60″ id=”37123″ ttl=”100″ csum=”519″>
<icmphdr type=”8″ code=”0″ csum=”23612″>
<data>6162636465666768696A6B6C6D6E6F7071727374757677616263646566676869</data>
</icmphdr>
</iphdr>
</packet>
</event>
</file>
4.2.7记录到数据库

Snort可以用数据库来记录日志和告警,你可以用Oracle或MySQL等多种类型的数据库,如下面的例子:
output database: log, mysql, user=rr password=rr \
dbname=snort host=localhost
下一章将详细讨论如何应用数据库,下面是数据库数据模块的格式:
output database: <log | alert>, <database_type>, \
<parameter_list>
这里database_type指的是数据库类型,如mysql,parameter_list是一些相关参数,用空格分隔。其中很多参数是可选的。
下面是参数的列表:

参数 描述
Host 运行数据库服务器的主机
Port 数据库服务器的端口号
Dbname 数据库的名称
User 数据库的用户名
Password 用户口令
Sensor_name Snort探测器的名称
Detail Full或者fast模式,默认是full
Encoding 记录数据的ASCII,hex或者base64的编码
4.2.8CSV数据模块
利用CSV模块,可以将输出数据保存为CSV文件,可以将数据导入到其他的软件中,如Excel等等。启动CSV模块的语句模式如下:
output csv: <filename> <formatting_options>
文件默认被创建到/var/log/snort路径下面,选项用来定义文件中储存什么样的信息以及以什么样的顺序储存。
例如,你用default作为格式选想那么告警的所有参数将被存储在文件中:
output csv: csv_log default
输出文件的格式如下:
07/23-18:24:03.388106 ,ICMP Packet with
TTL=100,ICMP,192.168.1.100,,192.168.1.2,,0:2:3F:33:C6:98,0:E0:29:89:
28:59,0x4A,,,,,,100,0,51367,60,20,8,0,,
07/23-18:25:51.608106 ,GET
matched,TCP,192.168.1.2,1060,192.168.10.193,,0:E0:29:89:28:59,0:6:25
:5B:29:ED,0×189,***AP***,0x55BCF404,0x8CBF42DD,,0x16D0,64,0,35580,37
9,20,,,,
07/23-18:25:52.008106 ,GET
matched,TCP,192.168.1.2,1061,192.168.10.193,,0:E0:29:89:28:59,0:6:25
:5B:29:ED,0x1D0,***AP***,0×55628967,0x8D33FB74,,0x16D0,64,0,63049,45
0,20,,,,
07/23-18:25:52.478106 ,GET
matched,TCP,192.168.1.2,1061,192.168.10.193,,0:E0:29:89:28:59,0:6:25
:5B:29:ED,0x1D0,***AP***,0x55628B01,0x8D33FC1B,,0×1920,64,0,63051,45
0,20,,,,
07/23-18:25:52.708106 ,GET
matched,TCP,192.168.1.2,1061,192.168.10.193,,0:E0:29:89:28:59,0:6:25
:5B:29:ED,0x1EF,***AP***,0x55628C9B,0x8D33FCC1,,0x1D50,64,0,63053,48
1,20,,,,
每一行包括下面的字段:

名称 描述
Timestamp 时间戳包含时间和日期
Msg 规则中msg字段中的信息
Porto 协议
Src 源IP地址
Dst 目的IP地址
Dstport 目的端口
Ethsrc 源MAC地址
Ethdst 目的MAC地址
Ethlen 以太网帧长度
Tcpflags 如果协议为TCP的话,这里就记录标志位
Tcpseq Tcp包的序列号
Tcpack Tcp的应答号
Tcplen TCP包的长度
Tcpwindow TCP窗口的大小
Ttl IP头部的TTL值
Tos IP头部的服务类型值
Id 包的ID值
Dgmlen 数据报的长度
Iplen IP头部长度
Icmptype ICMP头部的类型段
Icmpid ICMP头部的ID
Icmpseq ICMP序列号
你可以用少量的选项,例如:
output csv: csv_log timestamp,msg,src,dst
纪录的日志如下:
07/23-19:31:27.128106 ,GET matched,192.168.1.2,192.168.10.193
07/23-19:31:27.278106 ,GET matched,192.168.1.2,192.168.10.193
4.2.9统一纪录输出模块
同意输出适合告诉纪录,你可以将日志和告警存放不同的文件中,下面是配置格式:
output alert_unified: filename <alert_file>, \
limit <max_size>
output log_unified: filename <log_file>, \
limit <max_size>
文件的大小用M字节表示,你可以同时记录日志和告警,因为告警文件并不包含包的详细信息。下面是个例子:
output alert_unified: filename unified_alert, limit 50
output log_unified: filename unified_log, limit 200
如果不指定路径,那么文件将被创建在/var/log/snort中。在上面的例子中,告警文件的大小被限制在50M字节,日志文件是200M字节。
统一日志用二进制记录问津,你可以用一些工具开查看,比如Barnyard。

4.2.10SNMP Trap输出模块
这个模块可以向网络管理中心输出SNMP trap形式的告警,它可以产生SNMP 第二版和第三版的trap信息。格式如下:
output trap_snmp: alert, <sensor_ID>, {trap|inform} \
-v <snmp_version> -p <port_number> <hostname> <community>
下面一行的作用是将SNMP 2C版的trap信息发到192.168.1.3的162端口,共同体名称为public:
output trap_snmp: alert, 8, trap -v 2c -p 162 \
192.168.1.3 public
如果需要用SNMP,那么openssl的支持必须也在编译Snort的时候选择。
4.2.11 空记录数据模块
这个模块可以导致不记录告警,一般情况下不推荐使用。

4.3 BPF过滤器
BPF是在数据链路层过滤数据包的一种机制。基于BPF的过滤器通常用tcpdump这样的程序来过滤你想捕获的 数据包。你可以同时使用BPF和Snort。如果你使用BPF过滤器,那么Snort只能看到通过BPF过滤器的包。这样可以过滤掉没有意义的数据包,节 省CPU时间。
你可以将BPF过滤表放在一个文件中,在启动Snort的时候引用这个文件。假设你想让Snort仅仅探测IP头部的TOS不等于0的包,你可以创建一个文件bpf.txt,包含如下的一行:
ip[1] != 0
数字1表示的IP头部开始计算的偏移量,1就是TOS位。
然后,用下面的命令启动Snort:
snort -F bpf.txt -c /opt/snort/etc/snort.conf
所 有的系统都需要某种类型的可以有效的纪录的机制,这种机制通常是通过后台的数据库来完成的。Snort可以同MySQL、Oracle或者其他任何一种 ODBC兼容的数据库一起工作。在前面的章节中,你已经了解了你可以通过输出模块将日志和告警保存在数据库中,这对保存历史数据并产生报告和分析数据是非 常有用的。利用如ACID(将在下一章讨论)之类的工具,也可以得到关于入侵特征非常有用的信息,例如你可以得到最后15次攻击的报告,其中的信息包括连 续攻击你的网络的主机,攻击不同协议的分布等等。
MySQL是可以免费得到的数据库系统,并且能够在Linux和其他操作系统上很好的工作,因此对于Snort来说,是一种很自然的选择。
你可以在运行Snort的机器上同时安装MySQL服务器,如图5-1所示。
你也可以将MySQL服务器安装到另外一台机器上,并将Snort日志记录到这台机器,如图5-2所示。
你也可以用一台中心MySQL服务器记录多个Snort感应器的信息,如图5-3所示。
方案的选择取决于你的特定需求。例如,你只有一个Snort感应器,并且没有现有的数据库服务器,这样一个很自然的做法是将数据库和Snort安装在同一个机器上。但如果你有多个Snort机器,就应该建立一个中心数据库服务器,如图5-5所示。
如 果从远程Snort机器登录到独立的数据库服务器上,在传输数据的时候可以不采取安全措施,也可以采用某种加密手段。利用安全隧道,所有在Snort机器 和数据库服务器之间传输的数据都将被加密,这种手段也可以用于穿越防火墙的情况,因为这时你可以利用防火墙已经打开的端口。
在将Snort数据记录到MySQL数据库之前,你建立一个库。建立数据库后,必须要为数据库创建表用来记录Snort数据。你可以在http://www.incident.org/snortdb/参考关于这些表的详情,你可能需要重新编译Snort才能够支持MySQL,本章的后面将会对此做出说明。
学习完本章后,你将可以安装Snort和MySQL并将所有的Snort活动记录到数据库中。你也将了解如何用中心数据库服务器纪录多个Snort机器的数据。本章的最后部分将提供用安全隧道来管理Snort和远程数据库服务器间传输通道安全的信息。
5.1使Snort与MySQL共同工作
为使Snort与MySQL共同工作,有几个事情需要做。下面是建立Snort-MySQL系统的步骤。关于每个步骤的详细信息将在本章的后面介绍。
编译Snort使之支持MySQL并安装,并测试一些告警以确信Snort工作正常。在第2章已经叙述过,你需要在运行configure脚本的时候加上—with-mysql的命令行参数。
安装MySQL并用mysql客户端来确定数据库可以正常工作。
在MySQL服务器中创建一个数据库,我将这个数据库命名为snort,你也可以叫它其他的名字。本章的后面将对此进行详细讨论。
为数据库创建一个用户及口令,Snort将用这个用户名来记录数据。
用snort分发包的contrib目录下面的脚本来为数据库创建表。。
修改snort.conf,使数据库模块起作用,本章的后面将对此进行讨论。在此你将用到刚刚建立的数据库的名称和用户名及口令。。
重新启动Snort,如果一切正常,Snort将开始向数据库记录数据。
产生一些告警并用mysql客户端程序来确定告警已被纪录。
本章的剩下部分将解释如何实现这些步骤,下一章将讨论ACID的应用,此时本章你做的事情才能够得到实际的应用价值。
5.1.1 第一步:使Snort支持MySQL的编译方法
如果你需要使Snort支持MySQL数据库,那么你必须在编译的时候带上—with-mysql的参数。在第二章中,我们已经叙述过如何用configure脚本来做这样的事情。
典型的configure脚本命令行运行方式如下所示:
./configure –prefix=/opt/snort –with-mysql=/usr/lib/mysql
我建议你在运行configure脚本的时候,同时加入其他组件的支持,如SNMP等,它们也是非常有用的。在编译的时候,MySQL的系统库文件必须在/usr/lib/mysql中存在才能成功。详细信息可以在第二章中查阅。
5.1.2 第二步:安装MySQL
我建议你用随RedHat或其他Linux发行版附带的软件包来安装MySQL,这是最简单的方式。MySQL同时也有用于Windows平台的。当然,你也可以在http://www.mysql.org来获得MySQL服务器和客户端的源代码自己编译并安装它,但是我认为你在具有一定的经验的时候采用这种方式。
5.1.3 第三步:在MySQL中建立Snort数据库。
一 旦你完成了编译支持MySQL的Snort,那么下面要做的就是建立一个Snort用来记录数据的数据库了。在开始使用MySQL之前,首先要确定数据库 服务器上的MySQL运行正常。你可以用ps –ef | grep mysql来察看,如果列表中有MySQL进程,那么数据库服务器就正在运行。如果你只有一台机器,你可以在安装Snort的机器上运行MySQL服务 器。前面也说过,你也可以在别的机器上运行数据库服务器。为了本书叙述的方便,我将所有的部件,包括Snort和MySQL都安装在同一台机器上面。
你可以在http://www.mysql.ort上下载MySQL服务器的最新版,或者在RedHat安装盘中取得RPM版的MySQL服务器。对于Windows用户,应当使用安装包。你可以用数据库服务器的root用户来创建snort数据库,并将所需的权限赋予用户rr。
客 户端程序mysql用来连接数据库服务器。Snort数据库的名称可以用任意的名字,访问数据库的用户名也可以自由定义。为本书的叙述方便,我们在此创建 一个叫做snort的数据库,和一个名为rr的用户来访问数据库。假定MySQL服务器运行在本地,通常的用来创建数据库并检查其状态的mysql命令运 行过程如下所示:
[root@laptop]# mysql -h localhost -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 40 to server version: 3.23.36
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer
mysql> create database snort;
Query OK, 1 row affected (0.00 sec)
mysql> use snort
Database changed
mysql> status
————–
mysql Ver 11.13 Distrib 3.23.36, for redhat-linux-gnu (i386)
Connection id: 41
Current database: snort
Current user: root@localhost
Current pager: stdout
Using outfile: ”
Server version: 3.23.36
Protocol version: 10
Connection: Localhost via UNIX socket
Client characterset: latin1
Server characterset: latin1
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 1 hour 56 min 29 sec
Threads: 1 Questions: 107 Slow queries: 0 Opens: 14 Flush
tables: 1 Open tables: 7 Queries per second avg: 0.015
————–
mysql>
在这个过程中用到了下面的命令:
命 令“mysql -h localhost -u root –p ”用来将mysql客户端连接到本地的数据库服务器上面。其中“-u root”表示用来连接数据库的用户名,“-p”用来在下一行输入用户密码。登录后,你会看到一个欢迎信息,并得到“mysql>”提示符,这样你 可以执行其他的数据库操作命令。
命令“create database snort;”用来在MySQL服务器中创建一个名为snort的数据库,你也可以用其他你喜欢的名字。
命令“use snort”的作用是使用新创建的数据库snort。
命令“status”用来显示数据库服务器的当前状态。例子中显示了当前打开的数据库是snort。
在MySQL命令提示符下,你可以用“exit”命令来结束mysql客户端进程。
5.1.4创建MySQL用户并授予权限和设置口令
在访问Snort数据库的时候,我们不建议用root用户登录,因此,你要创建一个新的用户,我的新用户名为rr。下面的命令用来创建名为rr的用户,这个命令也用来给用户授予对表和库的访问权限。。
CREAT,用来创建新的对象。
INSERT,用来向数据库插入数据。
DELETE,用来从数据库删除数据。
UPDATE,用来修改记录。
SELECT,用来显示并选择记录。
我们用所创建的用户来访问Snort数据库,当你配置Snort使用其数据库输出模块的时候,在配置文件snort.conf中也将用到这个用户名及其口令。
mysql> grant CREATE,INSERT,DELETE,UPDATE,SELECT on snort.* to
rr@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql>
对新用户的授权仅限于Snort数据库,创建用户并授权用一条命令完成。
新用户需要一个口令,下面的命令为新用户指定口令“rr78x”。
mysql> set password for rr = password(‘rr78x’);
Query OK, 0 rows affected (0.00 sec)
mysql>
在snort.conf的MySQL输出配置中,将用到数据库的用户名和密码。在snort.conf文件中,以下的字段需要进行设置:
数据库名称,也就是snort
数据库用户名,也就是rr
数据库用户口令,也就是rr78x
运行数据库服务器的主机,在这里就是安装Snort的同一台机器。如果数据库服务器和Snort安装在同一台机器上,主机名就是“localhost”。
5.1.5第五步:在Snort数据库中创建表
在创建一个Snort数据库并建立用户后,现在应当在数据库中建立一些表来存储数据。非常幸运,我们可以在contrib目录中找到脚本create_mysql来完成你所需要的所有表。如果你从http://www.snort.org下载了snort的源代码,并解压它,就可以从中找到contrib目录。
下面的命令用这个脚本创建snort数据库中的所有表:
[root@laptop]# mysql -h localhost -u rr -p snort < contrib/
create_mysql
Enter password:
[root@laptop]#
该命令的各个选项的解释如下:
“-h localhost”告诉mysql客户端程序数据库服务器与客户端运行在同一台机器上。
“-u rr”用来指定登录数据库服务器的用户名
“-p”表示你将在下一行输入用户rr的口令
“snort”表示将表创建到名为snort的数据库中
最后一部分“<contrib./create_mysql”指定一个文件名,mysql客户端将从这个文件中读取命令。
用下面的命令来察看所创建的表:
[root@laptop]# mysql -h localhost -u rr -p snort
Enter password:
Reading table information for completion of table and column
names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 46 to server version: 3.23.36
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer
mysql> show tables;
+——————+
| Tables_in_snort |
+——————+
| data |
| detail |
| encoding |
| event |
| icmphdr |
| iphdr |
| opt |
| reference |
| reference_system |
| schema |
| sensor |
| sig_class |
| sig_reference |
| signature |
| tcphdr |
| udphdr |
+——————+
16 rows in set (0.00 sec)
mysql>
“show tables”命令用来显示当前打开的数据库中所有的表。上边列举了create_mysql脚本创建的16个表,每个表用来纪录关于Snort活动的不同部分的信息:
data表包含触发告警的每个包的载荷
detail表包含所记录包的信息的详细程度,这个表在默认情况下只包含两列,第一列为fast,第二列是full,表示不同的记录模式,这在前面已经做过表述。
Encoding表显示纪录包的表马形式,默认情况有3种:hex,base64和ASCII。
Event表列举了所有的事件,并为这些事件打上时间戳。
Icmphdr表中包含了记录到snort数据库中icmp包的头部信息,包括ICMP类型,编码,ID,序列号等等。
Iphdr表中包含了被记录的数据包中IP头部的所有字段信息,包括IP源和目的地址,IP头长度,TOS值,TTL值等等。
Opt表中包含了一些选项。
Reference及reference_system表中包含了关于一些入侵行为的参考网址,你可以从中获得更多的信息。
Schema表显示了数据库模型的版本。
Sensor表中包含了记录数据库的各个Snort探测器的相关信息。如果仅有一个Snort探测器,这个表就只有一排。如果有多个探测器,则每个探测器占一排。
Sig_class包含Snort规则不同级别的信息,例如“attemptedrecon”,“misc-attack”等等。
Signature表中包含了关于产生告警的一些特征的信息。
Tcphdr表中包含了TCP类型数据包中TCP头部的信息。
Udphdr表中包含了UDP类型数据包中UDP头部的信息,包括源和目的端口,长度和校验码。
如果你想了解每个表的结构,你可以在客户端中显示每个表的各个字段。下面的命令用来显示iphdr表的结构:
mysql> describe iphdr;
+———-+———————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———-+———————-+——+—–+———+——-+
| sid | int(10) unsigned | | PRI | 0 | |
| cid | int(10) unsigned | | PRI | 0 | |
| ip_src | int(10) unsigned | | MUL | 0 | |
| ip_dst | int(10) unsigned | | MUL | 0 | |
| ip_ver | tinyint(3) unsigned | YES | | NULL | |
| ip_hlen | tinyint(3) unsigned | YES | | NULL | |
| ip_tos | tinyint(3) unsigned | YES | | NULL | |
| ip_len | smallint(5) unsigned | YES | | NULL | |
| ip_id | smallint(5) unsigned | YES | | NULL | |
| ip_flags | tinyint(3) unsigned | YES | | NULL | |
| ip_off | smallint(5) unsigned | YES | | NULL | |
| ip_ttl | tinyint(3) unsigned | YES | | NULL | |
| ip_proto | tinyint(3) unsigned | | | 0 | |
| ip_csum | smallint(5) unsigned | YES | | NULL | |
+———-+———————-+——+—–+———+——-+
14 rows in set (0.00 sec)
mysql>
如果你想了解关于数据如何存储的详细信息,你可以在http://www.incident.org/snortdb/ 察看数据库的详细结构。
5.1.5.1 创建附加表
当 你用一些其它的程序与Snort和数据库一同工作,希望将端口号映射到服务名称的时候,你将需要一些附加的映射信息。例如,TCP端口23是用来 Telnet的,但是tcphar表中仅仅包含端口号码,并没有详细的描述。如果你想将源和目的端口表示为Telnet而不是数字23这种形式的时候,你 需要这些信息。Snort附带了一个附加的脚本,使你能够处理这样的信息。在contrib目录中有一个snortdb-extra.zip的文件,将它 解压,你就可以用它来创建附加的表:
[root@laptop]# mysql -h localhost -u rr –p snort < contrib/
snortdb-extra
Enter password:
[root@laptop]#
这个命令创建了3个表:protocols,services和flags。这些表中包含了关于不同协议、服务和标志位的详细信息。该脚本同时也为这些表构建数据。在snortdb-extra脚本中有关于这些表的表述。下面是这些表的列表:
mysql> show tables;
+——————+
| Tables_in_snort |
+——————+
| data |
| detail |
| encoding |
| event |
| flags |
| icmphdr |
| iphdr |
| opt |
| protocols |
| reference |
| reference_system |
| schema |
| sensor |
| services |
| sig_class |
| sig_reference |
| signature |
| tcphdr |
| udphdr |
+——————+
19 rows in set (0.01 sec)
mysql>
现在表的数量已经由16个变成了19个,其中service表非常大,包含了65536个TCP和UDP服务的相关条目。这个表一共包括131072列,因此是非常巨大,当你用脚本创建这个表的时候,或许会需要几分钟的时间。
5.1.5.2 Snort数据库表中一些条目的例子
为了使你对数据库表中的条目的形式有些概念,现在我们从数据库种选择其中的一些来做例子。
下面是sig_class表中的一些条目:
mysql> select * from sig_class;
+————–+————————–+
| sig_class_id | sig_class_name |
+————–+————————–+
| 9 | attempted-recon |
| 8 | misc-attack |
| 7 | bad-unknown |
| 6 | web-application-activity |
+————–+————————–+
4 rows in set (0.00 sec)
mysql>
Select命令从数据库中提取数据并在屏幕上显示。
下面是reference_system表中的一些记录。
mysql> select * from reference_system;
+—————+—————–+
| ref_system_id | ref_system_name |
+—————+—————–+
| 8 | nessus |
| 7 | cve |
| 6 | arachnids |
| 5 | bugtraq |
+—————+—————–+
4 rows in set (0.02 sec)
mysql>
下面是encoding表中的记录。
mysql> select * from encoding;
+—————+—————+
| encoding_type | encoding_text |
+—————+—————+
| 0 | hex |
| 1 | base64 |
| 2 | ascii |
+—————+—————+
3 rows in set (0.00 sec)
下面的select命令输出了services表中端口号码20-30的所有条目。
mysql> select * from services where port<30 and port>20;
+——+———-+———+————————-+
| port | protocol | name | description |
+——+———-+———+————————-+
| 21 | 6 | ftp | File Transfer [Control] |
| 21 | 17 | ftp | File Transfer [Control] |
| 22 | 6 | – | Unassigned |
| 22 | 17 | – | Unassigned |
| 23 | 6 | telnet | Telnet |
| 23 | 17 | telnet | Telnet |
| 24 | 6 | – | Unassigned |
| 24 | 17 | – | Unassigned |
| 25 | 6 | smtp | Simple Mail Transfer |
| 25 | 17 | smtp | Simple Mail Transfer |
| 26 | 6 | – | Unassigned |
| 26 | 17 | – | Unassigned |
| 27 | 6 | nsw-fe | NSW User System FE |
| 27 | 17 | nsw-fe | NSW User System FE |
| 28 | 6 | – | Unassigned |
| 28 | 17 | – | Unassigned |
| 29 | 6 | msg-icp | MSG ICP |
| 29 | 17 | msg-icp | MSG ICP |
+——+———-+———+————————-+
18 rows in set (1.14 sec)
mysql>
5.1.6 修改snort.conf的配置
在完成对数据库的相关操作后,现在你需要编辑snort.conf文件,在此文件中,下面的几行可以使日志信息记录到MySQL数据库中:
output database: log, mysql, user=rr password=rr78x \
dbname=snort host=localhost
如果用户没有口令,也可以用下面的形式:
output database: log, mysql, user=rr dbname=snort \
host=localhost
如果你的数据库服务器在另外的机器上,就需要在snort.conf中指定服务器的名字或者ip地址,例如:
output database: log, mysql, user=rr password=rr78x \
dbname=snort host=192.168.1.23
数据库服务器运行在IP地址为192.168.1.23的机器上,如果有很多Snort探测器,都把数据记录到这台数据库服务器上,那么每一个探测器的snort.conf都要如此修改。在启动snort前,数据库服务器必须正在运行,否则会导致错误。
5.1.7启动支持数据库的Snort
在完成对数据库相关的配置后,启动信息中将会显示你用的是何种数据库:

[root@laptop]# /opt/snort/bin/snort -c /etc/snort/snort.conf
Log directory = /var/log/snort
Initializing Network Interface eth0
–== Initializing Snort ==–
Decoding Ethernet on interface eth0
Initializing Preprocessors!
Initializing Plug-ins!
Initializing Output Plugins!
Parsing Rules file /etc/snort/snort.conf
+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains…
No arguments to frag2 directive, setting defaults to:
Fragment timeout: 60 seconds
Fragment memory cap: 4194304 bytes
Stream4 config:
Stateful inspection: ACTIVE
Session statistics: INACTIVE
Session timeout: 30 seconds
Session memory cap: 8388608 bytes
State alerts: INACTIVE
Scan alerts: ACTIVE
Log Flushed Streams: INACTIVE
No arguments to stream4_reassemble, setting defaults:
Reassemble client: ACTIVE
Reassemble server: INACTIVE
Reassemble ports: 21 23 25 53 80 143 110 111 513
Reassembly alerts: ACTIVE
Reassembly method: FAVOR_OLD
Back Orifice detection brute force: DISABLED
Using LOCAL time
database: compiled support for ( mysql )
database: configured to use mysql
database: user = rr
database: database name = snort
database: host = localhost
database: sensor name = 10.100.1.111
database: sensor id = 1
database: schema version = 105
database: using the “log” facility
886 Snort rules read…
886 Option Chains linked into 99 Chain Headers
0 Dynamic rules
+++++++++++++++++++++++++++++++++++++++++++++++++++
Rule application order: ->activation->dynamic->alert->pass-
>log
–== Initialization Complete ==–
-*> Snort! <*-
Version 1.8.6 (Build 105)
By Martin Roesch (roesch@sourcefire.com, www.snort.org)
从上面也可以看到很多其他相关信息。
5.1.8向数据库记录信息
在正确配置数据库后,现在你需要检验日志和告警信息是被保存在数据库的表中,我们用下面的两个Snort规则来检验:
alert ip any any -> any any (ipopts: lsrr; msg: \
“LSRR Options set”; logto: “test”;)
alert icmp any any -> 192.168.1.0/24 any (fragbits: D; \
msg: “Dont Fragment bit set”;)
我们在window机器上运行下面两个命令来测试这些规则:
ping -n 1 -f 192.168.1.2
ping -n 1 -j 192.168.1.2 192.168.1.2
第 一个命令发送一个设置DF位的ICMP包,因此触发第二条规则,第二个命令发送一个设置LSSR选项的ICMP包,这样将触发第一条规则。这两条命令会导 致告警的产生,告警信息被记录到数据库中。你可以在一些表中看到。例如,icmphdr表中会出现告警相关包的头部信息:
mysql> select * from icmphdr;
+—–+—–+———–+———–+———–+———+———-+
| sid | cid | icmp_type | icmp_code | icmp_csum | icmp_id | icmp_seq |
+—–+—–+———–+———–+———–+———+———-+
| 1 | 1 | 8 | 0 | 18780 | NULL | NULL |
| 1 | 2 | 0 | 0 | 20828 | NULL | NULL |
| 1 | 3 | 8 | 0 | 18524 | NULL | NULL |
+—–+—–+———–+———–+———–+———+———-+
3 rows in set (0.00 sec)
mysql>
在select命令的输出信息中,我们可以看到ICPM头部的不同字段,包括ICMP类型和代码,signature表中包含了下面的一些信息其他一些选项信息,如下所示:
mysql> select * from signature;
+——–+———————–+————–+————–+———+——
—+
| sig_id | sig_name | sig_class_id | sig_priority | sig_rev |
sig_sid |
+——–+———————–+————–+————–+———+——
—+
| 1 | Dont Fragment bit set | 0 | NULL | NULL |
NULL |
| 2 | LSRR Options set | 0 | NULL | NULL |
NULL |
+——–+———————–+————–+————–+———+——
—+
2 rows in set (0.00 sec)
mysql>
注意在signature表的sig_name字段中包括的信息与你在前面定义的两个规则中msg部分相同。在下一章中,你将开始使用ACID,届时你会发现你其实不再需要mysql的命令行了。ACID给你提供了一个很好的web界面,你可以管理和察看数据表。
5.2用Stunnel安全登录远程数据库
MySQL 数据库服务器监听3306端口,如果你的数据库服务器并不和Snort运行在同一台机器上,那么你就要远程登录数据库服务器,从安全的角度出发,你或许希 望加密从Snort机器到数据库服务器间的传输信息。Stunnel或称为安全隧道可以为你在两台主机间建立一个安全的通道,它是开发源码的软件包,你可 以在http://www.stunnel.org获得。
从该网站下载最新版本后,并在Snort机器和数据库服务器上安装并运行,以建立一个通道。在数据库服务器上,你可以运行下面的命令:
stunnel -P/tmp/ -p stunnel.pem -d 3307 -r localhost:3306
注意,如果在环境变量中不存在stunnel的路径,那么需要输入命令的全路径。这个命令会将所有进入的3307端口的连接重定向到MySQL服务器所监听的3306端口。
在Snort机器上,运行下面的命令:
stunnel -P/tmp/ -c -d 3306 -r SERVER_NAME:3307
只要将SERVER_NAME替换为数据库服务器的主机名或者IP地址就可以了。这个命令会将发到本地3306端口的请求重定向到远程服务器的3307端口。
要确定本地的Snort机器并没有运行MySQL服务器,否则3306端口就会被MySQL服务器占用,Stunnel就无法绑定在这个端口了。
设置完毕后,你应该配置Snort使之认为数据库服务器运行在本地机器上,Stunnel会负责与远程数据库服务器的所有通讯。
在有很多Snort探测器的时候,这种设置也是非常有用的。
5.3Snort数据库维护
你经常需要一些操作来保持数据库的运行效率。表的优化可以有效的加强数据库的运行效率。你可以用optimize命令来对单个表进行优化。下面的命令对表data进行优化。
mysql> optimize table data;
+————+———-+———-+———-+
| Table | Op | Msg_type | Msg_text |
+————+———-+———-+———-+
| snort.data | optimize | status | OK |
+————+———-+———-+———-+
1 row in set (58.10 sec)
mysql>
你也可以创建叫本来优化所有的表,为此你可以将下面的命令存放在文件optimize.sql中。
optimize table data;
optimize table detail;
optimize table event;
optimize table icmphdr;
optimize table iphdr;
optimize table opt;
用下面的命令来运行这个脚本:
mysql -h localhost -u rr -prr78x snort < optimize.sql
在这个脚本中,我并没有用到所有的表的名称。你可以加入你所需要的命令。
在实际应用中,你应该将这个命令放在cron计划列表中,设定每天运行一次。
5.3.1数据库存档
当你的数据库达到一定程度的时候,你就需要对它进行存档。其中一个方法是备份数据库,然后丢弃它并重新创建一个新的数据库。另外一个方法是将现有的数据存放到存档表中然后清理这些表。现在你可以在http://www.dirk.demon.co.uk/utils/中找到一些脚本来完成这些工作。这些脚本中附带详细的说明。
5.3.2极端措施:丢弃数据库
如果你真的想丢弃当前数据库中的所有数据,并创建一个新的数据库,你可以在mysql客户端中运行下面的命令。
drop database snort;
ACID 是一种通过web界面来分析察看Snort数据的工具。它是用PHP编写的,与Snort和MySQL或其他数据库一同工作,通过web服务器,使用户能 够方便的访问数据。除了和Snort一同工作外,ACID也可以被用户其他一些安全相关的产品,如防火墙和网络监控等。
本章将讨论ACID与Snort及MySQL的整合,ACID的图形化特点能够给你很好的帮助。
除了ACID外,本章也会介绍一些关于SnortSnarf的基本信息,SnortSnarf是另外一种通过web界面来分析Snort数据的工具。本书假定你用Apache作为web服务器。

第三章 使用Snort规则
如同病毒,大多数入侵行为都具有某种特征,Snort的规则就是用这些特征的有关信息构建的。在第1章中我 们提到,你可以用蜜罐来取得入侵者所用的工具和技术的信息,以及他们都做了什么。此外,还有入侵者会利用的已知的系统弱点数据库,如果入侵者试图利用这些 弱点来实施攻击,也可以作为一些特征。这些特征可能出现在包的头部,也可能在数据载荷中。Snort的检测系统是基于规则的,而规则是基于入侵特征的。 Snort规则可以用来检测数据包的不同部分。Snort 1.x可以分析第3层和第4层的信息,但是不能分析应用层协议。Snort v 2.x增加了对应用层头部分析的支持。所有的数据包根据类型的不同按顺序与规则比对。

阅读全文

2.1 Snort 安装方案
Snort的安装方式要取决于运行环境,下面列举了一些典型的安装方案以供参考,你可以根据你的网络情况进行选择。
2.1.1 测试安装
简单安装只包括一个Snort探测器。Snort将数据记录到文本文件中。日志文件供Snort管理员随后察看。由于这种方式在实际应用中分析日志的成本比较高因此仅适合测试环境。要用这种方式安装Snort,你可以在http://www.snort.org取得编译好的版本。对RedHat Linux来说,你可以下载RPM包。对Windows系统,你可以下载可执行文件安装到你的系统上。
2.1.2 安装单探测器的应用IDS
单探测器的Snort可应用安装适合只有一条Internet线路的小型网络。将探测器放在路由器或者防火墙的后面,以检测进入系统的入侵者。不过要是你对所有的Internet流量感兴趣,你也可以将传感器放在防火墙的外面。
在这种安装方式中,你可以从Snort网站http://www.snort.org下载编译好的版本,也可以下载源代码根据自己的要求编译,以取得自己需要的特征,这种要求在编译好的版本中是做不到的。Snort的编译步骤将在本章详细讨论。
在 应用系统安装中,也可以让Snort实现自动启动和关闭,这样Snort在系统启动是可以自动启动。如果你在Linux中安装编译好的版本,RPM包会帮 你做到这一点。在Windows系统中,你可以将Snort作为服务来启动或者放在启动组的批处理文件中。Windows相关的问题将在第8章涉及。日志 将纪录为文本文件或者二进制文件,并用类似于SnortSnarf的工具分析数据。SnortSnarf将在第6章中详细讨论。
2.1.3 单探测器与网管系统的整合
在应用系统中,你可以将Snort配置成向网管系统发送trap。在企业应用中,有很多种网管系统在应用。最常见的商业网管系统公司有惠普、IBM、Computer Associates等。
Snort利用SNMP trap整合到网管系统中。当你看完本章的Snort编译步骤后,就会了解Snort是怎样提供SNMP能力的。第4章将介绍更多的关于配置SNMP trap目标、community名称等更多的信息。
2.1.4 带有数据库和web界面的单探测器
Snort最通常的用法是与数据库的整合。数据库用来记录日志,并可以随后通过web界面访问。这种安装的典型设置包含3个基本的部件:
Snort 探测器
数据库服务器
web服务器
Snort将日志记录到数据库中,你可以通过连接到它的web浏览器察看这些数据。这种方案可以参见第1章的图1-1。所有3个部件也可以安装在同一个系统上,如第1章的图1-2所示。
Snort可以用不同类型的数据库,如MySQL,PostgresSQL,Oracle,Microsoft SQL Server和其他ODBC兼容的数据库。PHP用来在数据库中获取数据,并产生页面。
这样的安装提供给你一个易于管理的功能全面的IDS,并具有友好的用户界面。为了使你能够用数据库记录日志,你必须给Snort提供数据库的用户名称、密 码、数据库名称和数据库服务器的地址。在单探测器方案中,如果数据库服务器就安装在运行传感器的机器上,你可以用“localhost”作为主机名。你在 编译Snort时就要选择记录数据库的功能,这一点将在本章的后面详细描述。Snort使用数据库的配置将在第4、5、6章讨论。
2.1.5 用集中数据库管理多个Snort探测器
在分布式环境中,你可能需要在多个位置安装Snort探测器。管理所有这些探测器并分别分析它们收集的数据是一项艰难的任务。在企业应用中,有一些方法可以将Snort设置和安装成分布式的IDS。
其中一种方法是将多个探测器连接到同一个中心数据库,如图1-3所示。所有探测器产生的数据都存储在这个数据库中。同时运行一个类似于Apache的web服务器。然后用户可以用web浏览器察看这些数据并加以分析。
但要了解这种配置存在一些实际问题:
所有的探测器在启动Snort的时候必须能够访问到数据库,如果不能,Snort就终止进程。
数据库必须保证让探测器所有的时间都能访问,否则,数据将丢失。
如果探测器和数据库服务器之间有防火墙,你要打开相应的端口,有时这样做会与防火墙的安全策略不匹配或者违背安全策略。
在 探测器不能直接访问数据库服务器的时候,有一些变通的方法。探测器可以配置为将文件存储在本地,然后用类似于SCP的工具定期将这些文件上传到中央数据库 服务器。SCP用SSH协议来进行安全文件传输的工具。防火墙管理员要放行SSH端口的通信。你可以用Snort本身,Barnyard或其他一些工具从 日志文件中提取数据并将它们放到数据库中,你可以在以后用web界面来察看这些数据。这种方式的唯一问题是数据库中的数据并非严格的“实时”数据。延迟的 大小要看你用SCP上传数据到中心数据库服务器的频率。这种方式如图2-1所示。
要注意,中心数据库服务器必须要运行SSH服务器以能够用SCP来上传数据。
如第一章中提到的那样,这本书的最终目的是帮助你安装Snort并让所有的软件包可以协同工作。当你通读此书后,你将了解这些部件之间是如何相互作用,共同工作形成一个完整的入侵检测系统的。本书中涉及的这些软件都可以这本书的网站http://authors.phpktr.com/rhman/中获得源代码。你也可以发现这个网站上的一些脚本可以帮助你轻松的在一个新系统上安装这些软件包。事实上,用这本书提到的这个网站上的一些脚本,你可以以root身份用仅仅几个命令行就建立一个可用的IDS。如果你用的Snort的版本比本书涉及的要新,你可以在http://www.argusnetsec.com/downloads下载支持新版本Snort的最新版的脚本。
这 本书将详细介绍这些部件在RedHat Linux 7.3机器上的安装,但是在其他版本的Linux或者其他平台上的过程与之类似。为了方便本书介绍,所有的部件都安装在/opt目录下面。但是如果用编译 好的软件包,安装位置可能有所不同。当你用本书上或者从本书的网站取得的脚本,文件将被安装在这个目录下面。在本章中,你将了解如何将Snort作为一个 独立的产品安装,在后面的章节中,将介绍其他一些部件。
你可以得到二进制形式或者源代码形式的Snort。对于大多数安装来说,编译好的二进制软 件包是非常好的。如前面提及的,如果你想为Snort定制一些特性,你需要下载源代码版的Snort自行编译。例如,有些人喜欢SMB告警,但另外一些人 可能认为它们不安全。如果你需要不支持SMB告警的Snort,那么你需要自己编译它。这对于一些如SNMP trap、MySQL等其他特性也是一样的。另外一个自己编译Snort理由是你需要了解正在开发中的代码。本章将指导你一步一步的安装Snort。
基本的安装过程是非常简单的,而且Snort已经提供给你包含大多数已知攻击特征的预定义的规则。当然,自定义安装还是要费一些工夫的。
2.2 安装Snort
在这一部分,你将了解如何安装编译好的Snort和如何自己编译和安装。安装编译好的RPM包非常简单,仅需要几步。但是如果你的Snort是源代码形式的,是需要一些时间来了解和安装的。
2.2.1 用RPM包安装Snort
用RPM包安装Snort包括下面的步骤。
2.2.1.1 下载
从Snort的网站(http://www.snort.org)下载最新版的Snort。在写本书的时候,最新版的二进制文件是snort-1.9.0-1snort.i386.rpm。
2.2.1.2 安装
运行下面的命令来安装Snort的二进制文件:
rpm –install snort-1.9.0-1snort.i386.rpm
这个命令会产生下面的动作:
n 创建/etc/snort目录,n 其中会存放Snort的规则文件和配置文件。
n 创建/var/log/snort目录,n Snort的日志文件将会存放在这里。
n 创建/usr/share/doc/snort-1.9.0目录来存放Snort的文档文件,n 在这个目录中,n 你会看到类似于FAQ,README的文件和其他一些文件。
n 在/usr/sbin目录中创建一个叫做snort-plain的文件,n 这是Snort的守护进程。 创建文件 /etc/rc.d/init.d/snortd文件,n 这是启动和关闭脚本。在RedHat Linux中,n 它与/etc/init.d/snortd等价。
到这里基本安装就完成了,你可以开始使用Snort。这个版本的Snort并没有将对数据库的支持编译进去,你只能用/var/log/snort目录下面的日志文件。
2.2.1.3 Snort的启动,停止和重启
用下面的命令手工启动Snort:
/etc/init.d/snortd start
这个命令将启动Snort守护进程,运行“ps –ef”命令,你可以看到类似于下面的输出:
root 15999 1 0 18:31 ? 00:00:01 /usr/sbin/
snort -A fast -b -l /var/log/snort -d -D -i eth0 -c /etc/
snort/snort.conf
注意每次你重启机器,你都要手工启动Snort。你可以通过创建文件链接的方式让这个过程自动执行,这将在本章的后面讨论。
用下面的命令停止Snort:
/etc/init.d/snortd stop
用下面的命令重新启动Snort:
/etc/init.d/snortd restart
2.2.2 用源代码安装Snort
为了能够用源代码安装Snort,你必须先构造它。你可以用下面介绍的步骤来构造出可执行文件snort。首先从Snort网站(http://www.snort.org)获得最新版的Snort。在写这本书的时候,最新版的Snort是1.9.0,下载文件的名称是snort-1.9.0.tar.gz,下载后可以保存在/opt目录中。注意在你读这本书的时候可能会是更新的版本,安装方法也类似。
2.2.2.1 解压缩
下载后第一步要把源代码解压缩,用下面的命令来执行:
tar zxvf snort-1.9.0.tar.gz
这 样会创建/opt/snort-1.9.0目录。确定你将文件下载到/opt目录,并且你在这个目录运行tar命令。如果是其他版本的Snort,目录名 称可能会有所不同,目录名称会反映版本号。解压缩后你可以运行tree命令来观察tar命令建立的目录树,如下所示是/opt/snort-1.9.0的 目录树:
[root@conformix opt]# tree -d snort-1.9.0
snort-1.9.0
|– contrib
|– doc
|– etc
|– rules
|– src
| |– detection-plugins
| |– output-plugins
| |– preprocessors
| `– win32
| |– WIN32-Code
| |– WIN32-Includes
| | |– NET
| | |– NETINET
| | |– libnet
| | |– mysql
| | `– rpc
| |– WIN32-Libraries
| | |– libnet
| | `– mysql
| `– WIN32-Prj
`– templates
21 directories
[root@conformix opt]#
这些目录中的主要内容如下所示:
contrib目录主要包括并非严格输入Snort自身组成部分的应用软件,这些软件包括ACID,MySQL数据库生成脚本和其他。
doc目录包含文档文件。
etc目录包含配置文件。
rules目录包含预先定义的规则文件。
所有的源代码在src目录下面。
templates是为那些准备自己写插件的人准备的,这对大多数Snort用户没有意义。
2.2.2.2 编译和安装
编译和安装过程包括下列3个步骤:
运行configure脚本。
运行make命令。
运行make install命令。
开 始Snort的编译过程,首先去/opt/snort-1.9.0目录并运行configure脚本。如果你刚刚开始接触GNU类的软件,你需要了解 configure脚本是开放源码软件包通用的工具,它可以用来设置参数,创建makefile,检测开发工具和你系统中的库文件。运行 configure脚本的时候,有许多命令行选项,这些选项决定Snort编译时将带有那些组件。比如,用这些选项,你可以构建对SNMP、MySQL或 SMB告警的支持以及其他很多事情。你同样也可以定制Snort文件的最终安装位置。你可以用“./configure –help”命令来察看可用的选项,如下所示:
# ./configure –help
`configure’ configures this package to adapt to many kinds of systems.Usage: ./configure [OPTION]… [VAR=VALUE]…

To assign environment variables (e.g., CC, CFLAGS…), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
-h, –help display this help and exit
–help=short display options specific to this package
–help=recursive display the short help of all the included packages
-V, –version display version information and exit
-q, –quiet, –silent do not print `checking…’ messages
–cache-file=FILE cache test results in FILE [disabled]
-C, –config-cache alias for `–cache-file=config.cache’
-n, –no-create do not create output files
–srcdir=DIR find the sources in DIR [configure dir or `..']

Installation directories:
–prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
–exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]

By default, `make install’ will install all the files in
`/usr/local/bin’, `/usr/local/lib’ etc. You can specify
an installation prefix other than `/usr/local’ using `–prefix’,
for instance `–prefix=$HOME’.

For better control, use the options below.

Fine tuning of the installation directories:
–bindir=DIR user executables [EPREFIX/bin]
–sbindir=DIR system admin executables [EPREFIX/sbin]
–libexecdir=DIR program executables [EPREFIX/libexec]
–datadir=DIR read-only architecture-independent data [PREFIX/share]
–sysconfdir=DIR read-only single-machine data [PREFIX/etc]
–sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
–localstatedir=DIR modifiable single-machine data [PREFIX/var]
–libdir=DIR object code libraries [EPREFIX/lib]
–includedir=DIR C header files [PREFIX/include]
–oldincludedir=DIR C header files for non-gcc [/usr/include]
–infodir=DIR info documentation [PREFIX/info]
–mandir=DIR man documentation [PREFIX/man]

Program names:
–program-prefix=PREFIX prepend PREFIX to installed program names
–program-suffix=SUFFIX append SUFFIX to installed program names
–program-transform-name=PROGRAM run sed PROGRAM on installed program names

System types:
–build=BUILD configure for building on BUILD [guessed]
–host=HOST cross-compile to build programs to run on HOST [BUILD]

Optional Features:
–disable-FEATURE do not include FEATURE (same as –enable-FEATURE=no)
–enable-FEATURE[=ARG] include FEATURE [ARG=yes]
–disable-dependency-tracking Speeds up one-time builds
–enable-dependency-tracking Do not reject slow dependency extractors
–enable-debug enable debugging options (bugreports and developers only)
–enable-profile enable profiling options (developers only)
–enable-sourcefire Enable Sourcefire specific build options
–enable-perfmonitor Enable perfmonitor preprocessor
–enable-linux-smp-stats Enable statistics reporting through proc
–enable-flexresp Flexible Responses on hostile connection attempts

Optional Packages:
–with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
–without-PACKAGE do not use PACKAGE (same as –with-PACKAGE=no)
–with-libpcap-includes=DIR libpcap include directory
–with-libpcap-libraries=DIR libpcap library directory
–with-libnet-includes=DIR libnet include directory
–with-libnet-libraries=DIR libnet library directory
–with-mysql=DIR support for mysql
–with-odbc=DIR support for odbc
–with-postgresql=DIR support for postgresql
–with-oracle=DIR support for oracle

Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
nonstandard directory <lib dir>
CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
headers in a nonstandard directory <include dir>
CPP C preprocessor

Use these variables to override the choices made by `configure’ or to help
it to find libraries and programs with nonstandard names/locations
方括号中的值表示如果该选项如果没有被设定,系统就会选择该默认值。例如:– prefix选项帮助第二行表示,如果没有设定—prefix选项,系统就会选择默认值/usr/local。PREFIX是指当你运行“make install”命令的时候Snort文件要安装的目录。
–prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
运行configure脚本的典型会话如下所示。为节省空间,输出信息作了删减。注意命令行中打开的选项。
[root@conformix snort-1.9.0]# ./configure –prefix=/opt/snort
–enable-smbalerts –enable-flexresp –with-mysql –with-snmp
–with-openssl
loading cache ./config.cache
checking for a BSD compatible install… (cached) /usr/bin/
install -c
checking whether build environment is sane… yes
checking whether make sets ${MAKE}… (cached) yes
checking for working aclocal… found
checking for working autoconf… found
checking for working automake… found
checking for working autoheader… found
checking for working makeinfo… found
checking for gcc… (cached) gcc
checking whether the C compiler (gcc ) works… yes
checking whether the C compiler (gcc ) is a cross-compiler…
no
checking whether we are using GNU C… (cached) yes
checking whether gcc accepts -g… (cached) yes
checking for gcc option to accept ANSI C… (cached) none
needed
checking for ranlib… (cached) ranlib
输出信息作了删件,因为configure命令会产生大量的信息。选项prefix告诉configuire脚本程序最终的安装位置。其他的选项用来使下列Snort组件生效:
对MySQL数据库的支持。
对SNMP trap信息的支持。
对SMB告警的支持。SMB告警用来向Windows发出弹出窗口告警。
对flex响应的支持。Flex响应用来实时终止网络会话。后面的章节将提供关于flex响应的更多信息。注意你的系统必须安装了libnet才能够使用这个选项。你可以从http://www.securityfocus.net下载libnet。我是用1.0.2a版来完成安装的。
运行完configure脚本后,你可以运行下面两个命令来编译和安装Snort。
make
make install
你 一个命令也许要一些时间来完成,这要看你的计算机的能力。当你运行完第二个命令,文件就会被安装到适当的目录中去了。因为你在运行configure脚本 的时候选择了–prefix=/opt/snort,因此make install命令将Snort二进制文件安装到/opt/snort目录中去。
运行configure脚本的可用参数见表2-1
表2-1 configure脚本参数一览表

参数 描述
–with-mysql 构建Snort对Mysql的支持
–with-snmp 构建Snort对SNMP的支持。如果用这个选项,必须同时选-—with-openssl
–with-openssl 对OpenSSL的支持。当你选—with-snmp时要选择这个选项。
–with-oracle 对Oracle数据库的支持。
–with-odbc 构建Snort对ODBC的支持。
–enable-flexresp 使Snort能够使用Flex响应,以能够终止恶意的连接。目前这个选项还在实验中(察看Snort发布的README.FLEXRESP文件)。
–enable-smbalerts 使Snort能够发送SMB告警。注意每次告警时都会占用客户端的用户空间。
–Prefix=DIR 设置安装Snort文件的目录。
在运行“make install”命令之前,你也可以运行“make check”命令来确定Snort的构建是否正确。
安装完毕之后,运行Snort来看看是否可执行文件可以工作。在完成前面的步骤后,Snort的二进制文件会被安装在/opt/snort/bing目录中。下面的命令会显示新安装的snort的基本帮助信息和命令行选项。

如果你看到这样的信息,你的Snort就安装正确了。在下一部分,你将了解如何配置和运行Snort。
2.2.2.3 安装完后要做的工作
现在你已经安装好了Snort二进制文件,但是还有些事情要做:
创建/var/log/snort目录作为Snort默认的存放日至文件的地方。
创建一个存放配置文件的目录。我创建的是/opt/snort/etc目录,你可以创建自己的目录。
创建或者复制配置文件到/opt/snort/etc目录下。
创建目录/opt/snort/rules并且将默认的规则文件拷贝到里面。这个目录会在snort.conf文件中指定,你可以创建自己喜欢的目录。

下面来详细解释这些步骤:
首先,创建/var/log/snort目录让Snort存放日志文件。你也可以用其它的目录,但是这个目录是惯常使用的。如果你用其他任何目录,你需要在启动Snort的时候用命令行选项-l来指定。
然后,要创建Snort配置文件。当Snort启动的时候,将从当前目录读取配置文件snort.conf或者从运行Snort的用户属主目录读取. snortrc文件。如果这个文件在其他目录中,你也可以用命令行选项-c来指定。开始的时候,你可以将Snort源代码中附带的snort.conf文 件拷贝到你创建的/opt/snort/etc目录下面。同时也把classification.config和reference.config文件拷 贝进去,这两个文件是snort.conf文件要引用的。另外将源代码中rules目录下面的所有文件拷贝到/opt/snort/rules目录下面。 参考下列命令实现这些步骤:
mkdir /opt/snort/etc
cp /opt/snort-1.9.0/etc/snort.conf /opt/snort/etc
cp /opt/snort-1.9.0/etc/classification.config /opt/snort/etc
cp /opt/snort-1.9.0/etc/reference.config /opt/snort/etc
mkdir /opt/snort/rules
cp /opt/snort-1.9.0/rules/* /opt/snort/rules
rules目录中以.rules为后缀的文件中包含了各种规则,这些文件被snort.conf文件引用。这些rules文件的位置由snort.conf文件中定义的RULE_PATH变量控制,该变量在snort.conf中的定义一般如下表示:
var RULE_PATH ../rules
它说明rules文件的位置在名叫rules的目录下。例如,如果snort.conf文件在/opt/snort/etc目录中,那么所有的规则文件就 应该在/opt/snort/rules目录下。又例如如果snort.conf文件在/var/snort目录下,那么规则文件必须在 /var/rules目录中。你也可以将snort.conf与所有规则文件放在同一目录下面,只是你要将snort.conf文件中rules位置变量 的值由../变成./:
var RULE_PATH ./
在下一章中,你将了解更多的关于Snort规则的信息,同时你也将了解如何定义自己的规则。
classification.config文件中包括了关于Snort规则分类的信息,你将在下一章中了解更多信息。在本书的例子中,Snort的所有源代码文件在/opt/snort-1.9.0目录中,如果你用的是不同版本的Snort,该目录也会不同。
Reference.config文件中罗列了一些关于各种告警信息的参考网站的URL,这些参考将在Snort规则中引用,你会在下一章了解更多信息。典型的reference.config文件如下所示:
# $Id: reference.config,v 1.3 2002/08/28 14:19:15 chrisgreen
Exp $
# The following defines URLs for the references found in the
rules
#
# config reference: system URL
config reference: bugtraq http://www.securityfocus.com/bid/
config reference: cve http://cve.mitre.org/cgi-bin/
cvename.cgi?name=
config reference: arachNIDS http://www.whitehats.com/info/IDS
# Note, this one needs a suffix as well…. lets add that in a
bit.
config reference: McAfee http://vil.nai.com/vil/content/v_
config reference: nessus http://cgi.nessus.org/plugins/
dump.php3?id=
config reference: url http://
注意:classification和reference.config文件都会被主配置文件snort.conf引用。
现在你可以用下面的命令运行Snort了,这个命令会显示启动信息,然后监听eth0接口。注意为了避免一些困扰,这个命令用命令行选项指定了snort.conf文件的绝对目录。
[root@conformix snort]# /opt/snort/bin/snort -c /opt/snort/
etc/snort.conf
Initializing Output Plugins!
Log directory = /var/log/snort
Initializing Network Interface eth0
–== Initializing Snort ==–
Decoding Ethernet on interface eth0
Initializing Preprocessors!
Initializing Plug-ins!
Parsing Rules file /opt/snort/etc/snort.conf
+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains…
No arguments to frag2 directive, setting defaults to:
Fragment timeout: 60 seconds
Fragment memory cap: 4194304 bytes
Fragment min_ttl: 0
Fragment ttl_limit: 5
Fragment Problems: 0
Stream4 config:
Stateful inspection: ACTIVE
Session statistics: INACTIVE
Session timeout: 30 seconds
Session memory cap: 8388608 bytes
State alerts: INACTIVE
Evasion alerts: INACTIVE
Scan alerts: ACTIVE
Log Flushed Streams: INACTIVE
MinTTL: 1
TTL Limit: 5
Async Link: 0
No arguments to stream4_reassemble, setting defaults:
Reassemble client: ACTIVE
Reassemble server: INACTIVE
Reassemble ports: 21 23 25 53 80 143 110 111 513
Reassembly alerts: ACTIVE
Reassembly method: FAVOR_OLD
http_decode arguments:
Unicode decoding
IIS alternate Unicode decoding
IIS double encoding vuln
Flip backslash to slash
Include additional whitespace separators
Ports to decode http on: 80
rpc_decode arguments:
Ports to decode RPC on: 111 32771
telnet_decode arguments:
Ports to decode telnet on: 21 23 25 119
Conversation Config:
KeepStats: 0
Conv Count: 32000
Timeout : 60
Alert Odd?: 0
Allowed IP Protocols: All
Portscan2 config:
log: /var/log/snort/scan.log
scanners_max: 3200
targets_max: 5000
target_limit: 5
port_limit: 20
timeout: 60
1273 Snort rules read…
1273 Option Chains linked into 133 Chain Headers
0 Dynamic rules
+++++++++++++++++++++++++++++++++++++++++++++++++++
Rule application order: ->activation->dynamic->alert->pass-
>log
–== Initialization Complete ==–
-*> Snort! <*-
Version 1.9.0 (Build 209)
By Martin Roesch (roesch@sourcefire.com, www.snort.org)
正 如你看到的这些输出信息,Snort已经开始监听eth0接口了。如果有任何包与规则匹配,Snort就会根据规则做出相应的动作并发出告警。告警可以以 多种形式发出。在这种基本方式中,告警将被记录到/var/log/snort/alerts文件中。后面,你将看到产生其他形式的告警并将它们记录到数 据库中的方法,同时你也会了解Snort告警的数据文件的格式。
你可以在任何时候同时按下ctrl键和c键来终止Snort进程,这时Snort将显示程序活动的概要然后退出,如下所示:
==========================================================
Snort analyzed 65 out of 65 packets, dropping 0(0.000%)
packets
Breakdown by protocol: Action Stats:
TCP: 55 (84.615%) ALERTS: 10
UDP: 10 (15.385%) LOGGED: 10
ICMP: 0 (0.000%) PASSED: 0
ARP: 0 (0.000%)
EAPOL: 0 (0.000%)
IPv6: 0 (0.000%)
IPX: 0 (0.000%)
OTHER: 0 (0.000%)
DISCARD: 0 (0.000%)
==========================================================
Wireless Stats:
Breakdown by type:
Management Packets: 0 (0.000%)
Control Packets: 0 (0.000%)
Data Packets: 0 (0.000%)
==========================================================
Fragmentation Stats:
Fragmented IP Packets: 0 (0.000%)
Fragment Trackers: 0
Rebuilt IP Packets: 0
Frag elements used: 0
Discarded(incomplete): 0
Discarded(timeout): 0
Frag2 memory faults: 0
==========================================================
TCP Stream Reassembly Stats:
TCP Packets Used: 55 (84.615%)
Stream Trackers: 1
Stream flushes: 0
Segments used: 0
Stream4 Memory Faults: 0
==========================================================
Snort received signal 2, exiting
[root@conformix snort]#
前 面提到的方法是在前台运行Snort,用这种方式运行Snort你在终端会失去提示符。你可以用命令行开关-D来在后台运行Snort,这样Snort仍 然将告警信息记录到/var/log/snort,同时你得到了提示符。注意,如果你是用RPM包安装的Snort,那么你可以用 “/etc/init.d/snortd start”命令使Snort在后台运行。

2.2.3 Snort启动时的错误
如果你是自己编译的Snort,启动Snort的时候,有时会看到下面的错误信息:
[!] ERROR: Cannot get write access to logging directory “/var/
log/snort”.
(directory doesn’t exist or permissions are set incorrectly
or it is not a directory at all)
Fatal Error, Quitting..
造成这个错误的原因是你没有创建/var/log/snort目录。运行“mkdir /var/log/snort”然后再启动Snort这个错误就消失了。
如果你看到下面的错误信息,说明你在启动Snort没有在命令行中正确指定配置文件的时候没有指定配置文件。
Initializing rule chains…
ERROR: Unable to open rules file: /root/.snortrc or /root//
root/.snortrc
Fatal Error, Quitting..
注意:你可以下列情况,你可以不指定配置文件:
你在配置文件所在的目录启动Snort。
你已经将配置文件复制到你的属主目录中的.snortrc文件中。
2.2.4 测试Snort
在启动Snort后,你需要知道Snort是否真正开始捕获数据并纪录入侵行为。如果你在前台用命令行选项“-A console”来启动Snort,你将在终端屏幕上看到告警信息。如果你用守护进程模式启动Snort而不用上面的命令行选项,那么告警就记录到 /var/log/snort/alert文件中。
下面的命令将使你在控制台或者/var/log/snort/alert文件中看到一些告警信息,你可以判断Snort是否正常工作:
ping -n -r -b 255.255.255.255 -p “7569643d3028726f6f74290a” -c3
如果你用“-A console”命令行选项,你应该在屏幕上来到类似于下面的告警:
11/19-18:51:04.560952 [**] [1:498:3] ATTACK RESPONSES id
check returned root [**] [Classification: Potentially Bad
Traffic] [Priority: 2] {ICMP} 10.100.1.105 -> 255.255.255.255
2.2.4.1 产生测试告警
下面的名为snort-test.sh的脚本可以在http://authors.phptr.com/rehman/上找到。它的基本作用于上面的命令类似,不过能够在以守护进程模式运行Snort的时候用到。
1 #!/bin/sh
2 #
3 ###############################################################
4 # You are free to copy and distribute this script under #
5 # GNU Public License until this part is not removed #
6 # from the script. #
7 ###############################################################
8 # HOW TO USE #
9 # #
10 # Right after installation of Snort, run this script. #
11 # It will generate alerts in /var/log/snort/alert file similar#
12 # to the following: #
13 # #
14 # Note that Snort must be running at the time you run this #
15 # script. #
16 # #
17 # [**] [1:498:3] ATTACK RESPONSES id check returned root [**] #
18 # [Classification: Potentially Bad Traffic] [Priority: 2] #
19 # 08/31-15:56:48.188882 255.255.255.255 -> 192.168.1.111 #
20 # ICMP TTL:150 TOS:0×0 ID:0 IpLen:20 DgmLen:84 #
21 # Type:0 Code:0 ID:45596 Seq:1024 ECHO REPLY #
22 # #
23 # These alerts are displayed at the end of the script. #
24 ###############################################################
25 #
26 clear
27 echo “###############################################################”
28 echo “# Script to test Snort Installation #”
29 echo “# Written By #”
30 echo “# #”
31 echo “# Rafeeq Rehman #”
32 echo “# rr@argusnetsec.com #”
33 echo “# Argus Network Security Services Inc. #”
34 echo “# http://www.argusnetsec.com #”
35 echo “###############################################################”
36 echo
37
38 echo
39 echo “###############################################################”
40 echo “The script generates three alerts in file /var/log/snort/alert”
41 echo “Each alert should start with message like the following:”
42 echo
43 echo ” \”ATTACK RESPONSES id check returned root\” ”
44 echo “###############################################################”
45 echo
46 echo “Enter IP address of any other host on this network. If you”
47 echo “don’t know any IP address, just hit Enter key. By default”
48 echo -n “broacast packets are used [255.255.255.255] : ”
49
50 read ADDRESS
51
52 if [ -z $ADDRESS ]
53 then
54 ADDRESS=”255.255.255.255″
55 fi
56
57 echo
58 echo “Now generating alerts. If it takes more than 5 seconds, break”
59 echo “the script by pressing Ctrl-C. Probably you entered wrong IP”
60 echo “address. Run the script again and don’t enter any IP address”
61
62 ping -i 0.3 -n -r -b $ADDRESS -p “7569643d3028726f6f74290a” -c3 2>/dev/
null >/dev/null
63
64 if [ $? -ne 0 ]
65 then
66 echo “Alerting generation failed.”
67 echo “Aborting …”
68 exit 1
69 else
70 echo
71 echo “Alert generation complete”
72 echo
73 fi
74
75 sleep 2
76
77
78 echo
79 echo “################################################################”
80 echo “Last 18 lines of /var/log/snort/alert file will be displayed now”
81 echo “If snort is working properly, you will see recently generated”
82 echo “alerts with current time”
83 echo “################################################################”
84 echo
85 echo “Hit Enter key to continue …”
86 read ENTER
87
88 if [ ! -f /var/log/snort/alert ]
89 then
90 echo “The log file does not exist.”
91 echo “Aborting …”
92 exit 1
93 fi
94
95 tail -n18 /var/log/snort/alert
96
97 echo
98 echo “Done”
99 echo
该脚本将产生一些告警,如果你用守护进程模式运行Snort,你可以在/var/log/snort/alert文件中看到,或者你可以在你运行 Snort的终端屏幕上看到。导致告警的原因是发送了定制的ICMP echo包,定制的特征将触发下列Snort规则,并产生一个告警。
alert ip any any -> any any (msg:”ATTACK RESPONSES id check
returned root”; content: “uid=0(root)”; classtype:bad-unknown;
sid:498; rev:3;)
告警产生后,脚本将显示/var/log/snort/alert文件的最后18行信息。
现在让我们来看看脚本的各个部门以及它是如何运作的。第52到55行的作用是提示用户输入ping包发送目标的地址,如果用户没有输入,脚本就会采用255.255.255.255这个地址,ping包就会作为广播包发送。
第62行的作用是产生触发规则的ICMP包。注意在这里“7569643d3028726f6f74290a”
事实上与“uid=0(root)”是等价的,这样的特征可以产生告警。
命令行参数-c3的作用是产生3个包。并且标准输入和错误都被重定向到/dev/null中去了,因此不会产生屏幕输出。你可以用“man ping”命令来察看ping命令的man page以获得更多的信息。
第64行到第73行的作用是检查ping命令的输出结果。输出的信息将显示ping命令执行结果的成功或者失败。如果命令失败,脚本就在这里退出,不再执行下面的过程。
如果告警成功产生,它们一定会出现在/var/log/snort/alert文件中。脚本88到93行用来检测这个文件是否存在,如果不存在,脚本就退出运行。
如果一切正常,第95行的作用就是显示/var/log/snort/alert文件的最后18行内容。
2.2.4.2 自动启动Snort并产生自动告警的脚本
如果你将Snort安装到/opt/snort目录下,你也可以用下面的脚本来自动启动和停止Snort并检验其工作是否正常。在运行这个脚本之前要确定 Snort还没有启动,因为这个脚本将自己启动Snort。这个名为snort-test-auto.sh的脚本文件可以在本书的相关网站http://authors.phptr.com/rehman中找到。
1 #!/bin/sh
2 #
3 ###############################################################
4 # You are free to copy and distribute this script under #
5 # GNU Public License until this part is not removed #
6 # from the script. #
7 ###############################################################
8 # HOW TO USE #
9 # #
10 # Right after installation of Snort, run this script. #
11 # It is assumed that snort executable is present in the #
12 # /opt/argus/bin directory and all rules and configuration #
13 # files are present under /opt/argus/etc/snort directory. #
14 # If files are in other locations, edit the following location#
15 # of variables. If you used the installation script provided #
16 # along with this script, the files will be automatically #
17 # located in appropriate directories. #
18 # #
19 # Note that the script starts and stops Snort by itself and #
20 # you should make sure that Snort is not running at the time #
21 # you run this script. #
22 # #
23 # It will generate alerts in /tmp/alert file similar #
24 # to the following: #
25 # #
26 # [**] [1:498:3] ATTACK RESPONSES id check returned root [**] #
27 # [Classification: Potentially Bad Traffic] [Priority: 2] #
28 # 08/31-15:56:48.188882 255.255.255.255 -> 192.168.1.111 #
29 # ICMP TTL:150 TOS:0×0 ID:0 IpLen:20 DgmLen:84 #
30 # Type:0 Code:0 ID:45596 Seq:1024 ECHO REPLY #
31 # #
32 # These alerts are displayed at the end of the script. #
33 ###############################################################
34 #
35
36 PREFIX=/opt/snort
37 SNORT=$PREFIX/bin/snort
38 SNORT_CONFIG=$PREFIX/etc/snort.conf
39 LOG_DIR=/tmp
40 ALERT_FILE=$LOG_DIR/alert
41 ALERT_FILE_OLD=$LOG_DIR/alert.old
42 ADDRESS=”255.255.255.255″
43
44 clear
45
46 echo “###############################################################”
47 echo “# Script to test Snort Installation #”
48 echo “# Written By #”
49 echo “# #”
50 echo “# Rafeeq Rehman #”
51 echo “# rr@argusnetsec.com #”
52 echo “# Argus Network Security Services Inc. #”
53 echo “# http://www.argusnetsec.com #”
54 echo “###############################################################”
55 echo
56
57 echo
58 echo “###############################################################”
59 echo “The script generates three alerts in file /tmp/alert”
60 echo “Each alert should start with message like the following:”
61 echo
62 echo ” \”ATTACK RESPONSES id check returned root\” ”
63 echo “###############################################################”
64 echo
65
66 if [ ! -d $LOG_DIR ]
67 then
68 echo “Creating log directory …”
69 mkdir $LOG_DIR
70
71 if [ $? -ne 0 ]
72 then
73 echo “Directory $LOGDIR creation failed”
74 echo “Aborting …”
75 exit 1
76 fi
77 fi
78
79 if [ -f $ALERT_FILE ]
80 then
81 mv -f $ALERT_FILE $ALERT_FILE_OLD
82
83 if [ $? -ne 0 ]
84 then
85 echo “Can’t rename old alerts file.”
86 echo “Aborting …”
87 exit 1
88 fi
89 fi
90
91 if [ ! -f $SNORT ]
92 then
93 echo “Snort executable file $SNORT does not exist.”
94 echo “Aborting …”
95 exit 1
96 fi
97
98 if [ ! -f $SNORT_CONFIG ]
99 then
100 echo “Snort configuration file $SNORT_CONFIG does not exist.”
101 echo “Aborting …”
102 exit 1
103 fi
104
105 if [ ! -x $SNORT ]
106 then
107 echo “Snort file $SNORT is not executable.”
108 echo “Aborting …”
109 exit 1
110 fi
111
112 echo “Starting Snort …”
113 $SNORT -c $SNORT_CONFIG -D -l /tmp 2>/dev/null
114
115 if [ $? -ne 0 ]
116 then
117 echo “Snort startup failed.”
118 echo “Aborting …”
119 exit 1
120 fi
121
122 echo
123 echo “Now generating alerts.”
124
125 ping -i 0.3 -n -r -b $ADDRESS -p “7569643d3028726f6f74290a” -c3 2>/dev/
null >/dev/null
126
127 if [ $? -ne 0 ]
128 then
129 echo “Alerting generation failed.”
130 echo “Aborting …”
131 exit 1
132 else
133 echo
134 echo “Alert generation complete”
135 echo
136 fi
137
138 sleep 2
139
140 tail -n18 $ALERT_FILE 2>/dev/null | grep “ATTACK RESPONSES id check” >/
dev/null
141
142 if [ $? -ne 0 ]
143 then
144 echo “Snort test failed.”
145 echo “Aborting …”
146 exit 1
147 fi
148
149 echo “Stopping Snort …”
150 pkill snort >/dev/null 2>&1
151
152 if [ $? -ne 0 ]
153 then
154 echo “Snort stopping failed.”
155 echo “Aborting …”
156 exit 1
157 fi
158
159 echo
160 echo “Done. Snort installation is working properly”
161 echo
也许你会注意到,如果脚本成功产生,这个脚本将在/tmp目录中创建告警文件。如果你运行脚本一切正常,你将看到下面的输出信息:
###########################################################
# Script to test Snort Installation #
# Written By #
# #
# Rafeeq Rehman #
# rr@argusnetsec.com #
# Argus Network Security Services Inc. #
# http://www.argusnetsec.com #
###########################################################
###########################################################
The script generates three alerts in file /tmp/alert
Each alert should start with message like the following:
“ATTACK RESPONSES id check returned root”
##########################################################
Starting Snort …
Now generating alerts.
Alert generation complete
Stopping Snort …
Done. Snort installation is working properly
在你运行这个脚本的时候,它将会做一系列的事情。首先在36行到42行它定义了一些变量。
在定义变量之后,脚本将做以下的事情:
第66到67行用来检测$LOG_DIR目录是否存在。第39行中定义了这个目录为/tmp。如果这个目录不存在,脚本将创建它。
第78到79行用来检测$ALERT_FILE文件是否存在,也就是/tem/alert,如果已经存在,那么脚本将其更名为/tmp/alert.old。
第91到96行用来检测Snort的二进制文件是否存在,在这里也就是/opt/snort/bin/snort。如果这个文件不存在,脚本就终止执行。
第98到103行用来检测$SNORT_CONFIG文件,在这里也就是/opt/snort/etc/snort.conf文件是否存在,如果不存在,脚本就终止执行。
第105到110行用来确定Snort的二进制文件可以正常执行。
第113行用来启动Snort.
第115到120行用来检测Snort启动是否正常。
第125行用来产生前面提到的告警,这些告警将被发送到广播地址。
第127到136行用来确定告警产生过程是否正常。
第140行用来检测alert文件中的最后18行已确定告警是否成功产生以及是否正常记录日志。
第142到147行的作用是如果第140行测试的结果失败,就显示一个错误信息。
第150行用来停止Snort。
第160行显示信息表示测试过程成功。
2.2.5 在非默认端口运行Snort
在Linux系统中,Snort启动的时候就开始监听网络eth0。但是很多人在有多个接口的机器上运行Snort。如果你想让Snort监听其它的接口,你要用到命令行选项-I。下面的命令可以启动Snort使其监听网络接口eth1。
snort -c /opt/snort/etc/snort.conf –i eth1
在自动和关闭Snort的情况下,你需要修改脚本/etc/init.d/snortd以使Snort启动的时候监听你所希望的端口。关于Snort的自动自动和关闭在下一部分解释。
2.2.6 Snort的自动启动和关闭
你可以配置Snort使其在系统启动和关闭的时候自动启动和关闭。在UNIX类的机器上,你可以用脚本来完成这项工作,在Linux中,可以在 /etc/init.d/目录下创建这样的脚本。启动脚本可以链接到/etc/rc3.d目录下,关闭脚本可以链接到/etc/rc2.d、 /etc/rc1.d和/etc/rc0.d目录下。Snort的RPM发布版中捆绑的/etc/init.d/snortd脚本文件大体如下所示:
[root@conformix]# cat /etc/init.d/snortd
#!/bin/sh
#
# snortd Start/Stop the snort IDS daemon.
#
# chkconfig: 2345 40 60
# description: snort is a lightweight network intrusion
# detection tool that
# currently detects more than 1100 host and network
# vulnerabilities, portscans, backdoors, and more.
#
# June 10, 2000 — Dave Wreski <dave@linuxsecurity.com>
# – initial version
#
# July 08, 2000 Dave Wreski <dave@guardiandigital.com>
# – added snort user/group
# – support for 1.6.2
# July 31, 2000 Wim Vandersmissen <wim@bofh.st>
# – added chroot support
# Source function library.
. /etc/rc.d/init.d/functions
# Specify your network interface here
INTERFACE=eth0
# See how we were called.
case “$1″ in
start)
echo -n “Starting snort: ”
cd /var/log/snort
daemon /usr/sbin/snort -A fast -b -l /var/log/snort \
–d -D -i $INTERFACE -c /etc/snort/snort.conf
touch /var/lock/subsys/snort
echo
;;
stop)
echo -n “Stopping snort: ”
killproc snort
rm -f /var/lock/subsys/snort
echo
;;
restart)
$0 stop
$0 start
;;
status)
status snort
;;
*)
echo “Usage: $0 {start|stop|restart|status}”
exit 1
esac
exit 0
[root@conformix /root]#
要 注意的是,启动和关闭Snort都会用这同一个文件。在某一运行级别,链接文件名的第一个字符用来确定这个脚本是用来启动还是用来关闭Snort。启动链 接以S开头,如运行级别3中的启动文件/etc/rc3.d/S50snort,实际上它是链接到/etc/init.d/snortd文件的。与之类 似,用来关闭的脚本链接文件以K开头,例如/etc/rc2.d/K50snort,这样将在运行级别2关闭Snort。
同时,你也可以用脚本来手工启动和关闭Snort,下面的两个命令分别用来启动和关闭Snort:
/etc/init.d/snortd start
/etc/init.d/snortd stop
注意脚本在同运行级别目录中的链接可能会有不同的名称。脚本链接文件的名字依赖于在系统启动关闭过程中Snort所处的位置。如果你用RPM安装的Snort,那么这些链节将在安装RPM包的过程中被创建。
2.3 在多个网络接口上运行Snort
当Snort启动的时候,将在某个端口上监听网络通信。你可以用命令行选项-I <interface_name>来指定你想监听的接口。如果你想同时监听多个网络接口,那么你需要同时运行多个Snort的副本。例如,下 面两个命令用来在Linux机器上监听eth0接口和eth1接口。
/opt/snort/bin/snort -c /opt/snort/etc/snort.conf -i eth0 -l /
var/log/snort0
/opt/snort/bin/snort -c /opt/snort/etc/snort.conf -i eth1 -l /
var/log/snort1
我们看到这两个命令用到了两个日志目录:/var/log/snort0和/var/log/snort1,因此这两个Snort进程将分别保存自己的日志。在你启动Snort的时候,这两个目录必须已经存在。
如果根据snort.conf文件的配置,Snort将日志记录到MySQL数据库中,那么日志将被记录到同一个数据库中。
你需要了解,你也可以给不同的Snort进程使用不同的配置文件,这样做的目的有很多个。主要原因是你的不同网络接口所连接的网络是不同的,另一个原因是你可以让一个接口的Snort将日志记录到数据库中,而另外一个记录到系统日志中。见图2-2:
2.4 Snort命令行选项
Snort有很多命令行选项,可以让你在启动Snort的时候根据情况选择。正如你在前面看到的,你可以在一个系统上运行多个Snort。你可以用命令“Snort -?”来显示命令行选项。最常用的一些命令行选项如表2-2所示。

选项 描述
-A 用来设置告警模式。告警模式用来设置告警数据的详细程度。可用的模式有fast,full,console和none。你在前面已经看到console模式是在屏幕上显示告警而不记录到文件。Fast模式在Snort运行在高速网络环境中能够用得到。
-b 这个选项用来将日志记录为tcpdump格式,这样记录日志的速度非常快,然后你可以用tcpdump程序来察看数据。
-c 这是最常用的选项,用来指定snort.conf文件的位置。如果你用这个选项指定,Snort就不会在默认位置找snort.conf文件。例如,如果 snort.conf文件在/etc目录中,你要用命令行选项”-c /etc/snort.conf”来启动Snort。
-D 这个选项用来使Snort在后台运行,在多数实用情况,会用到这个选项。在安装完测试的时候,不要用这个选项。
-i 这个选项用来指定Snort监听的网络接口。当你有多个网络接口并想监听其中一个的时候,这个选项使非常有用的。而且在你运行多个Snort来监听多个接 口的时候,也会用到这个选项。例如你只想监听eth1接口,那么在启动Snort的时候用“-i eth1”选项。
-l 这个选项用来指定Snort记录日志的目录,默认目录是/var/log/snort。例如,你想将所有的日志文件记录到/snort目录下,你应当用命令行选项“-l /snort”。
-M 为使用这个选项,你应当指定一个文本文件。这个文本文件中包含了一些你想发送信息的Windows主机的列表,每行只包括一个IP地址。注意你可以用snort.conf文件达到同样的目的,这将在后面解释。
-T 这个选项在你做测试和报告的时候是非常有用的。你可以用这个选项来找出配置文件中的错误。

除了表中列举的,还有一些不太常用的选项,这些选项将在后面的相关部分到论。一些命令行选项的功能也可以通过snort.conf来实现。

2.5 用源代码编译并安装Snort的步骤总结
由RPM包安装Snort是非常简单的,你只需要运行一个命令就可以了:“rpm -install <snort_file_name.rpm>”。但正如已经看到的,如果你要用源代码来安装,就要多做很多工作了。下面是对源代码安装步骤的总结:
http://www.snort.org下载源代码文件。
用“tar zxvf <filename.tar.gz>”命令解包tar文件。
运行configure脚本,典型的命令如:“configure –prefix=/opt/snort –with-mysql –with-snmp –with-opnssl”
运行make命令。
运行“make install”。
创建目录/var/log/snort。
创建目录/opt/snort/etc。
创建目录/opt/snort/rules。
将snort.conf复制到/opt/snort/etc目录中。
将classifacation.config文件复制到/opt/snort/etc目录中。
将reference.config文件复制到/opt/snort/etc目录中。
将所有的rules文件复制到/opt/snort/rules目录中。
创建snortd脚本文件并复制到/etc/init.d目录中,并在/etc/rcx中创建链接。这里x是运行级别的数字。这样Snort可以在系统启动的时候运行。
如果你要用MySQL与Snort一起工作,那么在启动Snort前要启动MySQL。

2.6 Snort文件的位置
Snort文件分为下列类别:
n Snort的二进制文件,n 也就是可执行文件。
n Snort的主配置文件,n 通常是snort.conf。
n Snort的其它配置文件,n 如classification.config和reference.config。
n 规则文件。
n 日志文件。
如果你用RPM包安装Snort,它的二进制文件通常会安装在/usr/sbin目录下。如果是编译安装,安装目录有—prefix命令行选项指定。
如 果你用RPM包安装Snort,主配置文件snort.conf将被安装在/etc/snort目录中。当然,你可以将这个文件保存在任何一个目录中,因 为在启动Snort的时候你可以用命令行选项来指定。在本书的例子中,这个文件是存放在/opt/snort/etc目录下的。
其它配置文件如classification.config和reference.config通常存放在与snort.conf相同的目录中。在snort.conf文件中将指定这些文件的目录,你可以改变它。
规则文件在snort.conf中引用。如果你用RPM包安装Snort,那么rules文件也被安装在/etc/snort目录中。在本书的例子中,用源代码安装,这些文件被安装在/opt/snort/rules
目录中。通过修改snort.conf文件,你可以改变这些规则文件的位置。
Snort 日志文件的位置可以通过snort.conf文件指定或者用命令行选项指定。通常日志文件存放在/var/log/snort目录中。如果这个目录不存 在,你必须手工创建。如果Snort从不同的主机记录日志,它可以在/var/log/snort目录中为每个主机创建目录。
例如,你可以在snort.conf中的如下一行修改日志文件的默认路径到/snortlog:
config logdir: /snortlog
你也可以在启动Snort的时候用命令行选项-l来改变日志文件的目录。第三章中包括关于snort.conf文件的详细讨论。

2.7 Snort的操作模式
Snort有两种基本操作模式:包嗅探器模式和NIDS模式。Snort可以用作类似于tcpdump 和snoop的嗅探器。在嗅探器模式,Snort也可以将这些包的信息记录到日志文件中。这些文件随后可以用Snort或者tcpdump察看。在这种模 式中,Snort不会做任何入侵检测活动。这种模式的用处并非很大,因为现在有很多可以记录包的工具了。比如,随同Linux发行的tcpdump就是一 个效率很高的嗅探器。
如果你将Snort用在网络入侵检测(NIDS)模式,它会用规则来找出是否存在入侵活动。
2.7.1网络嗅探器模式
Snort在网络嗅探器模式下,与常用的tcpdump类似。它可以捕获网络中的包并以不同的详细程度将包的信息显示在终端上。在这种模式下运行Snort并不需要配置文件。下面的命令将显示网段中通行的每个包的信息:
[root@conformix snort]# /opt/snort/bin/snort -v
Initializing Output Plugins!
Log directory = /var/log/snort
Initializing Network Interface eth0
–== Initializing Snort ==–
Decoding Ethernet on interface eth0
–== Initialization Complete ==–
-*> Snort! <*-
Version 1.9.0 (Build 209)
By Martin Roesch (roesch@sourcefire.com, www.snort.org)
11/20-15:56:14.632067 192.168.1.100:2474 -> 192.168.1.2:22
TCP TTL:128 TOS:0×0 ID:4206 IpLen:20 DgmLen:40 DF
***A**** Seq: 0x9DAEEE9C Ack: 0xF5683C3A Win: 0x43E0 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-15:56:14.632188 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57042 IpLen:20 DgmLen:200 DF
***AP*** Seq: 0xF5683C8A Ack: 0x9DAEEE9C Win: 0×6330 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-15:56:14.632519 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57043 IpLen:20 DgmLen:120 DF
***AP*** Seq: 0xF5683D2A Ack: 0x9DAEEE9C Win: 0×6330 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-15:56:14.633891 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57044 IpLen:20 DgmLen:184 DF
***AP*** Seq: 0xF5683D7A Ack: 0x9DAEEE9C Win: 0×6330 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

Snort将不断地在屏幕上显示所捕获的包的信息直到你用Crtl-C终止Snort,这时它将显示统计信息。
现在让我们来分析Snort的嗅探器模式在屏幕上显示的信息。下面是一个捕获的典型的TCP包的输出信息。
11/20-15:56:14.633891 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57044 IpLen:20 DgmLen:184 DF
***AP*** Seq: 0xF5683D7A Ack: 0x9DAEEE9C Win: 0×6330 TcpLen: 20
如果分析这个输出信息,你可以得到以下关于这个包的信息:
这个包被捕获的时间和日期。
源IP地址是192.168.1.2
源端口是22。
目的地址是192.168.1.100
目的端口是2474
这个包的传输层协议是TCP。
IP头中的TTL值是64。
TOS值是0×10。
IP头的长度是20。
IP载荷是184个字节。
IP头部中的DF位已被设置(不要分片)。
两个TCP flag被设置成on。
TCP头的sequence number是0xF5683D7A。
TCP头的Ack number是0xDAEEE9C。
TCP的窗口字段值是0×6330。
TCP头部长度是20。
你可以用更多的命令行选项来显示更多关于所捕获的包的信息。下面的命令除了能够显示包的TCP、UDP、和ICMP信息以外,还能够显示一些应用层信息。注意,这个命令并不能显示包的所有信息。

[root@conformix snort]# /opt/snort/bin/snort -dv
Initializing Output Plugins!
Log directory = /var/log/snort
Initializing Network Interface eth0
–== Initializing Snort ==–
Decoding Ethernet on interface eth0
–== Initialization Complete ==–
-*> Snort! <*-
Version 1.9.0 (Build 209)
By Martin Roesch (roesch@sourcefire.com, www.snort.org)
11/20-16:18:11.129548 192.168.1.100:2474 -> 192.168.1.2:22
TCP TTL:128 TOS:0×0 ID:4387 IpLen:20 DgmLen:40 DF
***A**** Seq: 0x9DAEF2FC Ack: 0xF5688CDA Win: 0×4190 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:18:11.129723 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57171 IpLen:20 DgmLen:120 DF
***AP*** Seq: 0xF5688D2A Ack: 0x9DAEF2FC Win: 0×6330 TcpLen: 20
C5 1D 81 8F 70 B7 12 0B C1 1B 8F 6D A9 8F 1D 05 ….p……m….
40 7D F9 BD 84 21 11 59 05 01 E4 A1 01 20 AC 92 @}…!.Y….. ..
58 50 73 8D 17 EA E2 17 AD 3A AD 54 E2 50 80 CB XPs……:.T.P..
DA E1 40 30 7B 63 0D 79 5A D8 51 07 93 95 2B A8 ..@0{c.yZ.Q…+.
F8 D4 F5 FA 76 D6 27 35 E8 6E E2 ED 41 2B 01 2D ….v.’5.n..A+.-
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:18:11.130802 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57172 IpLen:20 DgmLen:120 DF
***AP*** Seq: 0xF5688D7A Ack: 0x9DAEF2FC Win: 0×6330 TcpLen: 20
E9 7C 09 E0 E0 5C 3E 17 1C BE 93 1F B0 DA 92 40 .|…\>……..@
D1 18 71 52 80 F3 B2 F7 59 CE F7 7C D4 8F FD B4 ..qR….Y..|….
98 08 A9 63 63 23 0D C8 9D A4 4F 68 87 06 0D 16 …cc#….Oh….
44 61 09 CD FF FE 8B 1A 5B D8 42 43 1D 1A 6F A8 Da……[.BC..o.
14 90 C6 63 4C EE 9D 64 1B 90 CC 3A FB BD 7E E4 ...cL..d...:..~.
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:18:11.131701 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0x10 ID:57173 IpLen:20 DgmLen:120 DF
***AP*** Seq: 0xF5688DCA Ack: 0x9DAEF2FC Win: 0x6330 TcpLen: 20
AF CE 60 CB 79 06 BB 3D 58 72 76 F2 51 0F C1 9A ..`.y..=Xrv.Q...
22 5A E3 27 49 F8 A5 00 1B 5A 4F 24 12 0F BF 70 "Z.'I....ZO$...p
B7 81 A0 0C F9 EB 83 D1 33 EB C1 5A 2A E6 2E 4B ........3..Z*..K
F1 98 FB 5A A9 C7 C3 92 78 B1 35 FF F7 59 CF B3 ...Z....x.5..Y..
83 D2 E7 FF 37 F8 34 56 CD 0F 61 62 A9 16 A4 9F ....7.4V..ab....
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:18:11.133935 192.168.1.100:2474 -> 192.168.1.2:22
TCP TTL:128 TOS:0x0 ID:4388 IpLen:20 DgmLen:40 DF
***A**** Seq: 0x9DAEF2FC Ack: 0xF5688D7A Win: 0x40F0 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:18:11.134057 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0x10 ID:57174 IpLen:20 DgmLen:280 DF
***AP*** Seq: 0xF5688E1A Ack: 0x9DAEF2FC Win: 0x6330 TcpLen: 20
A6 CF F9 B5 EA 24 E0 48 34 45 4B 57 5D FF CB B5 .....$.H4EKW]…
D6 C9 B3 26 3C 59 66 2C 55 EE C1 CF 09 AD 3A C2 …&<Yf,U…..:.
74 B6 61 D3 C5 63 ED BD 6F 51 0D 5E 18 44 07 AF t.a..c..oQ.^.D..
86 D2 8A 3F 82 F0 D2 84 5C A6 7F CC D5 7B 90 56 …?….\….{.V
93 CF CF 4D DE 03 00 4D E4 4B AD 75 3E 03 71 DC …M…M.K.u>.q.
A6 3D 78 DA 01 BF F0 33 46 7D E1 53 B5 62 94 9A .=x….3F}.S.b..
29 46 56 78 B1 73 C0 3E BB C0 EC 5C 6E D0 E6 BE )FVx.s.>…\n…
F9 5C 02 90 40 B1 BA 07 F1 96 2F A0 0F 9D E1 3E .\..@…../….>
8C 3C 40 07 B2 21 28 CA 2D 41 AC 5C 77 C6 D0 3F .<@..!(.-A.\w..?
73 0B 15 32 47 B5 CE E3 FB 83 B3 72 1A B4 64 9F s..2G……r..d.
6D C7 55 B8 6B DB FC AF 94 8F F3 58 B0 79 CF 14 m.U.k……X.y..
3F 9A FC 32 1D B6 21 B0 4D C3 64 82 C0 62 A8 8C ?..2..!.M.d..b..
80 C7 4A C8 BA D9 C3 0D 74 86 76 B8 49 8A 94 D1 ..J…..t.v.I…
4C F3 BF AF 55 3B 57 2B EA C7 48 B7 A4 BD B2 20 L…U;W+..H….
4A 66 B4 4E F3 2A 7E B6 F8 63 A8 61 42 F3 85 3B Jf.N.*~..c.aB..;
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
你可以用下面的命令来显示包的所有信息。.
这个命令可以同时以ASCII方式和二进制方式显示包的信息。
[root@conformix snort]# /opt/snort/bin/snort -dev
Initializing Output Plugins!
Log directory = /var/log/snort
Initializing Network Interface eth0
–== Initializing Snort ==–
Decoding Ethernet on interface eth0
–== Initialization Complete ==–
-*> Snort! <*-
Version 1.9.0 (Build 209)
By Martin Roesch (roesch@sourcefire.com, www.snort.org)
05/27-12:11:10.063820 0:D0:59:6C:9:8B -> FF:FF:FF:FF:FF:FF type:0×800
len:0xFC
192.168.1.100:138 -> 192.168.1.255:138 UDP TTL:128 TOS:0×0 ID:48572
IpLen:20 DgmLen:238
Len: 218
11 0E 82 D5 C0 A8 01 64 00 8A 00 C4 00 00 20 46 …….d…… F
43 46 43 43 4E 45 4D 45 42 46 41 46 45 45 50 46 CFCCNEMEBFAFEEPF
41 43 41 43 41 43 41 43 41 43 41 43 41 41 41 00 ACACACACACACAAA.
20 41 42 41 43 46 50 46 50 45 4E 46 44 45 43 46 ABACFPFPENFDECF
43 45 50 46 48 46 44 45 46 46 50 46 50 41 43 41 CEPFHFDEFFPFPACA
42 00 FF 53 4D 42 25 00 00 00 00 00 00 00 00 00 B..SMB%………
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00 00 11 00 00 2A 00 00 00 00 00 00 00 00 00 E8 …..*……….
03 00 00 00 00 00 00 00 00 2A 00 56 00 03 00 01 ………*.V….
00 01 00 02 00 3B 00 5C 4D 41 49 4C 53 4C 4F 54 …..;.\MAILSLOT
5C 42 52 4F 57 53 45 00 0C 00 A0 BB 0D 00 42 41 \BROWSE…….BA
54 54 4C 45 43 4F 57 53 00 00 00 00 01 00 03 0A TTLECOWS……..
00 10 00 80 D4 FE 50 03 52 52 2D 4C 41 50 54 4F ……P.RR-LAPTO
50 00 P.
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:20:38.459702 0:D0:59:6C:9:8B -> 0:50:BA:5E:EC:25 type:0×800
len:0x3C
192.168.1.100:2474 -> 192.168.1.2:22 TCP TTL:128 TOS:0×0 ID:4506
IpLen:20 DgmLen:40 DF
***A**** Seq: 0x9DAEFD9C Ack: 0xF568E2FA Win: 0x3F20 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:20:38.460728 0:50:BA:5E:EC:25 -> 0:D0:59:6C:9:8B type:0×800
len:0×86
192.168.1.2:22 -> 192.168.1.100:2474 TCP TTL:64 TOS:0×10 ID:57303
IpLen:20 DgmLen:120 DF
***AP*** Seq: 0xF568E34A Ack: 0x9DAEFD9C Win: 0x6BD0 TcpLen: 20
F9 7B 4B 96 3F C8 0A BC DF 9E EE 4F DA 27 6F B4 .{K.?……O.’o.
92 BD A7 C5 1D E4 35 AB DB BF 7B 56 B9 F8 BA A1 ……5…{V….
86 BB FE 6E FD 41 55 FF D0 51 04 AF 73 80 13 29 …n.AU..Q..s..)
D7 62 67 A4 B5 0C 5F 32 30 36 81 C2 9C 31 53 AD .bg…_206…1S.
3A 65 46 EE F1 52 59 ED 57 C7 6A 85 88 5A 3E D8 :eF..RY.W.j..Z>.
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

2.7.1.1用文本格式记录Snort数据
你可以在命令行用-l <directory name>将Snort数据纪录为文本模式。下面的命令会将所有的Snort数据记录到/var/log/snort目录下同时显示在终端。
snort –dev –l /var/log/snort
然后你会发现/var/log/snort目录下面出现一些子目录,每个对应一个主机,其中包含一些文件。子目录的名称通常与主机的IP地址相同。其中的 文件是于不同的连接和不同类型的网络数据。例如,包含以TCP打头的TCP数据,如文件名:2489-23。一个包含ICMP数据的文件如: ICMP_ECHO。当你运行Snort嗅探器的时候,日志中的内容与显示器上显示的是相同的。
2.7.1.2 以二进制格式记录Snort数据
在一个高速网络环境中,将许多文件记录成ASCII格式会导致过高的开销。Snort允许你将数据记录为tcpdump格式的二进制文件以供随后察看。这时,Snort将所有的数据记录成二进制的raw格式。典型的命令如下:
snort –l /tmp –b
Snort将会在/tmp目录下创建文件,典型的文件名类似于:snort.log.1037840339。文件名的最后一部分依赖于你的系统时钟。每次你在这种模式下运行Snort,在日志目录就会有一个新文件产生。有时把这种记录模式称为quick模式。
你可以用Snort查看raw格式的二进制文件,用命令行开关-r来指定文件名。下面的命令将显示snort.log.1037840339中所部获得数据。
snort -dev -r /tmp/snort.log.1037840339| more
这个命令的输出与你在控制台上实时看到的是相同的。你可以用不同的命令行开关来以不同的详细程度来显示这些数据。
你也可以用命令显示特定类型的数据。下面的命令会显示日志文件中的所有TCP数据。
snort -dev -r / tmp/snort.log.1037840339 tcp
显示ICMP数据和UDP数据与之类似。
你也可以用tcpdump来读取Snort产生的二进制数据。下面的命令将读取并显示Snort捕获的数据:
[root@conformix snort]# tcpdump -r /tmp/snort.log.1037840514
20:01:54.984286 192.168.1.100.2474 > 192.168.1.2.ssh: . ack 4119588794
win 16960 (DF)
20:01:54.984407 192.168.1.2.ssh > 192.168.1.100.2474: P 81:161(80) ack
0 win 32016 (DF) [tos 0x10]
20:01:54.985428 192.168.1.2.ssh > 192.168.1.100.2474: P 161:241(80) ack
0 win 32016 (DF) [tos 0x10]
20:01:54.986325 192.168.1.2.ssh > 192.168.1.100.2474: P 241:321(80) ack
0 win 32016 (DF) [tos 0x10]
20:01:54.988508 192.168.1.100.2474 > 192.168.1.2.ssh: . ack 161 win
16800 (DF)
20:01:54.988627 192.168.1.2.ssh > 192.168.1.100.2474: P 321:465(144)
ack 0 win 32016 (DF) [tos 0x10]
20:01:54.990771 192.168.1.100.2474 > 192.168.1.2.ssh: . ack 321 win
16640 (DF)
20:01:55.117890 192.168.1.100.2474 > 192.168.1.2.ssh: . ack 465 win
16496 (DF)
20:01:55.746665 192.168.1.1.1901 > 239.255.255.250.1900: udp 269
20:01:55.749466 192.168.1.1.1901 > 239.255.255.250.1900: udp 325
20:01:55.751968 192.168.1.1.1901 > 239.255.255.250.1900: udp 253
20:01:55.754145 192.168.1.1.1901 > 239.255.255.250.1900: udp 245
20:01:55.756781 192.168.1.1.1901 > 239.255.255.250.1900: udp 289
20:01:55.759258 192.168.1.1.1901 > 239.255.255.250.1900: udp 265
20:01:55.761763 192.168.1.1.1901 > 239.255.255.250.1900: udp 319
20:01:55.764365 192.168.1.1.1901 > 239.255.255.250.1900: udp 317
20:01:55.767103 192.168.1.1.1901 > 239.255.255.250.1900: udp 321
20:01:55.769557 192.168.1.1.1901 > 239.255.255.250.1900: udp 313
20:01:56.336697 192.168.1.100.2474 > 192.168.1.2.ssh: P 0:80(80) ack
465 win 16496 (DF)
[root@conformix snort]#
你可以用tcpdump的不同命令行选项来控制显示。用“man tcpdump”命令或者查看附录A获取更多tcpdump的信息。

2.7.2 网络入侵监测模式
在入侵检测模式下,Snort并不记录所有捕获的包,而是将包与规则比对,仅当包与某个规则匹配的时 候,才会记录日志或产生告警。如果包并不于任何一个规则匹配,那么它将被悄悄的丢弃,并不做任何纪录。你在运行Snort的入侵监测模式的时候,通常会在 命令行指定一个配置文件,这个文件包含一些规则和对其他包含规则的文件的引用,除此之外,还有一些关于输入和输出插件的信息,这些将在第4章讨论。配置文 件的名通常是snort.conf,在前面的安装过程中我们已经将配置文件snort.conf和其他一些文件保存在/opt/snort/etc目录下 了。下面的命令将用来启动Snort的网络入侵检测(NID)模式:
snort -c /opt/snort/etc/snort.conf
当你启动这个命令后,Snort将读取配置文件/opt/snort/etc/snort.conf以及被其引用的所有规则文件。通常这些文件包含 Snort规则和配置数据。读取这些数据后,Snort将建立内部数据结构和规则链。所有被捕获的数据将于这些规则比对,并根据规则的要求做出相应的动 作。如果你修改snort.conf文件,或者引用另外的文件,你必须重启Snort使其生效。
在IDS模式,还有一些其它的命令行选项与开关 可用。例如,你可以将日志记录到文件,也可以用命令显示。如果将Snort用作长期监测,那么日志越多,你需要的磁盘空间就越大,将日志显示在终端上也会 消耗一些主机的处理能力,因此,在何处运行Snort也是需要考虑的。下面的命令将使Snort工作在IDS模式,并同时作为嗅探器将日志记录到 /var/log/snort目录下。
snort -dev -l /var/log/snort -c /etc/snort/snort.conf
但在很多实际应用情况下,你会使用命令行开关-D使Snort以守护进程的方式运行,而不再终端上纪录。
通常的情况,你会希望将Snort日志数据记录到数据库,我们将在第5章讨论将Snort日志信息记录到MySQL数据库的情况。

2.8 Snort的告警模式
当Snort运行在NID模式下,如果捕获的包与规则匹配,Snort可以以多种模式产生告警。这些模 式可以通过snort.conf来配置,也可以用命令行配置。这一部分将介绍常用的告警模式。为方便介绍,我会用一个在Snort检测到TTL值为100 的ICMP包时会产生告警的规则,如下:
alert icmp any any -> any any (msg: “Ping with TTL=100″; \
ttl:100;)
规则将在下一章详细讨论,对本次讨论来说,你只要知道这个规则将在遇到TTL为100的ICMP包的时候产生一个包含“Ping with TTL=100”文字信息的告警就可以了。这个规则并不关心包中的源地址或目的地址。我在我的Windows机器上用下面的命令来发送一个TTL=100 的ICMP echo包。
C:\rrehman>ping -n 1 -i 100 192.168.1.3
Pinging 192.168.1.3 with 32 bytes of data:
Reply from 192.168.1.3: bytes=32 time=3ms TTL=255
Ping statistics for 192.168.1.3:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 3ms, Maximum = 3ms, Average = 3ms
C:\rrehman>
命令行选项“-n 1”用来指定仅仅发送一个ICMP包。“-i 100”用来使ICMP包中的TTL值等于100。可以在ftp://ftp.isi.edu/in-notes/rfc792/rfc792.txt或者本书的附录C参考关于ICMP包头部格式的详细信息。
当运行上面的命令的时候,Snort将捕获到这个数据包并产生一个告警。告警所纪录的信息的多少将依赖于特定的告警模式。下面我们来看在对一个包纪录的时候不同的告警模式的差异:
2.8.1 Fase模式
Fast高静默使将记录以下告警信息:
时间戳
告警消息(通过规则配置)
源地址和目的地址
源端口和目的端口
应当用命令行选项“-A fast”来配置fase告警模式,这种告警模式的系统开销比较小。下面的命令用fast告警模式启动Snort:
/opt/snort/bin/snort -c /opt/snort/etc/snort.conf -q -A fast
选项-q用来停止在屏幕显示初始化信息和最后的汇总统计。现在,如果产生一个告警,它将被记录到/var/log/snort/alert文件中,当然,你可以用命令行选项-l来改变它的位置。告警信息类似如下所示:
05/28-22:16:25.126150 [**] [1:0:0] Ping with TTL=100 [**]
{ICMP} 192.168.1.100 -> 192.168.1.3
这个告警包含下面的信息:
告警产生的日期和时间。
表示在规则中的告警消息,在这个例子中,这个消息就是:“Ping with TTL=100”.
源地址是192.168.1.100。
目的地址是192.168.1.3
包的类型,在上面的例子中,包的类型是ICMP。
2.8.2 Full模式
这是默认的告警模式,除了输出告警信息之外,还有包的头部信息。我们可以用下面的命令使Snort具有full告警模式。
/opt/snort/bin/snort -c /opt/snort/etc/snort.conf -q -A full
当Snort工作在这种告警模式下的时候,在/var/log/snort/alert中记录的信息类似于如下:
[**] [1:0:0] Ping with TTL=100 [**]
05/28-22:14:37.766150 192.168.1.100 -> 192.168.1.3
ICMP TTL:100 TOS:0×0 ID:40172 IpLen:20 DgmLen:60
Type:8 Code:0 ID:768 Seq:20224 ECHO
正如你看到的,日志中记录了附加的信息,这些信息显示包头中的不同的值,包括:
IP包头部的TTL值。在ftp://ftp.isi.edu/in-notes/rfc791.txt参考RFC791获取关于TTL的详细信息
IP包头部的TOS值,参考RFC791或本书附录A获取TOS的详细信息。
IP头长度,显示为:IpLen:20。
IP包总长,显示为:DgmLen:60。
ICMP类型段,参考RFC792获取ICMP类型段的详细信息。
ICMP代码段,参考RFC792获取ICMP代码段的详细信息。
IP包的ID。
序列号。
ICMP包的类型:ECHO。
2.8.3 UNIX套接字模式
你可以用命令行选项“-a unsock”使Snort将通过UNIX套接字将告警发送到其他的程序。如果你想进一步处理Snort告警,这将非常有用。你可以用“man socket”命令来查看套接字的更多信息。
2.8.4无告警模式
你可以用命令行选项“-A none”将Snort告警完全关闭。这在高速网络环境应用统一日志的情况下是非常有用的。你可以在用统一日志的时候关闭普通日志选项。统一日志输出插件将在第4章中讨论。
2.8.5 将告警发送到Syslog
下 面的命令允许Snort将告警发送到Syslog守护进程。Syslog是产生系统事件日志的守护进程,它将读取配置文件 /etc/syslog.conf取得记录日志文件的位置,这个位置通常是/var/log目录,在Linux系统中,主日志文件是 /var/log/messages。用“man syslog”命令来获得更多的信息,这个命令会显示syslog.conf文件的格式信息。
根据/etc/syslog.conf文件中的配置,告警奖杯记录到一个特定文件中。下面的命令可以使Snort将日志记录到Syslog守护进程:
/opt/snort/bin/snort -c /opt/snort/etc/snort.conf -s
在我的RedHat 7.1计算机上,使用的是默认配置,信息会被记录到/var/log/messages文件中。当你用TTL=100的ICMP产生告警时,/var/log/messages文件中将记录下面的信息:
May 28 22:21:02 snort snort[1750]: [1:0:0] Ping with TTL=100
{ICMP} 192.168.1.100 -> 192.168.1.3
本书的第4章将讨论使用Syslog工具,同时,你将了解如何用输出插件记录日志到Syslog。

2.8.6 向SNMP发送告警
Snort的一个非常有用的特性是SNMP trap。你可以配置一个输出插件,可以将信息以SNMP trap的形式发送到网络管理系统。通过这个特性,你可以将你的入侵检测探测器整合到类似于HP OpenView,OpenNMS,MRTG等集中的网管系统中。Snort配置SNMP trap的配置过程将在后面详细讨论。
2.8.7向Windows发送告警
Snort 可以以弹出窗口的形式向Windows及其发出告警,在windows中,弹出窗口由Windows信使服务控制。为使弹出窗口工作,Windows必须 要运行信使服务。你可以到控制面板的服务程序来看Window信使服务是否在运行。服务选项在你的管理工具菜单中,根据你的Windows版本的不同,也 可能在控制面板或其他的位置。
在你的Unix机器上,必须要安装SAMBA客户端软件包。SAMBA是在UNIX下可以与Windows共享文件和打印机的开放源码软件包。它也可以与其它运行CIFS和SMB协议的操作系统共同工作。你可以在http://www.samba.org取得关于SAMBA的更多信息。
Snort 告警机制利用UNIX的smb客户端程序来连接Windows信息并发送告警。当你使用这项服务之前,先确定SAMBA客户端是否正常工作。在 RedHat系统中,SAMBA的操作依赖于配置文件/etc/samba/smb.conf,在其他的Unix系统中,这个文件也许会在不同的位置。尽 管SAMBA的详细讨论已经超过了本书涉及的范围,还是在下面列举一个SAMBA配置的样本文件。这个文件可以用来配置smb使之生效,它创建一个可以在 Windows机器上看到的REHMAN工作组。
2.8.7.1 Samba配置文件样本
/etc/smba/smb.conf的样本文件如下:
[global]
workgroup = REHMAN
server string = REHMAN file server
log file = /var/log/samba/log.%m
max log size = 50
security = user
encrypt passwords = yes
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
dns proxy = no
domain logons = no
unix password sync = no
map to guest = never
password level = 0
null passwords = no
os level = 0
preferred master = yes
domain master = yes
wins support = yes
dead time = 0
debug level = 0
load printers = yes
[homes]
comment = Home Directories
browseable = yes
writable = yes
available = yes
public = yes
only user = no
[htmldir]
comment = html stuff
path = /home/httpd/html
public = yes
writable = yes
printable = no
write list = rehman
[virtualhosting]
comment = html stuff
path = /usr/virt_web
public = yes
writable = yes
printable = no
write list = rehman
[printers]
[netlogon]
available = no
关于SMB告警的更多信息将在后面的章节中出现。注意,如果你想用这个功能,你应该在编译Snort的时候用—with-sabalerts的选项,否则Snort就不能用SAMBA服务来工作。

2.9 在隐秘模式下运行Snort
在某些情况下,你会希望在隐秘模式下运行Snort,这样其他的主机不会探测到Snort机器的 存在,换句话说,Snort对于入侵者或其他人是不可见的。有多种方法可以使Snort在隐秘模式下运行。其中之一是在没有配置IP地址的接口上运行 Snort,这适合于下列两种情况:
只有一个网络适配器的独立Snort探测器。
一个安装了两个网络适配器的Snort探测器:一个用来在孤立的网络上用来访问探测器,另外一个连接到公众网络并在隐秘模式运行Snort。这种方法如图2-3所示:网络接口eth1连接到孤立的私有网络,eth0连接到公众网络。
当你想访问探测器的时候,要通过具有IP地址的网络接口eth1。图中所示的管理工作站可以用来连接到探测器,以收集数据,或将信息纪录到运行在本机或其他连接到本机的数据库服务器的中央数据库。
连接到Internet的网络接口eth0上没有配置IP地址,它运行在隐秘模式下,但是仍然可以监听此段网络的数据流。
在eth0上运行Snort之前,你必须将它激活,在Linux系统中,你可以用下面的命令来实现:
ifconfig eth0 up
这个命令可以使接口在没有IP地址的情况下可用,然后,你可以用“-i eth0”的命令行选项在这个接口启动Snort:
snort -c /opt/snort/etc/snort.conf -i eth0 -D

这个系列为转帖,因为原文太长了,所以我把他们分为几个章节来写出来。自然我会考虑做一个基于snort的一个小系统,所以还在学习中。这篇文章讲解的很详细。至于snort的安装可以参考我的文章《RHEL4上Snort的架构过程》,原文连接地址是:http://daxigua.com/?p=26

这篇文章的连接地址为:http://blog.chinaunix.net/u/10599/showart.php?id=181691

用Snort,Apache,MySQL,PHP及ACID构建高级IDS
入侵检测系统及Snort介绍
在当今的企业应用环境 中,安全是所有网络面临的大问题。黑客和入侵者已成功的入侵了一些大公司的网络及网站。目前已经存在一些保护网络架构及通信安全的方法,例如防火墙、虚拟 专用网(VPN)、数据加密等。入侵检测是最近几年出现的相对较新的网络安全技术。利用入侵检测技术,我们可以从已知的攻击类型中发现是否有人正在试图攻 击你的网络或者主机。利用入侵监测系统收集的信息,我们可以加固自己的系统,及用作其他合法用途。目前市场中也有很多弱点检测工具,包括商品化的和开放源 码形式的,可以用来评估网络中存在的不同类型的安全漏洞。
一个全面的安全系统包括很多种工具:
防火墙:用来阻止进入及走出网络的信息流。防火墙在商业化产品和开放源码产品中都有很多。最著名的商业化防火墙产品有Checkpoint (http://www.checkpoint.com), Cisco (http://www.cisco.com)及Netscreen(http://www.netscreen.com)。最著名的开放源码防火墙是Netfilter/Iptables(http://www.netfilter.org)。
入侵检测系统(IDS):用来发现是否有人正在侵入或者试图侵入你的网络。最著名的IDS是Snort,可以在http://www.snort.org下载。
弱点评估工具:用来发现并堵住网络中的安全漏洞。弱点评估工具收集的信息可以指导我们设置恰当的防火墙规则,以挡住恶意的互联网用户。现在有许多弱点评估工具,比如Nmap(http://www.nmap.org/)和Nessus(http://www.nessus.org/).
以上这些工具可以配合使用,交互信息。一些产品将这些功能捆绑在一起,形成一个完整的系统。

Snort是一个开放源码的网络入侵检测系统(NIDS),可以免费得到。NIDS是用来检测网络上的信息流的入侵检测系统(IDS)。IDS 也包括安装在特定的主机上并检测攻击目标是主机的行为的系统。IDS迄今为止还是一门相当新的技术,而Snort在IDS中处于领先的地位。
本书由入侵检测介绍及相关概念入手,你将学习如何安装及管理Snort以及与Snort协同工作的其他产品。这些产品包括MySQL数据库(http://www.mysql.org)、入侵数据库分析管理工具ACID(http://www.cert.org/kb/acid)。Snort能够将日志数据(例如告警d和其他日志消息)记录到数据库中。MySQL用作存储所有这些数据的数据库引擎。利用ACID及Apache (http://www.apache.com)Web服务器,我们可以分析这些数据。Snort、Apache、MySQL及ACID的共同协作,使我们可以将入侵检测数据记录到数据库,然后用web界面察看和分析这些数据。
此书的组织结构使读者能够跟着随后的章节一步一步的建立一个完整的入侵检测系统。安装及整合各种工具的步骤将在如下的章节逐步介绍:
第二章将介绍编译及安装Snort的基本知识。在这一章中,你将能够用基本安装及默认规则建立一个能够工作的IDS,同时能够建立可以记录入侵活动的日志文件。
第三章介绍Snort规则的有关知识,Snort规则的组成及如何根据你的系统环境及需要建立自己的规则。建立良好的规则是构建入侵检测系统的关键,因此本章非常重要。本章同时也介绍Snort不同版本间规则的不同。
第四章介绍input及output插件。插件与Snort一同编译,并用来调整检测引擎的输入和输出部分。Input插件用在实际检测过程发生前准备好 捕获的数据包。Output插件用来将数据数据格式化,以用于特定的目的,例如一种output插件可以将输出的检测信息转换成SNMP trap信息,而另外一种output插件可以将信息转换成数据库信息。这一章将详细介绍如何配置及使用这些插件。
第五章介绍MySQL数据库与Snort的共同工作。MySQL插件使Snort能够将日志数据记录到数据库以便随后的分析。在这一章中,你将了解如何在MySQL中建立数据库,如何配置数据库插件,以及将日志数据记录到数据库中。
第六章介绍ACID,以及如何用ACID取得你在第五章建立的数据库中的信息,并用Apache服务器显示它。ACID一种提供丰富的数据分析能力的重要 工具,你可以用它来取得攻击频率、攻击类别、察看这些攻击方法的相关资源等等。ACID用PHP脚本语言、图形显示库(GD library)和PHPLOT(一种用来绘制图表的工具)来工作,可以分析SQL中的数据并绘制图表。
第七章主要介绍可以和Snort一起工作的其他一些有用的工具。

在读完此书后,你将建立一个完整的,具有多个组件的系统,如图1-1所示。
在图中你可以看到,Snort捕获并分析数据,然后用 output插件将数据储存在MySQL数据库中。Apache服务器在ACID,PHP、GD library及PHP包的帮助下使连接到服务器的用户能够通过浏览器显示数据。用户可以在网页上应用不同的查询来分析、备份、删除数据或者显示图表。
基本上,你可以将Snort、MySQL、Apache、PHP、ACID、GD库以及ACID都安装到一台计算机上,而实际上在读完本书后,你可以建立一个类似于如图1-2所示得更加贴近实际应用的系统。
在企业中,人们通常使用多个Snort探测器,在每个路由器或者防火墙后面都放置探测器。在这种情况下,你可以用一个集中的数据库来收集所有探测器的信息,并在这个数据库服务器上运行Apache Web服务器,如图1-3所示。
1 什么是入侵检测?
入 侵检测是指用来检测针对网络及主机的可疑活动的一系列技术和方法。入侵检测系统基本可以分为两大类:基于特征的入侵检测系统和异常行为检测系统。入侵者常 具有用软件可以检测到的特征,如病毒。入侵检测系统将检测包含已知入侵行为特征或者异常于IP协议的数据包。基于一系列的特征及规则,入侵检测系统能够发 现并记录可疑行为并产生告警。基于异常的入侵检测系统通常是分析数据包中协议头部的异常,在某些情况下这种方式要比基于特征的入侵检测系统要更好一些。通 常情况下,入侵检测系统在网络上捕获数据包与规则比对或者检测其中的异常。Snort基本上是一个基于规则的IDS,但是input插件可以分析协议头部 异常。
Snort的规则存储在文本文件中,并可以用文本编辑器修改。规则以类别分组。不同类别的规则存储在不同的文件中。最后,这些文件被一 个叫做snort.conf的主配置文件引用。Snort在启动时读取这些规则,并建立内部数据结构或链表以用这些规则来捕获数据。发现入侵特征并利用规 则捕获它们是一项具有技巧性的工作,因为在实时检测中你应用越多的规则,那么你将需要越多的处理能力,所以用尽量少的规则来捕获尽量多的特征是非常重要 的。Snort已经预先定义了许多入侵检测规则,并且你可以自由添加自定义的规则。同时,你也可以移除一些内建规则以防止错误告警。

1.1.1 一些定义
在详细了解入侵检测及Snort之前,你需要了解一些网络安全相关的定义,这些定义将在这本书的随后章节中重复应用。对这些名词的基本了解对于理解其他更加复杂的安全概念是非常必要的。
1.1.1.1 IDS
入 侵检测系统或IDS是一种用来检测入侵行为的软件、硬件或者两者的结合。Snort是大众可以获得的开放源码的IDS。IDS的实际能力依赖于组件的复杂 度及精巧性。实体的IDS是硬件和软件的结合,很多公司可以提供及决方案。如前面提到的,IDS可以采用特征分析技术、异常检测技术,或者两者同时应用。
1.1.1.2 网络IDS或NIDS
NIDS是用来捕获在网络介质上传播的数据并与特征数据库比对的入侵检测系统。跟据数据包与特征数据库的匹配情况,IDS产生告警或者将日志记录到文件或数据库中。Snort主要是作为NIDS来使用的。
1.1.1.3 主机IDS或HIDS
面向主机的入侵检测系统或称HIDS作为一个代理安装在一台主机上,这种入侵检测系统可以分析系统及应用程序日志来检测入侵行为。其中一些HIDS是被动 状态的,只有当某些事情发生了才会通知你,另外一些是主动状态的,可以嗅探网络中针对某一主机的通信状况并实时产生告警。
1.1.1.4 特征
特征是数据包中包含信息的特点。特征用来检测一种或多种攻击行为。例如,目标是你的web服务的包中如果出现“scripts/iisadmin”,可能意味着一个入侵尝试。
根据攻击行为本质的不同,特征数据可能会出现在数据包中的不同位置。例如,你可能会在IP包头、传输层头(TCP或UDP头)及/或应用层头或载荷中发现攻击特征。你将在本书的后面更多的了解攻击特征。
通常IDS依靠特征来发现入侵行为。在发现新的入侵特征时,某些商业化的IDS需要从厂商那里得到更新的特征库。另外一些IDS,比如Snort,你可以自己更新特征库。

1.1.1.5 告警
告警是任何一种对入侵行为的通知。当IDS检测到入侵者,它将用告警来通知安全管理员。告警的形式可以使弹出窗口、终端显示及发送e-mail等等。告警同时也被存储到日志文件或者数据库中,以便供安全专家察看。在本书的后面,你将得到关于告警的详细信息。
Snort的告警由output插件控制,并可以产生多种形式的报警。Snort也可以将同一个告警发送到不同的目标,例如,将告警发送到数据库的同时,产生SNMP trap信息。一些插件可以修改防火墙配置,使入侵者在防火墙或者路由器上被控制。
1.1.1.6 日志
日志信息通常存放在文件中。默认情况下,Snort将这些信息存放在/var/log/snort目录下,但是也可以在启动Snort时用命令行开关来改 变这个目录。日志信息可以存储为文本格式或者二进制格式,二进制格式的文件可以供Snort或者Tcpdump随后访问,现在也有一个叫做 Barnyard的新工具可以分析Snort产生的二进制日志文件。将日志存放为二进制文件可以有更高的效率,因为这种格式开销相对较低。将Snort应 用在高速网络环境中,将日志存放为二进制文件是非常必要的。
1.1.1.7 误告警
误告警是错误的将非入侵行为报告为入侵行为的告 警。例如,内部主机的错误配置有时会产生触发规则,从而产生误告警。某些路由器,例如Linksys家用路由器,会产生一些信息,导致UpnP相关的告 警。为了避免误告警,你要修改和调试默认规则,在某些情况下,你也许需要停止一些规则的使用,以避免误告警。
1.1.1.8 探测器
运行入侵检测系统的机器也叫做探测器,因为它用来“探测”网络中的活动。在本书的后面部分,如果用到探测器这个词,那么它是指运行Snort的计算机或者其他设备。

1.1.2 IDS应该放在网络中的什么位置?
根据你的网络拓扑结构的不同,你应该在一个或多个位置放置IDS。IDS放置的位置也要 取决于你想检测的入侵行为的种类:内部入侵、外部入侵,或者两个都要检测。例如,如果你想仅仅检测外部入侵活动,并且你只有一个路由器接到 Internet,那么放置IDS的最佳位置也许紧靠着路由器或者防火墙的内部网络接口。如果你有多条接入Internet的借口,也许你希望在每个入口 处放置一台IDS。有时你也希望能够检测来自内部的威胁,那么可以在每个网段都放置一台IDS。
在很多情况下,你并不需要在所有网段都实施入侵检测,你可以仅仅在敏感区域放置IDS。要知道,越多的IDS就意味着越多的工作量和维护费用。因此IDS的部署要取决于你的安全策略,也就是你想防范什么样的入侵。图1-4表示通常放置IDS的典型位置。
正如你在图1-4中看到的那样,通常你应该在每个路由器和防火墙的后面放置IDS,在你的网络中包含非军事化区(DMZ)的情况下,在DMZ中也可以放置IDS。要注意的是,DMZ中的IDS告警策略不应像专用网络中那样严格。
1.1.3 蜜罐(Honey Pots)
蜜罐是一种以故意暴露已知弱点来愚弄黑客的系统。当黑客发现蜜罐时,通常会在它上面耗费一些时间,在此期间,你可以记录黑客的行为,从中找出黑客的活动情况和所使用的技术。一旦你了解了这些技术,你可以利用你得到的信息来加固你真正的服务器。
现在有很多种构建和放置蜜罐的方法。在蜜罐上应该运行一些公开的服务,这些服务包括Telnet服务(端口23),HTTP服务(端口80),FTP服务 (端口21)等等。你应该将蜜罐放在你紧靠你应用服务器的某个位置,这样黑客容易错误的将蜜罐当成真正的应用服务器。例如,如果你的应用服务器的IP地址 势192.168.10.21和192.168.10.23,那么你可以将你的蜜罐的IP地址设为192.168.10.22,同时设置你的防火墙和路由 器,使黑客对服务器某些端口的访问重定向到蜜罐上面,那么入侵者就会把蜜罐当成是真正的服务器。你应当仔细的考虑告警产生机制,以使你的蜜罐受到威胁的时 候可以立刻得到信息。将日志存放在其他机器上是个好主意,这样即使黑客侵入了蜜罐,也无法删除日志文件。
那么什么时候你应该安装蜜罐呢?那要根据你的情况来决定:
n 如果你的机构有足够的资源用来追踪黑客,n 那么你应该建立一个蜜罐。所谓资源包括硬件以及人力。如果你没有足够的资源,n 那么安置蜜罐就没有什么必要,n 要知道获取你不n 会用到的信息是没有什么意义的。
n 仅仅当你可以以某种方式来用蜜罐取得的信息的时候,n 蜜罐才是有用的。
n 如果你想收集有关行为的证据来起诉黑客,n 那么你也可以用到蜜罐。
理想的情况下,蜜罐应该看起来像一个真实的系统,你可以制作一些假的数据文件,假的账户等等,使黑客信以为真,这样才能使黑客在上面逗留足够长的时间,从而你可以记录更多的活动。
你可以在蜜罐项目网站http://project.honeynet.org/上面取得更多的信息,可以找到一些你感兴趣的资料,是你能够对蜜罐有进一步的了解。你也可以去另外一个蜜罐网站http://www.citi.umich.edu/u/provos/honeyd/了解他们的开放源码的密罐的相关信息。其他一些可以取得更多信息的地方是:
南佛罗里达蜜罐项目网站:http://www.sfhn.net
相关白皮书:http://www.sfhn.net/whites/howto.html
1.1.4 安全区域和信任等级
一段时间以前,人们将网络划分为两大类区域:安全区域和非安全区域。某些时候这种划分也就意味着网络是在路由器或防火墙的内部或者外部。现在典型的网络通 常根据不同的安全策略等级和信任等级划分为多个区域。例如,公司的财务部门拥有非常高的安全等级,在这个区域中仅仅允许对少数服务的操作,不允许 Internet服务;而在DMZ或称非军事化区中,网络是向Internet开放的,此区域的信任等级与财务部门迥然不同。
根据信任等级和安 全策略的不同,你应该在不同的区域中应用不同的入侵检测规则和策略。对安全等级要求不同的网络在物理上是分离的。你可以在对安全要求不同的每个区域都安装 一套具有不同规则的IDS来检测可疑的网络活动。例如,在财务部门的网络中没有web服务器,指向80端口的数据包将被纪录为入侵行为,而这样的规则不能 用在DMZ中,因为DMZ中的web服务器是对每个人开放的。
1.2 IDS 策略
在你在网络中安装IDS之前,你必须有一个能够检测入侵者并做出相应动作的策略。一个策略必须能够指示一系列的规则以及这些规则如何应用。IDS策略应当包含以下的内容,并且你可以根据你的要求添加更多的内容:
谁 来察看IDS信息?IDS提供给你对入侵行为产生告警信息的机制。告警系统或者是简单的文本文件形式,或者更加复杂,也许集成到类似于 HpOpenView这样的网管软件或MySQL这样的数据库中。在你的系统中需要有人负责来监视入侵行为和制定策略。入侵行为可以通过弹出窗口或web 页面实时监视。在这种情况下,操作者必须要了解告警的意义所在以及告警信息中事件的安全等级。
谁来管理IDS,维护日志等等?对于所有的系统,都需要建立一个日常维护体制,IDS也一样。
谁来处理安全事件?如果没有安全事件处理机制,也就根本没有必要安装IDS。根据安全事件的安全等级的需要,某些情况可能需要政府机构的介入。
事件处理程序是什么样的?策略应当规定一些事件响应机制,根据涉及安全等级的高低向不同的管理层汇报。
例行报告:总结前一天、上一周、或者上一个月所发生的相关事情。
特 征库的升级:黑客总是不断的创造新的攻击方法。如果IDS了解攻击的特征,就能够检测到攻击。Snort规则用攻击特征库来检测攻击。因为攻击的特征经常 在改变,你也必须为你的IDS规则更新特征库。你可以定期直接在Snort网站上取得特征库的更新,也可以在一种新的攻击方式被发现时自己更新。
每个项目都需要文档系统。IDS策略应当描述当攻击被检测到时应当记录什么样的文档。文档可以包括简单的日志或者对入侵行为的完整纪录。你也可以采用多种方式来记录数据。例行报告也属于文档的组成部分。
基于你的IDS策略,你可以清楚的知道你的网络到底需要多少IDS探测器和其他资源,更精确的计算IDS的成本和费用。

1.3 Snort的部件
Snort在逻辑上可以分成多个部件,这些部件共同工作,来检测特定的功绩,并产生符合特定要求的输出格式。一个基于Snort的IDS包含下面的主要部件:
包解码器
预处理器
探测引擎
日志和告警系统
输出模块
图1-5显示了这些部件的关系。任何来自Internet的包到了包解码器,然后被送到输出模块,在这里或者被丢弃,或者产生日志或告警。
在这个部分中,我们将简要介绍这些部件。在你通读这本书并建立一些规则后,你将对这些部件以及它们之间怎样相互作用更加熟悉。
1.3.1 包解码器
包解码器从不同的网络接口中获取包并准备预处理或者送到探测引擎。网络接口可能是以太网、SLIP、PPP等等。
1.3.2 预处理器
预处理器是Snort在探测引擎做出一些操作来发现数据包是否用来入侵之前排列或者修改数据包的组件或者插件。一些预处理器也可以通过发现数据包头部异常 来执行一些探测工作,并产生告警。预处理器的工作对于任何IDS的探测引擎依据规则分析数据都是非常重要的。黑客有很多愚弄IDS的技术。比如,你建立这 样一条规则,用来在HTTP包中发现包含“scripts/iisadmin”的入侵特征,如果你将字符匹配过于严格的限制,那么黑客只需要做一些细小的 变通,就能很轻易的耍弄你。例如:
“scripts/./iisadmin”
“scripts/examples/../iisadmin”
“scripts/.\iisadmin”
为了使问题复杂化,黑客也会在字符中嵌入16位URI字符或者Unicode字符,这对web服务器来说是同样合法的,要注意web服务器能够理解所有这 些字符,并将它们处理成为类似于“scripts/iisadmin”这样的字符。如果IDS严格匹配某一字符串,就可能不会探测到这种类型的攻击。预处 理器可以将字符重新排列,以使IDS能够探测得到。
预处理器也或来包分片的组装。当一个大的数据流传向主机的时候,通常数据包会被分割。例如, 以太网中默认的最大数据包大小是1500字节,这个数值由网络接口的MTU(Maximus Transfer Unit)值来确定。这就意味着如果你发送的数据如果大于1500字节,它将会被分割成多个数据包,以使每个数据包的大小都小于或等于1500字节。接收 方系统能够将这些小的分片重新组装,还原成原始的数据包。在IDS上,在可以对数据包进行特征分析之前,也需要重新组装数据包。例如,可能入侵特征的一般 在一个数据包分片上,而另外一半在别的分片上面。为了使探测引擎能够准确的分析特征,就需要组装所有的分片。黑客也用数据分片来对抗入侵检测系统。
预处理器用来对抗这些攻击。Snort的预处理器能够组装数据分片,解码HTTP URI,重新组装TCP流等等。这些功能是IDS中非常重要的部分。
1.3.3 探测引擎
探测引擎是Snort中最重要的部分,它的作用是探测数据包中是否包含着入侵行为。探测引擎通过Snort规则来达到目的。规则被读入到内部的数据结构或 者链表中,并与所有的数据包比对。如果一个数据包与某一规则匹配,就会有相应的动作(记录日志或告警等)产生,否则数据包就会被丢弃。
探测引擎是 Snort中时间相关的组件,根据你的机器的处理能力和你所定义的规则的多少,探测引擎会消耗不同的时间来对不同的数据包做出响应。在Snort工作在 NIDS模式的时候,如果网络中数据流量过大,有时可能会因为来不及响应而丢弃一些包。探测引擎的负载取决于以下因素:
规则的数量
运行Snort的机器的处理能力
运行Snort的机器的内部总线速度
网络的负载
当你在设计NIDS的时候,你应该考虑所有的相关因素。
你需要了解探测系统可以剖析数据包并把规则应用在高的不同部分,这些部分可能是:
包的IP头
包的传输层头,包括TCP、UDP或其他传输层协议头,也可以是ICMP头。
应用层头。应用层头包括DNS头,FTP头,SNMP头,SMTP头等等还有很多。有时你可以用一些间接的方法来获得应用头信息,比如位偏移等等。
包载荷。这意味着你可以建立这样一种规则,用探测引擎来寻找传输的数据中的字符。
在 不同版本的Snort中,探测引擎由不同的工作方式。在所有1.x版的Snort中,一旦探测引擎将数据包匹配到某个规则的时候,就会停止进一步的过程, 然后根据规则产生告警或者记录日志,这就意味着即使如果包匹配多条规则,仅仅第一个规则被应用,并不再进行其他的匹配,这样做有好处,但是除了下面的情 况:如果包匹配的第一个规则是低优先级的,就只产生低优先级的告警,即使这个包也匹配高优先级的后面其他规则。这个问题在第二版的Snort中得到了修 正:包先对所有的规则进行匹配,然后再产生告警,在对所有的规则进行匹配之后,选择最高优先级的规则告警。
第2版Snort的探测引擎是完全重写的,从而比先前版本的快了许多。在写这本书的时候,Snort 2.0还没有开始发行,早些时候的测试显示新的引擎比老的引擎要快将近18倍。
1.3.4 日志和告警系统
依据在包中所找到的东西,一个包可以用来记录行为或者产生告警。日志可以存为简单的文本文件、tcpdump格式文件或者其他的形式。在默认情况下,所有 的日志文件都存放在/var/log/snort目录中。你可以在命令行中用-l选项来修改日志和告警存放的位置。更多的命令行选项将在下一章中讨论。这 些选项可以用来修改日志和告警的类型和细节等等。
1.3.5 输出模块
输出模块或插件可以根据你指定的保存日志和告警系统产生的输出信息的方式来执行不同的动作。基本上这些模块用来控制日志和告警系统产生的输出信息的格式。根据配置,输出模块可以做下列事情:
简单的在/var/log/snort/alerts文件或其他文件中记录日志
发送SNMP trap
将日志记录到类似于MySQL或Oracle的数据库中。你将在这本书的后面了解更多的关于使用MySQL的信息
产生XML输出
修改路由其或者防火墙的配置
向Windows主机发送SMB消息
其他一些工具可以用来发送如e-mail信息或者web页面浏览等格式的告警,在后面的章节中你将了解更多的信息。表1-1是IDS各种部件的汇总。
表1-1 IDS的部件

名称 描述
包解码器 为处理过程准备包
预处理器或输入插件 分析协议头部,规格化头部,探测头部异常,包分片组装,TCP流组装
探测引擎 将包与规则比对
日志和告警系统 产生告警和日志
输出模块 将告警和日志输出到最终目标

1.4 关于交换机
根据你用的交换机的不同,你会有多种方式将Snort的机器安装在交换机端口上。一些交换机,比如CISCO,允许 你复制所有的通信到你连接Snort机器的那个端口上,这样的端口通常指的是Spanning端口。安装Snort的最佳位置是直接连到路由其或者防火墙 后面,这样Snort可以在数据进入交换机或HUB之前捕获所有的Internet数据流。例如,你的防火墙有连接Internet的T1线路,并用交换 机连接内部网络,典型的连接方案如图1-6所示:
如果你的交换机有Spanning端口,你可以像图1-7所示的那样将IDS及器连接到spanning端口上,这样IDS可以看到所有的与Internet的通信以及内部通信。
你也可以将IDS连接到防火墙与交换之间的HUB上,这样所有的进入和流出的通信对于IDS也是可见的,此方案如图1-8所示。
但是要注意,如果IDS按图1-8安置,那么IDS将不能得到内部通信的数据包,只能来见与Internet之间的通信。这种方案对于内部网络是可信的,而预想的攻击来自外部是非常有用的。
1.5 跟踪TCP数据流
Snort 新增加了一种叫做Stream4的预处理器,这种预处理器能够同时处理数千并发的数据流。关于它的配置将在第四章中讨论。它可以重新组装TCP数据流,并 进行状态检测。这就意味着你可以组装一个特定的TCP会话,并从利用多个TCP包进行攻击的方式中找出异常。你也可以查找流向或(和)流出某个服务器端口 的数据包。
1.6 Snort支持的平台
Snort支持多种硬件平台和操作系统。目前Snort支持下列操作系统:
• Linux
• OpenBSD
• NetBSD
• Solaris (Sparc或者i386)
• HP-UX
• AIX
• IRIX
• MacOS
• Windows
你可以到Snort的网站http://www.snort.org查询Snort当前支持的平台的列表。
1.7 如何保护IDS自身
有一个关键问题是,如何保护运行IDS的系统?如果IDS本身的安全受到了威胁,你收到的告警可能是错误的,也许就根本收不到告警。入侵者也许会在做出实际的攻击之间先让IDS失效。有许多方式来保护你的系统,从通用的建议到一些复杂的方法,下面会提到一些方法:
首先你可以做的事情是不要再你运行IDS探测器的机器上运行任何服务。网络服务是用来探寻系统最普遍的方式。
新的威胁出现后,厂商会发布相应的补丁,只是一个连续不断,永无休止的过程。你的IDS应该安装从厂商那里得到的最新的补丁。比如,如果你的Snort在Window机器上运行,你应该安装所有微软发布的最新的安全补丁。
配置你的IDS机器,使其不会对ping(ICMP echo)做出回应。
如果你在Linux机器上运行IDS,请用netfileter/iptables来阻止任何不必要的数据,这时Snort仍然可以看到所有的数据包。
如果你的IDS机器仅仅用来做入侵检测,那么除非完全有必要,不要在上面进行任何其他的活动以及设立其他用户账号。
除了这些通常的方法之外,Snort也可以在一些特殊方法下应用。下面有两种特别的技术来防止Snort遭到攻击。
1.7.1 在隐秘端口(Stealth Interface)上运行Snort
你 可以在隐秘端口上运行Snort,这种端口仅仅监听进入数据包而不向外部发送任何的数据包。在隐秘端口上我们用一种特殊的电缆,在你运行Snort的主机 上,将端口的1针和2针短路,3针和6针连到对端。你可以到Snort的FAQ页面http//www.snort.org/docs/faq.html 寻找这种方法的更多信息。
1.7.2 在没有IP地址的接口上运行Snort
你也可以在一个没有配置IP地址的接口上运行Snort。例 如在Linux机器上,你可以用“ifconfig eth0 up”这样的命令来激活没有配置IP地址的接口eth0。这种方法的好处是,因为Snort主机没有IP地址,因此没有人可以访问它。你可以在eth1上 配置IP地址用来访问这个探测器。见图1-9。
在Windows系统上,你可以用一个不绑定TCP/IP协议的接口,这样就不会在这个接口上出 现IP地址了。不要忘记同时也要禁用其他协议和服务。在某些情况下,当接口不配置IP地址的时候,你会遇到wincap(Windows用来捕获包的库) 不可用的提示,如果遇到这样的情况,你可以用下面的方法:
在你想做隐秘端口的网络接口上配置TCP/IP协议,同时禁用其他一切协议和服务。
启用DHCP客户端。
禁用DHCP服务器。
这样就会使网络接口没有IP地址,网络接口仍然可以绑定TCP/IP协议。
1.8 相关资源
1. 入侵检测 FAQ : http://www.sans.org/newlook/resources/IDFAQ/
ID_FAQ.htm
2. 蜜罐项目:http://project.honeynet.org/
3. Snort FAQ : http://www.snort.org/docs/faq.html
4. Honeyd 蜜罐: http://www.citi.umich.edu/u/provos/honeyd/
5. Winpcap : http://winpcap.polito.it/
6. Cisco systems : http://www.cisco.com
7. Checkpoint 网站: http://www.checkpoint.com
8. Netscreen :http://www.netscreen.com
9. Netfilter : http://www.netfilter.org
10. Snort :http://www.snort.org
11. Nmap工具: http://www.nmap.org
12. Nessus : http://www.nessus.org
13. MySQL 数据库:http://www.mysql.org
14. ACID: http://www.cert.org/kb/acid
15. Apache web 服务器: http://www.apache.org
安装Snort并开始初步工作
Snort 可以仅仅安装为守护进程或者一个包括很多其他工具的完整系统。如果你仅仅安装Snort,你可以得到入侵数据的文本文件或二进制文件,然后可以用文本编辑 器或其它类似于Barnyard的工具察看,本书的后面将对此做出描述。在简单安装的情况下,你也可以让告警信息以SNMP trap的形式发送到类似于HP OpenView或者OpenNMS之类的网管系统上。告警信息也可以以SMB弹出窗口的形式发送到Windows机器上。如果你与其它工具一起安装,你 可以做一些更加复杂的操作,比如将Snort数据发送到数据库并通过Web界面来分析。分析工具能够让你对捕获的数据有更加直观的认识,而不用对晦涩的日 志文件耗费大量时间。
其它一些可以用到的工具列在下面,它们中的没有特都有特定的任务。一个综合的Snort系统用这些工具来提供具有后台数据库Web用户界面。
MySQL用来Snort纪录告警日志。也可以用类似于Oracle的数据库,但在Snort环境中MySQL更加常用。事实上,Snort可以用任何ODBC兼容的数据库。
Apache用作web服务器
PHP用作web服务器和MySQL数据库之间的接口。
ACID是用来Web界面来分析Snort数据的PHP软件包。
GD库被ACID用来生成图表
PHPLOT用来在ACID的web界面将数据表现为图表形式。为了是PHPLOT工作,GD库必须要正确配置。
ADODB被ACID用来连接MySQL数据库。