基于Snort的入侵检测系统(2)

来源:百度文库 编辑:神马文学网 时间:2024/04/29 21:45:03

基于Snort的入侵检测系统(2)

2.1 Snort 安装方案
Snort的安装方式要取决于运行环境,下面列举了一些典型的安装方案以供参考,你可以根据你的网络情况进行选择。
2.1.1 测试安装
简单安装只包括一个Snort探测器。Snort将数据记录到文本文件中。日志文件供Snort管理员随后察看。由于这种方式在实际应用中分析日志的成本比较高因此仅适合测试环境。要用这种方式安装Snort,你可以在http://www.snort.org取得编译好的版本。对RedHat Linux来说,你可以下载RPM包。对Windows系统,你可以下载可执行文件安装到你的系统上。
2.1.2 安装单探测器的应用IDS
单探测器的Snort可应用安装适合只有一条Internet线路的小型网络。将探测器放在路由器或者防火墙的后面,以检测进入系统的入侵者。不过要是你对所有的Internet流量感兴趣,你也可以将传感器放在防火墙的外面。
在这种安装方式中,你可以从Snort网站http://www.snort.org下载编译好的版本,也可以下载源代码根据自己的要求编译,以取得自己需要的特征,这种要求在编译好的版本中是做不到的。Snort的编译步骤将在本章详细讨论。
在 应用系统安装中,也可以让Snort实现自动启动和关闭,这样Snort在系统启动是可以自动启动。如果你在Linux中安装编译好的版本,RPM包会帮 你做到这一点。在Windows系统中,你可以将Snort作为服务来启动或者放在启动组的批处理文件中。Windows相关的问题将在第8章涉及。日志 将纪录为文本文件或者二进制文件,并用类似于SnortSnarf的工具分析数据。SnortSnarf将在第6章中详细讨论。
2.1.3 单探测器与网管系统的整合
在应用系统中,你可以将Snort配置成向网管系统发送trap。在企业应用中,有很多种网管系统在应用。最常见的商业网管系统公司有惠普、IBM、Computer Associates等。
Snort利用SNMP trap整合到网管系统中。当你看完本章的Snort编译步骤后,就会了解Snort是怎样提供SNMP能力的。第4章将介绍更多的关于配置SNMP trap目标、community名称等更多的信息。
2.1.4 带有数据库和web界面的单探测器
Snort最通常的用法是与数据库的整合。数据库用来记录日志,并可以随后通过web界面访问。这种安装的典型设置包含3个基本的部件:
Snort 探测器
数据库服务器
web服务器
Snort将日志记录到数据库中,你可以通过连接到它的web浏览器察看这些数据。这种方案可以参见第1章的图1-1。所有3个部件也可以安装在同一个系统上,如第1章的图1-2所示。
Snort可以用不同类型的数据库,如MySQL,PostgresSQL,Oracle,Microsoft SQL Server和其他ODBC兼容的数据库。PHP用来在数据库中获取数据,并产生页面。
这样的安装提供给你一个易于管理的功能全面的IDS,并具有友好的用户界面。为了使你能够用数据库记录日志,你必须给Snort提供数据库的用户名称、密 码、数据库名称和数据库服务器的地址。在单探测器方案中,如果数据库服务器就安装在运行传感器的机器上,你可以用“localhost”作为主机名。你在 编译Snort时就要选择记录数据库的功能,这一点将在本章的后面详细描述。Snort使用数据库的配置将在第4、5、6章讨论。
2.1.5 用集中数据库管理多个Snort探测器
在分布式环境中,你可能需要在多个位置安装Snort探测器。管理所有这些探测器并分别分析它们收集的数据是一项艰难的任务。在企业应用中,有一些方法可以将Snort设置和安装成分布式的IDS。
其中一种方法是将多个探测器连接到同一个中心数据库,如图1-3所示。所有探测器产生的数据都存储在这个数据库中。同时运行一个类似于Apache的web服务器。然后用户可以用web浏览器察看这些数据并加以分析。
但要了解这种配置存在一些实际问题:
所有的探测器在启动Snort的时候必须能够访问到数据库,如果不能,Snort就终止进程。
数据库必须保证让探测器所有的时间都能访问,否则,数据将丢失。
如果探测器和数据库服务器之间有防火墙,你要打开相应的端口,有时这样做会与防火墙的安全策略不匹配或者违背安全策略。
在 探测器不能直接访问数据库服务器的时候,有一些变通的方法。探测器可以配置为将文件存储在本地,然后用类似于SCP的工具定期将这些文件上传到中央数据库 服务器。SCP用SSH协议来进行安全文件传输的工具。防火墙管理员要放行SSH端口的通信。你可以用Snort本身,Barnyard或其他一些工具从 日志文件中提取数据并将它们放到数据库中,你可以在以后用web界面来察看这些数据。这种方式的唯一问题是数据库中的数据并非严格的“实时”数据。延迟的 大小要看你用SCP上传数据到中心数据库服务器的频率。这种方式如图2-1所示。
要注意,中心数据库服务器必须要运行SSH服务器以能够用SCP来上传数据。
如第一章中提到的那样,这本书的最终目的是帮助你安装Snort并让所有的软件包可以协同工作。当你通读此书后,你将了解这些部件之间是如何相互作用,共同工作形成一个完整的入侵检测系统的。本书中涉及的这些软件都可以这本书的网站http://authors.phpktr.com/rhman/中获得源代码。你也可以发现这个网站上的一些脚本可以帮助你轻松的在一个新系统上安装这些软件包。事实上,用这本书提到的这个网站上的一些脚本,你可以以root身份用仅仅几个命令行就建立一个可用的IDS。如果你用的Snort的版本比本书涉及的要新,你可以在http://www.argusnetsec.com/downloads下载支持新版本Snort的最新版的脚本。
这 本书将详细介绍这些部件在RedHat Linux 7.3机器上的安装,但是在其他版本的Linux或者其他平台上的过程与之类似。为了方便本书介绍,所有的部件都安装在/opt目录下面。但是如果用编译 好的软件包,安装位置可能有所不同。当你用本书上或者从本书的网站取得的脚本,文件将被安装在这个目录下面。在本章中,你将了解如何将Snort作为一个 独立的产品安装,在后面的章节中,将介绍其他一些部件。
你可以得到二进制形式或者源代码形式的Snort。对于大多数安装来说,编译好的二进制软 件包是非常好的。如前面提及的,如果你想为Snort定制一些特性,你需要下载源代码版的Snort自行编译。例如,有些人喜欢SMB告警,但另外一些人 可能认为它们不安全。如果你需要不支持SMB告警的Snort,那么你需要自己编译它。这对于一些如SNMP trap、MySQL等其他特性也是一样的。另外一个自己编译Snort理由是你需要了解正在开发中的代码。本章将指导你一步一步的安装Snort。
基本的安装过程是非常简单的,而且Snort已经提供给你包含大多数已知攻击特征的预定义的规则。当然,自定义安装还是要费一些工夫的。
2.2 安装Snort
在这一部分,你将了解如何安装编译好的Snort和如何自己编译和安装。安装编译好的RPM包非常简单,仅需要几步。但是如果你的Snort是源代码形式的,是需要一些时间来了解和安装的。
2.2.1 用RPM包安装Snort
用RPM包安装Snort包括下面的步骤。
2.2.1.1 下载
从Snort的网站(http://www.snort.org)下载最新版的Snort。在写本书的时候,最新版的二进制文件是snort-1.9.0-1snort.i386.rpm。
2.2.1.2 安装
运行下面的命令来安装Snort的二进制文件:
rpm –install snort-1.9.0-1snort.i386.rpm
这个命令会产生下面的动作:
n 创建/etc/snort目录,n 其中会存放Snort的规则文件和配置文件。
n 创建/var/log/snort目录,n Snort的日志文件将会存放在这里。
n 创建/usr/share/doc/snort-1.9.0目录来存放Snort的文档文件,n 在这个目录中,n 你会看到类似于FAQ,README的文件和其他一些文件。
n 在/usr/sbin目录中创建一个叫做snort-plain的文件,n 这是Snort的守护进程。 创建文件 /etc/rc.d/init.d/snortd文件,n 这是启动和关闭脚本。在RedHat Linux中,n 它与/etc/init.d/snortd等价。
到这里基本安装就完成了,你可以开始使用Snort。这个版本的Snort并没有将对数据库的支持编译进去,你只能用/var/log/snort目录下面的日志文件。
2.2.1.3 Snort的启动,停止和重启
用下面的命令手工启动Snort:
/etc/init.d/snortd start
这个命令将启动Snort守护进程,运行“ps –ef”命令,你可以看到类似于下面的输出:
root 15999 1 0 18:31 ? 00:00:01 /usr/sbin/
snort -A fast -b -l /var/log/snort -d -D -i eth0 -c /etc/
snort/snort.conf
注意每次你重启机器,你都要手工启动Snort。你可以通过创建文件链接的方式让这个过程自动执行,这将在本章的后面讨论。
用下面的命令停止Snort:
/etc/init.d/snortd stop
用下面的命令重新启动Snort:
/etc/init.d/snortd restart
2.2.2 用源代码安装Snort
为了能够用源代码安装Snort,你必须先构造它。你可以用下面介绍的步骤来构造出可执行文件snort。首先从Snort网站(http://www.snort.org)获得最新版的Snort。在写这本书的时候,最新版的Snort是1.9.0,下载文件的名称是snort-1.9.0.tar.gz,下载后可以保存在/opt目录中。注意在你读这本书的时候可能会是更新的版本,安装方法也类似。
2.2.2.1 解压缩
下载后第一步要把源代码解压缩,用下面的命令来执行:
tar zxvf snort-1.9.0.tar.gz
这 样会创建/opt/snort-1.9.0目录。确定你将文件下载到/opt目录,并且你在这个目录运行tar命令。如果是其他版本的Snort,目录名 称可能会有所不同,目录名称会反映版本号。解压缩后你可以运行tree命令来观察tar命令建立的目录树,如下所示是/opt/snort-1.9.0的 目录树:
[root@conformix opt]# tree -d snort-1.9.0
snort-1.9.0
|– contrib
|– doc
|– etc
|– rules
|– src
| |– detection-plugins
| |– output-plugins
| |– preprocessors
| `– win32
| |– WIN32-Code
| |– WIN32-Includes
| | |– NET
| | |– NETINET
| | |– libnet
| | |– mysql
| | `– rpc
| |– WIN32-Libraries
| | |– libnet
| | `– mysql
| `– WIN32-Prj
`– templates
21 directories
[root@conformix opt]#
这些目录中的主要内容如下所示:
contrib目录主要包括并非严格输入Snort自身组成部分的应用软件,这些软件包括ACID,MySQL数据库生成脚本和其他。
doc目录包含文档文件。
etc目录包含配置文件。
rules目录包含预先定义的规则文件。
所有的源代码在src目录下面。
templates是为那些准备自己写插件的人准备的,这对大多数Snort用户没有意义。
2.2.2.2 编译和安装
编译和安装过程包括下列3个步骤:
运行configure脚本。
运行make命令。
运行make install命令。
开 始Snort的编译过程,首先去/opt/snort-1.9.0目录并运行configure脚本。如果你刚刚开始接触GNU类的软件,你需要了解 configure脚本是开放源码软件包通用的工具,它可以用来设置参数,创建makefile,检测开发工具和你系统中的库文件。运行 configure脚本的时候,有许多命令行选项,这些选项决定Snort编译时将带有那些组件。比如,用这些选项,你可以构建对SNMP、MySQL或 SMB告警的支持以及其他很多事情。你同样也可以定制Snort文件的最终安装位置。你可以用“./configure –help”命令来察看可用的选项,如下所示:
# ./configure –help
`configure’ configures this package to adapt to many kinds of systems.Usage: ./configure [OPTION]… [VAR=VALUE]…

To assign environment variables (e.g., CC, CFLAGS…), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
-h, –help display this help and exit
–help=short display options specific to this package
–help=recursive display the short help of all the included packages
-V, –version display version information and exit
-q, –quiet, –silent do not print `checking…’ messages
–cache-file=FILE cache test results in FILE [disabled]
-C, –config-cache alias for `–cache-file=config.cache’
-n, –no-create do not create output files
–srcdir=DIR find the sources in DIR [configure dir or `..’]

Installation directories:
–prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
–exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]

By default, `make install’ will install all the files in
`/usr/local/bin’, `/usr/local/lib’ etc. You can specify
an installation prefix other than `/usr/local’ using `–prefix’,
for instance `–prefix=$HOME’.

For better control, use the options below.

Fine tuning of the installation directories:
–bindir=DIR user executables [EPREFIX/bin]
–sbindir=DIR system admin executables [EPREFIX/sbin]
–libexecdir=DIR program executables [EPREFIX/libexec]
–datadir=DIR read-only architecture-independent data [PREFIX/share]
–sysconfdir=DIR read-only single-machine data [PREFIX/etc]
–sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
–localstatedir=DIR modifiable single-machine data [PREFIX/var]
–libdir=DIR object code libraries [EPREFIX/lib]
–includedir=DIR C header files [PREFIX/include]
–oldincludedir=DIR C header files for non-gcc [/usr/include]
–infodir=DIR info documentation [PREFIX/info]
–mandir=DIR man documentation [PREFIX/man]

Program names:
–program-prefix=PREFIX prepend PREFIX to installed program names
–program-suffix=SUFFIX append SUFFIX to installed program names
–program-transform-name=PROGRAM run sed PROGRAM on installed program names

System types:
–build=BUILD configure for building on BUILD [guessed]
–host=HOST cross-compile to build programs to run on HOST [BUILD]

Optional Features:
–disable-FEATURE do not include FEATURE (same as –enable-FEATURE=no)
–enable-FEATURE[=ARG] include FEATURE [ARG=yes]
–disable-dependency-tracking Speeds up one-time builds
–enable-dependency-tracking Do not reject slow dependency extractors
–enable-debug enable debugging options (bugreports and developers only)
–enable-profile enable profiling options (developers only)
–enable-sourcefire Enable Sourcefire specific build options
–enable-perfmonitor Enable perfmonitor preprocessor
–enable-linux-smp-stats Enable statistics reporting through proc
–enable-flexresp Flexible Responses on hostile connection attempts

Optional Packages:
–with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
–without-PACKAGE do not use PACKAGE (same as –with-PACKAGE=no)
–with-libpcap-includes=DIR libpcap include directory
–with-libpcap-libraries=DIR libpcap library directory
–with-libnet-includes=DIR libnet include directory
–with-libnet-libraries=DIR libnet library directory
–with-mysql=DIR support for mysql
–with-odbc=DIR support for odbc
–with-postgresql=DIR support for postgresql
–with-oracle=DIR support for oracle

Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L if you have libraries in a
nonstandard directory
CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have
headers in a nonstandard directory
CPP C preprocessor

Use these variables to override the choices made by `configure’ or to help
it to find libraries and programs with nonstandard names/locations
方括号中的值表示如果该选项如果没有被设定,系统就会选择该默认值。例如:– prefix选项帮助第二行表示,如果没有设定—prefix选项,系统就会选择默认值/usr/local。PREFIX是指当你运行“make install”命令的时候Snort文件要安装的目录。
–prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
运行configure脚本的典型会话如下所示。为节省空间,输出信息作了删减。注意命令行中打开的选项。
[root@conformix snort-1.9.0]# ./configure –prefix=/opt/snort
–enable-smbalerts –enable-flexresp –with-mysql –with-snmp
–with-openssl
loading cache ./config.cache
checking for a BSD compatible install… (cached) /usr/bin/
install -c
checking whether build environment is sane… yes
checking whether make sets ${MAKE}… (cached) yes
checking for working aclocal… found
checking for working autoconf… found
checking for working automake… found
checking for working autoheader… found
checking for working makeinfo… found
checking for gcc… (cached) gcc
checking whether the C compiler (gcc ) works… yes
checking whether the C compiler (gcc ) is a cross-compiler…
no
checking whether we are using GNU C… (cached) yes
checking whether gcc accepts -g… (cached) yes
checking for gcc option to accept ANSI C… (cached) none
needed
checking for ranlib… (cached) ranlib
输出信息作了删件,因为configure命令会产生大量的信息。选项prefix告诉configuire脚本程序最终的安装位置。其他的选项用来使下列Snort组件生效:
对MySQL数据库的支持。
对SNMP trap信息的支持。
对SMB告警的支持。SMB告警用来向Windows发出弹出窗口告警。
对flex响应的支持。Flex响应用来实时终止网络会话。后面的章节将提供关于flex响应的更多信息。注意你的系统必须安装了libnet才能够使用这个选项。你可以从http://www.securityfocus.net下载libnet。我是用1.0.2a版来完成安装的。
运行完configure脚本后,你可以运行下面两个命令来编译和安装Snort。
make
make install
你 一个命令也许要一些时间来完成,这要看你的计算机的能力。当你运行完第二个命令,文件就会被安装到适当的目录中去了。因为你在运行configure脚本 的时候选择了–prefix=/opt/snort,因此make install命令将Snort二进制文件安装到/opt/snort目录中去。
运行configure脚本的可用参数见表2-1
表2-1 configure脚本参数一览表

参数 描述
–with-mysql 构建Snort对Mysql的支持
–with-snmp 构建Snort对SNMP的支持。如果用这个选项,必须同时选-—with-openssl
–with-openssl 对OpenSSL的支持。当你选—with-snmp时要选择这个选项。
–with-oracle 对Oracle数据库的支持。
–with-odbc 构建Snort对ODBC的支持。
–enable-flexresp 使Snort能够使用Flex响应,以能够终止恶意的连接。目前这个选项还在实验中(察看Snort发布的README.FLEXRESP文件)。
–enable-smbalerts 使Snort能够发送SMB告警。注意每次告警时都会占用客户端的用户空间。
–Prefix=DIR 设置安装Snort文件的目录。
在运行“make install”命令之前,你也可以运行“make check”命令来确定Snort的构建是否正确。
安装完毕之后,运行Snort来看看是否可执行文件可以工作。在完成前面的步骤后,Snort的二进制文件会被安装在/opt/snort/bing目录中。下面的命令会显示新安装的snort的基本帮助信息和命令行选项。

如果你看到这样的信息,你的Snort就安装正确了。在下一部分,你将了解如何配置和运行Snort。
2.2.2.3 安装完后要做的工作
现在你已经安装好了Snort二进制文件,但是还有些事情要做:
创建/var/log/snort目录作为Snort默认的存放日至文件的地方。
创建一个存放配置文件的目录。我创建的是/opt/snort/etc目录,你可以创建自己的目录。
创建或者复制配置文件到/opt/snort/etc目录下。
创建目录/opt/snort/rules并且将默认的规则文件拷贝到里面。这个目录会在snort.conf文件中指定,你可以创建自己喜欢的目录。

下面来详细解释这些步骤:
首先,创建/var/log/snort目录让Snort存放日志文件。你也可以用其它的目录,但是这个目录是惯常使用的。如果你用其他任何目录,你需要在启动Snort的时候用命令行选项-l来指定。
然后,要创建Snort配置文件。当Snort启动的时候,将从当前目录读取配置文件snort.conf或者从运行Snort的用户属主目录读取. snortrc文件。如果这个文件在其他目录中,你也可以用命令行选项-c来指定。开始的时候,你可以将Snort源代码中附带的snort.conf文 件拷贝到你创建的/opt/snort/etc目录下面。同时也把classification.config和reference.config文件拷 贝进去,这两个文件是snort.conf文件要引用的。另外将源代码中rules目录下面的所有文件拷贝到/opt/snort/rules目录下面。 参考下列命令实现这些步骤:
mkdir /opt/snort/etc
cp /opt/snort-1.9.0/etc/snort.conf /opt/snort/etc
cp /opt/snort-1.9.0/etc/classification.config /opt/snort/etc
cp /opt/snort-1.9.0/etc/reference.config /opt/snort/etc
mkdir /opt/snort/rules
cp /opt/snort-1.9.0/rules/* /opt/snort/rules
rules目录中以.rules为后缀的文件中包含了各种规则,这些文件被snort.conf文件引用。这些rules文件的位置由snort.conf文件中定义的RULE_PATH变量控制,该变量在snort.conf中的定义一般如下表示:
var RULE_PATH ../rules
它说明rules文件的位置在名叫rules的目录下。例如,如果snort.conf文件在/opt/snort/etc目录中,那么所有的规则文件就 应该在/opt/snort/rules目录下。又例如如果snort.conf文件在/var/snort目录下,那么规则文件必须在 /var/rules目录中。你也可以将snort.conf与所有规则文件放在同一目录下面,只是你要将snort.conf文件中rules位置变量 的值由../变成./:
var RULE_PATH ./
在下一章中,你将了解更多的关于Snort规则的信息,同时你也将了解如何定义自己的规则。
classification.config文件中包括了关于Snort规则分类的信息,你将在下一章中了解更多信息。在本书的例子中,Snort的所有源代码文件在/opt/snort-1.9.0目录中,如果你用的是不同版本的Snort,该目录也会不同。
Reference.config文件中罗列了一些关于各种告警信息的参考网站的URL,这些参考将在Snort规则中引用,你会在下一章了解更多信息。典型的reference.config文件如下所示:
# $Id: reference.config,v 1.3 2002/08/28 14:19:15 chrisgreen
Exp $
# The following defines URLs for the references found in the
rules
#
# config reference: system URL
config reference: bugtraq http://www.securityfocus.com/bid/
config reference: cve http://cve.mitre.org/cgi-bin/
cvename.cgi?name=
config reference: arachNIDS http://www.whitehats.com/info/IDS
# Note, this one needs a suffix as well…. lets add that in a
bit.
config reference: McAfee http://vil.nai.com/vil/content/v_
config reference: nessus http://cgi.nessus.org/plugins/
dump.php3?id=
config reference: url http://
注意:classification和reference.config文件都会被主配置文件snort.conf引用。
现在你可以用下面的命令运行Snort了,这个命令会显示启动信息,然后监听eth0接口。注意为了避免一些困扰,这个命令用命令行选项指定了snort.conf文件的绝对目录。
[root@conformix snort]# /opt/snort/bin/snort -c /opt/snort/
etc/snort.conf
Initializing Output Plugins!
Log directory = /var/log/snort
Initializing Network Interface eth0
–== Initializing Snort ==–
Decoding Ethernet on interface eth0
Initializing Preprocessors!
Initializing Plug-ins!
Parsing Rules file /opt/snort/etc/snort.conf
+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains…
No arguments to frag2 directive, setting defaults to:
Fragment timeout: 60 seconds
Fragment memory cap: 4194304 bytes
Fragment min_ttl: 0
Fragment ttl_limit: 5
Fragment Problems: 0
Stream4 config:
Stateful inspection: ACTIVE
Session statistics: INACTIVE
Session timeout: 30 seconds
Session memory cap: 8388608 bytes
State alerts: INACTIVE
Evasion alerts: INACTIVE
Scan alerts: ACTIVE
Log Flushed Streams: INACTIVE
MinTTL: 1
TTL Limit: 5
Async Link: 0
No arguments to stream4_reassemble, setting defaults:
Reassemble client: ACTIVE
Reassemble server: INACTIVE
Reassemble ports: 21 23 25 53 80 143 110 111 513
Reassembly alerts: ACTIVE
Reassembly method: FAVOR_OLD
http_decode arguments:
Unicode decoding
IIS alternate Unicode decoding
IIS double encoding vuln
Flip backslash to slash
Include additional whitespace separators
Ports to decode http on: 80
rpc_decode arguments:
Ports to decode RPC on: 111 32771
telnet_decode arguments:
Ports to decode telnet on: 21 23 25 119
Conversation Config:
KeepStats: 0
Conv Count: 32000
Timeout : 60
Alert Odd?: 0
Allowed IP Protocols: All
Portscan2 config:
log: /var/log/snort/scan.log
scanners_max: 3200
targets_max: 5000
target_limit: 5
port_limit: 20
timeout: 60
1273 Snort rules read…
1273 Option Chains linked into 133 Chain Headers
0 Dynamic rules
+++++++++++++++++++++++++++++++++++++++++++++++++++
Rule application order: ->activation->dynamic->alert->pass-
>log
–== Initialization Complete ==–
-*> Snort! <*-
Version 1.9.0 (Build 209)
By Martin Roesch (roesch@sourcefire.com, www.snort.org)
正 如你看到的这些输出信息,Snort已经开始监听eth0接口了。如果有任何包与规则匹配,Snort就会根据规则做出相应的动作并发出告警。告警可以以 多种形式发出。在这种基本方式中,告警将被记录到/var/log/snort/alerts文件中。后面,你将看到产生其他形式的告警并将它们记录到数 据库中的方法,同时你也会了解Snort告警的数据文件的格式。
你可以在任何时候同时按下ctrl键和c键来终止Snort进程,这时Snort将显示程序活动的概要然后退出,如下所示:
==========================================================
Snort analyzed 65 out of 65 packets, dropping 0(0.000%)
packets
Breakdown by protocol: Action Stats:
TCP: 55 (84.615%) ALERTS: 10
UDP: 10 (15.385%) LOGGED: 10
ICMP: 0 (0.000%) PASSED: 0
ARP: 0 (0.000%)
EAPOL: 0 (0.000%)
IPv6: 0 (0.000%)
IPX: 0 (0.000%)
OTHER: 0 (0.000%)
DISCARD: 0 (0.000%)
==========================================================
Wireless Stats:
Breakdown by type:
Management Packets: 0 (0.000%)
Control Packets: 0 (0.000%)
Data Packets: 0 (0.000%)
==========================================================
Fragmentation Stats:
Fragmented IP Packets: 0 (0.000%)
Fragment Trackers: 0
Rebuilt IP Packets: 0
Frag elements used: 0
Discarded(incomplete): 0
Discarded(timeout): 0
Frag2 memory faults: 0
==========================================================
TCP Stream Reassembly Stats:
TCP Packets Used: 55 (84.615%)
Stream Trackers: 1
Stream flushes: 0
Segments used: 0
Stream4 Memory Faults: 0
==========================================================
Snort received signal 2, exiting
[root@conformix snort]#
前 面提到的方法是在前台运行Snort,用这种方式运行Snort你在终端会失去提示符。你可以用命令行开关-D来在后台运行Snort,这样Snort仍 然将告警信息记录到/var/log/snort,同时你得到了提示符。注意,如果你是用RPM包安装的Snort,那么你可以用 “/etc/init.d/snortd start”命令使Snort在后台运行。

2.2.3 Snort启动时的错误
如果你是自己编译的Snort,启动Snort的时候,有时会看到下面的错误信息:
[!] ERROR: Cannot get write access to logging directory “/var/
log/snort”.
(directory doesn’t exist or permissions are set incorrectly
or it is not a directory at all)
Fatal Error, Quitting..
造成这个错误的原因是你没有创建/var/log/snort目录。运行“mkdir /var/log/snort”然后再启动Snort这个错误就消失了。
如果你看到下面的错误信息,说明你在启动Snort没有在命令行中正确指定配置文件的时候没有指定配置文件。
Initializing rule chains…
ERROR: Unable to open rules file: /root/.snortrc or /root//
root/.snortrc
Fatal Error, Quitting..
注意:你可以下列情况,你可以不指定配置文件:
你在配置文件所在的目录启动Snort。
你已经将配置文件复制到你的属主目录中的.snortrc文件中。
2.2.4 测试Snort
在启动Snort后,你需要知道Snort是否真正开始捕获数据并纪录入侵行为。如果你在前台用命令行选项“-A console”来启动Snort,你将在终端屏幕上看到告警信息。如果你用守护进程模式启动Snort而不用上面的命令行选项,那么告警就记录到 /var/log/snort/alert文件中。
下面的命令将使你在控制台或者/var/log/snort/alert文件中看到一些告警信息,你可以判断Snort是否正常工作:
ping -n -r -b 255.255.255.255 -p “7569643d3028726f6f74290a” -c3
如果你用“-A console”命令行选项,你应该在屏幕上来到类似于下面的告警:
11/19-18:51:04.560952 [**] [1:498:3] ATTACK RESPONSES id
check returned root [**] [Classification: Potentially Bad
Traffic] [Priority: 2] {ICMP} 10.100.1.105 -> 255.255.255.255
2.2.4.1 产生测试告警
下面的名为snort-test.sh的脚本可以在http://authors.phptr.com/rehman/上找到。它的基本作用于上面的命令类似,不过能够在以守护进程模式运行Snort的时候用到。
1 #!/bin/sh
2 #
3 ###############################################################
4 # You are free to copy and distribute this script under #
5 # GNU Public License until this part is not removed #
6 # from the script. #
7 ###############################################################
8 # HOW TO USE #
9 # #
10 # Right after installation of Snort, run this script. #
11 # It will generate alerts in /var/log/snort/alert file similar#
12 # to the following: #
13 # #
14 # Note that Snort must be running at the time you run this #
15 # script. #
16 # #
17 # [**] [1:498:3] ATTACK RESPONSES id check returned root [**] #
18 # [Classification: Potentially Bad Traffic] [Priority: 2] #
19 # 08/31-15:56:48.188882 255.255.255.255 -> 192.168.1.111 #
20 # ICMP TTL:150 TOS:0×0 ID:0 IpLen:20 DgmLen:84 #
21 # Type:0 Code:0 ID:45596 Seq:1024 ECHO REPLY #
22 # #
23 # These alerts are displayed at the end of the script. #
24 ###############################################################
25 #
26 clear
27 echo “###############################################################”
28 echo “# Script to test Snort Installation #”
29 echo “# Written By #”
30 echo “# #”
31 echo “# Rafeeq Rehman #”
32 echo “# rr@argusnetsec.com #”
33 echo “# Argus Network Security Services Inc. #”
34 echo “# http://www.argusnetsec.com #”
35 echo “###############################################################”
36 echo
37
38 echo
39 echo “###############################################################”
40 echo “The script generates three alerts in file /var/log/snort/alert”
41 echo “Each alert should start with message like the following:”
42 echo
43 echo ” \”ATTACK RESPONSES id check returned root\” ”
44 echo “###############################################################”
45 echo
46 echo “Enter IP address of any other host on this network. If you”
47 echo “don’t know any IP address, just hit Enter key. By default”
48 echo -n “broacast packets are used [255.255.255.255] : ”
49
50 read ADDRESS
51
52 if [ -z $ADDRESS ]
53 then
54 ADDRESS=”255.255.255.255″
55 fi
56
57 echo
58 echo “Now generating alerts. If it takes more than 5 seconds, break”
59 echo “the script by pressing Ctrl-C. Probably you entered wrong IP”
60 echo “address. Run the script again and don’t enter any IP address”
61
62 ping -i 0.3 -n -r -b $ADDRESS -p “7569643d3028726f6f74290a” -c3 2>/dev/
null >/dev/null
63
64 if [ $? -ne 0 ]
65 then
66 echo “Alerting generation failed.”
67 echo “Aborting …”
68 exit 1
69 else
70 echo
71 echo “Alert generation complete”
72 echo
73 fi
74
75 sleep 2
76
77
78 echo
79 echo “################################################################”
80 echo “Last 18 lines of /var/log/snort/alert file will be displayed now”
81 echo “If snort is working properly, you will see recently generated”
82 echo “alerts with current time”
83 echo “################################################################”
84 echo
85 echo “Hit Enter key to continue …”
86 read ENTER
87
88 if [ ! -f /var/log/snort/alert ]
89 then
90 echo “The log file does not exist.”
91 echo “Aborting …”
92 exit 1
93 fi
94
95 tail -n18 /var/log/snort/alert
96
97 echo
98 echo “Done”
99 echo
该脚本将产生一些告警,如果你用守护进程模式运行Snort,你可以在/var/log/snort/alert文件中看到,或者你可以在你运行 Snort的终端屏幕上看到。导致告警的原因是发送了定制的ICMP echo包,定制的特征将触发下列Snort规则,并产生一个告警。
alert ip any any -> any any (msg:”ATTACK RESPONSES id check
returned root”; content: “uid=0(root)”; classtype:bad-unknown;
sid:498; rev:3;)
告警产生后,脚本将显示/var/log/snort/alert文件的最后18行信息。
现在让我们来看看脚本的各个部门以及它是如何运作的。第52到55行的作用是提示用户输入ping包发送目标的地址,如果用户没有输入,脚本就会采用255.255.255.255这个地址,ping包就会作为广播包发送。
第62行的作用是产生触发规则的ICMP包。注意在这里“7569643d3028726f6f74290a”
事实上与“uid=0(root)”是等价的,这样的特征可以产生告警。
命令行参数-c3的作用是产生3个包。并且标准输入和错误都被重定向到/dev/null中去了,因此不会产生屏幕输出。你可以用“man ping”命令来察看ping命令的man page以获得更多的信息。
第64行到第73行的作用是检查ping命令的输出结果。输出的信息将显示ping命令执行结果的成功或者失败。如果命令失败,脚本就在这里退出,不再执行下面的过程。
如果告警成功产生,它们一定会出现在/var/log/snort/alert文件中。脚本88到93行用来检测这个文件是否存在,如果不存在,脚本就退出运行。
如果一切正常,第95行的作用就是显示/var/log/snort/alert文件的最后18行内容。
2.2.4.2 自动启动Snort并产生自动告警的脚本
如果你将Snort安装到/opt/snort目录下,你也可以用下面的脚本来自动启动和停止Snort并检验其工作是否正常。在运行这个脚本之前要确定 Snort还没有启动,因为这个脚本将自己启动Snort。这个名为snort-test-auto.sh的脚本文件可以在本书的相关网站http://authors.phptr.com/rehman中找到。
1 #!/bin/sh
2 #
3 ###############################################################
4 # You are free to copy and distribute this script under #
5 # GNU Public License until this part is not removed #
6 # from the script. #
7 ###############################################################
8 # HOW TO USE #
9 # #
10 # Right after installation of Snort, run this script. #
11 # It is assumed that snort executable is present in the #
12 # /opt/argus/bin directory and all rules and configuration #
13 # files are present under /opt/argus/etc/snort directory. #
14 # If files are in other locations, edit the following location#
15 # of variables. If you used the installation script provided #
16 # along with this script, the files will be automatically #
17 # located in appropriate directories. #
18 # #
19 # Note that the script starts and stops Snort by itself and #
20 # you should make sure that Snort is not running at the time #
21 # you run this script. #
22 # #
23 # It will generate alerts in /tmp/alert file similar #
24 # to the following: #
25 # #
26 # [**] [1:498:3] ATTACK RESPONSES id check returned root [**] #
27 # [Classification: Potentially Bad Traffic] [Priority: 2] #
28 # 08/31-15:56:48.188882 255.255.255.255 -> 192.168.1.111 #
29 # ICMP TTL:150 TOS:0×0 ID:0 IpLen:20 DgmLen:84 #
30 # Type:0 Code:0 ID:45596 Seq:1024 ECHO REPLY #
31 # #
32 # These alerts are displayed at the end of the script. #
33 ###############################################################
34 #
35
36 PREFIX=/opt/snort
37 SNORT=$PREFIX/bin/snort
38 SNORT_CONFIG=$PREFIX/etc/snort.conf
39 LOG_DIR=/tmp
40 ALERT_FILE=$LOG_DIR/alert
41 ALERT_FILE_OLD=$LOG_DIR/alert.old
42 ADDRESS=”255.255.255.255″
43
44 clear
45
46 echo “###############################################################”
47 echo “# Script to test Snort Installation #”
48 echo “# Written By #”
49 echo “# #”
50 echo “# Rafeeq Rehman #”
51 echo “# rr@argusnetsec.com #”
52 echo “# Argus Network Security Services Inc. #”
53 echo “# http://www.argusnetsec.com #”
54 echo “###############################################################”
55 echo
56
57 echo
58 echo “###############################################################”
59 echo “The script generates three alerts in file /tmp/alert”
60 echo “Each alert should start with message like the following:”
61 echo
62 echo ” \”ATTACK RESPONSES id check returned root\” ”
63 echo “###############################################################”
64 echo
65
66 if [ ! -d $LOG_DIR ]
67 then
68 echo “Creating log directory …”
69 mkdir $LOG_DIR
70
71 if [ $? -ne 0 ]
72 then
73 echo “Directory $LOGDIR creation failed”
74 echo “Aborting …”
75 exit 1
76 fi
77 fi
78
79 if [ -f $ALERT_FILE ]
80 then
81 mv -f $ALERT_FILE $ALERT_FILE_OLD
82
83 if [ $? -ne 0 ]
84 then
85 echo “Can’t rename old alerts file.”
86 echo “Aborting …”
87 exit 1
88 fi
89 fi
90
91 if [ ! -f $SNORT ]
92 then
93 echo “Snort executable file $SNORT does not exist.”
94 echo “Aborting …”
95 exit 1
96 fi
97
98 if [ ! -f $SNORT_CONFIG ]
99 then
100 echo “Snort configuration file $SNORT_CONFIG does not exist.”
101 echo “Aborting …”
102 exit 1
103 fi
104
105 if [ ! -x $SNORT ]
106 then
107 echo “Snort file $SNORT is not executable.”
108 echo “Aborting …”
109 exit 1
110 fi
111
112 echo “Starting Snort …”
113 $SNORT -c $SNORT_CONFIG -D -l /tmp 2>/dev/null
114
115 if [ $? -ne 0 ]
116 then
117 echo “Snort startup failed.”
118 echo “Aborting …”
119 exit 1
120 fi
121
122 echo
123 echo “Now generating alerts.”
124
125 ping -i 0.3 -n -r -b $ADDRESS -p “7569643d3028726f6f74290a” -c3 2>/dev/
null >/dev/null
126
127 if [ $? -ne 0 ]
128 then
129 echo “Alerting generation failed.”
130 echo “Aborting …”
131 exit 1
132 else
133 echo
134 echo “Alert generation complete”
135 echo
136 fi
137
138 sleep 2
139
140 tail -n18 $ALERT_FILE 2>/dev/null | grep “ATTACK RESPONSES id check” >/
dev/null
141
142 if [ $? -ne 0 ]
143 then
144 echo “Snort test failed.”
145 echo “Aborting …”
146 exit 1
147 fi
148
149 echo “Stopping Snort …”
150 pkill snort >/dev/null 2>&1
151
152 if [ $? -ne 0 ]
153 then
154 echo “Snort stopping failed.”
155 echo “Aborting …”
156 exit 1
157 fi
158
159 echo
160 echo “Done. Snort installation is working properly”
161 echo
也许你会注意到,如果脚本成功产生,这个脚本将在/tmp目录中创建告警文件。如果你运行脚本一切正常,你将看到下面的输出信息:
###########################################################
# Script to test Snort Installation #
# Written By #
# #
# Rafeeq Rehman #
# rr@argusnetsec.com #
# Argus Network Security Services Inc. #
# http://www.argusnetsec.com #
###########################################################
###########################################################
The script generates three alerts in file /tmp/alert
Each alert should start with message like the following:
“ATTACK RESPONSES id check returned root”
##########################################################
Starting Snort …
Now generating alerts.
Alert generation complete
Stopping Snort …
Done. Snort installation is working properly
在你运行这个脚本的时候,它将会做一系列的事情。首先在36行到42行它定义了一些变量。
在定义变量之后,脚本将做以下的事情:
第66到67行用来检测$LOG_DIR目录是否存在。第39行中定义了这个目录为/tmp。如果这个目录不存在,脚本将创建它。
第78到79行用来检测$ALERT_FILE文件是否存在,也就是/tem/alert,如果已经存在,那么脚本将其更名为/tmp/alert.old。
第91到96行用来检测Snort的二进制文件是否存在,在这里也就是/opt/snort/bin/snort。如果这个文件不存在,脚本就终止执行。
第98到103行用来检测$SNORT_CONFIG文件,在这里也就是/opt/snort/etc/snort.conf文件是否存在,如果不存在,脚本就终止执行。
第105到110行用来确定Snort的二进制文件可以正常执行。
第113行用来启动Snort.
第115到120行用来检测Snort启动是否正常。
第125行用来产生前面提到的告警,这些告警将被发送到广播地址。
第127到136行用来确定告警产生过程是否正常。
第140行用来检测alert文件中的最后18行已确定告警是否成功产生以及是否正常记录日志。
第142到147行的作用是如果第140行测试的结果失败,就显示一个错误信息。
第150行用来停止Snort。
第160行显示信息表示测试过程成功。
2.2.5 在非默认端口运行Snort
在Linux系统中,Snort启动的时候就开始监听网络eth0。但是很多人在有多个接口的机器上运行Snort。如果你想让Snort监听其它的接口,你要用到命令行选项-I。下面的命令可以启动Snort使其监听网络接口eth1。
snort -c /opt/snort/etc/snort.conf –i eth1
在自动和关闭Snort的情况下,你需要修改脚本/etc/init.d/snortd以使Snort启动的时候监听你所希望的端口。关于Snort的自动自动和关闭在下一部分解释。
2.2.6 Snort的自动启动和关闭
你可以配置Snort使其在系统启动和关闭的时候自动启动和关闭。在UNIX类的机器上,你可以用脚本来完成这项工作,在Linux中,可以在 /etc/init.d/目录下创建这样的脚本。启动脚本可以链接到/etc/rc3.d目录下,关闭脚本可以链接到/etc/rc2.d、 /etc/rc1.d和/etc/rc0.d目录下。Snort的RPM发布版中捆绑的/etc/init.d/snortd脚本文件大体如下所示:
[root@conformix]# cat /etc/init.d/snortd
#!/bin/sh
#
# snortd Start/Stop the snort IDS daemon.
#
# chkconfig: 2345 40 60
# description: snort is a lightweight network intrusion
# detection tool that
# currently detects more than 1100 host and network
# vulnerabilities, portscans, backdoors, and more.
#
# June 10, 2000 — Dave Wreski
# - initial version
#
# July 08, 2000 Dave Wreski
# - added snort user/group
# - support for 1.6.2
# July 31, 2000 Wim Vandersmissen
# - added chroot support
# Source function library.
. /etc/rc.d/init.d/functions
# Specify your network interface here
INTERFACE=eth0
# See how we were called.
case “$1″ in
start)
echo -n “Starting snort: ”
cd /var/log/snort
daemon /usr/sbin/snort -A fast -b -l /var/log/snort \
–d -D -i $INTERFACE -c /etc/snort/snort.conf
touch /var/lock/subsys/snort
echo
;;
stop)
echo -n “Stopping snort: ”
killproc snort
rm -f /var/lock/subsys/snort
echo
;;
restart)
$0 stop
$0 start
;;
status)
status snort
;;
*)
echo “Usage: $0 {start|stop|restart|status}”
exit 1
esac
exit 0
[root@conformix /root]#
要 注意的是,启动和关闭Snort都会用这同一个文件。在某一运行级别,链接文件名的第一个字符用来确定这个脚本是用来启动还是用来关闭Snort。启动链 接以S开头,如运行级别3中的启动文件/etc/rc3.d/S50snort,实际上它是链接到/etc/init.d/snortd文件的。与之类 似,用来关闭的脚本链接文件以K开头,例如/etc/rc2.d/K50snort,这样将在运行级别2关闭Snort。
同时,你也可以用脚本来手工启动和关闭Snort,下面的两个命令分别用来启动和关闭Snort:
/etc/init.d/snortd start
/etc/init.d/snortd stop
注意脚本在同运行级别目录中的链接可能会有不同的名称。脚本链接文件的名字依赖于在系统启动关闭过程中Snort所处的位置。如果你用RPM安装的Snort,那么这些链节将在安装RPM包的过程中被创建。
2.3 在多个网络接口上运行Snort
当Snort启动的时候,将在某个端口上监听网络通信。你可以用命令行选项-I 来指定你想监听的接口。如果你想同时监听多个网络接口,那么你需要同时运行多个Snort的副本。例如,下 面两个命令用来在Linux机器上监听eth0接口和eth1接口。
/opt/snort/bin/snort -c /opt/snort/etc/snort.conf -i eth0 -l /
var/log/snort0
/opt/snort/bin/snort -c /opt/snort/etc/snort.conf -i eth1 -l /
var/log/snort1
我们看到这两个命令用到了两个日志目录:/var/log/snort0和/var/log/snort1,因此这两个Snort进程将分别保存自己的日志。在你启动Snort的时候,这两个目录必须已经存在。
如果根据snort.conf文件的配置,Snort将日志记录到MySQL数据库中,那么日志将被记录到同一个数据库中。
你需要了解,你也可以给不同的Snort进程使用不同的配置文件,这样做的目的有很多个。主要原因是你的不同网络接口所连接的网络是不同的,另一个原因是你可以让一个接口的Snort将日志记录到数据库中,而另外一个记录到系统日志中。见图2-2:
2.4 Snort命令行选项
Snort有很多命令行选项,可以让你在启动Snort的时候根据情况选择。正如你在前面看到的,你可以在一个系统上运行多个Snort。你可以用命令“Snort -?”来显示命令行选项。最常用的一些命令行选项如表2-2所示。

选项 描述
-A 用来设置告警模式。告警模式用来设置告警数据的详细程度。可用的模式有fast,full,console和none。你在前面已经看到console模式是在屏幕上显示告警而不记录到文件。Fast模式在Snort运行在高速网络环境中能够用得到。
-b 这个选项用来将日志记录为tcpdump格式,这样记录日志的速度非常快,然后你可以用tcpdump程序来察看数据。
-c 这是最常用的选项,用来指定snort.conf文件的位置。如果你用这个选项指定,Snort就不会在默认位置找snort.conf文件。例如,如果 snort.conf文件在/etc目录中,你要用命令行选项”-c /etc/snort.conf”来启动Snort。
-D 这个选项用来使Snort在后台运行,在多数实用情况,会用到这个选项。在安装完测试的时候,不要用这个选项。
-i 这个选项用来指定Snort监听的网络接口。当你有多个网络接口并想监听其中一个的时候,这个选项使非常有用的。而且在你运行多个Snort来监听多个接 口的时候,也会用到这个选项。例如你只想监听eth1接口,那么在启动Snort的时候用“-i eth1”选项。
-l 这个选项用来指定Snort记录日志的目录,默认目录是/var/log/snort。例如,你想将所有的日志文件记录到/snort目录下,你应当用命令行选项“-l /snort”。
-M 为使用这个选项,你应当指定一个文本文件。这个文本文件中包含了一些你想发送信息的Windows主机的列表,每行只包括一个IP地址。注意你可以用snort.conf文件达到同样的目的,这将在后面解释。
-T 这个选项在你做测试和报告的时候是非常有用的。你可以用这个选项来找出配置文件中的错误。

除了表中列举的,还有一些不太常用的选项,这些选项将在后面的相关部分到论。一些命令行选项的功能也可以通过snort.conf来实现。

2.5 用源代码编译并安装Snort的步骤总结
由RPM包安装Snort是非常简单的,你只需要运行一个命令就可以了:“rpm -install ”。但正如已经看到的,如果你要用源代码来安装,就要多做很多工作了。下面是对源代码安装步骤的总结:
从http://www.snort.org下载源代码文件。
用“tar zxvf ”命令解包tar文件。
运行configure脚本,典型的命令如:“configure –prefix=/opt/snort –with-mysql –with-snmp –with-opnssl”
运行make命令。
运行“make install”。
创建目录/var/log/snort。
创建目录/opt/snort/etc。
创建目录/opt/snort/rules。
将snort.conf复制到/opt/snort/etc目录中。
将classifacation.config文件复制到/opt/snort/etc目录中。
将reference.config文件复制到/opt/snort/etc目录中。
将所有的rules文件复制到/opt/snort/rules目录中。
创建snortd脚本文件并复制到/etc/init.d目录中,并在/etc/rcx中创建链接。这里x是运行级别的数字。这样Snort可以在系统启动的时候运行。
如果你要用MySQL与Snort一起工作,那么在启动Snort前要启动MySQL。

2.6 Snort文件的位置
Snort文件分为下列类别:
n Snort的二进制文件,n 也就是可执行文件。
n Snort的主配置文件,n 通常是snort.conf。
n Snort的其它配置文件,n 如classification.config和reference.config。
n 规则文件。
n 日志文件。
如果你用RPM包安装Snort,它的二进制文件通常会安装在/usr/sbin目录下。如果是编译安装,安装目录有—prefix命令行选项指定。
如 果你用RPM包安装Snort,主配置文件snort.conf将被安装在/etc/snort目录中。当然,你可以将这个文件保存在任何一个目录中,因 为在启动Snort的时候你可以用命令行选项来指定。在本书的例子中,这个文件是存放在/opt/snort/etc目录下的。
其它配置文件如classification.config和reference.config通常存放在与snort.conf相同的目录中。在snort.conf文件中将指定这些文件的目录,你可以改变它。
规则文件在snort.conf中引用。如果你用RPM包安装Snort,那么rules文件也被安装在/etc/snort目录中。在本书的例子中,用源代码安装,这些文件被安装在/opt/snort/rules
目录中。通过修改snort.conf文件,你可以改变这些规则文件的位置。
Snort 日志文件的位置可以通过snort.conf文件指定或者用命令行选项指定。通常日志文件存放在/var/log/snort目录中。如果这个目录不存 在,你必须手工创建。如果Snort从不同的主机记录日志,它可以在/var/log/snort目录中为每个主机创建目录。
例如,你可以在snort.conf中的如下一行修改日志文件的默认路径到/snortlog:
config logdir: /snortlog
你也可以在启动Snort的时候用命令行选项-l来改变日志文件的目录。第三章中包括关于snort.conf文件的详细讨论。

2.7 Snort的操作模式
Snort有两种基本操作模式:包嗅探器模式和NIDS模式。Snort可以用作类似于tcpdump 和snoop的嗅探器。在嗅探器模式,Snort也可以将这些包的信息记录到日志文件中。这些文件随后可以用Snort或者tcpdump察看。在这种模 式中,Snort不会做任何入侵检测活动。这种模式的用处并非很大,因为现在有很多可以记录包的工具了。比如,随同Linux发行的tcpdump就是一 个效率很高的嗅探器。
如果你将Snort用在网络入侵检测(NIDS)模式,它会用规则来找出是否存在入侵活动。
2.7.1网络嗅探器模式
Snort在网络嗅探器模式下,与常用的tcpdump类似。它可以捕获网络中的包并以不同的详细程度将包的信息显示在终端上。在这种模式下运行Snort并不需要配置文件。下面的命令将显示网段中通行的每个包的信息:
[root@conformix snort]# /opt/snort/bin/snort -v
Initializing Output Plugins!
Log directory = /var/log/snort
Initializing Network Interface eth0
–== Initializing Snort ==–
Decoding Ethernet on interface eth0
–== Initialization Complete ==–
-*> Snort! <*-
Version 1.9.0 (Build 209)
By Martin Roesch (roesch@sourcefire.com, www.snort.org)
11/20-15:56:14.632067 192.168.1.100:2474 -> 192.168.1.2:22
TCP TTL:128 TOS:0×0 ID:4206 IpLen:20 DgmLen:40 DF
***A**** Seq: 0×9DAEEE9C Ack: 0xF5683C3A Win: 0×43E0 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-15:56:14.632188 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57042 IpLen:20 DgmLen:200 DF
***AP*** Seq: 0xF5683C8A Ack: 0×9DAEEE9C Win: 0×6330 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-15:56:14.632519 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57043 IpLen:20 DgmLen:120 DF
***AP*** Seq: 0xF5683D2A Ack: 0×9DAEEE9C Win: 0×6330 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-15:56:14.633891 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57044 IpLen:20 DgmLen:184 DF
***AP*** Seq: 0xF5683D7A Ack: 0×9DAEEE9C Win: 0×6330 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

Snort将不断地在屏幕上显示所捕获的包的信息直到你用Crtl-C终止Snort,这时它将显示统计信息。
现在让我们来分析Snort的嗅探器模式在屏幕上显示的信息。下面是一个捕获的典型的TCP包的输出信息。
11/20-15:56:14.633891 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57044 IpLen:20 DgmLen:184 DF
***AP*** Seq: 0xF5683D7A Ack: 0×9DAEEE9C Win: 0×6330 TcpLen: 20
如果分析这个输出信息,你可以得到以下关于这个包的信息:
这个包被捕获的时间和日期。
源IP地址是192.168.1.2
源端口是22。
目的地址是192.168.1.100
目的端口是2474
这个包的传输层协议是TCP。
IP头中的TTL值是64。
TOS值是0×10。
IP头的长度是20。
IP载荷是184个字节。
IP头部中的DF位已被设置(不要分片)。
两个TCP flag被设置成on。
TCP头的sequence number是0xF5683D7A。
TCP头的Ack number是0xDAEEE9C。
TCP的窗口字段值是0×6330。
TCP头部长度是20。
你可以用更多的命令行选项来显示更多关于所捕获的包的信息。下面的命令除了能够显示包的TCP、UDP、和ICMP信息以外,还能够显示一些应用层信息。注意,这个命令并不能显示包的所有信息。

[root@conformix snort]# /opt/snort/bin/snort -dv
Initializing Output Plugins!
Log directory = /var/log/snort
Initializing Network Interface eth0
–== Initializing Snort ==–
Decoding Ethernet on interface eth0
–== Initialization Complete ==–
-*> Snort! <*-
Version 1.9.0 (Build 209)
By Martin Roesch (roesch@sourcefire.com, www.snort.org)
11/20-16:18:11.129548 192.168.1.100:2474 -> 192.168.1.2:22
TCP TTL:128 TOS:0×0 ID:4387 IpLen:20 DgmLen:40 DF
***A**** Seq: 0×9DAEF2FC Ack: 0xF5688CDA Win: 0×4190 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:18:11.129723 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57171 IpLen:20 DgmLen:120 DF
***AP*** Seq: 0xF5688D2A Ack: 0×9DAEF2FC Win: 0×6330 TcpLen: 20
C5 1D 81 8F 70 B7 12 0B C1 1B 8F 6D A9 8F 1D 05 ….p……m….
40 7D F9 BD 84 21 11 59 05 01 E4 A1 01 20 AC 92 @}…!.Y….. ..
58 50 73 8D 17 EA E2 17 AD 3A AD 54 E2 50 80 CB XPs……:.T.P..
DA E1 40 30 7B 63 0D 79 5A D8 51 07 93 95 2B A8 ..@0{c.yZ.Q…+.
F8 D4 F5 FA 76 D6 27 35 E8 6E E2 ED 41 2B 01 2D ….v.’5.n..A+.-
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:18:11.130802 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57172 IpLen:20 DgmLen:120 DF
***AP*** Seq: 0xF5688D7A Ack: 0×9DAEF2FC Win: 0×6330 TcpLen: 20
E9 7C 09 E0 E0 5C 3E 17 1C BE 93 1F B0 DA 92 40 .|…\>……..@
D1 18 71 52 80 F3 B2 F7 59 CE F7 7C D4 8F FD B4 ..qR….Y..|….
98 08 A9 63 63 23 0D C8 9D A4 4F 68 87 06 0D 16 …cc#….Oh….
44 61 09 CD FF FE 8B 1A 5B D8 42 43 1D 1A 6F A8 Da……[.BC..o.
14 90 C6 63 4C EE 9D 64 1B 90 CC 3A FB BD 7E E4 …cL..d…:..~.
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:18:11.131701 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57173 IpLen:20 DgmLen:120 DF
***AP*** Seq: 0xF5688DCA Ack: 0×9DAEF2FC Win: 0×6330 TcpLen: 20
AF CE 60 CB 79 06 BB 3D 58 72 76 F2 51 0F C1 9A ..`.y..=Xrv.Q…
22 5A E3 27 49 F8 A5 00 1B 5A 4F 24 12 0F BF 70 “Z.’I….ZO$…p
B7 81 A0 0C F9 EB 83 D1 33 EB C1 5A 2A E6 2E 4B ……..3..Z*..K
F1 98 FB 5A A9 C7 C3 92 78 B1 35 FF F7 59 CF B3 …Z….x.5..Y..
83 D2 E7 FF 37 F8 34 56 CD 0F 61 62 A9 16 A4 9F ….7.4V..ab….
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:18:11.133935 192.168.1.100:2474 -> 192.168.1.2:22
TCP TTL:128 TOS:0×0 ID:4388 IpLen:20 DgmLen:40 DF
***A**** Seq: 0×9DAEF2FC Ack: 0xF5688D7A Win: 0×40F0 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:18:11.134057 192.168.1.2:22 -> 192.168.1.100:2474
TCP TTL:64 TOS:0×10 ID:57174 IpLen:20 DgmLen:280 DF
***AP*** Seq: 0xF5688E1A Ack: 0×9DAEF2FC Win: 0×6330 TcpLen: 20
A6 CF F9 B5 EA 24 E0 48 34 45 4B 57 5D FF CB B5 …..$.H4EKW]…
D6 C9 B3 26 3C 59 66 2C 55 EE C1 CF 09 AD 3A C2 …&74 B6 61 D3 C5 63 ED BD 6F 51 0D 5E 18 44 07 AF t.a..c..oQ.^.D..
86 D2 8A 3F 82 F0 D2 84 5C A6 7F CC D5 7B 90 56 …?….\….{.V
93 CF CF 4D DE 03 00 4D E4 4B AD 75 3E 03 71 DC …M…M.K.u>.q.
A6 3D 78 DA 01 BF F0 33 46 7D E1 53 B5 62 94 9A .=x….3F}.S.b..
29 46 56 78 B1 73 C0 3E BB C0 EC 5C 6E D0 E6 BE )FVx.s.>…\n…
F9 5C 02 90 40 B1 BA 07 F1 96 2F A0 0F 9D E1 3E .\..@…../….>
8C 3C 40 07 B2 21 28 CA 2D 41 AC 5C 77 C6 D0 3F .<@..!(.-A.\w..?
73 0B 15 32 47 B5 CE E3 FB 83 B3 72 1A B4 64 9F s..2G……r..d.
6D C7 55 B8 6B DB FC AF 94 8F F3 58 B0 79 CF 14 m.U.k……X.y..
3F 9A FC 32 1D B6 21 B0 4D C3 64 82 C0 62 A8 8C ?..2..!.M.d..b..
80 C7 4A C8 BA D9 C3 0D 74 86 76 B8 49 8A 94 D1 ..J…..t.v.I…
4C F3 BF AF 55 3B 57 2B EA C7 48 B7 A4 BD B2 20 L…U;W+..H….
4A 66 B4 4E F3 2A 7E B6 F8 63 A8 61 42 F3 85 3B Jf.N.*~..c.aB..;
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
你可以用下面的命令来显示包的所有信息。.
这个命令可以同时以ASCII方式和二进制方式显示包的信息。
[root@conformix snort]# /opt/snort/bin/snort -dev
Initializing Output Plugins!
Log directory = /var/log/snort
Initializing Network Interface eth0
–== Initializing Snort ==–
Decoding Ethernet on interface eth0
–== Initialization Complete ==–
-*> Snort! <*-
Version 1.9.0 (Build 209)
By Martin Roesch (roesch@sourcefire.com, www.snort.org)
05/27-12:11:10.063820 0:D0:59:6C:9:8B -> FF:FF:FF:FF:FF:FF type:0×800
len:0xFC
192.168.1.100:138 -> 192.168.1.255:138 UDP TTL:128 TOS:0×0 ID:48572
IpLen:20 DgmLen:238
Len: 218
11 0E 82 D5 C0 A8 01 64 00 8A 00 C4 00 00 20 46 …….d…… F
43 46 43 43 4E 45 4D 45 42 46 41 46 45 45 50 46 CFCCNEMEBFAFEEPF
41 43 41 43 41 43 41 43 41 43 41 43 41 41 41 00 ACACACACACACAAA.
20 41 42 41 43 46 50 46 50 45 4E 46 44 45 43 46 ABACFPFPENFDECF
43 45 50 46 48 46 44 45 46 46 50 46 50 41 43 41 CEPFHFDEFFPFPACA
42 00 FF 53 4D 42 25 00 00 00 00 00 00 00 00 00 B..SMB%………
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …………….
00 00 11 00 00 2A 00 00 00 00 00 00 00 00 00 E8 …..*……….
03 00 00 00 00 00 00 00 00 2A 00 56 00 03 00 01 ………*.V….
00 01 00 02 00 3B 00 5C 4D 41 49 4C 53 4C 4F 54 …..;.\MAILSLOT
5C 42 52 4F 57 53 45 00 0C 00 A0 BB 0D 00 42 41 \BROWSE…….BA
54 54 4C 45 43 4F 57 53 00 00 00 00 01 00 03 0A TTLECOWS……..
00 10 00 80 D4 FE 50 03 52 52 2D 4C 41 50 54 4F ……P.RR-LAPTO
50 00 P.
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:20:38.459702 0:D0:59:6C:9:8B -> 0:50:BA:5E:EC:25 type:0×800
len:0×3C
192.168.1.100:2474 -> 192.168.1.2:22 TCP TTL:128 TOS:0×0 ID:4506
IpLen:20 DgmLen:40 DF
***A**** Seq: 0×9DAEFD9C Ack: 0xF568E2FA Win: 0×3F20 TcpLen: 20
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
11/20-16:20:38.460728 0:50:BA:5E:EC:25 -> 0:D0:59:6C:9:8B type:0×800
len:0×86
192.168.1.2:22 -> 192.168.1.100:2474 TCP TTL:64 TOS:0×10 ID:57303
IpLen:20 DgmLen:120 DF
***AP*** Seq: 0xF568E34A Ack: 0×9DAEFD9C Win: 0×6BD0 TcpLen: 20
F9 7B 4B 96 3F C8 0A BC DF 9E EE 4F DA 27 6F B4 .{K.?……O.’o.
92 BD A7 C5 1D E4 35 AB DB BF 7B 56 B9 F8 BA A1 ……5…{V….
86 BB FE 6E FD 41 55 FF D0 51 04 AF 73 80 13 29 …n.AU..Q..s..)
D7 62 67 A4 B5 0C 5F 32 30 36 81 C2 9C 31 53 AD .bg…_206…1S.
3A 65 46 EE F1 52 59 ED 57 C7 6A 85 88 5A 3E D8 :eF..RY.W.j..Z>.
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

2.7.1.1用文本格式记录Snort数据
你可以在命令行用-l 将Snort数据纪录为文本模式。下面的命令会将所有的Snort数据记录到/var/log/snort目录下同时显示在终端。
snort –dev –l /var/log/snort
然后你会发现/var/log/snort目录下面出现一些子目录,每个对应一个主机,其中包含一些文件。子目录的名称通常与主机的IP地址相同。其中的 文件是于不同的连接和不同类型的网络数据。例如,包含以TCP打头的TCP数据,如文件名:2489-23。一个包含ICMP数据的文件如: ICMP_ECHO。当你运行Snort嗅探器的时候,日志中的内容与显示器上显示的是相同的。
2.7.1.2 以二进制格式记录Snort数据
在一个高速网络环境中,将许多文件记录成ASCII格式会导致过高的开销。Snort允许你将数据记录为tcpdump格式的二进制文件以供随后察看。这时,Snort将所有的数据记录成二进制的raw格式。典型的命令如下:
snort –l /tmp –b
Snort将会在/tmp目录下创建文件,典型的文件名类似于:snort.log.1037840339。文件名的最后一部分依赖于你的系统时钟。每次你在这种模式下运行Snort,在日志目录就会有一个新文件产生。有时把这种记录模式称为quick模式。
你可以用Snort查看raw格式的二进制文件,用命令行开关-r来指定文件名。下面的命令将显示snort.log.1037840339中所部获得数据。
snort -dev -r /tmp/snort.log.1037840339| more
这个命令的输出与你在控制台上实时看到的是相同的。你可以用不同的命令行开关来以不同的详细程度来显示这些数据。
你也可以用命令显示特定类型的数据。下面的命令会显示日志文件中的所有TCP数据。
snort -dev -r / tmp/snort.log.1037840339 tcp
显示ICMP数据和UDP数据与之类似。
你也可以用tcpdump来读取Snort产生的二进制数据。下面的命令将读取并显示Snort捕获的数据:
[root@conformix snort]# tcpdump -r /tmp/snort.log.1037840514
20:01:54.984286 192.168.1.100.2474 > 192.168.1.2.ssh: . ack 4119588794
win 16960 (DF)
20:01:54.984407 192.168.1.2.ssh > 192.168.1.100.2474: P 81:161(80) ack
0 win 32016 (DF) [tos 0×10]
20:01:54.985428 192.168.1.2.ssh > 192.168.1.100.2474: P 161:241(80) ack
0 win 32016 (DF) [tos 0×10]
20:01:54.986325 192.168.1.2.ssh > 192.168.1.100.2474: P 241:321(80) ack
0 win 32016 (DF) [tos 0×10]
20:01:54.988508 192.168.1.100.2474 > 192.168.1.2.ssh: . ack 161 win
16800 (DF)
20:01:54.988627 192.168.1.2.ssh > 192.168.1.100.2474: P 321:465(144)
ack 0 win 32016 (DF) [tos 0×10]
20:01:54.990771 192.168.1.100.2474 > 192.168.1.2.ssh: . ack 321 win
16640 (DF)
20:01:55.117890 192.168.1.100.2474 > 192.168.1.2.ssh: . ack 465 win
16496 (DF)
20:01:55.746665 192.168.1.1.1901 > 239.255.255.250.1900: udp 269
20:01:55.749466 192.168.1.1.1901 > 239.255.255.250.1900: udp 325
20:01:55.751968 192.168.1.1.1901 > 239.255.255.250.1900: udp 253
20:01:55.754145 192.168.1.1.1901 > 239.255.255.250.1900: udp 245
20:01:55.756781 192.168.1.1.1901 > 239.255.255.250.1900: udp 289
20:01:55.759258 192.168.1.1.1901 > 239.255.255.250.1900: udp 265
20:01:55.761763 192.168.1.1.1901 > 239.255.255.250.1900: udp 319
20:01:55.764365 192.168.1.1.1901 > 239.255.255.250.1900: udp 317
20:01:55.767103 192.168.1.1.1901 > 239.255.255.250.1900: udp 321
20:01:55.769557 192.168.1.1.1901 > 239.255.255.250.1900: udp 313
20:01:56.336697 192.168.1.100.2474 > 192.168.1.2.ssh: P 0:80(80) ack
465 win 16496 (DF)
[root@conformix snort]#
你可以用tcpdump的不同命令行选项来控制显示。用“man tcpdump”命令或者查看附录A获取更多tcpdump的信息。

2.7.2 网络入侵监测模式
在入侵检测模式下,Snort并不记录所有捕获的包,而是将包与规则比对,仅当包与某个规则匹配的时 候,才会记录日志或产生告警。如果包并不于任何一个规则匹配,那么它将被悄悄的丢弃,并不做任何纪录。你在运行Snort的入侵监测模式的时候,通常会在 命令行指定一个配置文件,这个文件包含一些规则和对其他包含规则的文件的引用,除此之外,还有一些关于输入和输出插件的信息,这些将在第4章讨论。配置文 件的名通常是snort.conf,在前面的安装过程中我们已经将配置文件snort.conf和其他一些文件保存在/opt/snort/etc目录下 了。下面的命令将用来启动Snort的网络入侵检测(NID)模式:
snort -c /opt/snort/etc/snort.conf
当你启动这个命令后,Snort将读取配置文件/opt/snort/etc/snort.conf以及被其引用的所有规则文件。通常这些文件包含 Snort规则和配置数据。读取这些数据后,Snort将建立内部数据结构和规则链。所有被捕获的数据将于这些规则比对,并根据规则的要求做出相应的动 作。如果你修改snort.conf文件,或者引用另外的文件,你必须重启Snort使其生效。
在IDS模式,还有一些其它的命令行选项与开关 可用。例如,你可以将日志记录到文件,也可以用命令显示。如果将Snort用作长期监测,那么日志越多,你需要的磁盘空间就越大,将日志显示在终端上也会 消耗一些主机的处理能力,因此,在何处运行Snort也是需要考虑的。下面的命令将使Snort工作在IDS模式,并同时作为嗅探器将日志记录到 /var/log/snort目录下。
snort -dev -l /var/log/snort -c /etc/snort/snort.conf
但在很多实际应用情况下,你会使用命令行开关-D使Snort以守护进程的方式运行,而不再终端上纪录。
通常的情况,你会希望将Snort日志数据记录到数据库,我们将在第5章讨论将Snort日志信息记录到MySQL数据库的情况。

2.8 Snort的告警模式
当Snort运行在NID模式下,如果捕获的包与规则匹配,Snort可以以多种模式产生告警。这些模 式可以通过snort.conf来配置,也可以用命令行配置。这一部分将介绍常用的告警模式。为方便介绍,我会用一个在Snort检测到TTL值为100 的ICMP包时会产生告警的规则,如下:
alert icmp any any -> any any (msg: “Ping with TTL=100″; \
ttl:100;)
规则将在下一章详细讨论,对本次讨论来说,你只要知道这个规则将在遇到TTL为100的ICMP包的时候产生一个包含“Ping with TTL=100”文字信息的告警就可以了。这个规则并不关心包中的源地址或目的地址。我在我的Windows机器上用下面的命令来发送一个TTL=100 的ICMP echo包。
C:\rrehman>ping -n 1 -i 100 192.168.1.3
Pinging 192.168.1.3 with 32 bytes of data:
Reply from 192.168.1.3: bytes=32 time=3ms TTL=255
Ping statistics for 192.168.1.3:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 3ms, Maximum = 3ms, Average = 3ms
C:\rrehman>
命令行选项“-n 1”用来指定仅仅发送一个ICMP包。“-i 100”用来使ICMP包中的TTL值等于100。可以在ftp://ftp.isi.edu/in-notes/rfc792/rfc792.txt或者本书的附录C参考关于ICMP包头部格式的详细信息。
当运行上面的命令的时候,Snort将捕获到这个数据包并产生一个告警。告警所纪录的信息的多少将依赖于特定的告警模式。下面我们来看在对一个包纪录的时候不同的告警模式的差异:
2.8.1 Fase模式
Fast高静默使将记录以下告警信息:
时间戳
告警消息(通过规则配置)
源地址和目的地址
源端口和目的端口
应当用命令行选项“-A fast”来配置fase告警模式,这种告警模式的系统开销比较小。下面的命令用fast告警模式启动Snort:
/opt/snort/bin/snort -c /opt/snort/etc/snort.conf -q -A fast
选项-q用来停止在屏幕显示初始化信息和最后的汇总统计。现在,如果产生一个告警,它将被记录到/var/log/snort/alert文件中,当然,你可以用命令行选项-l来改变它的位置。告警信息类似如下所示:
05/28-22:16:25.126150 [**] [1:0:0] Ping with TTL=100 [**]
{ICMP} 192.168.1.100 -> 192.168.1.3
这个告警包含下面的信息:
告警产生的日期和时间。
表示在规则中的告警消息,在这个例子中,这个消息就是:“Ping with TTL=100”.
源地址是192.168.1.100。
目的地址是192.168.1.3
包的类型,在上面的例子中,包的类型是ICMP。
2.8.2 Full模式
这是默认的告警模式,除了输出告警信息之外,还有包的头部信息。我们可以用下面的命令使Snort具有full告警模式。
/opt/snort/bin/snort -c /opt/snort/etc/snort.conf -q -A full
当Snort工作在这种告警模式下的时候,在/var/log/snort/alert中记录的信息类似于如下:
[**] [1:0:0] Ping with TTL=100 [**]
05/28-22:14:37.766150 192.168.1.100 -> 192.168.1.3
ICMP TTL:100 TOS:0×0 ID:40172 IpLen:20 DgmLen:60
Type:8 Code:0 ID:768 Seq:20224 ECHO
正如你看到的,日志中记录了附加的信息,这些信息显示包头中的不同的值,包括:
IP包头部的TTL值。在ftp://ftp.isi.edu/in-notes/rfc791.txt参考RFC791获取关于TTL的详细信息
IP包头部的TOS值,参考RFC791或本书附录A获取TOS的详细信息。
IP头长度,显示为:IpLen:20。
IP包总长,显示为:DgmLen:60。
ICMP类型段,参考RFC792获取ICMP类型段的详细信息。
ICMP代码段,参考RFC792获取ICMP代码段的详细信息。
IP包的ID。
序列号。
ICMP包的类型:ECHO。
2.8.3 UNIX套接字模式
你可以用命令行选项“-a unsock”使Snort将通过UNIX套接字将告警发送到其他的程序。如果你想进一步处理Snort告警,这将非常有用。你可以用“man socket”命令来查看套接字的更多信息。
2.8.4无告警模式
你可以用命令行选项“-A none”将Snort告警完全关闭。这在高速网络环境应用统一日志的情况下是非常有用的。你可以在用统一日志的时候关闭普通日志选项。统一日志输出插件将在第4章中讨论。
2.8.5 将告警发送到Syslog
下 面的命令允许Snort将告警发送到Syslog守护进程。Syslog是产生系统事件日志的守护进程,它将读取配置文件 /etc/syslog.conf取得记录日志文件的位置,这个位置通常是/var/log目录,在Linux系统中,主日志文件是 /var/log/messages。用“man syslog”命令来获得更多的信息,这个命令会显示syslog.conf文件的格式信息。
根据/etc/syslog.conf文件中的配置,告警奖杯记录到一个特定文件中。下面的命令可以使Snort将日志记录到Syslog守护进程:
/opt/snort/bin/snort -c /opt/snort/etc/snort.conf -s
在我的RedHat 7.1计算机上,使用的是默认配置,信息会被记录到/var/log/messages文件中。当你用TTL=100的ICMP产生告警时,/var/log/messages文件中将记录下面的信息:
May 28 22:21:02 snort snort[1750]: [1:0:0] Ping with TTL=100
{ICMP} 192.168.1.100 -> 192.168.1.3
本书的第4章将讨论使用Syslog工具,同时,你将了解如何用输出插件记录日志到Syslog。

2.8.6 向SNMP发送告警
Snort的一个非常有用的特性是SNMP trap。你可以配置一个输出插件,可以将信息以SNMP trap的形式发送到网络管理系统。通过这个特性,你可以将你的入侵检测探测器整合到类似于HP OpenView,OpenNMS,MRTG等集中的网管系统中。Snort配置SNMP trap的配置过程将在后面详细讨论。
2.8.7向Windows发送告警
Snort 可以以弹出窗口的形式向Windows及其发出告警,在windows中,弹出窗口由Windows信使服务控制。为使弹出窗口工作,Windows必须 要运行信使服务。你可以到控制面板的服务程序来看Window信使服务是否在运行。服务选项在你的管理工具菜单中,根据你的Windows版本的不同,也 可能在控制面板或其他的位置。
在你的Unix机器上,必须要安装SAMBA客户端软件包。SAMBA是在UNIX下可以与Windows共享文件和打印机的开放源码软件包。它也可以与其它运行CIFS和SMB协议的操作系统共同工作。你可以在http://www.samba.org取得关于SAMBA的更多信息。
Snort 告警机制利用UNIX的smb客户端程序来连接Windows信息并发送告警。当你使用这项服务之前,先确定SAMBA客户端是否正常工作。在 RedHat系统中,SAMBA的操作依赖于配置文件/etc/samba/smb.conf,在其他的Unix系统中,这个文件也许会在不同的位置。尽 管SAMBA的详细讨论已经超过了本书涉及的范围,还是在下面列举一个SAMBA配置的样本文件。这个文件可以用来配置smb使之生效,它创建一个可以在 Windows机器上看到的REHMAN工作组。
2.8.7.1 Samba配置文件样本
/etc/smba/smb.conf的样本文件如下:
[global]
workgroup = REHMAN
server string = REHMAN file server
log file = /var/log/samba/log.%m
max log size = 50
security = user
encrypt passwords = yes
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
dns proxy = no
domain logons = no
unix password sync = no
map to guest = never
password level = 0
null passwords = no
os level = 0
preferred master = yes
domain master = yes
wins support = yes
dead time = 0
debug level = 0
load printers = yes
[homes]
comment = Home Directories
browseable = yes
writable = yes
available = yes
public = yes
only user = no
[htmldir]
comment = html stuff
path = /home/httpd/html
public = yes
writable = yes
printable = no
write list = rehman
[virtualhosting]
comment = html stuff
path = /usr/virt_web
public = yes
writable = yes
printable = no
write list = rehman
[printers]
[netlogon]
available = no
关于SMB告警的更多信息将在后面的章节中出现。注意,如果你想用这个功能,你应该在编译Snort的时候用—with-sabalerts的选项,否则Snort就不能用SAMBA服务来工作。

2.9 在隐秘模式下运行Snort
在某些情况下,你会希望在隐秘模式下运行Snort,这样其他的主机不会探测到Snort机器的 存在,换句话说,Snort对于入侵者或其他人是不可见的。有多种方法可以使Snort在隐秘模式下运行。其中之一是在没有配置IP地址的接口上运行 Snort,这适合于下列两种情况:
只有一个网络适配器的独立Snort探测器。
一个安装了两个网络适配器的Snort探测器:一个用来在孤立的网络上用来访问探测器,另外一个连接到公众网络并在隐秘模式运行Snort。这种方法如图2-3所示:网络接口eth1连接到孤立的私有网络,eth0连接到公众网络。
当你想访问探测器的时候,要通过具有IP地址的网络接口eth1。图中所示的管理工作站可以用来连接到探测器,以收集数据,或将信息纪录到运行在本机或其他连接到本机的数据库服务器的中央数据库。
连接到Internet的网络接口eth0上没有配置IP地址,它运行在隐秘模式下,但是仍然可以监听此段网络的数据流。
在eth0上运行Snort之前,你必须将它激活,在Linux系统中,你可以用下面的命令来实现:
ifconfig eth0 up
这个命令可以使接口在没有IP地址的情况下可用,然后,你可以用“-i eth0”的命令行选项在这个接口启动Snort:
snort -c /opt/snort/etc/snort.conf -i eth0 -D

 from site : http://daxigua.com/?p=627