原文地址:http://www.ibm.com/developerworks/cn/web/wa-snort1/
保护和分析 Web 站点及其流量
简介: Web 站点是 Internet 技术中最脆弱也最易受攻击的部分。尝试接触 Snort,它是一款免费、开源的网络入侵防御系统(Network Intrusion Prevention System,NIPS)和网络入侵检测系统(Network Intrusion Detection System,NIDS)工具,用于管理和防御黑客入侵您的 Web 站点、应用程序和支持 Internet 的程序。了解 Snort 能够如何帮助保护您的站点,分析您的网络的真实情况。学习本文之后,您将懂得利用 Snort 提供的某些高级入侵检测,并根据 Snort 提供的信息来优化您的站点和网络。
本文的标签: snort
安全性是重中之重
假设您已经付出了几个月乃至几年的时间来学习最热门的 Web 技术。您阅读了 developerWorks 的文章,购买了相关图书,在您的 Mac OS X 终端和 Windows® shell 上进行了试验。您已经设法构建了一个非常出色的约有 100 个页面的 Web 应用程序 ——— 有一部分是静态 HTML,还有一部分由 PHP 脚本生成。您已经开始添加某些 Ajax 技术和特效,使您的站点更具交互性,更具响应能力。您正处于 Web 编程世界的巅峰。
然而某一天早上醒来之后,您突然发现站点上全是某个与您毫无相关的站点的全页横幅广告。此外,您的购物车也慢得跟蜗牛一样,因为数千个无用数据包正在冲击您的 Web 站点,这也使客户烦恼和愤怒。
尽管听起来很有戏剧性,但大多数认真的 Web 开发人都知道有些人已经遇到过类似的场景,或者自己亲身经历过这样的场景。无论您的站点或应用程序有多出色,只要未得到周全的保护,即便是相当成功的,也会成为攻击的目标。无论是十二岁的顽童,还是作为商业间谍的专业黑客,Web 站点都是非常脆弱的,比其他类型的应用程序更容易受到攻击。只要每个月支付 20 美元(或者掌握一点接线技巧),任何人都可以随意访问 Internet。您的任务是保护站点,而不仅仅是开发站点。
安全性不是他人的责任
现在,您可能在受挫地摇着头,想着:“在办公大厅另一端那个人” 负责处理安全性。您可能认为,处理安全性是那个人 的责任。尽管从理论上来说,这是正确的。但从实践角度来看,则并非如此。如果您未执行基本的入侵检测(以及防御)就将站点托付给他人,那么站点出现问题的话,就可能造成很大损失。
并非所有开发人员都是安全专家,但所有开发人员都应该 了解足够多的知识,执行某些基本的网络和流量分析,并在其应用程序内构建基本的安全性。在最糟糕的情况下,开发人员也应该把所需要的安全性告诉安全技术人员,从而确保其站点受到了保护。毫无疑问,由于您是 开发人员,安全性也就是您的 工作的一部分。
基本安全性并不困难
掌握 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、Linux 系统(如 Mac OS X),则应从主下载链接中选择下载 GZipped TAR 文件,其名称类似于 snort-2.8.0.2.tar.gz(如果在本文撰写发表之后,发布的版本出现变化,具体文件名可能会略有不同)。此文件是 Snort 的源代码,您可以通过此源代码为您的特定平台进行生成。
回页首
通过源代码安装 Snort
有三种基本安装类型:
如果您正在使用 UNIX 类型的平台,则可通过源代码生成 Snort。这是最灵活的一种选项,能够确保专为您的系统生成 Snort。这种方法要稍微多花一些功夫,也有一些命令行或终端体验,您很有可能能够顺利完成安装。
Snort 需要一些二进制文件,尤其是通过源代码安装时。因此,在开始处理 Snort 包本身之前,应准备好这些二进制文件。
在 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 所示。
[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 所示的结果。
[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 所示。
[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 所示。
[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 所示。
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 所示。
[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 的配置之间做出选择。
此屏幕上的选项均应用于登录:Snort 在嗅探包时可以登录数据库。(如果您对此感到迷惑,在下文中将得到解释。)如果您不希望登录到数据库,而是希望仅登录到文件,或者希望登录到 MySQL 数据库以及 Microsoft Access 等 ODBC 可访问的数据库,则应选择第一个选项。否则选择用于 SQL Server 或 Oracle 的选项。
选择要安装的组件
接下来是选择要包含在安装之中的组件(参见图 2)。
这里有四个选项:Snort 本身、动态模块、文档和模式。没有理由不全部安装,完全安装只需要大约 24 MB 的空间,因此应选中所有组件继续操作。
选择安装目录
默认情况下,Snort 将安装在 C:\Snort 中,如图 3 所示。
这个默认目录是理想的首选目录。因为 Snort 并没有过多的 GUI 组件,它实际上不属于典型的 Windows 应用程序,安装目录也不在 C:\Program Files 之下。除非您能够为 Snort 这样的程序选择标准安装目录,否则应使用默认设置。
安装和关闭
奇怪的是,Snort 并未提供非常有用的 “安装完成” 屏幕。与之不同,您将看到一个已经完成的状态条和一个 Close 按钮(如图 4 所示)。
单击 Close 按钮,您就会看到弹出窗口,表明 Snort(几乎)已经为运行做好了准备(如图 5 所示)。
安装 WinPcap
Snort 明确地告诉您:在 Snort 能够使用之前,还有一些安装工作需要完成。第一项就是 WinPcap。WinPcap 是 Windows Packet Capture Library 的简写,它提供了某种类型的网络访问,而 Snort 的 IDS 和包嗅探功能需要这些访问。请访问 WinPcap 的 Web 站点(参见 参考资料),单击 Get WinPcap 链接。
选择最新的稳定版本下载,在本文撰写之时,最新版本是 4.0.2。下载包括一个 Windows 安装程序,可双击启动它(如图 6 所示)。
安装非常简单,只要连续单击 Next 按钮即可。这样,WinPcap 就可随时运行了。
编辑路径
接下来的内容有些偏离主题,至少不是这篇文章关注的主题。Snort 的安装提示您编辑 snort.conf 文件,观察在哪里查找规则和其他配置文件。这非常重要,但应该是我们后面讨论的话题。目前,只要安装好 Snort 和 WinPcap 即可。
但是,这里还有一个步骤,需要处理之后才能继续。您需要将 Snort 可执行文件添加到 PATH 语句之中,它的位置是 C:\Snort\bin\snort.exe(假设您选择的是默认安装目录)。设置的位置与操作系统有关。您需要找到 System Properties 对话框(在 “控制面板” 中或者选择 “控制面板” > “系统”),选择 Advanced System Properties,注意观察一个名为 Environment Variables 的按钮或选项卡。
其中有两个框(类似于图 7)。您需要选择上边的框,也就是用户变量,它仅应用于您的用户。(您很可能不希望系统上的所有用户都能运行 Snort,而无视您竭尽全力为某些程序设定的安全性制约。)
如果还没有用于 PATH 的项,请选择上方的 New... 按钮。如果您已经有了一个项,则应选择 Edit..。在对话框中,输入 PATH 作为变量名,输入 C:\Snort\bin 作为值。图 8 展示了在完成时的效果。
选择 OK,然后关闭所有对话框。打开命令提示符,键入 snort
,您应看到类似于图 9 所示的输出结果。
提示:下文将重复这一步骤,在 运行 Snort 二进制文件 一节中,但如果您使用的是 Windows,那么值得立即学习,因为这些步骤能够纠正与环境变量设置相关的所有问题。
回页首
测试安装
在完成安装之后,您需要采取几个步骤,确保 Snort 可在系统上正常运行。一切都很简单,但在每次安装新版本的 Snort 或在新机器上安装 Snort 时都需要执行这些步骤。
运行 Snort 二进制文件
可以执行的最简单的测试就是运行 snort
命令。要开始测试,请切换到机器上的任意随机目录。但为了安全起见,请不要在 Snort 安装目录中执行此命令。您应得到类似于清单 7 所示的输出结果。
[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] |
最后出现了错误,但在这个过程中完成了一些重要的事情:
,,_ -*> 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 进行嗅探
您知道,Snort 是一种入侵检测系统,但它是如何检测入侵的呢?Snort(和大多数高端 IDS)都会嗅探 网络流量。嗅探器是一种工具或设备(带有网卡),用于监控计算机之间的网络流量。有些嗅探器是 “第三方”,嗅探外部机器与嗅探器本身之间的流量。也有一些嗅探器会嗅探网络和嗅探器本身所在计算机之间的流量。在下一期的文章中,我们将进一步介绍嗅探,如果您目前对嗅探有不明确的地方,请不要担心。
目前,嗅探是一种简单而有用的方法,能够确保 Snort 已安装且能够正常工作,能够监控网络流量。使用 -v
标记运行 snort
命令,这告知 Snort 嗅探网络流量,将信息输出到控制台。清单 8 展示了在 Mac OS X 机器上运行 snort -v
的输出结果。
[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 将一直运行。
[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 所示。
[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 是一种包嗅探器
包 就是一组格式化的数据。网络不习惯于用较大的数据块或较小的字节来表示数据,而习惯于以包为单位。包不仅提供了数据,还提供了关于数据的简单信息。这允许包的发送方表明所发送的数据类型,也使包的接收方能够在研究数据本身之前对包的数据略有认识(称为有效负载)。
包嗅探器是一种工具,它会嗅探或调查包。使用 Snort,您可以在包的级别检查网络流量,这允许您查看原始数据,以及包的接收方附加到原始数据之上的信息。这是您使用带有 -v
标记的 snort
命令时获得的结果,将 Snort 作为包嗅探器运行时,您会获得三方面的信息:
在下一篇文章中,您将了解到这些包中究竟有哪些内容,如何开始对这些包进行基本分析。目前,只需思考一下,对于各包来说,所有信息是都是针对该包报告的。这里是一个包的输出结果:
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 所示)。
[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 服务器请求/响应模型中四处传递的包。试试看您能否确定什么是 “正常” 的流量,什么是不正常的流量。请继续关注下个月的文章,我们将进一步探讨警报、规则等内容,介绍如何避免您的系统遭遇严重的入侵。
参考资料
学习
获得产品和技术
讨论
关于作者
Brett McLaughlin 自从 Logo 时代以来一直从事计算机方面的工作。(还记得那个小三角符号么?)最近几年里,他已成为 Java 和 XML 社区中最著名的作家和程序员之一。他曾在 Nextel Communications 从事复杂企业系统的实现;在 Lutris Technologies 进行实际应用服务器的编写;最近他在 O'Reilly Media, Inc. 继续编写和编辑相关书籍。Brett 即将完成的书 Head Rush Ajax 将为 Ajax 引入饱受赞誉的创新的 Head First 方法。他的上一本书 Java 1.5 Tiger: A Developer's Notebook 是第一本可获得的关于最新版本 Java 技术的书籍。而他的名著 Java and XML 仍然是在 Java 语言中使用 XML 技术的权威性著作之一。