Snort 使用手册,第 1 部分: 安装与配置
保护和分析 Web 站点及其流量
Web 站点是 Internet 技术中最脆弱也最易受攻击的部分。尝试接触 Snort,它是一款免费、开源的网络入侵防御系统(Network Intrusion Prevention System,NIPS)和网络入侵检测系统(Network Intrusion Detection System,NIDS)工具,用于管理和防御黑客入侵您的 Web 站点、应用程序和支持 Internet 的程序。了解 Snort 能够如何帮助保护您的站点,分析您的网络的真实情况。学习本文之后,您将懂得利用 Snort 提供的某些高级入侵检测,并根据 Snort 提供的信息来优化您的站点和网络。
0评论:
Brett McLaughlin, 作家兼编辑, O'Reilly Media Inc.
2007 年 6 月 24 日
- 内容
在 IBM Bluemix 云平台上开发并部署您的下一个应用。
现在就开始免费试用
安全性是重中之重
假设您已经付出了几个月乃至几年的时间来学习最热门的 Web 技术。您阅读了 developerWorks 的文章,购买了相关图书,在您的 Mac OS X 终端和 Windows® shell 上进行了试验。您已经设法构建了一个非常出色的约有 100 个页面的 Web 应用程序 ——— 有一部分是静态 HTML,还有一部分由 PHP 脚本生成。您已经开始添加某些 Ajax 技术和特效,使您的站点更具交互性,更具响应能力。您正处于 Web 编程世界的巅峰。
然而某一天早上醒来之后,您突然发现站点上全是某个与您毫无相关的站点的全页横幅广告。此外,您的购物车也慢得跟蜗牛一样,因为数千个无用数据包正在冲击您的 Web 站点,这也使客户烦恼和愤怒。
尽管听起来很有戏剧性,但大多数认真的 Web 开发人都知道有些人已经遇到过类似的场景,或者自己亲身经历过这样的场景。无论您的站点或应用程序有多出色,只要未得到周全的保护,即便是相当成功的,也会成为攻击的目标。无论是十二岁的顽童,还是作为商业间谍的专业黑客,Web 站点都是非常脆弱的,比其他类型的应用程序更容易受到攻击。只要每个月支付 20 美元(或者掌握一点接线技巧),任何人都可以随意访问 Internet。您的任务是保护站点,而不仅仅是开发站点。
developerWorks Ajax 资源中心
请访问 Ajax 资源中心,这是有关开发 Ajax 应用程序所需的免费工具、代码和信息的一站式中心。由 Ajax 专家 Jack Herrington 主持的 活跃 Ajax 社区论坛 也许可以帮助您解答疑问。
安全性不是他人的责任
现在,您可能在受挫地摇着头,想着:“在办公大厅另一端那个人” 负责处理安全性。您可能认为,处理安全性是那个人 的责任。尽管从理论上来说,这是正确的。但从实践角度来看,则并非如此。如果您未执行基本的入侵检测(以及防御)就将站点托付给他人,那么站点出现问题的话,就可能造成很大损失。
并非所有开发人员都是安全专家,但所有开发人员都应该 了解足够多的知识,执行某些基本的网络和流量分析,并在其应用程序内构建基本的安全性。在最糟糕的情况下,开发人员也应该把所需要的安全性告诉安全技术人员,从而确保其站点受到了保护。毫无疑问,由于您是 开发人员,安全性也就是您的 工作的一部分。
基本安全性并不困难
掌握 OSI 网络模型、了解 TCP/IP 的所有方面、每天钻研两次信息包,这些任务都困难得令人沮丧,但掌握入侵检测和防御(稍后我将更详细地定义这些术语)的基础知识并不困难。通过这篇文章以及不久之后即将推出的第二部分,您将成为一名合格的安全性管理者,能够运用安全性的语言,能够发现应用程序中正在发生什么,而无需排队等候 IS 或 IT 处理。
因此,请关闭您喜爱的 IDE(至少将其最小化),启动终端或 shell,花几个小时钻研安全性。您不会后悔的,这将使您的应用程序和为这些应用程序付钱的客户更加顺利。
回页首
Snort:一种入侵检测工具
对于大多数系统和网络管理员来说,Snort 是一种常见的、熟悉的工具。遗憾的是,Web 程序员并不这样认为。如果提到 Snort,他们就将它与traceroute
和 ipconfig
等技术混同起来,认为那不是 Web 开发人员应该管的。
然而,Snort 绝不仅仅是一种管理员的工具。它是一种入侵检测系统 —— 而不仅仅是工具。尽管主要通过命令行使用,但 Web 程序员以及管理员也可轻松访问它。它是开源的,也就是说,它是免费的,与大多数开源工具不同,它得到了非常完善的维护。有着全面的文档(包括在线形式和图书形式,请参见 参考资料 中提供的链接),在您阅读本文(或许是本系列的下一期)时,您将与众多网络和安全性管理员一样熟悉 Snort。
那么究竟什么是入侵检测系统?
今天开放网络的数量达到历史高峰。内部网依然很常见,但可通过其他方式公开访问的站点中受保护的部分更加常见。对于企业黑客来说,要做的工作并不是很复杂。他们不必再去尝试潜入网络并找到毫不了解的域或网络,只需进入自己了解的某个网络的一部分即可。
入侵检测将识别对网络的非常规访问;这种访问与以不当的方式访问 Web 页面一样简单(或许是受保护的管理表单或 shell 对 Web 站点的整个根目录的访问)。另一方面,入侵可能非常复杂,例如更改 DNS 表,使得对一个站点的请求权不重定向到其他由黑客控制的域中,或使用一个更加随意的文件来替代 Apache Web 服务器上的 .htaccess 文件,允许黑客添加、删除和更改用户信息 —— 包括密码在内。
当然,检测部分的核心就是识别并防止这种情况发生。因此,谈论入侵检测的工具或系统时,内容涉及到来自 Cisco 的高端专业防火墙和简单的 Snort 安装等等。并非有很多组织能够为高端硬件投入大量资金,因此像 Snort 这样的开源应用程序非常适合实施基本的入侵检测,而带来的费用和麻烦较少。
您确信这是我的问题?
确实,入侵检测和 Snort 的使用都超越了 Web 站点本身,延伸为更广泛的网络安全问题。作为 Web 开发人员,没有必要成为 Snort 专家,也没有必要将 20% 的 Web 开发时间投入到入侵检测的工作之中。出色的面向开发人员的入侵检测旨在通过最少的时间获得最大的收益。即每次修订 Web 站点时都花点时间,为您的站点防止大多数攻击。
回页首
获得 Snort
现在,您已经获得了 Snort?首先使用 Web 浏览器访问 Snort 的 Web 站点(参见 参考资料)。左侧有一个很显眼的 “GET SNORT” 链接,就在那只大鼻子猪的下方。(严格来说,Snort 的徽标就是一头大鼻子粉红色小猪,似乎在喷鼻息)。在本文撰写之时,最新的可付诸生产的版本是 2.8。本文的所有内容都同样适用于 Snort 的 2.x 版本,只需进行少许调整,甚至完全不需要调整。
如果您使用的是 Linux® 或 Windows,可以下载二进制文件。单击生产文件列表下的 “Click to view binaries >>” 链接即可下载这些文件。
- 如果您使用的是 Windows,首先单击二进制文件的链接,随后单击 win32/ 链接。您将看到一个 .exe 文件,名为 Snort_2_8_0_2_installer.exe,单击即可开始下载 Snort。
- 对于 Linux,选择二进制文件链接,然后单击 linux/。您可以在几个 RPM 中做出选择,有些 RPM 带有对 MySQL 和 PostreSQL 的预置支持。选择所需 RPM,这样就准备完毕了。
如果您希望专研得深入一些,或者如果您使用的不是 Windows、Linux 系统(如 Mac OS X),则应从主下载链接中选择下载 GZipped TAR 文件,其名称类似于 snort-2.8.0.2.tar.gz(如果在本文撰写发表之后,发布的版本出现变化,具体文件名可能会略有不同)。此文件是 Snort 的源代码,您可以通过此源代码为您的特定平台进行生成。
回页首
通过源代码安装 Snort
有三种基本安装类型:
- 在 UNIX® 类型的平台上(UNIX、Linux、Mac OS X、Cygwin)通过源代码安装
- 在 Linux 上通过 RPM 安装
- 通过 Windows .exe 安装程序进行安装
如果您正在使用 UNIX 类型的平台,则可通过源代码生成 Snort。这是最灵活的一种选项,能够确保专为您的系统生成 Snort。这种方法要稍微多花一些功夫,也有一些命令行或终端体验,您很有可能能够顺利完成安装。
Snort 需要一些二进制文件,尤其是通过源代码安装时。因此,在开始处理 Snort 包本身之前,应准备好这些二进制文件。
Windows 用户,继续使用二进制文件
通过源代码安装 Snort 并不困难,它非常适合命令行环境,但需要使用 C 编译器和众多二进制文件。即便您已经在自己的 Windows 计算机上安装了 Cygwin,使用 GUI 安装程式来使 Snort 准备好正常运行也是非常简单的。如果您要访问 Mac OS X 或 Linux 计算机,那么就应该选择通过源代码进行安装,但若您正在保护一个 Windows 组件(假设是 Internet Information Server),那么就不要引入不必要的麻烦。
在 Mac OS X 上安装 C 编译器
要通过源代码安装 Snort,您需要使用 C 编译器。大多数 Linux 和 UNIX 平台都提供了一个 C 编译器,名为 gcc
,因此无需进行额外的处理。对于 Mac OS X 用户,gcc
编译器在默认情况下不会安装。
要获得用于 Mac OS X 的 gcc
,请访问 Apple Developer Connection(参见 参考资料),登录并选择 Downloads。您将在页面右侧看到许多分类。选择 Developer Tools,然后查找 Xcode,下载用于 Tiger 或 Mac OS X 的更早期版本(即 10.4.x 或更早的版本)的 Xcode 2.5 的磁盘镜像;如果您目前使用的是 Leopard(10.5.x 或更新版本),请选择 Xcode 3.0。要下载的文件都很大,绝不仅仅是一个 C 编译器,因此请耐心等待下载完成。
最后,打开磁盘镜像,浏览 Installer 文件夹。运行安装程序,按提示完成各个步骤即可。为了确定您已经成功安装了 gcc
,运行命令 gcc
即可:
[bdm0509:~/Desktop] gcc powerpc-apple-darwin8-gcc-4.0.1: no input files
这是一个错误(您并未给 gcc
提供任何需要编译的内容),但它指出了您的系统应该安装编译器。在 UNIX、Linux、Solaris 或 Cygwin on Windows 上也会获得类似的响应。
添加 PCRE 支持
Snort 需要 Perl Compatible Regular Expressions,也就是 PCRE。您可以在线免费下载该库(参见 参考资料 部分),它可用于多种平台。将 .tar.gz 文件解压缩到一个目录中,切换到此目录:
[bdm0509:~/Desktop] tar xzf pcre-7.6.tar.gz [bdm0509:~/Desktop] cd pcre-7.6
现在,通过 configure
脚本配置此安装(稍后对 Snort 也要进行相同的处理)。结果如清单 1 所示。
清单 1. 为安装配置 PCRE 包
[bdm0509:~/Desktop/pcre-7.6] ./configure checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... ./install-sh -c -d checking for gawk... no checking for mawk... no checking for nawk... no ... Lots more output here... ... config.status: executing script-chmod commands config.status: executing delete-old-chartables commands pcre-7.6 configuration summary: Install prefix .................. : /usr/local C preprocessor .................. : gcc -E C compiler ...................... : gcc C++ preprocessor ................ : g++ -E C++ compiler .................... : g++ Linker .......................... : /usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld C preprocessor flags ............ : C compiler flags ................ : -O2 C++ compiler flags .............. : -O2 Linker flags .................... : Extra libraries ................. : Build C++ library ............... : yes Enable UTF-8 support ............ : no Unicode properties .............. : no Newline char/sequence ........... : lf \R matches only ANYCRLF ......... : no EBCDIC coding ................... : no Rebuild char tables ............. : no Use stack recursion ............. : yes POSIX mem threshold ............. : 10 Internal link size .............. : 2 Match limit ..................... : 10000000 Match limit recursion ........... : MATCH_LIMIT Build shared libs ............... : yes Build static libs ............... : yes Link pcregrep with libz ......... : no Link pcregrep with libbz2 ....... : no Link pcretest with libreadline .. : no
接下来您只需要完成用于生成和编译代码的程序,然后将其安装到系统恰当的位置上即可。大多数程序、工具和实用工具(包括 PCRE 和 Snort)都允许您通过一个命令完成所有这些步骤:make install
。但在执行这条命令之前,您应作为 root 用户登录或使用 sudo
命令。Snort 和 PCRE 等大多数软件包都需要写入受保护的目录,而普通用户通常无法访问这样的目录。使用 root 用户的权限或 sudo
命令就能顺利完成。您应看到如清单 2 所示的结果。
清单 2. 安装 PCRE(使用 sudo)
[bdm0509:~/Desktop/pcre-7.6] sudo make install Password: test -z "/usr/local/lib" || ./install-sh -c -d "/usr/local/lib" /bin/sh ./libtool --mode=install /usr/bin/install -c 'libpcre.la' '/usr/local/lib/libpcre.la' /usr/bin/install -c &.libs/libpcre.0.0.1.dylib /usr/local/lib/libpcre.0.0.1.dylib (cd /usr/local/lib && { ln -s -f libpcre.0.0.1.dylib libpcre.0.dylib || { rm -f libpcre.0.dylib && ln -s libpcre.0.0.1.dylib libpcre.0.dylib; }; }) (cd /usr/local/lib && { ln -s -f libpcre.0.0.1.dylib libpcre.dylib || { rm -f libpcre.dylib && ln -s libpcre.0.0.1.dylib libpcre.dylib; }; }) /usr/bin/install -c .libs/libpcre.lai /usr/local/lib/libpcre.la /usr/bin/install -c .libs/libpcre.a /usr/local/lib/libpcre.a chmod 644 /usr/local/lib/libpcre.a ranlib /usr/local/lib/libpcre.a ---------------------------------------------------------------------- Libraries have been installed in: /usr/local/lib ... Lots more output here... ... test -z "/usr/local/include" || ./install-sh -c -d "/usr/local/include" /usr/bin/install -c -m 644 'pcre.h' '/usr/local/include/pcre.h' /usr/bin/install -c -m 644 'pcrecpparg.h' '/usr/local/include/pcrecpparg.h' /usr/bin/install -c -m 644 'pcre_stringpiece.h' '/usr/local/include/pcre_stringpiece.h' test -z "/usr/local/lib/pkgconfig" || ./install-sh -c -d "/usr/local/lib/pkgconfig" /usr/bin/install -c -m 644 'libpcre.pc' '/usr/local/lib/pkgconfig/libpcre.pc' /usr/bin/install -c -m 644 'libpcrecpp.pc' '/usr/local/lib/pkgconfig/libpcrecpp.pc'
有了这些库和工具,您就可以转向核心的 Snort 配置和安装了。
配置 Snort
下载了 Snort 源代码的 .tar.gz 文件之后,将其解压缩到一个便于访问的目录中。可以使用这样的命令:
[bdm0509:~/Desktop] tar xzf snort-2.8.0.2.tar.gz
在 Mac OS X 中,也可以双击文件,由 GUI 解压工具来处理解压缩的工作。您将获得一个类似于 snort-2.8.0.2 的文件夹,内容应如清单 3 所示。
清单 3. Snort 安装文件夹的目录列表
[bdm0509:~/Desktop/snort-2.8.0.2] ls COPYING ChangeLog LICENSE Makefile.am Makefile.in RELEASE.NOTES aclocal.m4 config.guess config.h.in config.sub configure configure.in contrib depcomp doc etc install-sh ltmain.sh m4 missing mkinstalldirs preproc_rules rpm schemas snort.8 src templates verstuff.pl ylwrap
现在,切换到刚刚创建的目录。运行 configure
,这是一个脚本命令,尝试为您自动配置安装。您的输出应如清单 4 所示。
清单 4. 为安装配置 Snort 包
[bdm0509:~/Desktop/snort-2.8.0.2] ./configure checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... ./install-sh -c -d checking for gawk... no checking for mawk... no checking for nawk... no checking for awk... awk checking whether make sets $(MAKE)... yes checking whether to enable maintainer-specific portions of Makefiles... no checking for style of include used by make... GNU checking for gcc... gcc ... lots more output... ... config.status: creating doc/Makefile config.status: creating contrib/Makefile config.status: creating schemas/Makefile config.status: creating rpm/Makefile config.status: creating preproc_rules/Makefile config.status: creating m4/Makefile config.status: creating etc/Makefile config.status: creating templates/Makefile config.status: creating src/win32/Makefile config.status: creating config.h config.status: executing depfiles commands
在您的系统上安装 Snort
在安装了 PCRE 之后,下一步就是:再次运行 make install
,同样以 root 用户的身份或使用 sudo
命令运行。您的输出应如清单 5 所示。
清单 5. 在 Snort 目录上运行 make install
[bdm0509:~/Desktop/snort-2.8.0.2] sudo make install Password: Making install in src Making install in sfutil gcc -DHAVE_CONFIG_H -I. -I../.. -I../.. -I../../src -I../../src/sfutil -I/sw/include -I../../src/output-plugins -I../../src/detection-plugins -I../../src/dynamic-plugins -I../../src/preprocessors -I../../src/preprocessors/flow -I../../src/preprocessors/portscan -I../../src/preprocessors/flow/int-snort -I../../src/preprocessors/HttpInspect/include -I../../src/preprocessors/Stream5 -I../../src/target-based -I/usr/local/include -fno-strict-aliasing -g -O2 -Wall -DDYNAMIC_PLUGIN -fno-strict-aliasing -c sfghash.c ... Lots more output... ... Making install in preproc_rules make[2]: Nothing to be done for `install-exec-am'. make[2]: Nothing to be done for `install-data-am'. make[2]: Nothing to be done for `install-exec-am'. test -z "/usr/local/share/man/man8" || ./install-sh -c -d "/usr/local/share/man/man8" /usr/bin/install -c -m 644 './snort.8' '/usr/local/share/man/man8/snort.8'
如果在运行 configure
和 make
的解压缩目录中未看到很多变化,也不必担心。这里的大多数工作都是在系统用于二进制文件、库和可执行文件的目录中完成的。
回页首
在 Linux 上通过 RPM 安装 Snort
RPM 表示 RPM Package Manager。(没错,这个缩写实际上是循环的。并不是很有意义,但符合事实。)RPM on Linux 是可以轻松安装的软件包,因为 RPM 支持是市面上所有 Linux 发布版的核心。从 Snort Web 站点下载了一个 RPM 之后,只需将您下载的文件名作为参数运行 rpm
命令即可,如清单 6 所示。
清单 6. 在 Snort RPM 上调用 rpm
[bdm0509@pegasus]# rpm -ivh snort-2.8.0.2-1.RH5.i386.rpm Preparing... ################################################ [100%] 1:snort ################################################ [100%]
ivh
选项代表安装、详尽和井号,它会安装软件包,同时告诉您所有细节(还会为您提供井号状态指标)。在本例中,安装是在 Red Hat 上进行的,但您会在任何 Linux 发布版上看到类似的结果。
与通过源代码安装 Snort 类似,您可能需要作为 root 用户登录来运行此命令,或使用 sudo
命令来作为超级用户安装 RPM。Snort 希望其二进制文件能够置于受保护的目录中,如 /usr/bin、/usr/local/bin,因此标准系统上的安装需要高于大多数普通用户账户的权限。
回页首
通过 Windows 二进制安装程序安装 Snort
您下载的 Windows 安装程序的名字应类似于 Snort_2_8_0_2_Installer.exe。运行安装程序,在 Windows 提示时确认您信任该应用程序,接受 Snort 许可协议。
选择数据库支持
您的第一个决定就是希望提供哪种类型的数据库支持。图 1 展示的屏幕允许您在默认设置(即支持 SQL Server 的配置)与支持 Oracle 的配置之间做出选择。
图 1. 选择所需的数据库登录支持
此屏幕上的选项均应用于登录:Snort 在嗅探包时可以登录数据库。(如果您对此感到迷惑,在下文中将得到解释。)如果您不希望登录到数据库,而是希望仅登录到文件,或者希望登录到 MySQL 数据库以及 Microsoft Access 等 ODBC 可访问的数据库,则应选择第一个选项。否则选择用于 SQL Server 或 Oracle 的选项。
选择要安装的组件
接下来是选择要包含在安装之中的组件(参见图 2)。
图 2. 指出您希望安装哪些 Snort 组件
这里有四个选项:Snort 本身、动态模块、文档和模式。没有理由不全部安装,完全安装只需要大约 24 MB 的空间,因此应选中所有组件继续操作。
选择安装目录
默认情况下,Snort 将安装在 C:\Snort 中,如图 3 所示。
图 3. 选择 Snort 安装目录
这个默认目录是理想的首选目录。因为 Snort 并没有过多的 GUI 组件,它实际上不属于典型的 Windows 应用程序,安装目录也不在 C:\Program Files 之下。除非您能够为 Snort 这样的程序选择标准安装目录,否则应使用默认设置。
安装和关闭
奇怪的是,Snort 并未提供非常有用的 “安装完成” 屏幕。与之不同,您将看到一个已经完成的状态条和一个 Close 按钮(如图 4 所示)。
图 4. 安装在此时已经完成
单击 Close 按钮,您就会看到弹出窗口,表明 Snort(几乎)已经为运行做好了准备(如图 5 所示)。
图 5. Snort 指出一些安装后的任务
安装 WinPcap
Snort 明确地告诉您:在 Snort 能够使用之前,还有一些安装工作需要完成。第一项就是 WinPcap。WinPcap 是 Windows Packet Capture Library 的简写,它提供了某种类型的网络访问,而 Snort 的 IDS 和包嗅探功能需要这些访问。请访问 WinPcap 的 Web 站点(参见 参考资料),单击 Get WinPcap 链接。
选择最新的稳定版本下载,在本文撰写之时,最新版本是 4.0.2。下载包括一个 Windows 安装程序,可双击启动它(如图 6 所示)。
图 6. WinPcap 的安装很简单
安装非常简单,只要连续单击 Next 按钮即可。这样,WinPcap 就可随时运行了。
编辑路径
接下来的内容有些偏离主题,至少不是这篇文章关注的主题。Snort 的安装提示您编辑 snort.conf 文件,观察在哪里查找规则和其他配置文件。这非常重要,但应该是我们后面讨论的话题。目前,只要安装好 Snort 和 WinPcap 即可。
但是,这里还有一个步骤,需要处理之后才能继续。您需要将 Snort 可执行文件添加到 PATH 语句之中,它的位置是 C:\Snort\bin\snort.exe(假设您选择的是默认安装目录)。设置的位置与操作系统有关。您需要找到 System Properties 对话框(在 “控制面板” 中或者选择 “控制面板” > “系统”),选择 Advanced System Properties,注意观察一个名为 Environment Variables 的按钮或选项卡。
其中有两个框(类似于图 7)。您需要选择上边的框,也就是用户变量,它仅应用于您的用户。(您很可能不希望系统上的所有用户都能运行 Snort,而无视您竭尽全力为某些程序设定的安全性制约。)
图 7. Windows 提供两组环境变量
如果还没有用于 PATH 的项,请选择上方的 New... 按钮。如果您已经有了一个项,则应选择 Edit..。在对话框中,输入 PATH 作为变量名,输入 C:\Snort\bin 作为值。图 8 展示了在完成时的效果。
图 8. 创建一个 PATH 变量并在 Snort 的可执行文件中指向它
选择 OK,然后关闭所有对话框。打开命令提示符,键入 snort
,您应看到类似于图 9 所示的输出结果。
图 9. 通过命令提示符运行 Snort
提示:下文将重复这一步骤,在 运行 Snort 二进制文件 一节中,但如果您使用的是 Windows,那么值得立即学习,因为这些步骤能够纠正与环境变量设置相关的所有问题。
回页首
测试安装
在完成安装之后,您需要采取几个步骤,确保 Snort 可在系统上正常运行。一切都很简单,但在每次安装新版本的 Snort 或在新机器上安装 Snort 时都需要执行这些步骤。
运行 Snort 二进制文件
可以执行的最简单的测试就是运行 snort
命令。要开始测试,请切换到机器上的任意随机目录。但为了安全起见,请不要在 Snort 安装目录中执行此命令。您应得到类似于清单 7 所示的输出结果。
清单 7. 测试 Snort 二进制文件
[bdm0509:~] snort ,,_ -*> Snort! <*- o" )~ Version 2.8.0.2 (Build 75) '''' By Martin Roesch & The Snort Team: http://www.snort.org/team.html (C) Copyright 1998-2007 Sourcefire Inc., et al. Using PCRE version: 7.6 2008-01-28 USAGE: snort [-options]Options: -A Set alert mode: fast, full, console, test or none (alert file alerts only) "unsock" enables UNIX socket logging (experimental). -b Log packets in tcpdump format (much faster!) -B Obfuscated IP addresses in alerts and packet dumps using CIDR mask -c Use Rules File -C Print out payloads with character data only (no hex) -d Dump the Application Layer -D Run Snort in background (daemon) mode -e Display the second layer header info -f Turn off fflush() calls after binary log writes -F Read BPF filters from file -g Run snort gid as group (or gid) after initialization -G <0xid> Log Identifier (to uniquely id events for multiple snorts) -h Home network = -H Make hash tables deterministic. -i Listen on interface -I Add Interface name to alert output -k Checksum mode (all,noip,notcp,noudp,noicmp,none) -K Logging mode (pcap[default],ascii,none) -l Log to directory -L Log to this tcpdump file -M Log messages to syslog (not alerts) -m Set umask = -n Exit after receiving packets -N Turn off logging (alerts still work) -o Change the rule testing order to Pass|Alert|Log -O Obfuscate the logged IP addresses -p Disable promiscuous mode sniffing -P Set explicit snaplen of packet (default: 1514) -q Quiet. Don't show banner and status report -r Read and process tcpdump file -R Include 'id' in snort_intf .pid file name -s Log alert messages to syslog -S Set rules file variable n equal to value v -t Chroots process to after initialization -T Test and report on the current Snort configuration -u Run snort uid as user (or uid) after initialization -U Use UTC for timestamps -v Be verbose -V Show version number -w Dump 802.11 management and control frames -X Dump the raw packet data starting at the link layer -y Include year in timestamp in the alert and log files -Z Set the performonitor preprocessor file path and name -? Show this information are standard BPF options, as seen in TCPDump Longname options and their corresponding single char version --logid <0xid> Same as -G --perfmon-file Same as -Z --pid-path Specify the path for the Snort PID file --snaplen Same as -P --help Same as -? --version Same as -V --alert-before-pass Process alert, drop, sdrop, or reject before pass, default is pass before alert, drop,... --treat-drop-as-alert Converts drop, sdrop, and reject rules into alert rules during startup --process-all-events Process all queued events (drop, alert,...), default stops after 1st action group --dynamic-engine-lib Load a dynamic detection engine --dynamic-engine-lib-dir Load all dynamic engines from directory --dynamic-detection-lib Load a dynamic rules library --dynamic-detection-lib-dir Load all dynamic rules libraries from directory --dump-dynamic-rules Creates stub rule files of all loaded rules libraries --dynamic-preprocessor-lib Load a dynamic preprocessor library --dynamic-preprocessor-lib-dir Load all dynamic preprocessor libraries from directory --dump-dynamic-preproc-genmsg Creates gen-msg.map files of all loaded preprocessor libraries --create-pidfile Create PID file, even when not in Daemon mode --nolock-pidfile Do not try to lock Snort PID file --disable-inline-initialization Do not perform the IPTables initialization in inline mode. --loop In combination with the -r option, this will read the tcpdump file continuously for times. A value of 0 will read the pcap until Snort is killed. ERROR: Uh, you need to tell me to do something... Fatal Error, Quitting..
最后出现了错误,但在这个过程中完成了一些重要的事情:
- 它确认了 Snort 二进制文件已正确安装到了您的路径中。这也就是说,您可以从计算机的任何目录运行它。
- 它为您提供了关于 Snort 版本及其相关库的重要信息。请注意靠近输出顶端的这段输出内容:
,,_ -*> Snort! <*- o" )~ Version 2.8.0.2 (Build 75) '''' By Martin Roesch & The Snort Team: http://www.snort.org/team.html (C) Copyright 1998-2007 Sourcefire Inc., et al. Using PCRE version: 7.6 2008-01-28
这使您可以轻而易举地看到正在运行的 Snort 和 PCRE 的版本。
- 它为您提供了可向 Snort 发送的简单命令纲要。
使用 Snort 进行嗅探
您知道,Snort 是一种入侵检测系统,但它是如何检测入侵的呢?Snort(和大多数高端 IDS)都会嗅探 网络流量。嗅探器是一种工具或设备(带有网卡),用于监控计算机之间的网络流量。有些嗅探器是 “第三方”,嗅探外部机器与嗅探器本身之间的流量。也有一些嗅探器会嗅探网络和嗅探器本身所在计算机之间的流量。在下一期的文章中,我们将进一步介绍嗅探,如果您目前对嗅探有不明确的地方,请不要担心。
目前,嗅探是一种简单而有用的方法,能够确保 Snort 已安装且能够正常工作,能够监控网络流量。使用 -v
标记运行 snort
命令,这告知 Snort 嗅探网络流量,将信息输出到控制台。清单 8 展示了在 Mac OS X 机器上运行 snort -v
的输出结果。
清单 8. 使用 Snort 进行嗅探
[bdm0509:~] snort -v Running in packet dump mode --== Initializing Snort ==-- Initializing Output Plugins! Verifying Preprocessor Configurations! *** *** interface device lookup found: en0 *** Initializing Network Interface en0 ERROR: You don't have permission to sniff. Try doing this as root. Fatal Error, Quitting..
是的,这是一个错误,在这里输出有一个重要的目的:Snort 需要广泛的权限来完成大量工作。嗅探是一项基本操作,但毫无疑问,如果没有 root 权限,没有使用 sudo
的能力,就很难充分利用 Snort。
尝试相同的命令,但这一次在超级用户的账户下运行。您应看到类似于清单 9 的输出结果。必须使用 Ctrl+C 退出,否则 Snort 将一直运行。
清单 9. 使用 Snort 进行嗅探(成功的结果)
[bdm0509:~] sudo snort -v Password: Running in packet dump mode --== Initializing Snort ==-- Initializing Output Plugins! Verifying Preprocessor Configurations! *** *** interface device lookup found: en0 *** Initializing Network Interface en0 Decoding Ethernet on interface en0 --== Initialization Complete ==-- ,,_ -*> Snort! <*- o" )~ Version 2.8.0.2 (Build 75) '''' By Martin Roesch & The Snort Team: http://www.snort.org/team.html (C) Copyright 1998-2007 Sourcefire Inc., et al. Using PCRE version: 7.6 2008-01-28 Not Using PCAP_FRAMES 03/31-08:55:12.179192 192.168.1.102:64862 -> 239.255.255.253:427 UDP TTL:1 TOS:0x0 ID:10292 IpLen:20 DgmLen:64 Len: 36 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.179498 192.168.1.102:64863 -> 239.255.255.253:427 UDP TTL:1 TOS:0x0 ID:10293 IpLen:20 DgmLen:64 Len: 36 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.180121 192.168.1.102:64864 -> 239.255.255.253:427 UDP TTL:1 TOS:0x0 ID:10294 IpLen:20 DgmLen:64 Len: 36 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.180278 192.168.1.102:64865 -> 239.255.255.253:427 UDP TTL:1 TOS:0x0 ID:10295 IpLen:20 DgmLen:64 Len: 36 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.247880 192.168.1.102:64866 -> 192.168.1.255:137 UDP TTL:64 TOS:0x0 ID:10296 IpLen:20 DgmLen:78 Len: 50 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.248297 192.168.1.103:137 -> 192.168.1.102:64866 UDP TTL:64 TOS:0x0 ID:8075 IpLen:20 DgmLen:90 Len: 62 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.599248 192.168.1.102:55381 -> 192.168.1.101:139 TCP TTL:64 TOS:0x0 ID:10297 IpLen:20 DgmLen:64 DF ******S* Seq: 0x42127B5E Ack: 0x0 Win: 0xFFFF TcpLen: 44 TCP Options (8) => MSS: 1460 NOP WS: 0 NOP NOP TS: 1428368232 0 TCP Options => SackOK EOL ... LOTS more output here ... =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:21.976018 0.0.0.0:68 -> 255.255.255.255:67 UDP TTL:64 TOS:0x0 ID:48134 IpLen:20 DgmLen:328 Len: 300 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:21.976800 ARP who-has 192.168.1.104 tell 192.168.1.1 03/31-08:55:22.968515 192.168.1.1:67 -> 255.255.255.255:68 UDP TTL:150 TOS:0x0 ID:6040 IpLen:20 DgmLen:576 Len: 548 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:22.977578 ARP who-has 192.168.1.104 tell 192.168.1.104 ^C*** Caught Int-Signal Run time prior to being shutdown was 14.231224 seconds =============================================================================== Packet Wire Totals: Received: 78 Analyzed: 78 (100.000%) Dropped: 0 (0.000%) Outstanding: 0 (0.000%) =============================================================================== Breakdown by protocol (includes rebuilt packets): ETH: 78 (100.000%) ETHdisc: 0 (0.000%) VLAN: 0 (0.000%) IPV6: 0 (0.000%) IP6 EXT: 0 (0.000%) IP6opts: 0 (0.000%) IP6disc: 0 (0.000%) IP4: 71 (91.026%) IP4disc: 0 (0.000%) TCP 6: 0 (0.000%) UDP 6: 0 (0.000%) ICMP6: 0 (0.000%) ICMP-IP: 0 (0.000%) TCP: 57 (73.077%) UDP: 14 (17.949%) ICMP: 0 (0.000%) TCPdisc: 0 (0.000%) UDPdisc: 0 (0.000%) ICMPdis: 0 (0.000%) FRAG: 0 (0.000%) FRAG 6: 0 (0.000%) ARP: 3 (3.846%) EAPOL: 0 (0.000%) ETHLOOP: 0 (0.000%) IPX: 0 (0.000%) OTHER: 4 (5.128%) DISCARD: 0 (0.000%) InvChkSum: 0 (0.000%) Upconvt: 0 (0.000%) Up fail: 0 (0.000%) S5 G 1: 0 (0.000%) S5 G 2: 0 (0.000%) Total: 78 =============================================================================== Action Stats: ALERTS: 0 LOGGED: 0 PASSED: 0 =============================================================================== Snort exiting
目前看来,这很可能没有太多意义,但没有关系。在本系列结束前,您将了解更多相关内容。目前,我们的任务是确保 Snort 已正确安装。如果您能够将 Snort 作为嗅探器运行,也就做好了继续使用 Snort 的准备,而不仅仅是向它发送令人迷惑的命令。
回页首
但我没有 root 访问权限!
至此为止,您已经了解到,Snort 需要的权限超过大多数普通用户账户的能力。即使您能够说服网络或系统管理员安装 Snort —— 并且为他们没有安装 Snort 而惋惜 —— 但如果没有获得额外的特权,您依然是只利用了 Snort 的部分功能。
然而,在普通的用户账户和 root 用户(或通过 sudo
命令授予的特权)之间仍然存在显著差异。大多数管理员都愿意帮助您缩短一点这个的差距。下面介绍了一种合理的方法,能使您的管理员允许您使用 Snort,并授予您使用 Snort 所需的权限:
安装 Snort
首先,安装 Snort。同样,某些管理员已经使用了 Snort。切记,Snort 不必运行在您希望保护和嗅探的机器之上。例如,您可能在几台服务器上管理几个 Web 站点。如果 Snort 能在所有服务器上运行并访问,并且您能够轻松通过远程登录使用它,这当然更好;但您也可以在您自己的机器上运行 Snort,并将其指向运行站点的服务器,从而获得大量信息。因此,您将能够使用 Snort 在您自己的桌面或笔记本电脑上为所欲为(重申一下,这并不是理想的做法,但至少可以算是朝着正确方向发展的一个步骤)。
如果管理员对您提起 Snort 毫无动情,请为他们推荐本文或 参考资料 中提到的某些 Snort 书籍。如果您能帮助保护他们负责的服务器,那么他们可能会更乐于为您提供所需的更多权限。
确保您可以运行 Snort
下一项优先任务就是确保您能够运行 snort
命令。因为 Snort 安装在 /usr/local/bin 中(默认目录),因此这非常简单,只需为所有用户或您的用户账户开放此目录,或者允许您的用户(或一个可以添加用户账户的组)使用该特定的二进制文件。最好的方法是首先提出最具体的请求。询问您的管理员,他们能否使您的特定用户账户可以运行 /usr/local/bin/snort。
实际上,大多数管理员都有较重的工作压力,往往十分忙碌。他们授予您的权限通常会超过您所要求的权限,但希望您不会提出一些在他们看来十分荒谬的要求,例如为您的账户授予对其负责的服务器上所有重要可执行程序的访问权限。您通常会得到居中的权限,例如进入可访问 Snort 等并不通用的程序的组,但这些程序并不存在像更改用户密码或删除用户账户那样的危险。
确保您能够使用 Snort
遗憾的是,Snort 需要写入大量受限的目录,并且要在其中运行。这也就是说,即便您可以运行 Snort,通常也无法使用它来做任何有生产意义的事情。参考下面的步骤,并坚持阅读本系列文章,我们将提供解决方法。
首先,默认情况下,Snort 所做的许多工作都要在受限目录中完成,它可以请求不受保护的目录。因此,您可以选择使 Snort 登录您已经有权访问的目录,减少部分权限问题。但最终,您依然会看到错误,如清单 10 所示。
清单 10. 权限错误
[bdm0509:~] snort -v Running in packet dump mode --== Initializing Snort ==-- Initializing Output Plugins! Verifying Preprocessor Configurations! *** *** interface device lookup found: en0 *** Initializing Network Interface en0 ERROR: You don't have permission to sniff. Try doing this as root. Fatal Error, Quitting..
坏消息是:不存在好的规避方法,它需要通常与 root 用户相关联的权限。但也有好消息:也是这篇文章对 Web 开发人员而不仅仅是系统和网络管理员都有意义 —— 您在本地机器上配置和运行的一切都适用于在生产机器上运行的 Snort。因此,在您生成配置文件时,了解如何记录警报,为 Snort 开发规则,而这一切都在您的本地安装上完成(甚至可能是一台笔记本电脑),这样,您就是在构建一个可在任何位置检测入侵的系统。
虽然大多数管理员不会允许您自由支配,但许多管理员会准许您为他们提供脚本和规则文件(在下一期的文章中,我们将进一步介绍规则),由他们来替您运行 —— 往往是在您小心谨慎的时候。这是最好的情况吗?或许不是,但仍然会提供站点保护,这也是底线。
使日志和警报通过邮件发送给您
对于大多数 IDS 和管理员来说,最遗憾的事实莫过于常常发现很多问题,也忽略了很多问题。管理员有繁重的工作,即便您已经很好地设置了 Snort,为它提供了可靠的规则,仍然不代表您将得到一个安全的系统。大多数入侵都需要操作。因而,如果有可能,您应该要求管理员通过邮件为您发送日志和警报文件,不久之后,您的 Snort 将可以生成此类文件。您可以每周要求一次,作为自动化作业完成,但还可能需要配置 Snort,在问题出现时,自动为您和管理员发送邮件。同样,弄清楚在您的机器上完成此任务的配置,然后将其提交给管理员,帮助管理员完成此工作。
这样,无论您是 root 用户、具有超级用户特权的网络管理员,还是因系统管理员保护过度而为安装 PHP 脚本据理力争的 Web 开发人员,您都将受益于对 Snort 的深入理解。
回页首
试用三项功能
至此,您应已得到了可正常工作的 Snort 安装,也对使 Snort 运行(即便在半受限的环境中)有了一些深入的理解。在本文结束之前,我们有机会来观察和试用 Snort 的三项基本功能。这使您能够为下一篇文章做好准备,并具体了解 Snort 能够为您的系统带来怎样的影响。
Snort 是一种包嗅探器
包 就是一组格式化的数据。网络不习惯于用较大的数据块或较小的字节来表示数据,而习惯于以包为单位。包不仅提供了数据,还提供了关于数据的简单信息。这允许包的发送方表明所发送的数据类型,也使包的接收方能够在研究数据本身之前对包的数据略有认识(称为有效负载)。
我的 IP 地址是什么?
有多种方法可用于确定您的计算机的 IP 地址。大多数 GUI 都提供了以可视化方法查找计算机 IP 地址的手段。Windows 中的网络控制面板提供了相关报告(在 TCP/IP 协议下);在 Mac OS X 上,System Preferences 中的 Network 面板将告诉您 IP 地址。还可利用一些命令。在 Windows 中,从命令行中运行 ipconfig
。在 Mac OS X 、Linux 和 UNIX 中,ifconfig
的变体将完成此任务。
包嗅探器是一种工具,它会嗅探或调查包。使用 Snort,您可以在包的级别检查网络流量,这允许您查看原始数据,以及包的接收方附加到原始数据之上的信息。这是您使用带有 -v
标记的 snort
命令时获得的结果,将 Snort 作为包嗅探器运行时,您会获得三方面的信息:
- 关于 Snort 将信息记录到何处及其所检查的网络接口的信息。
- Snort 所嗅探的包,发送到指定网络接口,或从指定网络接口发出。
- Snort 在本次运行中完成的所有任务的汇总(在您结束嗅探时输出,通常要使用 Ctrl+C 控制)。
在下一篇文章中,您将了解到这些包中究竟有哪些内容,如何开始对这些包进行基本分析。目前,只需思考一下,对于各包来说,所有信息是都是针对该包报告的。这里是一个包的输出结果:
03/31-08:55:12.180121 192.168.1.102:64864 -> 239.255.255.253:427 UDP TTL:1 TOS:0x0 ID:10294 IpLen:20 DgmLen:64 Len: 36
如果您不确定,可尝试在您自己的机器上嗅探包,使用您自己的 Snort 安装,作为辅助,您还需要查看自己的 IP 地址。这将允许您将尚不确定的内容整理在一起。
Snort 是一种包记录器
包嗅探非常出色,但如您所见,Snort 的包嗅探模式假设您一直关注着显示器,急切地查看数千行网络数据。当然,您已经有了需要设计的站点和需要掌控的世界,所以这显然不理想。通过为 Snort 添加 -l
开关,就能告诉它将包记录到您选定的目录中(如清单 11 所示)。
清单 11: 告诉 Snort 在何处记录包
[bdm0509:~/Documents/developerworks/snort_1] sudo snort -l myLogDir/ Password: Running in packet logging mode Log directory = myLogDir/ --== Initializing Snort ==-- Initializing Output Plugins! Verifying Preprocessor Configurations! *** *** interface device lookup found: en0 *** Initializing Network Interface en0 Decoding Ethernet on interface en0 --== Initialization Complete ==-- ,,_ -*> Snort! <*- o" )~ Version 2.8.0.2 (Build 75) '''' By Martin Roesch & The Snort Team: http://www.snort.org/team.html (C) Copyright 1998-2007 Sourcefire Inc., et al. Using PCRE version: 7.6 2008-01-28 Not Using PCAP_FRAMES
请注意,这条命令在前台启动 Snort;如果此时按下 Ctrl+C,重新调出终端提示符,也就中止了 Snort 的记录。因此,应将 Snort 作为包记录器在一个可最小化、可忽略的窗口中运行,更好的方法是,将其作为长期运行的进程(作为守护进程或系统进程)。
退出此进程时,Snort 会为您提供与前述相同的汇总数据。但也会在您指定的目录中创建一个文件,列举所嗅探过的包:
[bdm0509:~/Documents/developerworks/snort_1] ls myLogDir/ snort.log.1206998502
打开这个文件,您将看到 Snort 运行时嗅探过的包的更多具体信息。但务必牢记,如果必须作为超级用户(使用 sudo
)或 root 用户运行 Snort,也就必须使用相同的权限打开此文件。
查看该文件,它与上文列出的嗅探器输出略有不同。实际上,它的用处更小 —— 除非您想了解 Snort 如何分析自己的文件。这也是另一篇文章的主题,现在您尝试了使用 Snort、使用命令行版本、包嗅探器,但包记录器的更多内容不在此处赘述。
Snort 是 IDS(或 NIDS)
从根本上来说,包嗅探和包记录(以及对这些记录的分析)都是入侵检测系统(或者说 Snort 的另一种称呼:NIDS,即网络入侵检测系统)的子系统。这是 Snort 最杰出的领域。也是涉猎广泛、讲究技巧的方面。由于入侵的类型不断迅速变化,Snort 有一组规则,您可从 Snort 的站点下载这些规则,它们详细阐述了这些入侵,允许 Snort 观察入侵。规则频繁更改,保证(至少是尝试保证)与最新攻击的各种类型保持一致。
此外,您需要配置 Snort,告诉它在感知到攻击时应采取怎样的措施。这是您此前与之建立良好合作关系的网络和系统管理员出面拯救您的站点的时机……让他们来负责采取措施应对攻击。但如果您能通过提交配置和规则文件来使他们注意到攻击,那么您就已经在这场游戏中占据了领先地位。
如果您耐心不足,或者无法等待尝试将 Snort 作为 IDS 使用,请尝试运行 snort -A
,这会将 Snort 切换为警报 模式。您必须付出一定的努力,才能使它正常运作,但在等待下一篇文章发表期间,这是一项不错的 Snort 试验。
回页首
结束语
Web 开发不仅仅与 HTML 和 CSS 有关,Web 编程的范畴也远不止 Java™ 代码、C++ 和 PHP。实际上,您要构建的是功能型应用程序。如果用户无法上线、无法从他们喜爱的厂商那里购买商品、无法在当地美术馆中找到最新抽象水彩画的价格,那么您的所有代码都等于零。无论您的编程和设计技能有多么出众,用户都不能 —— 也不会使用遭受过攻击,有着不恰当图片、报价过高或者更低(这对厂商来说,更加糟糕)的购物车的应用程序和 Web 页面。出色的开发人员和设计人员不仅仅是代码写手。他们至少应该参与保护自己的资产,就像好的投资商一样。他们的工作成果正常运行的时间越长,其价值也就越高。
可以证明,Snort 是市面上最好、最易用或许也是最便宜的入侵检测系统。在几分钟内即可完成安装,它易于设置和运行,它十分灵活。从包嗅探、分析一直到向您或管理员发出可能出现入侵的警报,Snort 能够保护您的工作成果,使之免受攻击。目前,您应在至少一台机器上运行 Snort(如果您真正理解了,那么或许应该在几台不同平台的机器上运行),执行一些基本的包嗅探工作。您应该很好奇,这些包中究竟有什么内容,Snort 还允许您做哪些事情。
在等待这些包的具体信息,思考出色的 IDS 应该检测哪些类型的警报并继续试用 Snort 时,这里有一些关于实践的想法。首先,以包嗅探或包分析模式启动 Snort。随后,尝试以下场景:
- 如果您的机器嗅探包上已经有了一个 Web 服务器,将另一机器上的浏览器指向该 Web 服务器,随意浏览。请注意另一台机器(使用浏览器的机器)的 IP 地址。您在来自 Snort 的包日志或输出中看到了哪些内容?您能否找到 Web 流量?
- 尝试从另外一台机器远程登录或 FTP 登录到所嗅探的机器。然后您看到了怎样的流量?
- 在没有 index.html(或 .php、.htm 等)的 Web 服务器上创建目录。在该目录中放置一些文件,允许匿名目录列表。将另外一台机器的浏览器指向该目录。流量(和表示该流量的包)与普通的 HTML 或 PHP 页面是否有差别?有什么样的差别?
- 使用 Apache .htaccess 文件或您的服务器所提供的内容设置身份验证。从另外一台机器访问受保护的资源。包看上去是怎样的?在成功登录时又是怎样?使用有效凭据而未能成功登录时又是怎样?
这只是一些想法,但能帮助您很好地理解在典型的 Web 服务器请求/响应模型中四处传递的包。试试看您能否确定什么是 “正常” 的流量,什么是不正常的流量。请继续关注下个月的文章,我们将进一步探讨警报、规则等内容,介绍如何避免您的系统遭遇严重的入侵。
参考资料
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
- 关于 Snort 的一切都源于 Snort Web 站点。
- Red Hat Linux 在 利用 Snort 保护您的 Red Hat Linux 系统 方面有一项杰出的特性。或许有几分过时,但基本概念依然适用。
- 如果您希望利用 Snort 的强大力量,但更倾向于具有专业支持的商业产品,请查看Sourcefire's IDS,该产品构建于 Snort 的基础之上。
- developerWorks Web 开发专区 包含大量的 Web 2.0 开发工具和信息。
- developerWorks Ajax 资源中心 包含不断增加的大量 Ajax 内容以及有用资源,可以让您立即开始开发 Ajax 应用程序。
获得产品和技术
- Snort 下载主页 提供了所有 Snort 二进制文件和源文件下载。
- 可从 Apple Developer Connection 下载一个用于 Mac OS X 的 C 编译器。需要使用账户登录,但注册和下载都是免费的。
- 下载 Perl Compatible Regular Expressions 库。
- WinPcap 允许 Windows 平台上的 Snort 链路层网络访问。
- Managing Security with Snort and IDS Tools(Kerry Cox 和 Christopher Gerg;O'Reilly Media, Inc.)提供了更加全面的安全性简介,还包括大量特定于 Snort 的内容,帮您管理您的站点。
- Snort Cookbook (Angela Orebaugh、Simon Biles 和 Jacob Babbin;O'Reilly Media, Inc.)是一份出色的 Snort 入门资料,指导您执行具体的任务,从基本的安装到高级的入侵检测和网络优化。
讨论
- developerWorks blog:加入 developerWorks 社区
Snort 使用手册,第 2 部分: 配置
通过设置 Snort 报告 Web 站点入侵
Snort 是一款免费、开源的网络入侵防御系统(Network Intrusion Prevention System,NIPS)和网络入侵检测系统(Network Intrusion Detection System,NIDS)工具,可以检测入侵、防止外部攻击损害您的 Web 设计和应用程序编程。本系列的 第一篇文章 完成了 Snort 安装并使它可以检测包、日志通信量,做好了入侵检测的准备工作。在本文中,将了解这些包中的数据含义,以及如何使用这些数据判断是否发生攻击并向系统管理员发出警告。
0评论:
Brett McLaughlin ([email protected]), 作家兼编辑, O'Reilly Media, Inc.
2008 年 7 月 18 日
- 内容
在 IBM Bluemix 云平台上开发并部署您的下一个应用。
现在就开始免费试用
在上一篇文章中,您了解到 Snort 是什么,以及如何在系统中安装并运行它。也看到了 Snort 如何执行三种关键的基本功能:
- 包嗅探:Snort 可以针对它所在的机器监视进入和出去的包。它还可以监视它所运行的网络中大量正在传输的包。这是 Snort 最基本的功能,以包的形式检测和观察网络通信量是所有其他功能的基础。
- 包记录:Snort 不仅可以实时监视包,还可以记录这些包。日志功能可以使您手动或自动处理这些包,并记录已发生的事件。不论是否正在清理旧包来检测入侵,或是 Snort 根据所记录的内容发出软件警告,包记录功能使 Snort 从一个实时工具转到一个可以以不同形式持久存储数据的工具。
- 入侵检测:从很大程度上讲,入侵检测实际上就是结合了包嗅探和记录功能,并在其上添加一层自动智能层。一个入侵检测系统(即 IDS)具有一个包含网络状态信息的规则集,可以针对网络中可疑的状态进行监视并发出响应。
在本文中,我将越过基本的安装和配置知识,讨论如何 设置 Snort,以检测与 Web 相关的入侵。您将了解如何用最新的规则配置 Snort,并在后台监控服务器的行为。
注意:本文并非从系统管理员的角度考虑 Snort。与 Snort 相关的知识很多,它可以检测各种入侵,包括对 IRC 服务的攻击、与 Web 相关的问题,以及试图通过受保护端口访问机器的恶意代码。但是,本文实际上专门针对 Web 设计者和开发人员,为保护他们的具体项目和应用程序提出改进建议。有关 Snort 的更多参考资料,请参见 参考资料 中的各种链接。
使用 Snort 分析包
在上一篇文章中,我们简单了解了 Snort 的三个功能,并查看了一些包。例如,运行 snort -v
获得如清单 1 所示的输出。
清单 1. 使用 Snort 嗅探
[bdm0509:~] sudo snort -v Password: Running in packet dump mode --== Initializing Snort ==-- Initializing Output Plugins! Verifying Preprocessor Configurations! *** *** interface device lookup found: en0 *** Initializing Network Interface en0 Decoding Ethernet on interface en0 --== Initialization Complete ==-- ,,_ -*> Snort! <*- o" )~ Version 2.8.0.2 (Build 75) '''' By Martin Roesch & The Snort Team: http://www.snort.org/team.html (C) Copyright 1998-2007 Sourcefire Inc., et al. Using PCRE version: 7.6 2008-01-28 Not Using PCAP_FRAMES 03/31-08:55:12.179192 192.168.1.102:64862 -> 239.255.255.253:427 UDP TTL:1 TOS:0x0 ID:10292 IpLen:20 DgmLen:64 Len: 36 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.179498 192.168.1.102:64863 -> 239.255.255.253:427 UDP TTL:1 TOS:0x0 ID:10293 IpLen:20 DgmLen:64 Len: 36 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.180121 192.168.1.102:64864 -> 239.255.255.253:427 UDP TTL:1 TOS:0x0 ID:10294 IpLen:20 DgmLen:64 Len: 36 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.180278 192.168.1.102:64865 -> 239.255.255.253:427 UDP TTL:1 TOS:0x0 ID:10295 IpLen:20 DgmLen:64 Len: 36 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.247880 192.168.1.102:64866 -> 192.168.1.255:137 UDP TTL:64 TOS:0x0 ID:10296 IpLen:20 DgmLen:78 Len: 50 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.248297 192.168.1.103:137 -> 192.168.1.102:64866 UDP TTL:64 TOS:0x0 ID:8075 IpLen:20 DgmLen:90 Len: 62 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:12.599248 192.168.1.102:55381 -> 192.168.1.101:139 TCP TTL:64 TOS:0x0 ID:10297 IpLen:20 DgmLen:64 DF ******S* Seq: 0x42127B5E Ack: 0x0 Win: 0xFFFF TcpLen: 44 TCP Options (8) => MSS: 1460 NOP WS: 0 NOP NOP TS: 1428368232 0 TCP Options => SackOK EOL ... LOTS more output here ... =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:21.976018 0.0.0.0:68 -> 255.255.255.255:67 UDP TTL:64 TOS:0x0 ID:48134 IpLen:20 DgmLen:328 Len: 300 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:21.976800 ARP who-has 192.168.1.104 tell 192.168.1.1 03/31-08:55:22.968515 192.168.1.1:67 -> 255.255.255.255:68 UDP TTL:150 TOS:0x0 ID:6040 IpLen:20 DgmLen:576 Len: 548 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:22.977578 ARP who-has 192.168.1.104 tell 192.168.1.104 ^C*** Caught Int-Signal Run time prior to being shutdown was 14.231224 seconds =============================================================================== Packet Wire Totals: Received: 78 Analyzed: 78 (100.000%) Dropped: 0 (0.000%) Outstanding: 0 (0.000%) =============================================================================== Breakdown by protocol (includes rebuilt packets): ETH: 78 (100.000%) ETHdisc: 0 (0.000%) VLAN: 0 (0.000%) IPV6: 0 (0.000%) IP6 EXT: 0 (0.000%) IP6opts: 0 (0.000%) IP6disc: 0 (0.000%) IP4: 71 (91.026%) IP4disc: 0 (0.000%) TCP 6: 0 (0.000%) UDP 6: 0 (0.000%) ICMP6: 0 (0.000%) ICMP-IP: 0 (0.000%) TCP: 57 (73.077%) UDP: 14 (17.949%) ICMP: 0 (0.000%) TCPdisc: 0 (0.000%) UDPdisc: 0 (0.000%) ICMPdis: 0 (0.000%) FRAG: 0 (0.000%) FRAG 6: 0 (0.000%) ARP: 3 (3.846%) EAPOL: 0 (0.000%) ETHLOOP: 0 (0.000%) IPX: 0 (0.000%) OTHER: 4 (5.128%) DISCARD: 0 (0.000%) InvChkSum: 0 (0.000%) Upconvt: 0 (0.000%) Up fail: 0 (0.000%) S5 G 1: 0 (0.000%) S5 G 2: 0 (0.000%) Total: 78 =============================================================================== Action Stats: ALERTS: 0 LOGGED: 0 PASSED: 0 =============================================================================== Snort exiting
注意,您需要以根用户的身份运行或是使用 sudo
,详细内容请查看上一篇文章。
当然,这里的难点是利用这些信息。可以进一步把这些信息分解为单个的包,如清单 2 所示(直接使用清单 1 的内容)。
清单 2. 清单 1 输出的单个包
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:21.976800 ARP who-has 192.168.1.104 tell 192.168.1.1 03/31-08:55:22.968515 192.168.1.1:67 -> 255.255.255.255:68 UDP TTL:150 TOS:0x0 ID:6040 IpLen:20 DgmLen:576 Len: 548 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
这个包表示什么含义?是否值得关注?
基本上全部关于 IP 地址
包中的最重要信息来自 IP 地址。清单 2 中的包提供了一些;它们在清单 3 中使用粗体突出显示。
清单 3. 注意清单 2 所示包中的 IP 地址
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 03/31-08:55:21.976800 ARP who-has 192.168.1.104 tell 192.168.1.1 03/31-08:55:22.968515 192.168.1.1:67 -> 255.255.255.255:68 UDP TTL:150 TOS:0x0 ID:6040 IpLen:20 DgmLen:576 Len: 548 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
这里提到了两个 IP 地址:192.168.1.104 和 192.168.1.1。此外,192.168.1.1 在第二次出现时,后面多了一个端口号。端口号通常出现在 IP 地址之后的冒号后面,例如:192.168.1.1:67。
IP 地址实践经验
通常,以 1.1 结尾的 IP 通常一般为路由器或无线网关。在具有多个路由器的位置中,经常会看到从 1.1 到 1.10 等地址,但是低端数字通常表示通向 Internet 或其他网络的路由器和网关。而诸如 100 或 210 等高端数字表示网络中的单个设备。当然,智能管理可以识别这些地址并进行修改,这样恶意攻击者就不会轻松地推测出这些地址,但是可以监视某个包,并从其 IP 地址中获得有关包的发送源和发送目的地的信息。
在利用这些信息之前,需要了解您的机器的 IP 地址。可以使用 Windows® 命令 ipconfig
,或者在 Linux®、UNIX®,或 Mac OS X 的终端上,使用 ifconfig
。在清单 3 的示例包中,192.168.1.104 正是运行 Snort 的机器的 IP 地址,而 192.168.1.1 则是该机器的网络通往外部网络的路由器的地址。
在这个例子中,这个包来自一个计算机(运行 Snort,IP 地址为 192.168.1.104),并将传输到路由器(192.168.1.1)。随后,将获得一些额外的信息,诸如长度、ID 和一些奇怪的代码,例如 TOS、TTL 和 UDP。
是否适合使用 Snort?
现在看来,详细分析包的过程似乎有些繁琐。如果您是习惯使用 CSS 样式和 div
的 Web 设计师,或者是更加关心类的衔接、接口或某个抽象类是否有意义的开发人员,那么包分析是一个非常枯燥乏味的过程。如果开始就加入一些奇怪的缩写词,那么您很可能再没有兴趣阅读本文,而是查找一些有关 CSS 文本替换或如何使用 C# 实现 Chain of Responsibility 设计模式等内容的资料。
Snort 最擅长于解决这类复杂和困难的包问题。事实上,Snort 对 Web 开发人员如此有用,是因为 它关注设计模式、布局和函数性任务。使用 Snort,在基本理解的基础之上(可以阅读上一篇文章和本节内容),可以让您的工具完成您不愿意完成的工作。本文其余内容将介绍 Snort 如何处理包分析,以及如何利用社区力量保证系统安全,而不需要重新学习已经淡忘的大学网络课程。
回页首
配置 Snort
不需花大量时间研究包,可以对 Snort 进行设置来处理分析,并在发生问题时收到 Snort 的警报;这些功能是通过为 Snort 指定一组规则 实现的。这些规则通常使用文本文件的形式,告诉 Snort 要执行什么操作,为它在包中查找关键细节提供信息,并指导 Snort 在找到键信息后如何操作。此外,这些规则可以限制 Snort 侦听的内容(例如命令 Snort 只监视单个机器,或监视整个网络中的通信量),以及记录查找到的所有内容并生成一个文件方便日后查看。
实际上,使用 Snort 规则可以省去手工分析包的工作。
Snort 的默认配置
在编写规则之前,需要告诉 Snort 作为 IDS 运行。最简单的方法(包括记录包)是使用 Snort 的默认配置,这个配置保存在 Snort 安装目录(我的是 /usr/local/snort-2.8.1/etc/snort.conf)中的 etc/snort.conf 文件。这种方法可以简单地设置并运行 Snort。清单 4 展示了 Snort 配置文件的一部分。
清单 4. 默认的 snort.conf 文件
# stream5: Target Based stateful inspection/stream reassembly for Snort # --------------------------------------------------------------------- # Stream5 is a target-based stream engine for Snort. Its functionality # replaces that of Stream4. Consequently, BOTH Stream4 and Stream5 # cannot be used simultaneously. Comment out the stream4 configurations # above to use Stream5. # # See README.stream5 for details on the configuration options. # # Example config (that emulates Stream4 with UDP support compiled in) preprocessor stream5_global: max_tcp 8192, track_tcp yes, \ track_udp no preprocessor stream5_tcp: policy first, use_static_footprint_sizes # preprocessor stream5_udp: ignore_any_rules # Performance Statistics # ---------------------- # Documentation for this is provided in the Snort Manual. You should read it. # It is included in the release distribution as doc/snort_manual.pdf # # preprocessor perfmonitor: time 300 file /var/snort/snort.stats pktcnt 10000 # http_inspect: normalize and detect HTTP traffic and protocol anomalies # # lots of options available here. See doc/README.http_inspect. # unicode.map should be wherever your snort.conf lives, or given # a full path to where snort can find it. preprocessor http_inspect: global \ iis_unicode_map unicode.map 1252 preprocessor http_inspect_server: server default \ profile all ports { 80 8080 8180 } oversize_dir_length 500 # # Example unique server configuration # #preprocessor http_inspect_server: server 1.1.1.1 \ # ports { 80 3128 8080 } \ # flow_depth 0 \ # ascii no \ # double_decode yes \ # non_rfc_char { 0x00 } \ # chunk_length 500000 \ # non_strict \ # oversize_dir_length 300 \ # no_alerts # rpc_decode: normalize RPC traffic # --------------------------------- # RPC may be sent in alternate encodings besides the usual 4-byte encoding # that is used by default. This plugin takes the port numbers that RPC # services are running on as arguments - it is assumed that the given ports # are actually running this type of service. If not, change the ports or turn # it off. # The RPC decode preprocessor uses generator ID 106 # # arguments: space separated list # alert_fragments - alert on any rpc fragmented TCP data # no_alert_multiple_requests - don't alert when >1 rpc query is in a packet # no_alert_large_fragments - don't alert when the fragmented # sizes exceed the current packet size # no_alert_incomplete - don't alert when a single segment # exceeds the current packet size preprocessor rpc_decode: 111 32771 # content goes on for a long time...
因此一个单个配置语句如下所示:
preprocessor rpc_decode: 111 32771
Snort 在这里使用了大量的关键字,但是为了配合本文的主题,即提供一种实用的、基本的 Snort 方法,因此不会过多涉及这些内容。但是,需要在这个文件中注意两项内容:
- 简短的 Snort 指令,通常包括
preprocessor
语句(关于查找内容)和用于发出警告的output
语句(未显示在清单 4 中)。 - 默认的 snort.conf 文件实际上是一个功能完整的、有用的配置文件。这不是无用数据,它可用于 Snort 安装。
使用 Snort 检测入侵
准备好配置文件后,可以作为一种入侵检测程序运行 Snort(将在稍后添加规则),清单 5 展示了以 IDS 形式启动 Snort 的输出,并在前台运行。
清单 5. 作为 IDS 运行 Snort
bdm0509:/usr/local/snort-2.8.1] sudo snort -de -l logs/ -c etc/snort.conf Running in IDS mode --== Initializing Snort ==-- Initializing Output Plugins! Initializing Preprocessors! Initializing Plug-ins! Parsing Rules file etc/snort.conf PortVar 'HTTP_PORTS' defined : [ 80 ] PortVar 'SHELLCODE_PORTS' defined : [ 0:79 81:65535 ] PortVar 'ORACLE_PORTS' defined : [ 1521 ] Frag3 global config: Max frags: 65536 Fragment memory cap: 4194304 bytes Frag3 engine config: Target-based policy: FIRST Fragment timeout: 60 seconds Fragment min_ttl: 1 Fragment ttl_limit (not used): 5 Fragment Problems: 1 Stream5 global config: Track TCP sessions: ACTIVE Max TCP sessions: 8192 Memcap (for reassembly packet storage): 8388608 Track UDP sessions: INACTIVE Track ICMP sessions: INACTIVE Stream5 TCP Policy config: Reassembly Policy: FIRST Timeout: 30 seconds Min ttl: 1 Options: Static Flushpoint Sizes: YES Reassembly Ports: 21 client (Footprint) 23 client (Footprint) 25 client (Footprint) 42 client (Footprint) 53 client (Footprint) 80 client (Footprint) 110 client (Footprint) 111 client (Footprint) 135 client (Footprint) 136 client (Footprint) 137 client (Footprint) 139 client (Footprint) 143 client (Footprint) 445 client (Footprint) 513 client (Footprint) 514 client (Footprint) 1433 client (Footprint) 1521 client (Footprint) 2401 client (Footprint) 3306 client (Footprint) HttpInspect Config: GLOBAL CONFIG Max Pipeline Requests: 0 Inspection Type: STATELESS Detect Proxy Usage: NO IIS Unicode Map Filename: etc/unicode.map IIS Unicode Map Codepage: 1252 DEFAULT SERVER CONFIG: Server profile: All Ports: 80 8080 8180 Flow Depth: 300 Max Chunk Length: 500000 Max Header Field Length: 0 Inspect Pipeline Requests: YES URI Discovery Strict Mode: NO Allow Proxy Usage: NO Disable Alerting: NO Oversize Dir Length: 500 Only inspect URI: NO Ascii: YES alert: NO Double Decoding: YES alert: YES %U Encoding: YES alert: YES Bare Byte: YES alert: YES Base36: OFF UTF 8: OFF IIS Unicode: YES alert: YES Multiple Slash: YES alert: NO IIS Backslash: YES alert: NO Directory Traversal: YES alert: NO Web Root Traversal: YES alert: YES Apache WhiteSpace: YES alert: NO IIS Delimiter: YES alert: NO IIS Unicode Map: GLOBAL IIS UNICODE MAP CONFIG Non-RFC Compliant Characters: NONE Whitespace Characters: 0x09 0x0b 0x0c 0x0d rpc_decode arguments: Ports to decode RPC on: 111 32771 alert_fragments: INACTIVE alert_large_fragments: ACTIVE alert_incomplete: ACTIVE alert_multiple_requests: ACTIVE Portscan Detection Config: Detect Protocols: TCP UDP ICMP IP Detect Scan Type: portscan portsweep decoy_portscan distributed_portscan Sensitivity Level: Low Memcap (in bytes): 10000000 Number of Nodes: 36900 ERROR: Unable to open rules file: ../rules/local.rules or etc/../rules/local.rules Fatal Error, Quitting..
截至最后一行为止,一切运行顺利。Snort 期望发现一些规则文件,但是没有找到,因此出现错误。
默认的配置文件包含一些规则文件
Snort 提供了一些标准规则文件,具有预定义的名称和函数。如果再次打开 snort.conf 文件,并浏览最底部的内容,将看到如清单 6 所示的一组命令:
清单 6. snort.conf 文件的底部
#################################################################### # Step #6: Customize your rule set # # Up to date snort rules are available at http://www.snort.org # # The snort Web site has documentation about how to write your own custom snort # rules. #========================================= # Include all relevant rulesets here # # The following rulesets are disabled by default: # # web-attacks, backdoor, shellcode, policy, porn, info, icmp-info, virus, # chat, multimedia, and p2p # # These rules are either site policy specific or require tuning in order to not # generate false positive alerts in most environments. # # Please read the specific include file for more information and # README.alert_order for how rule ordering affects how alerts are triggered. #========================================= include $RULE_PATH/local.rules include $RULE_PATH/bad-traffic.rules include $RULE_PATH/exploit.rules include $RULE_PATH/scan.rules include $RULE_PATH/finger.rules include $RULE_PATH/ftp.rules include $RULE_PATH/telnet.rules include $RULE_PATH/rpc.rules include $RULE_PATH/rservices.rules include $RULE_PATH/dos.rules include $RULE_PATH/ddos.rules include $RULE_PATH/dns.rules include $RULE_PATH/tftp.rules include $RULE_PATH/web-cgi.rules include $RULE_PATH/web-coldfusion.rules include $RULE_PATH/web-iis.rules include $RULE_PATH/web-frontpage.rules include $RULE_PATH/web-misc.rules include $RULE_PATH/web-client.rules include $RULE_PATH/web-php.rules include $RULE_PATH/sql.rules include $RULE_PATH/x11.rules include $RULE_PATH/icmp.rules include $RULE_PATH/netbios.rules include $RULE_PATH/misc.rules include $RULE_PATH/attack-responses.rules include $RULE_PATH/oracle.rules include $RULE_PATH/mysql.rules include $RULE_PATH/snmp.rules include $RULE_PATH/smtp.rules include $RULE_PATH/imap.rules include $RULE_PATH/pop2.rules include $RULE_PATH/pop3.rules include $RULE_PATH/nntp.rules include $RULE_PATH/other-ids.rules # include $RULE_PATH/web-attacks.rules # include $RULE_PATH/backdoor.rules # include $RULE_PATH/shellcode.rules # include $RULE_PATH/policy.rules # include $RULE_PATH/porn.rules # include $RULE_PATH/info.rules # include $RULE_PATH/icmp-info.rules # include $RULE_PATH/virus.rules # include $RULE_PATH/chat.rules # include $RULE_PATH/multimedia.rules # include $RULE_PATH/p2p.rules # include $RULE_PATH/spyware-put.rules # include $RULE_PATH/specific-threats.rules include $RULE_PATH/experimental.rules # include $PREPROC_RULE_PATH/preprocessor.rules # include $PREPROC_RULE_PATH/decoder.rules # Include any thresholding or suppression commands. See threshold.conf in the #/etc directory for details. Commands don't necessarily need to be # contained in this conf, but a separate conf makes it easier to maintain them. # Note for Windows users: You are advised to make this an absolute path, # such as: c:\snort\etc\threshold.conf # Uncomment if needed. # include threshold.conf
该文件试图包含一些规则文件,这些行中最主要的一行如下所示:
include $RULE_PATH/local.rules
接下来,要运行 Snort 需要一些可以加载和使用的规则。
回页首
告诉 Snort 如何使用规则
规则在 Snort 术语里面就是 Snort 指令;具体来讲,规则就是如何检查、分析或报告包。虽然配置是关于 Snort 如何操作的更加一般化的规则集,但在包每次跨过所监视的网络接口时,规则将告诉 Snort 执行什么操作。
Snort 中的规则由两个基本部分组成:
- 告诉 Snort 查找包中的特定内容,例如 Web 请求中的
GET
或 telnet 连接中的特定端口。 - 告诉 Snort 在找到特定内容时执行何种操作。多数情况下仅是触发一个警告,允许您对警告进行响应。
因此对于每一个可能的入侵连接,Snort 都需要使用一条规则(或涵盖多个相关入侵的规则)。这种方法的缺点十分明显:需要处理的入侵太多了。即使是专职网络管理员或系统管理员,也无法应付所有不同的入侵,而且新的入侵每天都会出现。更糟糕的是,如果您是一个小型组织的 Web 开发人员,并且兼管 Snort,或者试图劝说已经满负荷工作的管理员再负责 Snort,这更不可能。所幸的是,Snort 解决了这些问题。
Snort 要求用户必须进行免费注册
大多数 Web 友好的开源项目不会要求您进行注册。但是必须注册 Snort。只有注册后才能免费下载 Snort 提供的默认规则,这也是本文下一小节的主题。访问 Snort 站点(参见 参考资料),单击 Registration 链接进行注册。
获得 Snort 的默认规则
由于 Snort 是一种技术性的、特定于网络的产品,人们在不断改进 Snort 的同时更新目前流行的入侵类型 —— 以及如何检测并响应这些入侵。每当发布 Snort 的新版本时,将附带一组新的 “默认” 规则集。这个默认规则集基本上涵盖了需要进行保护的所有内容,并且非常简单。
导航到 Snort Web 站点(访问 参考资料 小节的链接),单击左侧导航的 Rules 链接。在规则页面的顶部有一个灰色的导航栏,单击上面的 VRT Rules。向下滚动已注册用户部分,可以找到一组匹配您所使用的 Snort 版本的规则集;图 1 显示了这部分 Snort 站点。
注意:确保在下载规则之前已经登录。
图 1. 从 Snort Web 站点下载默认规则
这将下载一个 ZIP 文件,名为 snortrules-snapshot-2.8.tar.gz。展开这个文件,将得到一个名为 snortrules-snapshot-2.8_s 的文件夹。这个文件夹的内容如图 2 所示。
图 2. 从 Snort Web 站点获得规则
“安装” 默认规则集
默认情况下,Snort 至少会在 Snort 安装的 rules 目录中查找一个名为 local.rules 的规则集。因此,利用刚才下载的规则,只需将展开的规则文件夹复制或移动到 Snort 安装目录:
[bdm0509:/usr/local/snort-2.8.1] cp -rp ~/Downloads/snortrules-snapshot-2.8_s/rules .
还应该复制下载的规则中的 etc/ 目录。这将更新您的默认配置,从而包括任何附加的规则文件,这些规则文件可能需要用于这个版本的规则:
[bdm0509:/usr/local/snort-2.8.1] cp -rp ~/Downloads/snortrules-snapshot-2.8_s/etc .
完成以上所有操作后,您的 Snort 目录结构应当如清单 7 所示。
清单 7. 含有一个规则目录的 Snort 安装目录
[bdm0509:/usr/local/snort-2.8.1] ls COPYING autom4te.cache configure.in ltmain.sh snort.8 ChangeLog config.guess contrib m4 src LICENSE config.h depcomp missing stamp-h1 Makefile config.h.in doc mkinstalldirs templates Makefile.am config.log etc preproc_rules verstuff.pl Makefile.in config.status install-sh rpm ylwrap RELEASE.NOTES config.sub libtool rules aclocal.m4 configure logs schemas
嵌套的目录中也包含了大量规则。清单 8 展示了从 Snort 站点获得的所有规则文件。
清单 8. Snort 的 rules/ 目录中的规则
[bdm0509:/usr/local/snort-2.8.1] ls rules Makefile.am info.rules smtp.rules VRT-License.txt local.rules snmp.rules attack-responses.rules misc.rules specific-threats.rules backdoor.rules multimedia.rules spyware-put.rules bad-traffic.rules mysql.rules sql.rules cgi-bin.list netbios.rules telnet.rules chat.rules nntp.rules tftp.rules content-replace.rules open-test.conf virus.rules ddos.rules oracle.rules voip.rules deleted.rules other-ids.rules web-attacks.rules dns.rules p2p.rules web-cgi.rules dos.rules policy.rules web-client.rules experimental.rules pop2.rules web-coldfusion.rules exploit.rules pop3.rules web-frontpage.rules finger.rules porn.rules web-iis.rules ftp.rules rpc.rules web-misc.rules icmp-info.rules rservices.rules web-php.rules icmp.rules scan.rules x11.rules imap.rules shellcode.rules
在 Mac OS X 上的问题
如果在这个阶段尝试在大多数平台上运行 Snort,则应该没有问题。然而,值得一提的是与 Mac OS X 有关的一些问题,特别是在将 Snort 引入 UNIX 或 Linux 生产服务器之前使用 Mac 作为测试机器。需要执行一些步骤才能在 Mac OS X 上正确地运行 Snort。
首先,需要删除当前的 Snort 安装并重新构建。但不需要手工删除文件。运行以下命令即可:
make clean
上面的命令将删除所有文件,为重新构建适合 Mac OS X 的安装做好准备。然后,发出以下命令:
[bdm0509:/usr/local/snort-2.8.1] glibtoolize --force Using `AC_PROG_RANLIB' is rendered obsolete by `AC_PROG_LIBTOOL' [bdm0509:/usr/local/snort-2.8.1] sudo aclocal -I m4 Password: [bdm0509:/usr/local/snort-2.8.1] sudo autoheader [bdm0509:/usr/local/snort-2.8.1] sudo automake --add-missing --copy [bdm0509:/usr/local/snort-2.8.1] sudo autoconf [bdm0509:/usr/local/snort-2.8.1] export LD_TWOLEVEL_NAMESPACE=1
现在,可以重新运行 make
命令,然后运行 make install
命令(上一篇文章已详细描述)。您将获得大量输出,现在基本上可以开始运行 Snort 了。
还需要进行一处修改,即 etc/snort.conf 配置文件。在 snort.conf 文件中查找以下行(最简单的方法是搜索 “dynamicengine”)。
# # Load a dynamic engine from the install path # (same as command line option --dynamic-engine-lib) # dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.so
通过在行首插入 #
符号注释掉 dynamicengine 行,然后添加以下粗体显示的行:
# # Load a dynamic engine from the install path # (same as command line option --dynamic-engine-lib) # #dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.so dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.dylib
还需要执行几个类似的修改。搜索 “Step #2”,将看到清单 9 所示的内容:
清单 9. 在代码中搜索 Step #2
#################################################### # Step #2: Configure dynamic loaded libraries ## If snort was configured to use dynamically loaded libraries, # those libraries can be loaded here.# # Each of the following configuration options can be done via# the command line as well. ## Load all dynamic preprocessors from the install path # (same as command line option --dynamic-preprocessor-lib-dir) # dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.so dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.so dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.so dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.so dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.so # Comment out above and uncomment this if running OSX # #dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.dylib #dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.dylib #dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.dylib #dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.dylib #dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.dylib
注意:为了方便输出和在 Web 上查看,一些行被人为地打断。这些指令在 snort.conf 中都在同一行上,您应该在自己的配置文件中保持这种格式。
您将需要如实地根据说明操作。注释掉前面的几行,然后去掉后面几行的注释,如清单 10 所示。
清单 10. 显示需要注释和去掉注释的行
#################################################### # Step #2: Configure dynamic loaded libraries ## If snort was configured to use dynamically loaded libraries, # those libraries can be loaded here.# # Each of the following configuration options can be done via# the command line as well. ## Load all dynamic preprocessors from the install path # (same as command line option --dynamic-preprocessor-lib-dir) # #dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.so #dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.so #dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.so #dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.so #dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.so # Comment out above and uncomment this if running OSX # dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_dcerpc_preproc.dylib dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_dns_preproc.dylib dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_ftptelnet_preproc.dylib dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_smtp_preproc.dylib dynamicpreprocessor file /usr/local/lib/snort_dynamicpreprocessor/libsf_ssh_preproc.dylib
现在,可以运行 Snort 了,看上去似乎需要很多工作,但是使用与网络或系统相关的工具可以轻松地完成此类配置。最棒的是这种工作只需做一次(或少数几次)。
但是,在继续之前需要注意,由于大多数规则包含一个新版本的 snort.conf 文件,您需要在每次复制新的文件或 etc/ 目录时执行这些步骤的最后一个步骤。
这些内容的细节不是本文探讨的范围,并且涉及到真正的网络和系统管理员问题,作为一名 Web 开发人员或设计师不需要花时间细究这些问题。现在,只需执行这些指令,如果有兴趣进一步了解,可访问 Snort 在线论坛(参见 参考资料)。
以 IDS 的形式运行 Snort
具备了默认的规则集,并且对 Mac OS X(如果使用该平台的话)进行了调整,就可以开始启动 Snort 了。清单 11 显示了需要使用的命令,以及该命令的一部分输出。
清单 11. 运行 Snort(没错错误)
[bdm0509:/usr/local/snort-2.8.1] sudo snort -de -l logs/ -c etc/snort.conf Running in IDS mode --== Initializing Snort ==-- Initializing Output Plugins! Initializing Preprocessors! Initializing Plug-ins! Parsing Rules file etc/snort.conf PortVar 'HTTP_PORTS' defined : [ 80 ] PortVar 'SHELLCODE_PORTS' defined : [ 0:79 81:65535 ] PortVar 'ORACLE_PORTS' defined : [ 1521 ] Frag3 global config: Max frags: 65536 Fragment memory cap: 4194304 bytes Frag3 engine config: Target-based policy: FIRST Fragment timeout: 60 seconds Fragment min_ttl: 1 Fragment ttl_limit (not used): 5 Fragment Problems: 1 Stream5 global config: Track TCP sessions: ACTIVE Max TCP sessions: 8192 Memcap (for reassembly packet storage): 8388608 Track UDP sessions: INACTIVE Track ICMP sessions: INACTIVE Stream5 TCP Policy config: Reassembly Policy: FIRST Timeout: 30 seconds Min ttl: 1 Options: Static Flushpoint Sizes: YES Reassembly Ports: 21 client (Footprint) 23 client (Footprint) 25 client (Footprint) 42 client (Footprint) 53 client (Footprint) 80 client (Footprint) ... LOTS more output like this for a while... ... +++++++++++++++++++++++++++++++++++++++++++++++++++ Initializing rule chains... 8771 Snort rules read 8771 detection rules 0 decoder rules 0 preprocessor rules 8771 Option Chains linked into 501 Chain Headers 0 Dynamic rules +++++++++++++++++++++++++++++++++++++++++++++++++++ +-------------------[Rule Port Counts]--------------------------------------- | tcp udp icmp ip | src 1011 38 0 0 | dst 6684 429 0 0 | any 494 117 20 7 | nc 15 4 3 4 | s+d 16 16 0 0 +---------------------------------------------------------------------------- +-----------------------[thresholding-config]---------------------------------- | memory-cap : 1048576 bytes +-----------------------[thresholding-global]---------------------------------- | none +-----------------------[thresholding-local]----------------------------------- | gen-id=1 sig-id=12224 type=Limit tracking=src count=1 seconds=600 | gen-id=1 sig-id=12228 type=Limit tracking=src count=1 seconds=30 | gen-id=1 sig-id=7055 type=Limit tracking=src count=1 seconds=300 | gen-id=1 sig-id=7069 type=Limit tracking=src count=1 seconds=300 | gen-id=1 sig-id=7068 type=Limit tracking=src count=1 seconds=300 | gen-id=1 sig-id=7074 type=Limit tracking=src count=1 seconds=600 | gen-id=1 sig-id=12121 type=Limit tracking=src count=1 seconds=300 | gen-id=1 sig-id=12122 type=Limit tracking=src count=1 seconds=18000 ... More packet information rolling by... ... +-----------------------[suppression]------------------------------------------ | none ------------------------------------------------------------------------------- Rule application order: activation->dynamic->pass->drop->alert->log Log directory = logs/ Verifying Preprocessor Configurations! Warning: 'ignore_any_rules' option for Stream5 UDP disabled because of UDP rule with flow or flowbits option Warning: flowbits key 'access.download' is set but not ever checked. Warning: flowbits key 'dce.bind.mqqm' is checked but not ever set. Warning: flowbits key 'sylk.download' is set but not ever checked. Warning: flowbits key 'AdvancedSpy_detection' is set but not ever checked. Warning: flowbits key 'works.download' is set but not ever checked. Warning: flowbits key 'mspub_header' is set but not ever checked. 358 out of 512 flowbits in use. *** *** interface device lookup found: en0 *** Initializing Network Interface en0 Decoding Ethernet on interface en0 [ Port Based Pattern Matching Memory ] +-[AC-BNFA Search Info Summary]------------------------------ | Instances : 835 | Patterns : 210306 | Pattern Chars : 1938187 | Num States : 1108715 | Num Match States : 177685 | Memory : 26.49Mbytes | Patterns : 5.86M | Match Lists : 7.21M | Transitions : 13.36M +------------------------------------------------- --== Initialization Complete ==-- ,,_ -*> Snort! <*- o" )~ Version 2.8.1 (Build 28) '''' By Martin Roesch & The Snort Team: http://www.snort.org/team.html (C) Copyright 1998-2008 Sourcefire Inc., et al. Using PCRE version: 6.5 01-Feb-2006 Rules Engine: SF_SNORT_DETECTION_ENGINE Version 1.8Preprocessor Object: SF_SSH Version 1.1 Preprocessor Object: SF_SMTP Version 1.1 Preprocessor Object: SF_FTPTELNET Version 1.1 Preprocessor Object: SF_DNS Version 1.1 Preprocessor Object: SF_DCERPC Version 1.1 Not Using PCAP_FRAMES System will wait here until you exit Snort... ^C*** Caught Int-Signal Run time prior to being shutdown was 356.123989 seconds =============================================================================== Packet Wire Totals: Received: 893 Analyzed: 893 (100.000%) Dropped: 0 (0.000%) Outstanding: 0 (0.000%) =============================================================================== Breakdown by protocol (includes rebuilt packets): ETH: 893 (100.000%) ETHdisc: 0 (0.000%) VLAN: 0 (0.000%) IPV6: 4 (0.448%) IP6 EXT: 0 (0.000%) IP6opts: 0 (0.000%) IP6disc: 0 (0.000%) IP4: 884 (98.992%) IP4disc: 0 (0.000%) TCP 6: 0 (0.000%) UDP 6: 0 (0.000%) ICMP6: 0 (0.000%) ICMP-IP: 0 (0.000%) TCP: 807 (90.370%) UDP: 74 (8.287%) ICMP: 3 (0.336%) TCPdisc: 0 (0.000%) UDPdisc: 0 (0.000%) ICMPdis: 0 (0.000%) FRAG: 0 (0.000%) FRAG 6: 0 (0.000%) ARP: 5 (0.560%) EAPOL: 0 (0.000%) ETHLOOP: 0 (0.000%) IPX: 0 (0.000%) OTHER: 0 (0.000%) DISCARD: 0 (0.000%) InvChkSum: 458 (51.288%) S5 G 1: 0 (0.000%) S5 G 2: 0 (0.000%) Total: 893 =============================================================================== Action Stats: ALERTS: 33 LOGGED: 33 PASSED: 0 =============================================================================== Frag3 statistics: Total Fragments: 0 Frags Reassembled: 0 Discards: 0 Memory Faults: 0 Timeouts: 0 Overlaps: 0 Anomalies: 0 Alerts: 0 FragTrackers Added: 0 FragTrackers Dumped: 0 FragTrackers Auto Freed: 0 Frag Nodes Inserted: 0 Frag Nodes Deleted: 0 =============================================================================== Stream5 statistics: Total sessions: 62 TCP sessions: 18 UDP sessions: 44 ICMP sessions: 0 TCP Prunes: 0 UDP Prunes: 0 ICMP Prunes: 0 TCP StreamTrackers Created: 20 TCP StreamTrackers Deleted: 20 TCP Timeouts: 4 TCP Overlaps: 0 TCP Segments Queued: 0 TCP Segments Released: 0 TCP Rebuilt Packets: 0 TCP Segments Used: 0 TCP Discards: 120 UDP Sessions Created: 46 UDP Sessions Deleted: 46 UDP Timeouts: 2 UDP Discards: 0 Events: 0 =============================================================================== HTTP Inspect - encodings (Note: stream-reassembled packets included): POST methods: 0 GET methods: 0 Post parameters extracted: 0 Unicode: 0 Double unicode: 0 Non-ASCII representable: 0 Base 36: 0 Directory traversals: 0 Extra slashes ("//"): 0 Self-referencing paths ("./"): 0 Total packets processed: 238 =============================================================================== Snort exiting
这产生了大量输出,并且指出了为什么在命令行运行 Snort 是一种临时的低效的方法。最好是在一个长期的持久的基础上运行 Snort(作为系统或后台进程运行)。
但是,在进一步分析规则之前,如清单 11 所示,在 sudo snort -de -l logs/ -c etc/snort.conf
命令中,应该将运行 Snort 的命令的各个部分分解。下面解释了各个部分的作用:
sudo
:允许您使用管理特权运行 Snort。上一篇文章对此已做讨论,但简而言之,Snort 需要比普通用户更多的权限。snort
:显然,这用来运行 Snort。-de
:“d” 选项使 Snort 侦听并显示应用程序层的数据,而 “e” 显示链接层包报头。这个选项实际上提供了有关 Snort 包嗅探的最详尽的记录(但都是必要的)。-l logs/
:告诉 Snort 记录包和生成的警告,并将所有内容放入到 logs/ 目录。-c etc/snort.conf
:表示使用 etc/snort.conf 作为配置文件来运行 Snort。
回页首
三种基本的规则
在使用当前的规则集运行 Snort 后,可以进一步编写您自己的规则。这种方法可以添加安全性和针对特定问题的检查,并意味着基于 Web 的攻击和与 HTTP 有关的问题将是关注的重点。但是,您首先需要了解一些有关规则构建的概念和理论。
下面是一些通用的规则类型。通过查看每一种类型,您将大致了解使用 Snort 规则可以实现哪些操作。
- 包基于它们所指向的端口的规则。这些规则主要侧重于接收包的端口。可以很容易地判断应用程序应该打开哪些端口,因此这种方法可以监视异常的或已关闭端口中潜在的非法通信。在这里,最常出现攻击源的是 IRC(Internet Relay Chat),下面的这条规则可以防止非法利用通用的 IRC 端口:
alert tcp $EXTERNAL_NET any -> $HOME_NET 6666:7000 (msg:"EXPLOIT CHAT IRC topic overflow"; flow:to_client,established; content:"|EB|K[S2|E4 83 C3 0B|K|88 23 B8|Pw"; reference:bugtraq,573; reference:cve,1999-0672; classtype:attempted-user; sid:307; rev:9;)
- 包基于包协议的规则。这些规则侧重于使用的协议,比如 HTTP 或 IP Mobility。例如,下面这条规则可以检测到潜在的恶意 SMTP SSL 请求:
alert tcp $SMTP_SERVERS 465 -> $EXTERNAL_NET any (msg:"SMTP SSLv2 Server_Hello request"; flow:from_server,established; flowbits:isset,sslv2.client_hello.request; content:"|04|"; depth:1; offset:2; content:"|00 02|"; depth:2; offset:5; flowbits:set,sslv2.server_hello.request; flowbits:noalert; metadata:policy balanced-ips drop, policy connectivity-ips drop, policy security-ips drop, service smtp; classtype:protocol-command-decode; sid:3497; rev:4;)
- 包基于相关的应用程序的规则。很多应用程序本身没有问题,但是存在潜在的安全漏洞,比如这种应用程序所使用的某个端口或协议存在漏洞。下面的规则可以防止一种顽固的访问漏洞,即允许不当的下载请求:
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"WEB-CLIENT Microsoft Access file download request"; flow:to_server, established; content:"GET"; nocase; uricontent:".mdb"; nocase; flowbits:set,access.download; flowbits:noalert; metadata:service http; reference:url,support.microsoft.com/kb/925330; classtype:misc-activity; sid:13627; rev:1;)
对于包来讲,不需要理解这些规则中的每一个选项;事实上,要做的是查看 nocase
的内容,而不是如何理解它的含义,或者弄明白规则创建者如何知道 IRC 通信流量通常经过 6666 与 7000 之间的端口。虽然提到过很多次,但是这里还要再重复一遍:如果您是一名设计人员,那么就关注设计方面的内容,如果是一名编程人员,那么就关注编程。以您的主要职能为重点,然后了解相关的 Snort 知识并使用它。随后则由网络或系统管理员来研究每个细节选项。
回页首
一些常用的规则
尽管不需要了解规则的所有细节,但是有些规则是应该熟悉的。这些规则侧重于 Web 或与 Web 相关的问题,并且不一定包含在从 Snort 获得的默认规则集中。
避免成为垃圾邮件中转站
首先,应当始终防止您的机器(为数百万个用户提供 Web 内容的机器)成为一个邮件中转站。大多数垃圾邮件发送者是这样工作的:他们通过另一个不受保护的机器发送邮件并隐藏自己的身份。实施这种保护实际上出于两种重要的原因:
- 很明显,垃圾邮件不是什么好东西,没有人希望自己的服务器成为垃圾邮件发送者的资源。
- 您的服务器的 IP 会被阻塞。这个问题对于 Web 开发人员来说更加严重。如果其他网络及其管理员意识到您的服务器是发送垃圾邮件的源头,那么很可能阻止您的服务器的 IP 地址访问他们的网络。在某些情况下,这只会影响邮件(来自您的服务器的邮件被阻塞或列入黑名单)。然而,有些情况下,来自或流向您的服务器的所有通信都将被阻塞。这意味着当有人尝试从这个网络访问您的站点时,他们也将受到阻塞,这也将缩减您的用户群。
清单 12 展示了一个示例规则,可以将它添加到 Snort 设置中处理邮件转发。
清单 12. 使用规则防止邮件转发
alert tcp $SMTP_SERVERS 25 -> $EXTERNAL_NET any (msg:"Possible mail relay usage"; content:"Relaying denied"; flags:A+; classtype:trojan-activity; sid:1000001; rev:1;)
详细分析 403 错误
有时您希望 Snort 显示信息警告的内容。这些警告提供有用的数据,但是需要采用人工进一步分析。一个很好的例子就是 403 禁止消息(在请求受保护资源时 Web 服务器生成禁止消息)。Snort 可以检测所有这些 “403 - forbidden” 错误,然后发出警告。您将得到如下内容:
HTTP/1.0 403 Access denied to 72.187.80.82/../../windows/system/cmd.exe
显然,这不仅仅是一个错误的 URL 或坏链接……而是试图恶意利用一个命令行可执行文件。当然,可能还会得到类似如下的警告:
HTTP/1.0 403 Access denied to 203.42.142.32/images/sg_talking.jpg
乍看上去好像一切正常;似乎只是一个关于图像的权限问题。因此首先确定是否需要将一个 IP 或网络添加到黑名单,其次,需要检查您的应用程序。总之,您需要有关 403 的信息,以便作出决定。清单 13 显示了报告这些信息的规则。
清单 13. 报告 403 错误的规则
alert tcp $HTTP_SERVERS $HTTP_PORTS -> $EXTERNAL_NET any (msg:"ATTACK-RESPONSES 403 Forbidden"; flow:from_server,established; content:"HTTP/1.1 403"; depth:12; classtype:attempted-recon; sid:1201; rev:7;)
实际上这条规则现在包含在了较新的 Snort 版本中,但是如果您已经安装了 Snort,那么确保包含这条规则。如果管理员用电子邮件每月向您发送规则生成的警告,您将得到一些益处。这可以使您了解自己的应用程序设计中存在的潜在安全问题。
避免成为 Snort 权威
最后一条忠告,特别是针对小型组织中的人员:小心不要成为 Snort 权威。学习 Snort 将投入大量的时间,这样就无法将精力集中在您的专长上:设计站点和构建 Web 应用程序等。当然,如果希望 进一步了解网络,那么就尽情地研究 Snort 吧。但是最好向目前的管理员推荐类似本文的文章,并鼓励他们完成这些工作,而不是成为他们学习 Snort 知识的管道。
从某种角度而言,对安全性有了一定的了解之后,就应该就此打住。学习一些关于 Snort 或其他 IDS 知识是容易的,并且容易因此变得多疑。攻击 Web 应用程序有很多方法,您不可能阻止所有攻击方式。与其熟悉并精通 Snort,还不如与管理员建立良好的关系。告诉他们您的安全需求和顾虑,然后由他们解决问题。从长远来看,与亲自接揽本应由管理员负责的安全性维护相比,这将受益匪浅。
回页首
结束语
好像 Snort 应该是由系统和网络管理员来使用的工具。作为一名 Web 设计师或应用程序编程人员,和管理员一起讨论他们如何安装 Snort 时,您可能会感到茫然。因此,如果您将这篇文章(或包含一些 Snort 规则的文本文件)交给管理员时,可能会遭到拒绝,您要为此做好心理准备。
尽管如此,您的职责 是将所有工作整合到设计良好的 Web 站点,或一个经过调优的 Web 应用程序。因此,如果将保护您的工作成果的职责完全交付给其他人,那么这样做不仅愚蠢而且是不负责任的。通过一些准备工作、一些前瞻性考虑以及与您的管理员进行深入的交流,您将可以获得一些提示、技巧和本文详述的规则,并应用到企业的 Snort 设置中。如果您在一个更小的组织中工作,可能需要亲自负责 Snort 的工作。这也没有关系;它允许您使用正确的方式保护您的应用程序,并且最重要的是,确保您 Web 站点可以一直安全运行,使您可以在晚上关掉手机、传呼机等睡个安稳的觉。
最重要的是,Snort 可以让您的 Web 应用程序在更广阔的环境中运行。 如果选择将站点和应用程序放在 Internet 中,那么将在一个非常公开的环境中运行;因此不能确定所有内容运行正常。然而,通过与管理员和组织中的其他成员进行交流,对 Snort 有了充分的了解,那么就可以在开发并部署应用程序之后实现长期运行。
参考资料
学习
- 您可以参阅本文在 developerWorks 全球网站上的 英文原文。
- 本系列的第 1 部分 Snort 使用手册,第 1 部分:安装和配置(developerWorks,2007 年 6 月),介绍 Snort 安装细节并帮助您检测 Web 站点入侵。
- Snort Web 站点 提供了有关 Snort 的所有内容。
- Red Hat Linux 提供了一个出色的特性,可以 使用 Snort 保护您的 Red Hat Linux 系统。虽然有一点过时,但是基本概念仍然适用。
- 如果希望拥有 Snort 的强大功能,但是需要提供专业支持的商业产品,请查看构建在 Snort 之上的 Sourcefire 的 IDS。
- 访问 Snort 在线论坛,在线解答有关 Snort 的疑问。
获得产品和技术
- The Snort 下载主页 提供了所有 Snort 二进制文件和源文件下载。
- 您可以从 Apple Developer Connection 下载一个面向 Mac OS X 的 C 编译器。可能需要一个帐户,但是可以免费注册和下载。
- 下载 Perl Compatible Regular Expressions 库。
- WinPcap 允许在 Windows 平台上实现 Snort 链接层网络访问。
- Managing Security with Snort and IDS Tools(Kerry Cox 和 Christopher Gerg,O'Reilly Media,Inc.)提供了有关安全性的更全面的介绍,并为站点管理提供了大量与 Snort 相关的内容。
- Snort Cookbook(Angela Orebaugh、Simon Biles 和 Jacob Babbin,O'Reilly Media, Inc.)是一份出色的参考资料,介绍了 Snort 知识和一些特殊任务,涵盖了基本安装、高级入侵检测和网络优化等