Sid
这个关键字被用来识别snort规则的唯一性。这个信息允许输出插件很容易的识别规则的ID号。
sid 的范围是如下分配的:
<100 保留做将来使用
100-1000,000 包含在snort发布包中
>1000,000 作为本地规则使用
文件sid-msg.map 包含一个从msg标签到snort规则ID的映射。这将被post-processing 输出模块用来映射一个ID到一个报警信息。
格式:
sid:
rev
这个关键字是被用来识别规则修改的。修改,随同snort规则ID,允许签名和描述被较新的信息替换。
格式:
rev:
Classtype
这个关键字把报警分成不同的攻击类。通过使用这个关键字和使用优先级,用户可以指定规则类中每个类型所具有的优先级。具有classification的规则有一个缺省的优先级。
格式:
classtype:
在文件classification.config中定义规则类。这个配置文件使用如下的语法:
config classification:
Priority
这个关键字给每条规则赋予一个优先级。一个classtype规则具有一个缺省的优先级,但这个优先级是可以被一条priority规则重载的。
格式:
priority:
Uricontent
这个关键字允许只在一个请求的URI(URL)部分进行搜索匹配。它允许一条规则只搜索请求部分的攻击,这样将避免服务数据流的错误报警。关于这个关键字的参数的描述可以参考content关键字部分。这个选项将和HTTP解析器一起工作。(只能搜索第一个“/”后面的内容)。
格式:
uricontent:[!]
Tag
这个关键字允许规则记录不仅仅是触发这条规则的那个数据包。一旦一条规则被触发,来自这个主机的数据包将被贴上“标签”。被贴上标签的数据流将被记录用于随后的响应代码和提交攻击流量的分析。
格式:
tag:
type
session 记录触发这条规则的会话的数据包
host 记录激活tag规则的主机的所有数据包(这里将使用[direction]修饰词
count Count 指定一个单位的数量。这个单位由
metric
packets 标记主机/会话的
seconds 标记主机/会话的
例子:
alert tcp !$HOME_NET any -> $HOME_NET 143 (flags: A+; content: "|e8 c0ff ffff|/bin/sh"; tag: host, 300, packets, src; msg: "IMAP Buffer overflow, tagging!";)
alert tcp !$HOME_NET any -> $HOME_NET 23 (flags: S; tag: session, 10, seconds; msg: "incoming telnet session";)
Ip_proto
Ip_proto关键字允许检测IP协议头。这些协议可以是由名字标识的,参考/etc/protocols文件。在规则中要谨慎使用ip_protocol关键字。
格式:
ip_proto:[!]
例子:
alert ip !$HOME_NET any -> $HOME_NET any (msg: "IGMP traffic detected"; ip_proto: igmp;)
SameIP
Sameip关键字允许规则检测源IP和目的IP是否相等。
格式:
sameip;
例子:
alert ip $HOME_NET any -> $HOME_NET any (msg: "SRC IP == DST IP"; sameip;)
Regex
这个模块现在还正在开发,所以在当前的产品规则集中还不能使用。如果使用的话,它将触发一个错误信息。
Flow
这个选项要和TCP流重建联合使用。它允许规则只应用到流量流的某个方向上。这将允许规则只应用到客户端或者服务器端。这将能把内网客户端流览web页面的数据包和内网服务器所发送的数据包区分开来。这个确定的关键字能够代替标志:A+ 这个标志在显示已建立的TCP连接时都将被使用。
选项:
to_client 触发服务器上从A到B的响应。
to_server 触发客户端上从A到B的请求。
from_client 触发客户端上从A到B的请求。
from_server触发服务器上从A到B的响应。
established 只触发已经建立的TCP连接。
stateless 不管流处理器的状态都触发(这对处理那些能引起机器崩溃的数据包很有用。
no_stream 不在重建的流数据包上触发(对dsize 和 stream4 有用。
only_stream 只在重建的流数据包上触发。
格式:
flow:[to_client|to_server|from_client|from_server|established|stateless|no_stream|
only_stream]}
例子:
alert tcp !$HOME_NET any -> $HOME_NET 21 (flow: from_client; content: "CWD incoming"; nocase; msg: "cd incoming detected"; )
alert tcp !$HOME_NET 0 -> $HOME_NET 0 (msg: "Port 0 TCP traffic"; flow: stateless;)
Fragoffset
这个关键字允许把IP分段偏移值和一个十进制数相比较。为了抓到一个IP会话的第一个分段,你可以使用这个fragbits关键字并且和fragoffset:0 选项一起查看更多的分段选项。
格式:
fragoffset:[<|>]
例子:
alert ip any any -> any any (msg: "First Fragment"; fragbits: M; fragoffset: 0;)
Rawbytes
Rawbytes关键字允许规则查看telnet 解码数据来处理不常见的数据。这将使得telnet 协议代码独立于预处理程序来检测。这是对前面的content 的一个修饰。
格式:
rawbytes;
例子:
alert tcp any any -> any any (msg: "Telnet NOP"; content: "|FF F1|"; rawbytes;)
distance
distance关键字是content关键字的一个修饰词,确信在使用content时模式匹配间至少有N个字节存在。它被设计成在规则选项中和其他选项联合使用。
格式:
distance:
例子:
alert tcp any any -> any any (content: "2 Patterns"; content: "ABCDE"; content: "EFGH"; distance: 1;)
Within
Winthin关键字是content关键字的一个修饰词,确保在使用content时模式匹配间至多有N个字节存在。它被设计成在规则选项中和distance选项联合使用。
格式:
within:
例子:
alert tcp any any -> any any (content: "2 Patterns"; content: "ABCDE"; content: "EFGH"; within: 10;)
Byte_Test
测试一个字节的域为特定的值。能够测试二进制值或者把字节字符串转换成二进制后再测试。
格式:byte_test:
bytes_to_convert 从数据包取得的字节数。
operator 对检测执行的操作 (<,>,=,!)。
value 和转换后的值相测试的值。
offset 开始处理的字节在负载中的偏移量。
relative 使用一个相对于上次模式匹配的相对的偏移量。
big 以网络字节顺序处理数据(缺省)。
little 以主机字节顺序处理数据。
string 数据包中的数据以字符串形式存储。
hex 把字符串数据转换成十六进制数形式。
dec 把字符串数据转换成十进制数形式。
oct 把字符串数据转换成八进制数形式。
例子:
alert udp $EXTERNAL_NET any -> $HOME_NET any (msg:"AMD procedure 7 plog overflow "; content: "|00 04 93 F3|"; content: "|00 00 00 07|"; distance: 4; within: 4; byte_test: 4,>, 1000, 20, relative;)
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"AMD procedure 7 plog overflow "; content: "|00 04 93 F3|"; content: "|00 00 00 07|"; distance: 4; within: 4; byte_test: 4, >,1000, 20, relative;)
Byte_Jump
Byte_jump 选项用来取得一定数量的字节,并把它们转换成数字形式,跳过一些字节以进一步进行模式匹配。这就允许相对模式匹配在网络数据中进行数字值匹配。
格式:
byte_jump:
bytes_to_convert 从数据包中选出的字节数。
offset 开始处理的字节在负载中的偏移量。
relative 使用一个相对于上次模式匹配的相对的偏移量。
big 以网络字节顺序处理数据(缺省)。
little 以主机字节顺序处理数据。
string 数据包中的数据以字符串形式存储。
hex 把字符串数据转换成十六进制数形式。
dec 把字符串数据转换成十进制数形式。
oct 把字符串数据转换成八进制数形式。
align 以32位为边界对转换的字节数对齐,即转换的字节数为4的倍数。
例子:
alert udp any any -> any 32770:34000 (content: "|00 01 86 B8|"; content: "|00 00 00 01|"; distance: 4; within: 4; byte_jump: 4, 12, relative, align; byte_test: 4, >, 900, 20, relative; msg: "statd format string buffer overflow";)
预处理程序
预处理程序从Snort版本1.5开始引入,使得Snort的功能可以很容易地扩展,用户和程序员能够将模块化的插件方便地融入Snort之中。预处理程序代码在探测引擎被调用之前运行,但在数据包译码之后。通过这个机制,数据包可以通过额外的方法被修改或分析。使用preprocessor关键字加载和配置预处理程序。在Snort规则文件中的preprocessor指令格式如下:
preprocessor
例子:
preprocessor minfrag: 128
HTTP Decode
HTTP Decode用于处理HTTP URI字符串并且将串中的数据转化为可读的ASCII字串。HTTP对于一些特性定义了一个十六进制编码方法,例如字符串%20被解释成一个空格。Web服务器被设计成能够处理无数的客户端并且支持多种不同的标准。
格式:
http_decode:
例子:
preprocessor http_decode: 80 8080 unicode iis_flip_slash iis_alt_unicode
Portscan Detector
Snort Portscan预处理程序的用处:
向标准记录设备中记录从一个源IP地址来的端口扫描的开始和结束。如果指定了一个记录文件,在记录扫描类型的同时也记录目的IP地址和端口。端口扫描定义为在时间T(秒)之内向超过P个端口进行TCP连接尝试,或者在时间T(秒)之内向超过P个端口发送UDP数据包。端口扫描可以是对任一IP 地址的多个端口,也可以是对多个IP地址的同一端口进行。现在这个版本可以处理一对一和一对多方式的端口扫描,下一个完全版本将可以处理分布式的端口扫描(多对一或多对多)。端口扫描也包括单一的秘密扫描(stealth scan)数据包,比如NULL,FIN,SYNFIN,XMAS等。如果包括秘密扫描的话,端口扫描模块会对每一个扫描数据包告警。为避免这种情况,可以在Snort标准发行版中的scan-lib文件里把有关秘密扫描数据包的小节注释掉,这样对每次扫描就只记录一次。如果使用外部记录特性,可以在记录文件中看到(端口扫描的?)技术和类型。该模块的参数如下:
- network to monitor - 监视端口扫描的目标网络以network/CIDR表示。
- number of ports - 在探测期间访问的端口数目。
- detection period - 以秒计数的端口访问时间限制。
- logdir/filename - 告警信息存放的目录/文件名,告警也可以写入标准的告警文件中。
格式:
portscan:
例子:
preprocessor portscan: 192.168.1.0/24 5 7 /var/log/portscan.log
Portscan Ignorehosts
如果用户的服务器(比如NTP,NFS和DNS服务器)会妨碍端口扫描的探测,可以通知portscan模块忽略源自这些主机的TCP SYN和UDP端口扫描。该模块的参数为IPs/CIDR的列表。
格式:
portscan-ignorehosts:
例子:
preprocessor portscan-ignorehosts: 192.168.1.5/32 192.168.3.0/24
Frag2
Frag2是一个新的IP碎片重组预处理器。Frag2的内存使用和碎片时间超时选项是可配置的。不给出参数,frag2将使用缺省的内存量(4MB)和时间超时值(60秒)。这个时间值用来决定一个没有重组的分段将被丢弃的时间长度。
格式
preprocessor frag2: [memcap
timeout
memcap
min_ttl
detect_state_problems 发现重叠分段时报警。
ttl_limit
例子:
preprocessor frag2: memcap 16777216, timeout 30
Stream4
Stream4模块使snort 具有 TCP流从新组装和状态分析能力。强壮的流重组能力使得snort能够忽视无“状态”攻击,例如,stick粘滞位攻击。Stream4也能够给大量用户提供超过256个TCP同步连接。Stream4缺省配置时能够处理32768个TCP同步连接。Stream4有两个可配置的模块,stream4 preprocessor 和相关的 stream4_reassemble 插件。stream4_reassemble有如下选项
Stream4 格式:
preprocessor stream4: [noinspect], keepstats [machine|binary], [timeout
noinspect 关闭状态监测能力。
keepstats [machine|binary] 保持会话统计,如果是“machine”选项就从机器以平坦的模式读入,如果是“binary”选项就用统一的二进制模式输出。
timeout
memcap
detect_scans 打开portscan 的报警能力。
detect_state_problems 打开流事件报警能力,例如,没有RST的数据包、带有数据的SYN包和超出窗口序列号的包。
disable_evasion_alerts 关闭事件报警能力,例如,TCP重叠。
ttl_limit 设置ttl的极限值。
Stream4_Reassemble 格式:
preprocessor stream4_reassemble: [clientonly], [serveronly],[noalerts], [ports
clientonly 对一个连接的客户端提供重组
serveronly 对一个连接的服务器端提供重组
noalerts 对于插入和逃避攻击事件不发出报警
ports
注:在配置文件中仅仅设置stream4和stream4_reassemble 命令而没有参数,它们将会使用缺省的参数配置。Stream4引入了一个新的命令行参数:-z 。在TCP流量中,如果指定了 –z 参数,snort将只对那些通过三次握手建立的流以及那些协作的双向活动的流(即,一些流量走一个方向而其他一些除了一个RST或FIN外走相反方向)检测报警。当设置了-z 选项后snort就完全忽略基于TCP的stick/snot攻击。
Conversation
Conversation 预处理器使Snort 能够得到关于协议的基本的会话状态而不仅仅是由spp_stream4处理的TCP状态。
目前它使用和stream4相同的内存保护机制,所以它能保护自己免受DOS攻击。当它接收到一个你的网络不允许的协议的数据包时,它也能产生一个报警信息。要做到这一点,请在IP协议列表中设置你允许的IP协议,并且当它收到一个不允许的数据包时,它将报警并记录这个数据包。
格式:
preprocessor conversation: [allowed_ip_protocols
Portscan2
这个模块将检测端口扫描。它要求包含Conversation预处理器以便判定一个会话是什么时间开始的。它的目的是能够检测快速扫描,例如,快速的nmap扫描。
格式:
preprocessor portscan2: [scanners_max
- scaners_max 一次所支持的扫描一个网络的主机数
- targets_max 分配代表主机的节点的最大数
- target_limit 在一个扫描触发前,一个扫描器所允许扫描的最大的主机数
- port_limit 在一个扫描触发前,一个扫描器所允许扫描的最大的端口数
- timeout 一个扫描行为被忘记的秒数
Telnet Decode
telnet_decode 预处理器使snort能够标准化telnet会话数据的控制协议字符。它把数据包规格和成单独的数据缓存,这样原始数据就能够通过rawbytes content 修饰词来记录或者检验了。缺省情况下,它运行在21, 23, 25, 和119端口.
格式:
preprocessor telnet_decode:
RPC Decode
Rpc_decode 预处理器将RPC的多个碎片记录组合成一个完整的记录。它是通过将数据包放在标准缓存中来做到这一点的。如果打开stream4预处理器功能。它将只处理客户端的流量。它缺省运行在 111和 32771端口。
格式:
preprocessor rpc_decode:
Perf Monitor
这个模块是用来评估snort各方面性能的一个工具。它的输出格式和参数格式都是变化的,在这里就不给出注释了。
Http Flow
使用这个模块可以忽略HTTP头后面的HTTP服务响应。
输出插件
输出插件使得Snort在向用户提供格式化输出时更加灵活。输出插件在Snort的告警和记录子系统被调用时运行,在预处理程序和探测引擎之后。规则文件中指令的格式非常类似于预处理程序。
注意:如果在运行时指定了命令行的输出开关,在Snort规则文件中指定的输出插件会被替代。例如,如果在规则文件中指定了alert_syslog插件,但在命令行中使用了"-A fast"选项,则alert_syslog插件会被禁用而使用命令行开关。多个输出插件是在snort的配置文件中指定的。当指定多个输出插件时,它们被压入栈并且在事件发生时按顺序调用。关于标准的记录和报警系统,输出模块缺省把数据发送到 /var/log/snort.或者通过使用-l命令行参数输出到一个用户指定的目录。在规则文件中通过指定output关键字,使得在运行时加载输出模块。
格式:
output
例子:
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:
Alert_fast
将报警信息快速的打印在指定文件的一行里。它是一种快速的报警方法,因为不需要打印数据包头的所有信息。
格式:
alert_fast:
例子:
output alert_fast: alert.fast
Alert_full
打印数据包头所有信息的报警。这些报警信息写到缺省的日志目录(/var/log/snort)或者写到命令行指定的目录。在日志目录内,每个IP都创建一个目录。产生报警的数据包被解码后写到这个目录下的文件里。这些文件的创建将大大降低snort的性能。所以这种输出方法对大多数不适用,但那些轻量级的网络环境还是可以使用的。
格式:
alert_full:
例子:
output alert_full: alert.full
Alert_smb
这个插件将把WinPopup报警信息发送给NETBIOS命名的机器上的一个文件。并不鼓励使用这个插件,因为它以snort权限执行了一个外部可执行二进制程序,通常是root权限。那个工作站上接受报警信息的文件每行存放一条报警信息。
格式:
alert_smb:
例子;
output alert_smb: workstation.list
Alert_unixsock
打开一个UNIX套接字,并且把报警信息发送到那里。外部的程序/进程会在这个套接字上侦听并实时接收这些报警数据。
格式:
alert_unixsock
例子:
output alert_unixsock
Log_tcpdump
log_tcpdump插件将数据包记录到tcpdump格式的文件中。这便于使用已有的多种检查tcpdump格式文件的工具,来对收集到的流量数据进行后处理工作。该插件只接受一个参数,即输出文件名
格式:
log_tcpdump:
例子:
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:
例子:
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:
output log_unified:
例子:
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标志没有置位,就不需要对数据包的有效载荷进行检验。如果这些标志置位,检验标志而带来的计算能力消耗是可以忽略不计的。
.分页: [1] [2]
- 上一篇:snort入侵检测系统介绍
- 下一篇:linux下最佳安全工具