这个预处理器有4个相关的参数
所监控的地址范围,采用CIDR规格。
在一个时间段内访问的端口数目,例如这个参数取5表示在一个时间段内,如果超过5个端口被扫描,则产生告警。
时间段,用来配合上个参数的门限时间范围,用秒表示。
记录日志的文件路径。
下面是个配置实例,用来监测针对网络192.168.1.0/24的端口扫描,并将日志记录到/var/log/snort/portscan.log文件中。
preprocessorportscan:
192.168.1.0/24510\
/var/log/snort/portscan.log
端口扫描活动是针对TCP和UDP端口的。
端口扫描预处理器可以监测正常端口和隐秘端口的扫描。
针对隐秘端口的扫描,可以查看nmap的相关文档或网站。
端口扫描的主要方法如下:
TCP端口连接扫描。
这种方式试图对某个端口进行标准的TCP连接,如果连接建立,则表示这个端口是打开的。
SYN扫描。
入侵者发送一个带有SYN标志的TCP包到某个端口,如果收到了带有SYN和ACK标志的回应,那么这个端口是打开的,如果收到了带有RST标志的包,这个端口就是关闭的。
NULL端口扫描,FIN端口扫描,XMAS端口扫描,这是几个比较类似的扫描方式。
入侵者发送一个TCP包出去,如果收到带有RST标志的包,表示端口是关闭的,如果什么包也没有收到,就有端口打开的可能性。
还有一种预处理器,可以和这种预处理器一同工作,它叫做端口扫描忽略预处理器,用来忽略针对某些主机的扫描行为,用法如下例所示:
preprocessorportscan-ignorehosts:
192.168.1.10/32\
192.168.1.13/32
4.1.3frag2模块
这个预处理器用来组装包的分片,老版本的Snort用defrag。
应用frag2的时候,你可以配置组装分片的超时和内存上限。
默认情况下是4M的内存和60秒的超时界限。
如果在这个时间段内没有完成,就把包丢弃。
下面的命令用默认参数打开frag2:
preprocessorfrag2
下面的命令将frag2配置为2M的内存上限和30秒的超时。
在一个高速的网络中,你应该用更多的内存上限。
4.1.4stream4模块
这个模块用来代替老版本的Stream模块,它有两个基本功能:
Tcp数据流的组装
状态监测
为了使Stream4正常工作,你必须在snort.conf中配置两个预处理器,分别是“stream4”和“stream4_reassemble.”它们都有很多的参数,如果你不配置这些参数,系统就会采用默认值。
Stream4预处理器的大体格式如下:
preprocessorstream4:
[noinspect],[keepstats],\
[timeout],[memcap],[detect_scan],\
[detect_state]
下面是关于各个参数的描述和默认值
参数
表述
默认值
Noinspect
关闭状态监测
ACTIVE
Keepstats
将会话概要记录到session.log文件中
INACTIVE
Timeout
保持一个活动会话的超时
30秒
Memcap
这个模块利用的最大内存
8MB
Detect_scan
监测端口扫描活动
INACTIVE
Detect_state_problems
监测TCP流相关的各种问题
INACTIVE
下面是stream4_reassemble预处理器的主要格式:
preprocessorstream4_reassemble:
[clientonly],
[serveronly],[noalerts],[ports]
下面是这个预处理器的主要参数的描述
参数
表述
Clientonly
仅仅组装客户端的数据流
Severonly
仅仅组装服务器端的数据流
Noalerts
在遇到逃避和嵌入式攻击时不告警
Ports
组装关于特定端口的数据流的端口列表,用空格分隔,all表示端口21,23,25,53,80,110,111,143和513。
指定少数的端口可以节省CPU时间。
4.1.5spade模块
SPADE是统计包异常探测引擎的缩写,你可以在
要记住SPADE对系统的要求比较高,尤其是在高负荷的网络上,因此要小心使用。
4.1.6ARP欺骗
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“preprocessorarpspoof:
-unicast”。
你可以在Snort内部缓存中预先存放MAC-IP映射对,如果遇到不匹配,系统就会产生告警。
下面的一行添加一个IP-MAC对,可以用来探测ARP欺骗的企图。
preprocessorarpspoof_detect_host:
192.168.1.13\
34:
45:
fd:
3e:
a2:
01
4.2输出模块
输出模块用来控制Snort探测引擎的输出,你可以将输出的信息送到各种目标。
比如:
数据库
SMB弹出窗口
系统日志
XML或者CSV文件。
在snort.conf中配置输出模块的命令大体如下所示:
output[:
arguments]
比如你希望将信息记录到名为snort的MySQL数据库,可以采用如下的配置:
outputdatabase:
log,mysql,user=rrpassword=rr\
dbname=snorthost=localhost
一旦你在配置输出模块加入上面着一行,所有的告警都送到MySQL数据库中,在日志文件中就不会出现了,也有一些方法可以将告警送到不同的目标。
下面的例子是将SMB弹出窗口送到workstation.list文件中列举的主机上:
outputalert_smb:
workstation.list
有时候你可能需要将告警发到多种目标,那么用ruletype关键字自定义动作时一个好主意。
例如,下面豫剧定义了一个动作,将告警同时发送到数据库和SMB弹出窗口。
ruletypesmb_db_alert
{
typealert
outputalert_smb:
workstation.list
outputdatabase:
log,mysql,user=rrpassword=rr\
dbname=snorthost=localhost
}
下面的规则应用了上面的自定义动作。
smb_db_alerticmpanyany->192.168.1.0/24any\
(fragbits:
D;msg:
"DontFragmentbitset";)
4.2.1alert_syslog输出模块
几乎所有的UNIX系统中都有系统日志守护进程syslog,它的配置文件是/etc/syslog.conf。
你可以查看syslogd和syslog.conf的手册来获得更多信息。
Alert_syslog模块使你能够将告警发送到系统日志钟。
如果你需要的话,系统日志守护进程也可以将告警发送到其他的主机。
下面是这个模块的配置格式:
outputalert_syslog:
其中,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.2alert_full输出模块
这个模块用来想文件记录详尽的告警信息。
下面的配置让系统把日志记录到Snort日志目录的alert_detailed文件中:
outputalert_full:
alert_detailed
尽管这个模块可以使你得到详细的信息,但是也会导致系统资源的大量消耗,在一个高负载的网络环境中,可能导致系统来不及响应而使探测引擎忽略一些数据包。
4.2.3alert_fast输出模块
如前面所提到的,记录详细的信息可能导致系统资源的过度消耗,因此Snort提供快速记录简要信息的输出模块,每个信息只有一行,这个模块的配置如下所示:
outputalert_fast:
alert_quick
4.2.4alert_smb模块
这个模块用linux的SAMBA客户端smbclient程序向Windows工作站发送SMB告警,使用之前确定smbclient程序的路程在PATH环境变量中。
下面是一个示例:
outputalert_smb:
workstation.list
每个工作站的SMB名称都要分行列在workstation.list文件中。
SMB名称就是Windows机器的计算机名称。
客户端程序会自己解析这个名称。
4.2.5log_tcpdump模块
这个模块用来将告警数据存放为tcpdump格式,这种方法便于高负荷网络中提高分析数据的速度。
下面是配置格式:
outputlog_tcpdump:
下面是一个示例:
outputlog_tcpdump:
/var/log/snort/snort_tcpdump.log
4.2.6XML输出模块
Snort可以用SNML(SimpleNetworkModelingLanguage)来输出告警以便基于XML的解释器或浏览器阅读。
通过这个插件,你可以将XML数据存放在本地机器上或者通过HTTP及HTTP协议传送到Web服务器上。
XML输出模块的基本用法如下:
outputxml:
[log|alert],[parameterlist]
你可以选择用XML记录告警或者日志,其他的参数如下表所示:
参数
描述
File
将数据储存到XML文件中
Protocol
将信息记录到其他机器上用的协议如HTTP,HTTPS。
Host
记录信息的远程主机
Port
记录信息的远程主机的端口
Cert
Https用到的证书
Key
客户端私钥
Ca
认证证书的服务器
Server
X.509证书的CN
4.2.6.1例子
将日志记录到本地主机上的文件“xmlout”:
outputxml:
log,file=xmlout
文件名字会添加时间和日期作为后缀,这样的目的是为多个Snort进程服务。
将日志记录用HTTP协议到的xmlout文件上:
outputxml:
alert,protocol=http\
host=file=xmlout
将日志记录用HTTPS协议到的xmlout文件上:
outputxml:
alert,protocol=https\
host=file=xmloutcert=conformix.crt\
key=conformix.pemca=ca.crtserver=Conformix_server
将日志记录到监听5555端口的TCP服务器上:
outputxml:
alert,protocol=tcp\
host=port=5555
典型的输出XML文件如下:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEsnort-message-version-0.2>
eth0
192.168.1.2
ICMPPacketwithTTL=100
2002-07-2317:
48:
31-04
hlen="5"len="60"id="37123"ttl="100"csum="519">
6162636465666768696A6B6C6D6E6F7071727374757677616263646566676869
4.2.7记录到数据库
Snort可以用数据库来记录日志和告警,你可以用Oracle或MySQL等多种类型的数据库,如下面的例子:
outputdatabase:
log,mysql,user=rrpassword=rr\
dbname=snorthost=localhost
下一章将详细讨论如何应用数据库,下面是数据库数据模块的格式:
outputdatabase:
,,\
这里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模块的语句模式如下:
outputcsv:
文件默认被创建到/var/log/snort路径下面,选项用来定义文件中储存什么样的信息以及以什么样的顺序储存。
例如,你用default作为格式选想那么告警的所有参数将被存储在文件中:
outputcsv:
csv_logdefault
输出文件的格式如下:
07/23-18:
24:
03.388106,ICMPPacketwith
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,0x189,***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***,0x55628967,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,,0x1920,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序列号
你可以用少量的选项,例如:
outputcsv:
csv_logtimestamp,msg,src,dst
纪录的日志如下:
07/23-19:
31:
27.128106,GETmatched,192.168.1.2,192.168.10.193
07/23-19:
31:
27.278106,GETmatched,192.168.1.2,192.168.10.193
4.2.9统一纪录输出模块
同意输出适合告诉纪录,你可以将日志和告警存放不同的文件中,下面是配置格式:
outputalert_unified:
filename,\
limit
output