Snort配置
本章描述:
这章覆盖Snort配置选项,在snort.conf文件里面的。大部分snort的配置已经在snort.conf被完成。文件的各个部分以及如何配置它的选项 将会被广泛的讨论。
本章目的:
- 理解snort.conf的结构
- 在snort.conf执行配置更新
- 描述和配置变量
- 知道如何配置snort.conf文件六大部分的各个选项
snort的主配置文件
如上面的标题所暗示的,snort.conf文件是Snort安装的重要组成部分。 它是配置Snort行为的主要方法,因此本节将介绍文件内容的评估及其结构以及如何在文件中进行更改。
snort.conf 概览
snort.conf包含了超过400行文本,默认文件包含了许多注释行,这就占了它很大一部分了。当然你可以删除他们,这不会影响系统的运行,它们能成为教你学习使用系统的指南。文件本身被分为9个主要部分和步骤,如下所述:
- step 1:设置网络变量
- step 2:配置解码器
- step 3:配置库检测引擎
- step 4:配置动态加载库
- step 5:配置预处理器
- step 6:配置输出插件
- step 7:定制你的规则集
- step 8:定制预处理器和解码器规则集
- step 9:定制共享对象规则集
每一个步骤将会在接下来的内容讲述到。
第1步:设置网络变量
变量提供
- IP地址、地址列表、地址范围。通过
ipvar
关键字定义 - 端口、端口范围。这些通过
portvar
关键字定义 - 其他值,比如目录位置的路径通过
var
关键字定义
snort.conf文件的这部分也包含用于配置snort解码器和检查引擎模式匹配方法的区域
变量
变量基本的解释如下:
var <variable name> <variable value>
在snort.conf文件一个使用方法的例子:
ipvar HOME_NET 10.1.1.0/24
在本例中,您可以看到关键字ipvar用于定义名称为HOME_NET,值为10.1.1.0/24的变量。 这个特定的变量是有意义的,因为它定义了您要用Snort传感器保护的网络空间。 默认情况下,该变量设置为“any”,它是一个关键字,可以在变量定义中使用。 仅当在Snort中编译支持IPv6时,Ipvar才可用。
当表达IP地址的变量值时,适用以下准则:
您可以使用关键字any来表示任何IP地址。
您可以通过将列表括在方括号中并列出以逗号分隔的各个IP地址来指定多个IP地址。 请注意,IP地址之间不应有空格。 例如:
[192.168.1.1,192.168.1.14,192.168.1.22]
你可以用CIDR表示法列出网络
CIDR表示法可以与单个IP地址混合,如下所示:
[192.168.1.0/24,192.168.2.10,192.168.2.18]
同样,请确保在使用此语法时条目之间没有空格。
您可以使用“!”字符在地址前面来排除IP地址。 例如:
!192.168.1.254
指定除列出的IP以外的任何IP地址。 另外,你可以
使用“!”字符在IP列表前面,来排除IP地址列表 。
![192.168.1.1,192.168.1.14]
您还可以使用否定字符从地址范围内排除一个或多个地址,如下所示:
[192.168.1.0/24,![192.168.1.1,192.168.1.14]]
使用该示例,地址192.168.1.1和192.168.1.14将不包括在由CIDR块标识的地址范围之内。
您应该使用'portvar'指令来指定端口变量。 在将来的版本中将不推荐使用'var'来声明端口变量。 为了向后兼容,如果变量名称以“PORT”结尾或以“PORT_”开头,则仍可使用“var”声明端口变量。
当表示端口的变量值时,适用以下准则:
关键词“any”指定任何端口。
语法
first_port:last_port
表示端口的范围,其中first_port表示范围中的第一个端口,last_port指定范围中的最后一个端口。 例如:23:443
:port
表示所有端口小于等于端口。 例如::1337
port:
表示所有端口大于等于端口。 例如:80:
!port
表示端口以外的任何端口。 例如:!80
端口列表可以使用以下语法:
[21,23,80:90,8080:8090]
变量名称也可以用作变量值。 这具有在变量中嵌套变量的作用。 例如:
ipvar DNS_SERVERS $HOME_NET
在这个例子中,有两件重要的事情要注意:
当使用变量时,它将在之前'$'字符
变量
DNS_SERVERS
被定义为$HOME_NET
的值。
鉴于我们之前将$HOME_NET
定义为10.1.1.0/24
,该变量DNS_SERVERS
意味着这些服务器包含在相同的地址空间中。
在变量语法的另一个例子中,默认snort.conf文件包含一个变量如何用于定义目录位置的示例:
var RULE_PATH /etc/snort/rules
如变量的构造所隐含的,我们正在定义规则位置
的目录。这个变量实际上是在系统启动时要包含的指向规则文件的位置,见下文:
include $RULE_PATH/bad-traffic.rules
第2步 配置解码器
解码器首先要做的事情是,在DAQ将数据从网线拉出后,看到网络流量。 解码器能够在检测到某些异常情况时发出警报。 以下摘录来自包含解码器设置的snort.conf文件部分。 正如你所看到的,这是非常好的注释。
# Stop generic decode events: config disable_decode_alerts # Stop Alerts on experimental TCP options config disable_tcpopt_experimental_alerts # Stop Alerts on obsolete TCP options config disable_tcpopt_obsolete_alerts # Stop Alerts on T/TCP alerts config disable_tcpopt_ttcp_alerts # Stop Alerts on all other TCPOption type events: config disable_tcpopt_alerts # Stop Alerts on invalid ip options config disable_ipopt_alerts # Alert if value in length field (IP, TCP, UDP) is greater th elength of the packet # config enable_decode_oversized_alerts # Same as above, but drop packet if in Inline mode (requires enable_decode_oversized_alerts) # config enable_decode_oversized_drops # Configure IP / TCP checksum mode config checksum_mode: all
这些设置基本上关闭解码器的一些或全部警报功能。 要取消功能,只需通过删除它前面的“#”符号来取消注释行。重新启动Snort进程,使更改生效。 以“config”开头的行表示你可以应用的选项。 请参阅README.decode文件以获得更多的信息。
# Configure maximum number of flowbit references. For more information, see README.flowbits # config flowbits_size: 64 # Configure ports to ignore # config ignore_ports: tcp 21 6667:6671 1356 # config ignore_ports: udp 1:17 53 # Configure active response for non inline operation. For more information, see REAMDE.active # config response: eth0 attempts 2
flow_bits_size
- 规则中使用的最大流量参考数。 默认值为1024,最大值为2096。
Ignore_ports
- 从检查中排除指定的端口/协议对。
Responses
- 设置每个注入的响应和/或设备(如eth0)的发送尝试次数,从中发送响应。 这些选项可能以任何顺序显示,但必须以逗号分隔。 用于被动模式。
# config daq: <type> # config daq_dir: <dir> # config daq_mode: <mode> # config daq_var: <var> # # <type> ::= pcap | afpacket | dump | nfq | ipq | ipfw # <mode> ::= read-file | passive | inline # <var> ::= arbitrary <name>=<value passed to DAQ # <dir> ::= path as to where to look for DAQ module so's
daq - 指定要使用的DAQ类型。 PCAP是默认值。
daq_dir - 指定DAQ库的位置。
daq_mode - 指定DAQ操作的模式。 这样可以让DAQ内联,被动或指定它将读取文件。
daq_var - 允许DAQ进行其他配置。 使用daq_var传递如缓冲区大小和接口信息的参数。 请参阅DAQ源目录中的README。
以下配置选项允许用户配置控制Snort的其他参数。 这些可以从命令行或 /etc/sysconfig/snort文件中调用的重复选项
# Configure specific UID and GID to run snort as after dropping privs. For more information see snort -h # command line options # # config set_gid: # config set_uid: # Configure default snaplen. Snort defaults to MTU of in use interface. For more information see README # # config snaplen: # Configure default bpf_file to use for filtering what traffic reaches snort. For more information see # snort -h command line options (-F) # # config bpf_file: # Configure default log directory for snort to log to. # For more information see snort -h command line options (-l) # # config logdir:
第3步 配置基本检测引擎
本节允许您调整Snort检测过程的功能。 如前所述,检测引擎是IPS的核心。 通过配置,您可以更改检测引擎和其他检测功能的运行方式。 本节有三个主要元素:PCRE(Perl兼容正则表达式)匹配限制,检测引擎和事件队列。
# Configure PCRE match limitations config pcre_match_limit: 3500 config pcre_match_limit_recursion: 1500 # Configure the detection engine See the Snort Manual, Configuring Snort - Includes - Config config detection: search-method ac-split search-optimize max-pattern-len 20 # Configure the event queue. For more information, see README.event_queue config event_queue: max_queue 8 log 5 order_events content_length
PCRE是一个匹配的算法,可以在规则内部使用。 您可以限制给定PCRE选项使用的回溯。 您还可以限制PCRE选项使用的堆栈数量。 这两个指令是配置pcre_match_limit
和config pcre_match_Iimit_recursion
。
检测引擎具有许多配置功能。 它们允许您配置替代模式匹配算法。 可用的选项是Aho-Corasic \(ac)
或lowmem
,这是一种较少的内存密集型搜索方法。 还可以使用Aho-Corasick
模式匹配算法调用其他操作模式的选项:ac-bnfa-nq
,ac-split
(当前为默认),ac-banded
和ac-sparsebands
(参见这个模块最后的指令表以获得完整的选项列表)。 以下snort.conf文件的摘录提供了有关如何配置此选项的一些指导。 您还可以配置引擎行为的其他方面,如下所述。
检测指令还有其他选项:
search-optimize
- 通过基于总数状态,动态确定状态的大小来优化快速模式内存。 这是一个内存优化功能。
max-pattern-length
- 这是一个内存优化,指定将放入快速模式匹配器的模式的最大长度。 在插入模式匹配器之前,长于此长度的条件将被截断为此长度。
Snort支持使用不同的插入方法优先处理每个数据包/流的多个事件,例如使用event_queue的最大内容长度或事件排序。
可用的选项有:
max_queue
- 这决定了事件队列的最大的长度。 例如,如果事件队列的最大为8,对于单个数据包或流,只会存储8个事件。 默认值为8。log
- 这决定了给定数据包或流记录的事件数。 您不能记录超过指定的最大事件数。 默认值为3。order_events
- 此参数确定传入事件的排序方式。我们目前有两种不同的方法:priority
- 首先排列最高优先级(1为最高)事件。content_length
- 规则在解码或预处理器警报之前排序, 具有较长内容的规则在具有较短内容的规则之前排序
数据包性能监视
数据包性能监视功能,又叫(A.K.A)延迟阈值,提供安全的提高性能保证的机制。您可以对内联配置进行重要的平衡,以防止传感器因长时间的数据包处理或行为不规范而成为瓶颈。sensor可运行在它性能极限的高吞吐环境中,这会是被动配置引人注目的功能 。
延迟阈值(Latency Thresholding)
数据包性能监视 (Packet Performance Monitoring) PPM
Packet latency
- 阈值衡量适用解码器,预处理器和规则处理数据包所用的总时间,如果处理时间超过可配置的阈值,则停止检查数据包。Rule latency
- 阈值衡量每个规则处理单个数据包所用的时间,如果处理时间超过规则等待时间阈值一个可配置的连续次数,则暂停规则指定的时间,并在抑制时间超时后恢复该规则。
数据包和规则等待时间阈值,测量经过时间,而不仅仅是处理时间,以便更准确地反映规则处理数据包所需的实际时间。 然而,延迟阈值是基于软件的延迟实现,不执行严格的时序。 数据包和规则延迟阈值操作独立运行。 您可以同时启用,或单独启用。
延迟阈值驱动的优势是性能和延迟的妥协,但这样未检测的数据包可能包含攻击。 但是,数据包和规则延迟阈值功能为您提供可用于平衡安全性和连接性的工具。
# Per Packet latency configuration #config ppm: max-pkt-time 250, \ # fastpath-expensive-packets, \ # pkt-log # Per Rule latency configuration #config ppm: max-rule-time 200, \ # threshold 3, \ # suspend-expensive-rules, \ # suspend-timeout 20, \ # rule-log alert
理解数据包延迟阈值
启用数据包延迟阈值后,当解码器处理开始时,每个数据包都会启动计时器。 计时将持续,直到数据包的所有处理结束或在定时测试点处理时间超过阈值为止。
如上图所示,数据包延迟在以下测试点进行测试:
- 在所有解码器和预处理器处理完成之后,以及规则处理开始之前
- 由每个规则处理后
如果在任何测试点处理时间超过阈值,则数据包检查将停止。 请注意,所有数据包处理时间不包括常规TCP流或IP分片重组时间。
数据包延迟阈值对解码器,预处理器或处理数据包的规则触发的事件没有影响。 任何适用的解码器,预处理器或规则都会正常触发,直到数据包被完全处理,或者直到数据包处理结束,因为超过延迟阈值(以较先者为准)。 如果丢弃动作的规则检测到入侵,则该规则会触发事件并丢弃数据包。
数据包延迟阈值的好处
数据包延迟阈值可以提高passive
和inline
部署中的系统性能,通过停止检查需要过多处理时间的数据包,来减少inline
部署的延迟。 这些性能优势可能发生在,例如:
对于
passive
和inline
部署,通过多个规则顺序检查数据包需要过多的时间对于
inline
部署,一段时间内较差的网络性能,例如当有人下载超大文件时,会减慢数据包处理
配置数据包延迟阈值
在snort.conf
文件,可以输入以下配置指令来控制数据包
延迟行为:
config ppm: max-pkt-time <micro-secs>, \ fastpath-expensive-packets, \ pkt-1og, \ debug-pkts
max-pkt-time <micro-secs>
使用“微秒”作为限制启用数据包延迟阈值。
默认值为0(禁用数据包延迟阈值)
由于测量延迟时间固有的不确定性,您应该使用下面列出的最小设置作为基准,直到您可以获得代表实际网络性能的数字进入“阈值”字段。
1 Gbps:100 μ sec
100 Mbps:250 μ sec
5 Mbps:1000 μ sec
fastpath-expensive-packets
- 如果超过最大时间,则可以停止进一步检查数据包
- 默认是关闭
pkt-log
- 如果数据包超过max-pkt-time,则启用记录数据包事件
- 根据snort配置,日志记录到syslog或console
- 默认是没有日志记录
debug-pkts
- 在每个数据包启用数据包定时统计信息
- 默认关闭
理解规则延迟阈值
当启用规则延迟阈值时,定时器将在每次处理数据包时记录处理时间。 规则处理时间超过指定规则延迟阈值时,IPS会增加一个计数器。 如果连续阈值违规的数量达到规则暂停前必须发生的指定数量,则IPS执行以下操作:
- 暂停规则一段时间
- 触发一个事件指出规则已被暂停
- 在暂停期间重启规则
- 触发一个事件指出规则已被重启
规则延迟阈值的好处
规则延迟阈值处理可以提高passive
和inline
部署中的系统性能,并可以通过暂停需要花费大量时间来处理数据包的规则,来减少inline
部署中的延迟。 暂停的规则不会再次处理数据包,直到可配置的时间到期,从而使传感器的过载时间恢复。 这些优点可能发生在例如:
- 一个仓促的,未经测试的规则要求处理数据包的时间过长
- 网络性能不佳的时期,例如有人下载超大文件时,会导致任何规则的数据包检测速度较慢
设置规则延迟阈值的选项
在snort.conf文件中,您可以输入以下配置指令来控制规则行为:
config ppm: max-rule-time <micro-secs>, \ threshold count, \ suspend-expensive-rules, \ suspend-timeout <seconds>, \ rule-log [log] [alert]
max-rule-time <micro-secs>
启用规则等待时间阈值,使用“微秒”作为单位。
默认值为0(禁用规则延迟阈值)
由于测量延迟时间固有的不确定性,您应该使用下面列出的最小设置作为基准,直到您可以获得代表实际网络性能的数字进入“阈值”字段。
1 Gbps: 100 μ sec.
100 Mbps: 250 μ sec.
5 Mbps: 1000 μ sec.
threshold <count>
在禁用规则之前设置连续规则时间过多的次数
默认为5
suspend-expensive-rules
如果超过最大规则时间,则允许暂停规则检查
默认是关闭
suspend-timeout <seconds>
规则暂停时间(秒)
默认为60秒
设置为零以永久禁用开销大的规则
rule-log [log] [alert]
启用规则的事件记录输出
默认是没有日志记录
“log”和“alert”选项中的一个或两个必须与“rule-log”一起使用
日志选项可以根据snort配置启用输出到syslog或console
设置性能分析选项
性能分析可用于调试开销大的规则和预处理器设置。 这会
在后面的章节中更详细地讨论:
################################################### # Configure Perf Profiling for debugging # For more information see README.PerfProfiling ################################################### #config profile_rules: print all, sort avg_ticks #config profile_preprocs: print all, sort avg_ticks
设置Protocal Aware Flushing
可以启用HTTP,SMB和DCE / RPC的协议感知冲洗。 这允许Snort有条件地扫描流并重新组合一个完整的协议数据单元(PDU),而不管分段。 例如,单个TCP分段内的多个PDU以及跨越多个TCP段的一个PDU将被重新组合成每PDU的一个PDU。 大于配置的最大值的PDU将被分成多个数据包。
################################################### # Configure protocol aware flushing # For more information see README.stream5 ################################################### config paf_max: 16000
第4步 配置动态加载库
您可以使用本节中的配置,设置指向包含利用此功能的任何Snort模块的库的目录。 在本节中配置任何内容之前,请确保已启用此功能编译Snort。 这是通过包括--enable-dynamicplugin
标志与./configure
命令在编译时。
指令语如下:>
<dynamic module name> <file|directory> <path to library(s)>
<dynamic module name>
- 根据您打算使用的动态模块类型,可以是以下任意一种。
- dynamicpreprocessor
- dynamicengine
- dynamicdetection
<file|directory>
- 您可以使用file参数指向一个文件。 使用绝对路径并包含文件名。 或者,如果有几个库需要引用,可以使用directory参数指向库文件所在的目录。
<path to library(s)>
- 根据您在上一个参数中的选择,您将提供特定文件或相应库所在目录的位置。
举例:
dynamicpreprocessor directory /usr/local/lib/snort_dynamicpreprocessor/
Snort现在有几个动态预处理器。 默认情况下,还会启用dynamicpreprocessor指令。 但是如果由于动态插件问题,Snort无法初始化,您可以检查以下内容:
- snort.conf中是否启用了适当的动态插件指令?
- 动态插件指令是否指向正确的文件或目录位置?
- 动态插件版本是否正确?
第5步 配置预处理器
预处理器是Snort架构的关键部分。 它们可以用于检查网络流量,以确保它符合协议,并准备流量,以便以一致的方式呈现给检测引擎。 如果检测到异常情况,他们还可以发出警报。
预处理器配置语法:
preprocessor <name_of_processor> : <configuration_options>
然而,一些预处理器相当的复杂,它们的相关配置同样也相当复杂。这些将在后面章节谈论.