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服务器。

相关文章

本文还暂无回复

添加回复

支持 Ctrl+Enter 快速提交