输出插件

输出插件使得Snort在向用户提供格式化输出时更加灵活。输出插件在Snort的告警和记录子系统被调用时运行,在预处理程序和探测引擎之后。规则文件中指令的格式非常类似于预处理程序。 
注意:如果在运行时指定了命令行的输出开关,在Snort规则文件中指定的输出插件会被替代。例如,如果在规则文件中指定了alert_syslog插件,但在命令行中使用了"-A fast"选项,则alert_syslog插件会被禁用而使用命令行开关。多个输出插件是在snort的配置文件中指定的。当指定多个输出插件时,它们被压入栈并且在事件发生时按顺序调用。关于标准的记录和报警系统,输出模块缺省把数据发送到 /var/log/snort.或者通过使用-l命令行参数输出到一个用户指定的目录。在规则文件中通过指定output关键字,使得在运行时加载输出模块。 
格式: 
output <name>: <options> 
例子: 
output alert_syslog: LOG_AUTH LOG_ALERT 

Alert_syslog 
该插件向syslog设备发送告警(很像命令行中的-s开关)。该插件也允许用户指定记录设备,优先于Snort规则文件中的设定,从而在记录告警方面给用户更大的灵活性。 
可用关键字: 
选项(Options) 
LOG_CONS 
LOG_NDELAY 
LOG_PERROR 
LOG_PID 
设备(Facilities) 
LOG_AUTH 
LOG_AUTHPRIV 
LOG_DAEMON 
LOG_LOCAL0 
LOG_LOCAL1 
LOG_LOCAL2 
LOG_LOCAL3 
LOG_LOCAL5 
LOG_LOCAL6 
LOG_LOCAL7 
LOG_USER 
优先级(Priorities) 
LOG_EMERG 
LOG_ALERT 
LOG_CRIT 
LOG_ERR 
LOG_WARNING 
LOG_NOTICE 
LOG_INFO 
LOG_DEBUG 
格式: 
alert_syslog: <facility> <priority> <options> 

Alert_fast 
将报警信息快速的打印在指定文件的一行里。它是一种快速的报警方法,因为不需要打印数据包头的所有信息。 
格式: 
alert_fast: <output filename> 
例子: 
output alert_fast: alert.fast 

Alert_full 
打印数据包头所有信息的报警。这些报警信息写到缺省的日志目录(/var/log/snort)或者写到命令行指定的目录。在日志目录内,每个IP都创建一个目录。产生报警的数据包被解码后写到这个目录下的文件里。这些文件的创建将大大降低snort的性能。所以这种输出方法对大多数不适用,但那些轻量级的网络环境还是可以使用的。 
格式: 
alert_full: <output filename> 
例子: 
output alert_full: alert.full 

Alert_smb 
这个插件将把WinPopup报警信息发送给NETBIOS命名的机器上的一个文件。并不鼓励使用这个插件,因为它以snort权限执行了一个外部可执行二进制程序,通常是root权限。那个工作站上接受报警信息的文件每行存放一条报警信息。 
格式: 
alert_smb: <alert workstation filename> 
例子; 
output alert_smb: workstation.list 
Alert_unixsock 
打开一个UNIX套接字,并且把报警信息发送到那里。外部的程序/进程会在这个套接字上侦听并实时接收这些报警数据。 
格式: 
alert_unixsock 
例子: 
output alert_unixsock 

Log_tcpdump 
log_tcpdump插件将数据包记录到tcpdump格式的文件中。这便于使用已有的多种检查tcpdump格式文件的工具,来对收集到的流量数据进行后处理工作。该插件只接受一个参数,即输出文件名 
格式: 
log_tcpdump: <output filename> 
例子: 
output log_tcpdump: snort.log 

database 
该插件由Jed Pickel提供将Snort数据记录到Postgres SQL数据库中。更多的有关安装和配置该插件的信息可以在Incident.org http://www.incident.org/snortdb)找到。这个插件的参数是数据库名称和一个参数列表。参数由格式parameter argument来指定。可用参数如下: 
host 连接主机。如果指定了一个非零字串,就使用TCP/IP通讯。如果不指定主机名,就会使用Unix domain socket连接。 
port 连接服务器主机的端口号,或者是Unix-domain连接的socket文件名扩展。 
dbname 数据库名。 
user – 数据库中身份认证用的用户名。 
password 如果数据库要求口令认证,就使用这个口令。 
sensor_name 为snort指定一个你自己的名字。如果你不指定,这里就自动产生一个。 
encoding 因为数据包负载和选项都是二进制的,所以没有一个轻便简单的方法把它存储在数据库中。没有使用BLOBS,因为它们在穿越数据库时不是那么轻便的。所以,我们提供了一个encoding 选项给你。你可以从下面的选项中选择。它们有各自的优缺点。 
hex (default) 把二进制数据表示成十六进制字符串 
storage requirements – 二进制的二倍容量 
searchability – 很好用 
human readability – 不是很好读除非你很滑稽,要求邮件处理。 
base64 把二进制数据表示成以64为基的字符串。 
storage requirements二进制的1.3倍容量。 
searchability – 没有邮件处理是不可能的。 
human readability –不易读,要求邮件处理。 
ascii 把二进制数据表示成 ascii 码字符串。这是唯一的可以释放数据的选项。非ascii码数据用… 代替。即使你选择了这个选项,ip和tcp选项数据还将用十六进制表示,因为那些数据用ascii码标上没有任何意义。 
storage requirements – 稍微比二进制大,因为避免了一些字符(&,<,>)。 
searchability – 对于搜索文本字符串很好用,而搜索二进制串是不可能的。 
human readability – 很好用。 
detail 你想存储多少细节数据,有如下选项: 
full (缺省值)记录一个引起报警数据包的所有的细节(包括ip/tcp选项和负载)。 
fast 只记录少量数据。如果选择了这个选项,你将削减了潜在的分析能力,但这仍是一些应用的最佳选项。这将记录下面的字段(timestamp, signature, source ip, destination ip, source port, destination port, tcp flags, and protocol) 
此外,还必须定义一个记录方法和数据库类型。有两种记录方法,log和alert。设置为log类型,将启动这个程序的数据库记录功能。如果你设置为log类型,输出链表将调用这个插件。设置为alert类型,将启动这个程序的数据库报警输出功能。 
当前共有四种数据库类型:MySQL, PostgreSQL, Oracle, 和 unixODBC-兼容数据库。 
格式: 
output database: log, mysql, dbname=snort user=snort host=localhost password=xyz 

CSV 
CSV输出插件可以将报警数据以一种方便的形式输出到一个数据库。这个插件要求两个参数,一个全路径文件名和输出模式选项。下面是模式选项列表。如果模式选项缺省,就按模式选项列表中的顺序输出。 
timestamp 
msg 
proto 
src 
srcport 
dst 
dstport 
ethsrc 
ethdst 
ethlen 
tcpflags 
tcpseq 
tcpack 
tcplen 
tcpwindow 
ttl 
tos 
id 
dgmlen 
iplen 
icmptype 
icmpcode 
icmpid 
icmpseq 
格式: 
output alert_CSV: <filename> <format> 
例子: 
output alert_CSV: /var/log/alert.csv default 
output alert_CSV: /var/log/alert.csv timestamp, msg 

Unified 
Unified输出插件被设计成尽可能快的事件记录方法。它记录一个事件到一个报警文件和一个数据包到一个日志文件。报警文件包含一个事件的主要信息(ips, protocol, port, message id)。日志文件包含数据包信息的细节(一个数据包考贝及相关的事件ID)。 
这两个文件都是以spo_unified.h文件中描述的二进制形式写的。以unix秒为单位的时间将附加到每个文件的后面写出。 
格式 
output alert_unified: <file name> 
output log_unified: <file name> 
例子: 
output alert_unified: snort.alert 
output log_unified: snort.log 

Log Null 
有时创建这样的规则是必要的,即在某些情况下能够发出报警而不记录数据包。当使用log_null插件时就相当于命令行的-N选项,但这个插件可以工作在一个规则类型上。 
格式: 
output log_null 

ruletype info 
type alert 
output alert_fast: info.alert 
output log_null 



自己动手编写好的规则 
当编写snort规则时,首先考虑的是效率和速度。 
好的规则要包含content选项。2.0版本以后,snort改变了检测引擎的工作方式,在第一阶段就作一个集合模式匹配。一个content选项越长,这个匹配就越精确。如果一条规则不包含content选项,它们将使整个系统慢下来。 
当编写规则时,尽量要把目标定位在攻击的地方(例如,将目标定位在1025的偏移量等等)而不仅仅是泛泛的指定(如,在这匹配脚本代码)。Content规则是大小写敏感的(除非你使用了nocase选项)。不要忘记content是大小写敏感的和大多数程序的命令都是大写字母。FTP就是一个很好的例子。考虑如下的规则: 
alert tcp any any -> 192.168.1.0/24 21 (content: "user root"; msg: "FTP root login";) 
alert tcp any any -> 192.168.1.0/24 21 (content: "USER root"; msg: "FTP root login";) 
上面的第二条规则能检测出大多数的自动以root登陆的尝试,而第一条规则就不行。Internet 守护进程在接受输入时是很随便的。在编写规则时,很好的理解协议规范将降低错过攻击的机会。 

加速含有内容选项的规则 
探测引擎运用规则的顺序和它们在规则中的书写顺序无关。内容规则选项总是最后一个被检验。利用这个事实,应该先运用别的快速规则选项,由这些选项决定是否需要检查数据包的内容。例如:在TCP会话建立起来后,从客户端发来的数据包,PSH和ACK这两个TCP标志总是被置位的。如果想检验从客户端到服务器的有效载荷,利用这个事实,就可以先进行一次TCP标志检验,这比模式匹配算法(pattern match algorithm)在计算上节约许多。使用内容选项的规则要加速的一个简便方法就是也进行一次标志检验。基本思想是,如果PSH和ACK标志没有置位,就不需要对数据包的有效载荷进行检验。如果这些标志置位,检验标志而带来的计算能力消耗是可以忽略不计的。 

你可能感兴趣的:(输出插件)