Centos 7搭建SNORT

文章目录

简介

前言
防火墙可以比喻为办公室门口的警卫,用来检查进出者的身份。而入侵检测系统就像是网上的警报器,当发现入侵者时,指出入侵者的来历、他们正在做什么。入侵检测系统被视为防火墙之后的第二道安全闸门。
Snort IDS概述
Snort IDS(入侵检测系统)是一个强大的网络入侵检测系统。它具有实时数据流量分析和记录IP网络数据包的能力,能够进行协议分析,对网络数据包内容进行搜索/匹配。它能够检测各种不同的攻击方式,对攻击进行实时报警。此外,Snort是开源的入侵检测系统,并具有很好的扩展性和可移植性。
Snort IDS体系结构
在这里插入图片描述
Snort的结构由4大软件模块组成,它们分别是:
   (1)数据包嗅探模块——负责监听网络数据包,对网络进行分;
   (2)预处理模块——该模块用相应的插件来检查原始数据包,从中发现原始数据的“行为”,如端口扫描,IP碎片等,数据包经过预处理后才传到检测引擎;
   (3)检测模块——该模块是Snort的核心模块。当数据包从预处理器送过来后,检测引擎依据预先设置的规则检查数据包,一旦发现数据包中的内容和某条规则相匹配,就通知报警模块;
   (4)报警/日志模块——经检测引擎检查后的Snort数据需要以某种方式输出。如果检测引擎中的某条规则被匹配,则会触发一条报警,这条报警信息会通过网络、UNIXsocket、WindowsPopup(SMB)、SNMP协议的trap命令传送给日志文件,甚至可以将报警传送给第三方插件(如SnortSam),另外报警信息也可以记入SQL数据库。
Snort的3中工作模式
Snort拥有三大基本功能:嗅探器、数据包记录器和入侵检测。嗅探器模式仅从网络上读取数据包并作为连续不断的流显示在终端上,常用命令snort -dev。数据包记录器模式是把数据包记录到硬盘上,常用命令snort -b。网络入侵检测模式是最复杂的,而且是可配置的。我们可以让Snort分析网络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作。
从本质上说,Snort与tcpdump和snoop一样,都是网络数据包嗅探器。因此,嗅探器模式是Snort工作的基本模式。只要运行Snort时不加载规则,它就可以从网络上读取数据包并连续不断地显示在屏幕上,直到用户按下Ctrl+C键终止。这时,Snort将显示统计信息。Snort使用Libpcap网络驱动库。在这种模式下,Snort将网卡设置为混在模式,读取并解析共享信道中的网络数据包。
在嗅探模式下,Snort也可以将这些信息记录到日志文件中。这些文件随后可以用Snort或者tcpdump查看。这种模式的用户并非很大,因为现在很多可以记录包的工具了。在这种模式下并不需要snort.conf配置文件。
入侵模式需要载入规则库才能工作。在入侵模式下,Snort并不记录所有捕获的包,而是将包与规则对比,仅当包与某个规则匹配的时候,才会记录日志或产生报警。如果包并不与任何一个规则匹配,那么它将会被悄悄丢弃,并不做任何记录。运行Snort的入侵检测模式的时候,通常会在命令行指定一个配置文件。

Snort规则定义
Snort使用一种简单的规则描述语言,这种描述语言易于扩展,功能也比较强大。Snort规则是基于文本的,规则文件按照不同的组进行分类,比如,文件ftp.rules包含了FTP攻击内容。「注」Snort的每条规则必须在一行中,它的规则解释器无法对跨行的规则进行解析。Snort的每条规则都可以分成逻辑上的两个部分:规则头和规则体。
规则头
规则头包括4个部分:规则行为;协议;源信息;目的信息。下图是对于规则头的描述。
在这里插入图片描述
snort规则头Snort预置的规则动作有5种:
   (1)pass—动作选项pass将忽略当前的包,后继捕获的包将被继续分析。
   (2)log—动作选项log将按照自己配置的格式记录包。
   (3)alert—动作选项alert将按照自己配置的格式记录包,然后进行报警。它的功能强大,但是必须恰当的用,因为如果报警记录过多,从中攫取有效信息的工作量增大,反而会使安全防护工作变得低效。 
   (4)dynamic—动作选项dynamic是比较独特的一种,它保持在一种潜伏状态,直到activate类型的规则将其触发,之后它将像log动作一样记录数据包。
   (5)activate—动作选项activate功能强大,当被规则触发时生成报警,并启动相关的dynamic类型规则。在检测复杂的攻击,或对数据进行归类时,该动作选项相当有用。
  除了以上5种预置的规则动作类型,用户还可以定制自己的类型。

规则体的作用是在规则头信息的基础上进一步分析,有了它才能确认复杂的攻击(Snort的规则定义中可以没有规则体)。规则体由若干个被分别隔开的片断组成,每个片断定义了一个选项和相应的选项值。一部分选项是对各种协议的详细说明,包括IP、ICMP和TCP协议,其余的选项是:规则触发时提供给管理员的参考信息,被搜索的关键字,Snort规则的标识和大小写不敏感选项。

下面是一个规则实例。
  alert tcp !192.168.0.1/24 any ->any 21 (content:"USER";msg: "FTP Login";)
alert表示规则动作为报警。
tcp表示协议类型为TCP协议。
!192.168.0.1/24表示源IP地址不是192.168.0.1/24。
第一个any表示源端口为任意端口。
->表示发送方向操作符。
第二个any表示目的IP地址为任意IP地址。
21表示目的端口为21。
content:"USER"表示匹配的字符串为“USER”。
msg:"FTPLogin"表示报警信息为“FTPLogin”。
此外,还有一个双向操作符<>,它使Snort对这条规则中,两个IP地址/端口之间的数据传输进行记录/分析,例如telnet或者POP3对话。

下面的规则表示对一个telnet对话的双向数据传输进行记录:

      log 192.168.0.1/24 any <> 192.168.0.1/24 23
  activate/dynamic规则对扩展了snort功能。使用activate/dynamic规则对,你能够使用一条规则激活另一条规则,当一条特定的规则启动,如果你想要snort接着对符合条件的数据包进行记录时,使用activate/dynamic规则对非常方便。除了一个必需的选项activates外,激活规则非常类似于报警规则(alert)。动态规则(dynamic)和日志规则(log)也很相似,不过它需要一个选项:activated_by。动态规则还需要另一个选项:count。当一个激活规则启动,它就打开由activate/activated_by选项之后的数字指示的动态规则,记录count个数据包。

下面是一条activate/dynamic规则对的规则:

  activate tcp any any -> any 23(activates:111;msg:"Telnet Login";)    
   dynamic tcp any any -> any 23 (activated_by:111;count:20;)
  当发现Telnet默认使用的23端口有通信,activate规则会被触发并启动dynamic规则,然后dynamic规则将遵循配置,记录后面的20个数据包。在上面的例子里activate规则的“activates”值为111,dynamic规则的“activated_by”值为111,这样就把两个规则关联起来,而不是因为这两个规则有相同的规则头。

预处理
预处理器在调用检测引擎之前,在数据包被解码之后运行。通过这种机制,Snort可以以一种out of band的方式对数据包进行修改或者分析。
  预处理器可以使用preprocessor关键词来加载和配置,常用到的预处理器如下:
  (1)HTTPdecode预处器 HTTP解码预处理模块用来处理HTTPURL字符串,把它们转换为清晰的ASCII字符串。
  (2)端口扫描器 portscan端口扫描器会把由单个源IP地址发起的端口扫描从开始到结束的全过程记录到标准日志。
  (3)stream处理器 stream处理器为snort提供了TCP数据包重组的功能。在配置的端口上,stream处理器能够对TCP数据包的细小片段进行重组,使之成为完整的TCP数据包,然后snort可以对其可疑行为进行检查。
  (4)frag2处理器 frag2预处理器为snort提供了IP分片重组的功能。frag2预处理器能够对分片包进行重组来定位分片攻击,它的工作原理是将所有的分片重组构造成一个包含完整信息的数据包,再将这个包传给检测引擎。

安装

首先先装依赖文件

yum -y install gcc flex bison zlib zlib-devel libpcap libpcap-devel pcre pcre-devel libdnet libdnet-devel tcpdump
yum -y install epel-release
yum -y install nghttp2

接着我们去SNORT的官网下载包

https://www.snort.org/downloads
看到Source有两个

snort-2.9.12.tar.gz和daq-2.0.6.tar.gz

复制这两个的链接。在centos中进行wget

 wget https://www.snort.org/downloads/snort/snort-2.9.12.tar.gz
 wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz

##这里是后面我加的,因为不用这个包就会报错说

Cannot decode data link type  201

再下一个依赖包
网站地址:

http://www.tcpdump.org/#latest-releases
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz

接着解压
进入libpcap的目录进行

./configure 

没有错误就

make && make install

接着还要下载一个依赖的包

 wget http://prdownloads.sourceforge.net/libdnet/libdnet-1.11.tar.gz

下好后有四个包
先解压依赖.

tar -xzvf libdnet-1.11.tar.gz

进入解压后的目录
执行./configure。进行编译前的检查。我这里看到有报错
这是说没有c++库。我们yum一个

yum -y install glibc-headers
yum -y install gcc-c++

重新

./configure

没有报错了。进行

make && make install

完事后解压daq的压缩包

tar -xzvf daq-2.0.6.tar.gz

进入其目录
执行

 ./configure

接着

make && make install

完事后解压snort压缩包。并进入其目录
执行

 ./configure --enable-sourcefire

这是报了一个错。
在这里插入图片描述
它是说没有这个LuaJIT的库。我们去他说的网址看看
都是英文。。不会可以翻译一下。
在这里插入图片描述
在这里插入图片描述
我们点击download。看到
点击第一个tar.gz。看到在下载了。我们就复制这个链接地址。
在这里插入图片描述
在cenos中进行wget

wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz

对这个压缩包进行解压
进入目录,再进入其src目录
我们直接mak接着cd …到src外面一层进行make install
接着我们再去snort中, ./configure --enable-sourcefire
结果又来了一个error。。说什么openssl的
就是说没有openssl这个依赖。我们yum一个

yum install openssl
yum install openssl-devel
./configure --enable-sourcefire
make && make install
snort -v #测试是否成功

在这里插入图片描述
桌面现在
在这里插入图片描述
编写Snort规则文件:Snort.conf
基础
snort使用一种简单的,轻量级的规则描述语言,这种语言灵活而强大。在开发snort规则时要记住几个简单的原则。
第一,大多数snort规则都写在一个单行上,或者在多行之间的行尾用/分隔。Snort规则被分成两个逻辑部分:规则头和规则选项。规则头包含规则的动作,协议,源和目标ip地址与网络掩码,以及源和目标端口信息;规则选项部分包含报警消息内容和要检查的包的具体部分。
下面是一个规则范例:

alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";)
第一个括号前的部分是规则头(rule header),包含的括号内的部分是规则选项(rule options)。规则选项部分中冒号前的单词称为选项关键字(option keywords)。注意,不是所有规则都必须包含规则选项部分,选项部分只是为了使对要收集或报警,或丢弃的包的定义更加严格。组成一个规则的所有元素对于指定的要采取的行动都必须是真的。当多个元素放在一起时,可以认为它们组成了一个逻辑与(AND)语句。同时,snort规则库文件中的不同规则可以认为组成了一个大的逻辑或(OR)语句。

规则高级概念
Includes:
include允许由命令行指定的规则文件包含其他的规则文件。
格式:
include:
注意在该行结尾处没有分号。被包含的文件会把任何预先定义的变量值替换为自己的变量引用。参见变量(Variables)一节以获取关于在SNORT规则文件中定义和使用变量的更多信息。

Variables :
变量可能在snort中定义。
格式:
var:

例子:
var MY_NET 192.168.1.0/24
alert tcp any any -> $MY_NET any (flags: S; msg: "SYN packet";)
规则变量名可以用多种方法修改。可以在"$"操作符之后定义变量。"?" 和 "-"可用于变量修改操作符。
$var - 定义变量。
$(var) - 用变量"var"的值替换。
$(var:-default) - 用变量"var"的值替换,如果"var"没有定义用"default"替换。
$(var:?message) - 用变量"var"的值替换或打印出错误消息"message"然后出。
例子:
var MY_NET $(MY_NET:-192.168.1.0/24)
log tcp any any -> $(MY_NET:?MY_NET is undefined!) 23

规则头
规则动作:
规则的头包含了定义一个包的who,where和what信息,以及当满足规则定义的所有属性的包出现时要采取的行动。规则的第一项是"规则动作"(rule action),"规则动作"告诉snort在发现匹配规则的包时要干什么。在snort中有五种动作:alert、log、pass、activate和dynamic.
1、Alert-使用选择的报警方法生成一个警报,然后记录(log)这个包。
2、Log-记录这个包。
3、Pass-丢弃(忽略)这个包。
4、activate-报警并且激活另一条dynamic规则。
5、dynamic-保持空闲直到被一条activate规则激活,被激活后就作为一条log规则执行。
你可以定义你自己的规则类型并且附加一条或者更多的输出模块给它,然后你就可以使用这些规则类型作为snort规则的一个动作。

下面这个例子创建一条规则,记录到tcpdump。
ruletype suspicious
{
type log output
log_tcpdump: suspicious.log
}
下面这个例子创建一条规则,记录到系统日志和MySQL数据库
ruletype redalert
{
type alert output
alert_syslog: LOG_AUTH LOG_ALERT
output database: log, mysql, user=snort dbname=snort host=localhost
}

协议
规则的下一部分是协议。Snort当前分析可疑包的ip协议有四种:tcp 、udp、icmp和ip。将来可能会更多,例如ARP、IGRP、GRE、OSPF、RIP、IPX等。
Ip地址
规则头的下一个部分处理一个给定规则的ip地址和端口号信息。关键字"any"可以被用来定义任何地址。Snort没有提供根据ip地址查询域名的机制。地址就是由直接的数字型ip地址和一个cidr块组成的。Cidr块指示作用在规则地址和需要检查的进入的任何包的网络掩码。/24表示c类网络,/16表示b类网络,/32表示一个特定的机器的地址。

例如,192.168.1.0/24代表从192.168.1.1到192.168.1.255的地址块。在这个地址范围的任何地址都匹配使用这个192.168.1.0/24标志的规则。这种记法给我们提供了一个很好的方法来表示一个很大的地址空间。

有一个操作符可以应用在ip地址上,它是否定运算符(negation operator)。这个操作符告诉snort匹配除了列出的ip地址以外的所有ip地址。否定操作符用"!"表示。下面这条规则对任何来自本地网络以外的流都进行报警。

alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content: "|00 01 86 a5|"; msg: "external mountd access";)
这个规则的ip地址代表"任何源ip地址不是来自内部网络而目标地址是内部网络的tcp包"。
也可以指定ip地址列表,一个ip地址列表由逗号分割的ip地址和CIDR块组成,并且要放在方括号内“[”,“]”。此时,ip列表可以不包含空格在ip地址之间。下面是一个包含ip地址列表的规则的例子。
alert tcp ![192.168.1.0/24,10.1.1.0/24] any -> [192.168.1.0/24,10.1.1.0/24] 111 (content: "|00 01 86 a5|"; msg: "external mountd access";)

端口号
端口号可以用几种方法表示,包括"any"端口、静态端口定义、范围、以及通过否定操作符。“any"端口是一个通配符,表示任何端口。静态端口定义表示一个单个端口号,例如111表示portmapper,23表示telnet,80表示http等等。端口范围用范围操作符”:"表示。范围操作符可以有数种使用方法,如下所示:

log udp any any -> 192.168.1.0/24 1:1024

记录来自任何端口的,目标端口范围在1到1024的udp流

log tcp any any -> 192.168.1.0/24 :6000

记录来自任何端口,目标端口小于等于6000的tcp流

log tcp any :1024 -> 192.168.1.0/24 500:

记录来自任何小于等于1024的特权端口,目标端口大于等于500的tcp流

端口否定操作符用"!"表示。它可以用于任何规则类型(除了any,这表示没有,呵呵)。例如,由于某个古怪的原因你需要记录除x windows端口以外的所有一切,你可以使用类似下面的规则:

log tcp any any -> 192.168.1.0/24 !6000:6010

方向操作符
方向操作符"->“表示规则所施加的流的方向。方向操作符左边的ip地址和端口号被认为是流来自的源主机,方向操作符右边的ip地址和端口信息是目标主机,还有一个双向操作符”<>"。它告诉snort把地址/端口号对既作为源,又作为目标来考虑。这对于记录/分析双向对话很方便,例如telnet或者pop3会话。用来记录一个telnet会话的两侧的流的范例如下:
log !192.168.1.0/24 any <> 192.168.1.0/24 23
Activate 和 dynamic 规则:
注:Activate 和 dynamic 规则将被tagging 所代替。在snort的将来版本,Activate 和 dynamic 规则将完全被功能增强的tagging所代替。
Activate 和 dynamic 规则对给了snort更强大的能力。你现在可以用一条规则来激活另一条规则,当这条规则适用于一些数据包时。在一些情况下这是非常有用的,例如你想设置一条规则:当一条规则结束后来完成记录。Activate规则除了包含一个选择域:activates外就和一条alert规则一样。Dynamic规则除了包含一个不同的选择域:activated_by 外就和log规则一样,dynamic规则还包含一个count域。
Actevate规则除了类似一条alert规则外,当一个特定的网络事件发生时还能告诉snort加载一条规则。Dynamic规则和log规则类似,但它是当一个activate规则发生后被动态加载的。把他们放在一起如下图所示:
activate tcp !$HOME_NET any -> H O M E N E T 143 ( f l a g s : P A ; c o n t e n t : " E 8 C 0 F F F F F F / b i n " ; a c t i v a t e s : 1 ; m s g : " I M A P b u f f e r o v e r f l o w ! " ; ) d y n a m i c t c p ! HOME_NET 143 (flags: PA; content: "|E8C0FFFFFF|/bin"; activates: 1; msg: "IMAP buffer overflow!";) dynamic tcp ! HOME_NET any -> $HOME_NET 143 (activated_by: 1; count: 50;)
三种模式的使用

嗅探器 kali里没有./
所谓的嗅探器模式就是snort从网络上读出数据包然后显示在你的控制台上。首先,我们从最基本的用法入手。如果你只要把TCP/IP包头信息打印在屏幕上,只需要输入下面的命令:

./snort -v

使用这个命令将使snort只输出IP和TCP/UDP/ICMP的包头信息。如果你要看到应用层的数据,可以使用:

./snort -vd

这条命令使snort在输出包头信息的同时显示包的数据信息。如果你还要显示数据链路层的信息,就使用下面的命令:

./snort -vde

注意这些选项开关还可以分开写或者任意结合在一块。例如:下面的命令就和上面最后的一条命令等价:

./snort -d -v –e

数据包记录器
如果要把所有的包记录到硬盘上,你需要指定一个日志目录,snort就会自动记录数据包:

./snort -dev -l ./log

当然,./log目录必须存在,否则snort就会报告错误信息并退出。当snort在这种模式下运行,它会记录所有看到的包将其放到一个目录中,这个目录以数据包目的主机的IP地址命名,例如:192.168.10.1
  如果你只指定了-l命令开关,而没有设置目录名,snort有时会使用远程主机的IP地址作为目录,有时会使用本地主机IP地址作为目录名。为了只对本地网络进行日志,你需要给出本地网络:

./snort -dev -l ./log -h 192.168.1.0/24

这个命令告诉snort把进入C类网络192.168.1的所有包的数据链路、TCP/IP以及应用层的数据记录到目录./log中。
如果你的网络速度很快,或者你想使日志更加紧凑以便以后的分析,那么应该使用二进制的日志文件格式。所谓的二进制日志文件格式就是tcpdump程序使用的格式。使用下面的命令可以把所有的包记录到一个单一的二进制文件中:

./snort -l ./log -b

注意此处的命令行和上面的有很大的不同。我们勿需指定本地网络,因为所有的东西都被记录到一个单一的文件。你也不必冗余模式或者使用-d、-e功能选项,因为数据包中的所有内容都会被记录到日志文件中。
你可以使用任何支持tcpdump二进制格式的嗅探器程序从这个文件中读出数据包,例如:tcpdump或者Ethereal。使用-r功能开关,也能使snort读出包的数据。snort在所有运行模式下都能够处理tcpdump格式的文件。例如:如果你想在嗅探器模式下把一个tcpdump格式的二进制文件中的包打印到屏幕上,可以输入下面的命令:

./snort -dv -r packet.log

在日志包和入侵检测模式下,通过BPF(BSD Packet Filter)接口,你可以使用许多方式维护日志文件中的数据。例如,你只想从日志文件中提取ICMP包,只需要输入下面的命令行:

./snort -dvr packet.log icmp

网络入侵检测系统
snort最重要的用途还是作为网络入侵检测系统(NIDS),使用下面命令行可以启动这种模式:

./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf

snort.conf是规则集文件。snort会对每个包和规则集进行匹配,发现这样的包就采取相应的行动。如果你不指定输出目录,snort就输出到/var/log/snort目录。
注意:如果你想长期使用snort作为自己的入侵检测系统,最好不要使用-v选项。因为使用这个选项,使snort向屏幕上输出一些信息,会大大降低snort的处理速度,从而在向显示器输出的过程中丢弃一些包。
此外,在绝大多数情况下,也没有必要记录数据链路层的包头,所以-e选项也可以不用:

./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf

这是使用snort作为网络入侵检测系统最基本的形式,日志符合规则的包,以ASCII形式保存在有层次的目录结构中。
网络入侵检测模式下的输出选项
在NIDS模式下,有很多的方式来配置snort的输出。在默认情况下,snort以ASCII格式记录日志,使用full报警机制。如果使用full报警机制,snort会在包头之后打印报警消息。如果你不需
要日志包,可以使用-N选项。
snort有6种报警机制:full、fast、socket、syslog、smb(winpopup)和none。其中有4个可以在命令行状态下使用-A选项设置。这4个是:
-A fast:报警信息包括:一个时间戳(timestamp)、报警消息、源/目的IP地址和端口。
-A full:是默认的报警模式。
-A unsock:把报警发送到一个UNIX套接字,需要有一个程序进行监听,这样可以实现实时报警。
-A none:关闭报警机制。
使用-s选项可以使snort把报警消息发送到syslog,默认的设备是LOG_AUTHPRIV和LOG_ALERT。可以修改snort.conf文件修改其配置。
snort还可以使用SMB报警机制,通过SAMBA把报警消息发送到Windows主机。为了使用这个报警机制,在运行./configure脚本时,必须使用–enable-smbalerts选项。
下面是一些输出配置的例子:

使用默认的日志方式(以解码的ASCII格式)并且把报警发给syslog:
./snort -c snort.conf -l ./log -s -h 192.168.1.0/24
使用二进制日志格式和SMB报警机制:  
./snort -c snort.conf -b -M WORKSTATIONS
发布了26 篇原创文章 · 获赞 0 · 访问量 549

猜你喜欢

转载自blog.csdn.net/Butterfly0011/article/details/104885593