当前位置:Linux教程 - Linux - linux系统中IDS软件Snort的安装与使用  

linux系统中IDS软件Snort的安装与使用  



        


      Snort是一个免费的IDS(入侵监测系统)软件。它的一些源代码是从著名的tcpdump软件发展而来的。它是一个基于libpcap包的网络监控软件,可以作为一个十分有效的网络入侵监测系统。它能够监测多种网络攻击和探测,例如:缓冲器溢出攻击,端口扫描,CGI攻击,SMB探测等等。Snort具有实时的告警能力,将告警记入一个特别的告警文件--系统日志,或者将告警信息通过samba转发给另一台Windows PC机。
      Snort首先根据远端的ip地址建立目录,然后将检测到的包以tcpdump的二进制格式记录或者以自身的解码形式存储到这些目录中.这样一来,你就可以使用Snort来监测或过滤你所需要的包.
      我们所要介绍的是snort-1.6版本.与1.5版本相比,Snort1.6版本中,又增加了新的功能。这些内容包括:监测和预处理插件,会话日志,规则文件变量和头文件,以及五个新的网络层解码器,例如:ISDN和令牌环支持,新的监测功能.还有很多其他很cool的功能呢!

    一、 Snort的安装
    Snort的安装十分简单,一般的分为以下几个步骤:
    * 首先,确定你的linux系统中已经安装了libpcap库。
    * 改写snort的配置文件以满足系统的要求.
    * 使用make命令,编译snort的源文件生成二进制可执行文件.
    * 使用make install命令,将编辑好的可执行文件安装到指定的位置.
    * 根据snort中头文件定义的简单规则,可以编译一些简单的规则文件.
    * 使用snort -?命令;
    * 如果你已经使用了Snort早期的版本,你还需要重新编译所用的规则,使它与现有的规则格式相兼容。

    1. 配置选项介绍
    --enable-smbalerts
    开启SMB告警,但是当程序中执行popen()调用时,它会带来一定的不安全因素(因为它是工作在root权限中),所以容易遭受缓冲区攻击,使用的时候要谨慎。
    --enable-flexresp
    开启灵活响应功能。当某个IP层的恶意连接与规则库中的某个规则匹配,这个功能允许你灵活的切断这个恶意连接。当你开启这个功能时,你还需要libnet库的支持,这个库你可以在http://www.packetfactory.net/libnet找到。这仍是个测试版的功能,使用时应谨慎。
    --with-libpq-includes=DIR
    设置头文件目录。
    --with-libpq-libraries=DIR
    设置库文件目录。
    --with-libpcap-includes=DIR
    --with-libpcap-libraries=DIR
    如果配置脚本configure没能发现libpcap的头文件和库文件,必须手动设置libpcap库的这两个路径。

    2. 基本安装
    下面介绍一下基本安装过程。
    首先,配置的shell脚本,configure脚本会自动检测你的系统,找到在编译中需要的各种与系统相关的变量的正确值.配置脚本利用这些值来更正snort软件中所有的makefile文件.同时,配置脚本也会产生一个或更多包含着这些系统变量定义的头文件.最后,配置脚本还会产生一个脚本config.status,这个脚本使你可以在以后重新产生文件config.cache(保存测试的结果以加快重新配置的速度)和config.log(保存着编译的结果).
    如果你不希望在config.cache中保存配置一些结果,你可以删掉它们.文件configure.in是程序autoconf用来产生configure.
    当你使用命令make install时,snort的可执行文件被缺省的安装到/usr/local/bin的目录下,man的帮助页安装到/usr/local/man目录下.如果你想要改变他,只需在configure命令中使用选项-prefix=PATH.
    其实,configure还有许多选项,可以使编译更加灵活,你可以使用命令configure -help来获得详细的帮助.

    二、 Snort的使用
    Snort采取命令行方式运行。格式为:snort -[options] 。options中可选的参数很多,下面逐一介绍。
    首先介绍-[options]的内容:
    -A 设置告警方式为full,fast或者none。 在full方式下,Snort将传统的告警信息格式写入告警文件,告警内容比较详细。在fast方式下,Snort只将告警时间,告警内容,告警IP地址和端口号写入文件。在none方式下,系统将关闭告警功能。
    -a 显示ARP包
    -b 以tcpdump的格式将数据包记入日志。 所有的数据包将以二进制格式记入名为snort.log的文件中。这个选项提高了snort的操作速度,因为直接已二进制存储,省略了转换为文本文件的时间,通过-b选项的设置,snort可以在100Mbps的网络上正常工作。
    -c 使用配置文件。这是一个规则文件。文件内容主要控制系统哪些包需要记入日志,哪些包需要告警,哪些包可以忽略等。
    -C 仅抓取包中的ASCII字符
    -d 抓取应用层的数据包
    -D 在守护模式下运行Snort。告警信息发送至/var/log/snort.alert,除非特别配置。
    -e 显示和记录网络层数据包头信息
    -F 从文件中读取BPF过滤信息。
    -h 设置(C类IP地址)为内部网络.当使用这个开关时,所有从外部的流量将会有一个方向箭头指向右边,所有从内部的流量将会有一个左箭头.这个选项没有太大的作用,但是可以使显示的包的信息格式比较容易察看.
    -i 使用网络接口文件
    -l 将包信息记录到目录下。设置日志记录的分层目录结构,按接收包的IP地址将抓取的包存储在相应的目录下。
    -M 文件格式非常简单。文件的每一行包含一个目的地址的SMB名。
    -n 处理完包后退出。
    -N 关闭日志功能。告警功能仍然工作。
    -o 改变应用于包的规则的顺序。标准的应用顺序是:Alert->Pass->Log;采用-o选项后,顺序改为:Pass->Alert->Log,允许用户避免使用冗长的BPF命令行来过滤告警规则。
    -p 关闭混杂模式的嗅探(sniffing)。这个选项在网络严重拥塞时十分有效。
    -r 读取tcpdump生成的文件。Snort将读取和处理这个文件。例如:当你已经得到了一个Shadow文件或者tcpdump格式的文件,想处理文件包含的内容时,这个选项就很有用了。
    -s 将告警信息记录到系统日志。在其他的平台下,日志文件可以出现在/var/log/secure, /var/log/messages目录里。
    -S ,n=v> 设置变量n的值为v。这个选项可以用命令行的方式设置Snort规则文件中的变量。例如:如果要给Snort规则文件中的变量HOME_NET赋值,就可以在命令行下采用这个选项。
    -v 将包信息显示到终端时,采用详细模式。这种模式存在一个问题:它的显示速度比较慢,如果你是在IDS网络中使用Snort,最好不要采用详细模式,否则会丢失部分包信息。
    -V 显示版本号,并退出。
    -x 当收到骚扰IPX包时,显示相关信息。
    -? 显示使用摘要,并退出。
    下面介绍一下< filters >的内容:
    这里的"filters"与TCPDump中的filter相同,是标准的BPF格式的过滤器。一般来说,你可以指定过滤器的主机,网络或者协议,还可以给出逻辑表达式,定制特定的过滤器。例如:
    [root@ice snort-1.6]# ./snort -h 192.168.1.0/24 -d -v host 192.168.1.1
    表示记录从主机192.168.1.1发送和接收的所有包信息。
    [root@ice snort-1.6]# ./snort -h 192.168.1.0/24 -d -v net 192.168.1 and not host 192.168.1.1
    表示记录子网192.168.1中从192.168.1.0到192.168.1.24的所有主机接收和发送的包信息,但不包括192.168.1.1的信息。
    在1.3版本中,你可以使用选项-F从文件中读入自己的BPF过滤器。
    前面将常提到规则文件,先面简单介绍一下规则。详细的内容可以从下面的站点得到。
    http://www.clark.net/~roesch/snort_rules.html 。系统生成的告警信息都记录在alert.log文件中。你可以简单的使用"tail -f"查看日志信息。同时这些日志信息还被记录在系统日志中,其缺省的目录是/var/log/snort.你可以使用-L选项来指定特定的目录.如果你设置了smbalert功能,那么这些告警就可以通过smbclient在windows的机子上弹出一个对话框.
    实际上,在使用snort的过程中,大家一定感受到规则(rules)文件的重要性.如何构造高效全面的规则文件就成了重点.下面我们就介绍一下该文件.
    在该文件中,一条规则必须在一行中,符号#是注释行.所有的ip地址和端口号都要使用数字形式,系统并不支持名字服务.一条规则的格式如下:

    func proto src_ip/mask src_port_range -> dst_ip/mask dst_port_range (options)
    动作 协议 源地址 源端口 目标地址 目标端口 (选项)
    动作包括三类:告警(alert),日志(log)和通行(pass).表明snort对包的三种处理方式.
    在源/目的地址/端口中可以使用any来代表任意的地址或端口.还可以使用符号!来表明取非运算.同时,在目的和源地址之间可以使用标识符<>来指明方向.
    选项包括:
    1. msg -------将要放入alert或log文件中的输出信息;
    2. flags-------tcp协议中的标志,如SYN,ACK等等,如果是0则表明全部标志.
    3. ttl -------在ip包中的ttl值,有利于识别traceroute包.
    4. content----数据包的应用层,查找缓冲区溢出攻击.
    5. itype-------icmp包的类型;
    6. icode-------icmp包的编码;
    7. minfrag----最小的分片的有效载荷大小.
    8. seg---------tcp包中的顺序号;
    9. ack --------tcp包中的响应号;
    10. id ------ip 包中分片的序号;
    .
    11. logto---指定特殊的存放告警信息的文件;
    12. dsize---指定特定的包的长度;
    13. offset---在包中查找一定字节内容;
    14. depth---在数据包中仅仅查找depth字节.
    15. ipopts---查找一个特定的ip选项.

    下面我们就举一些例子来说明规则的作用:
    1. 下面这条规则记录了所有登录到一个特定主机的数据包:
    log tcp any any -> 192.168.1.1/32 23
    2. 在第一条的基础上记录了双向的流量.
    log tcp any any <> 192.168.1.1/32 23
    3. 这一条规则记录了所有到达你的本地主机的icmp数据包.
    log icmp any any -> 192.168.1.0/24 any
    4. 这条规则允许双向的从你的机子到其他站点的http包.
    pass tcp any 80 <> 192.168.1.0/24 any
    5.这条告警规则显示了本地主机对其他主机的111端口的访问,并在log中显示端口影射调用(portmapper call)信息:
    alert tcp 192.168.1.0/24 any -> any 111 (msg:"Portmapper call";)
    6.记录其他任意地址的小于1024端口访问本地小于1024端口的流量:
    log tcp any :1024 -> 192.168.1.0/24 :1024
    7.这条规则将会发现SYN FIN扫描:
    alert tcp any any -> 192.168.1.0/24 any (msg:"SYN-FIN scan!"; flags: SF;)
    8.这条规则将会发现空tcp扫描:
    alert tcp any any -> 192.168.1.0/24 any (msg:"Null scan!"; flags: 0;)
    9.这条规则将会发现Queso fingerprint扫描:
    alert tcp any any -> 192.168.1.0/24 any (msg:"Queso fingerprint";flags: S12;)
    10.这条规则将进行基于内容的查找以发现溢出攻击:
    alert tcp any any -> 192.168.1.0/24 143 (msg:"IMAP Buffer overflow!"; content:"|90E8 C0FF FFFF|/bin/sh";)
    11.这条规则将会发现PHF攻击:
    alert tcp any any -> 192.168.1.0/24 80 (msg:"PHF attempt"; content:"/cgi-bin/phf";)
    12.这条规则将会发现traceroute包:
    alert udp any any -> 192.168.1.0/24 any (msg:"Traceroute"; ttl:1;)
    13.这条规则将会发现其他主机对本地发出的icmp包.
    alert udp any any -> 192.168.1.0/24 any (msg:"Traceroute"; ttl:1;)
    14.这条规则发现nmap的tcp 的ping扫描
    alert tcp any any -> 192.168.1.0/24 any (flags: A; ack: 0; msg:"NMAP TCP ping!";)
    15.这条规则将会发现源路由的数据包(源路由攻击):
    alert tcp any any -> any any (ipopts: lsrr; msg: "Source Routed packet!";)

    由于snort也在不断的发展着,许多功能正在被开发出来,如果需要详细的信息,需要大家随时关注它的发展.希望以上的介绍会对大家有所帮助,利用snort可以建立一个有效的IDS系统.
    发布人:netbull 来自:China-Pub