`
sanying123
  • 浏览: 15798 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

基于Snort的入侵检测系统

阅读更多





基于Snort的入侵检测系统



用Snort,Apache,MySQL,PHP及ACID构建高级IDS


第一章 入侵检测系统及Snort介绍
在当今的企业应用环境中,安全是所有网络面临的大问题。黑客和入侵者已成功的入侵了一些大公司的网络及网站。目前已经存在一些保护网络架构及通信安全的方法,例如防火墙、虚拟专用网(VPN)、数据加密等。入侵检测是最近几年出现的相对较新的网络安全技术。利用入侵检测技术,我们可以从已知的攻击类型中发现是否有人正在试图攻击你的网络或者主机。利用入侵监测系统收集的信息,我们可以加固自己的系统,及用作其他合法用途。目前市场中也有很多弱点检测工具,包括商品化的和开放源码形式的,可以用来评估网络中存在的不同类型的安全漏洞。
一个全面的安全系统包括很多种工具:
l 防火墙:用来阻止进入及走出网络的信息流。防火墙在商业化产品和开放源码产品中都有很多。最著名的商业化防火墙产品有Checkpoint (http://www.checkpoint.com), Cisco (http://www.cisco.com)及Netscreen(http://www.netscreen.com)。最著名的开放源码防火墙是Netfilter/Iptables(http://www.netfilter.org)。
l 入侵检测系统(IDS):用来发现是否有人正在侵入或者试图侵入你的网络。最著名的IDS是Snort,可以在http://www.snort.org下载。
l 弱点评估工具:用来发现并堵住网络中的安全漏洞。弱点评估工具收集的信息可以指导我们设置恰当的防火墙规则,以挡住恶意的互联网用户。现在有许多弱点评估工具,比如Nmap(http://www.nmap.org/)和Nessus(http://www.nessus.org/).
以上这些工具可以配合使用,交互信息。一些产品将这些功能捆绑在一起,形成一个完整的系统。

Snort是一个开放源码的网络入侵检测系统(NIDS),可以免费得到。NIDS是用来检测网络上的信息流的入侵检测系统(IDS)。IDS也包括安装在特定的主机上并检测攻击目标是主机的行为的系统。IDS迄今为止还是一门相当新的技术,而Snort在IDS中处于领先的地位。
   本书由入侵检测介绍及相关概念入手,你将学习如何安装及管理Snort以及与Snort协同工作的其他产品。这些产品包括MySQL数据库(http://www.mysql.org)、入侵数据库分析管理工具ACID(http://www.cert.org/kb/acid)。Snort能够将日志数据(例如告警和其他日志消息)记录到数据库中。MySQL用作存储所有这些数据的数据库引擎。利用ACID及Apache (http://www.apache.com)Web服务器,我们可以分析这些数据。Snort、Apache、MySQL及ACID的共同协作,使我们可以将入侵检测数据记录到数据库,然后用web界面察看和分析这些数据。
   此书的组织结构使读者能够跟着随后的章节一步一步的建立一个完整的入侵检测系统。安装及整合各种工具的步骤将在如下的章节逐步介绍:
   第二章将介绍编译及安装Snort的基本知识。在这一章中,你将能够用基本安装及默认规则建立一个能够工作的IDS,同时能够建立可以记录入侵活动的日志文件。
   第三章介绍Snort规则的有关知识,Snort规则的组成及如何根据你的系统环境及需要建立自己的规则。建立良好的规则是构建入侵检测系统的关键,因此本章非常重要。本章同时也介绍Snort不同版本间规则的不同。
   第四章介绍input及output插件。插件与Snort一同编译,并用来调整检测引擎的输入和输出部分。Input插件用在实际检测过程发生前准备好捕获的数据包。Output插件用来将数据数据格式化,以用于特定的目的,例如一种output插件可以将输出的检测信息转换成SNMP trap信息,而另外一种output插件可以将信息转换成数据库信息。这一章将详细介绍如何配置及使用这些插件。
   第五章介绍MySQL数据库与Snort的共同工作。MySQL插件使Snort能够将日志数据记录到数据库以便随后的分析。在这一章中,你将了解如何在MySQL中建立数据库,如何配置数据库插件,以及将日志数据记录到数据库中。
   第六章介绍ACID,以及如何用ACID取得你在第五章建立的数据库中的信息,并用Apache服务器显示它。ACID一种提供丰富的数据分析能力的重要工具,你可以用它来取得攻击频率、攻击类别、察看这些攻击方法的相关资源等等。ACID用PHP脚本语言、图形显示库(GD library)和PHPLOT(一种用来绘制图表的工具)来工作,可以分析SQL中的数据并绘制图表。
   第七章主要介绍可以和Snort一起工作的其他一些有用的工具。

   在读完此书后,你将建立一个完整的,具有多个组件的系统,如图1-1所示。
   在图中你可以看到,Snort捕获并分析数据,然后用output插件将数据储存在MySQL数据库中。Apache服务器在ACID,PHP、GD library及PHP包的帮助下使连接到服务器的用户能够通过浏览器显示数据。用户可以在网页上应用不同的查询来分析、备份、删除数据或者显示图表。
   基本上,你可以将Snort、MySQL、Apache、PHP、ACID、GD库以及ACID都安装到一台计算机上,而实际上在读完本书后,你可以建立一个类似于如图1-2所示得更加贴近实际应用的系统。
   在企业中,人们通常使用多个Snort探测器,在每个路由器或者防火墙后面都放置探测器。在这种情况下,你可以用一个集中的数据库来收集所有探测器的信息,并在这个数据库服务器上运行Apache Web服务器,如图1-3所示。
1.1 什么是入侵检测?
入侵检测是指用来检测针对网络及主机的可疑活动的一系列技术和方法。入侵检测系统基本可以分为两大类:基于特征的入侵检测系统和异常行为检测系统。入侵者常具有用软件可以检测到的特征,如病毒。入侵检测系统将检测包含已知入侵行为特征或者异常于IP协议的数据包。基于一系列的特征及规则,入侵检测系统能够发现并记录可疑行为并产生告警。基于异常的入侵检测系统通常是分析数据包中协议头部的异常,在某些情况下这种方式要比基于特征的入侵检测系统要更好一些。通常情况下,入侵检测系统在网络上捕获数据包与规则比对或者检测其中的异常。Snort基本上是一个基于规则的IDS,但是input插件可以分析协议头部异常。
   Snort的规则存储在文本文件中,并可以用文本编辑器修改。规则以类别分组。不同类别的规则存储在不同的文件中。最后,这些文件被一个叫做snort.conf的主配置文件引用。Snort在启动时读取这些规则,并建立内部数据结构或链表以用这些规则来捕获数据。发现入侵特征并利用规则捕获它们是一项具有技巧性的工作,因为在实时检测中你应用越多的规则,那么你将需要越多的处理能力,所以用尽量少的规则来捕获尽量多的特征是非常重要的。Snort已经预先定义了许多入侵检测规则,并且你可以自由添加自定义的规则。同时,你也可以移除一些内建规则以防止错误告警。

1.1.1 一些定义
   在详细了解入侵检测及Snort之前,你需要了解一些网络安全相关的定义,这些定义将在这本书的随后章节中重复应用。对这些名词的基本了解对于理解其他更加复杂的安全概念是非常必要的。
1.1.1.1 IDS
入侵检测系统或IDS是一种用来检测入侵行为的软件、硬件或者两者的结合。Snort是大众可以获得的开放源码的IDS。IDS的实际能力依赖于组件的复杂度及精巧性。实体的IDS是硬件和软件的结合,很多公司可以提供及决方案。如前面提到的,IDS可以采用特征分析技术、异常检测技术,或者两者同时应用。
   1.1.1.2 网络IDS或NIDS
   NIDS是用来捕获在网络介质上传播的数据并与特征数据库比对的入侵检测系统。跟据数据包与特征数据库的匹配情况,IDS产生告警或者将日志记录到文件或数据库中。Snort主要是作为NIDS来使用的。
1.1.1.3 主机IDS或HIDS
   面向主机的入侵检测系统或称HIDS作为一个代理安装在一台主机上,这种入侵检测系统可以分析系统及应用程序日志来检测入侵行为。其中一些HIDS是被动状态的,只有当某些事情发生了才会通知你,另外一些是主动状态的,可以嗅探网络中针对某一主机的通信状况并实时产生告警。
1.1.1.4 特征
   特征是数据包中包含信息的特点。特征用来检测一种或多种攻击行为。例如,目标是你的web服务的包中如果出现“scripts/iisadmin”,可能意味着一个入侵尝试。
   根据攻击行为本质的不同,特征数据可能会出现在数据包中的不同位置。例如,你可能会在IP包头、传输层头(TCP或UDP头)及/或应用层头或载荷中发现攻击特征。你将在本书的后面更多的了解攻击特征。
   通常IDS依靠特征来发现入侵行为。在发现新的入侵特征时,某些商业化的IDS需要从厂商那里得到更新的特征库。另外一些IDS,比如Snort,你可以自己更新特征库。
1.1.1.5 告警
   告警是任何一种对入侵行为的通知。当IDS检测到入侵者,它将用告警来通知安全管理员。告警的形式可以使弹出窗口、终端显示及发送e-mail等等。告警同时也被存储到日志文件或者数据库中,以便供安全专家察看。在本书的后面,你将得到关于告警的详细信息。
   Snort的告警由output插件控制,并可以产生多种形式的报警。Snort也可以将同一个告警发送到不同的目标,例如,将告警发送到数据库的同时,产生SNMP trap信息。一些插件可以修改防火墙配置,使入侵者在防火墙或者路由器上被控制。
1.1.1.6 日志
   日志信息通常存放在文件中。默认情况下,Snort将这些信息存放在/var/log/snort目录下,但是也可以在启动Snort时用命令行开关来改变这个目录。日志信息可以存储为文本格式或者二进制格式,二进制格式的文件可以供Snort或者Tcpdump随后访问,现在也有一个叫做Barnyard的新工具可以分析Snort产生的二进制日志文件。将日志存放为二进制文件可以有更高的效率,因为这种格式开销相对较低。将Snort应用在高速网络环境中,将日志存放为二进制文件是非常必要的。
1.1.1.7 误告警
   误告警是错误的将非入侵行为报告为入侵行为的告警。例如,内部主机的错误配置有时会产生触发规则,从而产生误告警。某些路由器,例如Linksys家用路由器,会产生一些信息,导致UpnP相关的告警。为了避免误告警,你要修改和调试默认规则,在某些情况下,你也许需要停止一些规则的使用,以避免误告警。
1.1.1.8 探测器
   运行入侵检测系统的机器也叫做探测器,因为它用来“探测”网络中的活动。在本书的后面部分,如果用到探测器这个词,那么它是指运行Snort的计算机或者其他设备。

1.1.2     IDS应该放在网络中的什么位置?
根据你的网络拓扑结构的不同,你应该在一个或多个位置放置IDS。IDS放置的位置也要取决于你想检测的入侵行为的种类:内部入侵、外部入侵,或者两个都要检测。例如,如果你想仅仅检测外部入侵活动,并且你只有一个路由器接到Internet,那么放置IDS的最佳位置也许紧靠着路由器或者防火墙的内部网络接口。如果你有多条接入Internet的借口,也许你希望在每个入口处放置一台IDS。有时你也希望能够检测来自内部的威胁,那么可以在每个网段都放置一台IDS。
在很多情况下,你并不需要在所有网段都实施入侵检测,你可以仅仅在敏感区域放置IDS。要知道,越多的IDS就意味着越多的工作量和维护费用。因此IDS的部署要取决于你的安全策略,也就是你想防范什么样的入侵。图1-4表示通常放置IDS的典型位置。
正如你在图1-4中看到的那样,通常你应该在每个路由器和防火墙的后面放置IDS,在你的网络中包含非军事化区(DMZ)的情况下,在DMZ中也可以放置IDS。要注意的是,DMZ中的IDS告警策略不应像专用网络中那样严格。
1.1.3 蜜罐(Honey Pots)
   蜜罐是一种以故意暴露已知弱点来愚弄黑客的系统。当黑客发现蜜罐时,通常会在它上面耗费一些时间,在此期间,你可以记录黑客的行为,从中找出黑客的活动情况和所使用的技术。一旦你了解了这些技术,你可以利用你得到的信息来加固你真正的服务器。
   现在有很多种构建和放置蜜罐的方法。在蜜罐上应该运行一些公开的服务,这些服务包括Telnet服务(端口23),HTTP服务(端口80),FTP服务(端口21)等等。你应该将蜜罐放在你紧靠你应用服务器的某个位置,这样黑客容易错误的将蜜罐当成真正的应用服务器。例如,如果你的应用服务器的IP地址势192.168.10.21和192.168.10.23,那么你可以将你的蜜罐的IP地址设为192.168.10.22,同时设置你的防火墙和路由器,使黑客对服务器某些端口的访问重定向到蜜罐上面,那么入侵者就会把蜜罐当成是真正的服务器。你应当仔细的考虑告警产生机制,以使你的蜜罐受到威胁的时候可以立刻得到信息。将日志存放在其他机器上是个好主意,这样即使黑客侵入了蜜罐,也无法删除日志文件。
   那么什么时候你应该安装蜜罐呢?那要根据你的情况来决定:
n 如果你的机构有足够的资源用来追踪黑客,那么你应该建立一个蜜罐。所谓资源包括硬件以及人力。如果你没有足够的资源,那么安置蜜罐就没有什么必要,要知道获取你不会用到的信息是没有什么意义的。
n 仅仅当你可以以某种方式来用蜜罐取得的信息的时候,蜜罐才是有用的。
n 如果你想收集有关行为的证据来起诉黑客,那么你也可以用到蜜罐。
理想的情况下,蜜罐应该看起来像一个真实的系统,你可以制作一些假的数据文件,假的账户等等,使黑客信以为真,这样才能使黑客在上面逗留足够长的时间,从而你可以记录更多的活动。
   你可以在蜜罐项目网站http://project.honeynet.org/上面取得更多的信息,可以找到一些你感兴趣的资料,是你能够对蜜罐有进一步的了解。你也可以去另外一个蜜罐网站http://www.citi.umich.edu/u/provos/honeyd/了解他们的开放源码的密罐的相关信息。其他一些可以取得更多信息的地方是:
南佛罗里达蜜罐项目网站:http://www.sfhn.net
相关白皮书:http://www.sfhn.net/whites/howto.html
1.1.4 安全区域和信任等级
   一段时间以前,人们将网络划分为两大类区域:安全区域和非安全区域。某些时候这种划分也就意味着网络是在路由器或防火墙的内部或者外部。现在典型的网络通常根据不同的安全策略等级和信任等级划分为多个区域。例如,公司的财务部门拥有非常高的安全等级,在这个区域中仅仅允许对少数服务的操作,不允许Internet服务;而在DMZ或称非军事化区中,网络是向Internet开放的,此区域的信任等级与财务部门迥然不同。
   根据信任等级和安全策略的不同,你应该在不同的区域中应用不同的入侵检测规则和策略。对安全等级要求不同的网络在物理上是分离的。你可以在对安全要求不同的每个区域都安装一套具有不同规则的IDS来检测可疑的网络活动。例如,在财务部门的网络中没有web服务器,指向80端口的数据包将被纪录为入侵行为,而这样的规则不能用在DMZ中,因为DMZ中的web服务器是对每个人开放的。
1.2          IDS 策略
在你在网络中安装IDS之前,你必须有一个能够检测入侵者并做出相应动作的策略。一个策略必须能够指示一系列的规则以及这些规则如何应用。IDS策略应当包含以下的内容,并且你可以根据你的要求添加更多的内容:
谁来察看IDS信息?IDS提供给你对入侵行为产生告警信息的机制。告警系统或者是简单的文本文件形式,或者更加复杂,也许集成到类似于HpOpenView这样的网管软件或MySQL这样的数据库中。在你的系统中需要有人负责来监视入侵行为和制定策略。入侵行为可以通过弹出窗口或web页面实时监视。在这种情况下,操作者必须要了解告警的意义所在以及告警信息中事件的安全等级。
谁来管理IDS,维护日志等等?对于所有的系统,都需要建立一个日常维护体制,IDS也一样。
谁来处理安全事件?如果没有安全事件处理机制,也就根本没有必要安装IDS。根据安全事件的安全等级的需要,某些情况可能需要政府机构的介入。
事件处理程序是什么样的?策略应当规定一些事件响应机制,根据涉及安全等级的高低向不同的管理层汇报。
例行报告:总结前一天、上一周、或者上一个月所发生的相关事情。
特征库的升级:黑客总是不断的创造新的攻击方法。如果IDS了解攻击的特征,就能够检测到攻击。Snort规则用攻击特征库来检测攻击。因为攻击的特征经常在改变,你也必须为你的IDS规则更新特征库。你可以定期直接在Snort网站上取得特征库的更新,也可以在一种新的攻击方式被发现时自己更新。
每个项目都需要文档系统。IDS策略应当描述当攻击被检测到时应当记录什么样的文档。文档可以包括简单的日志或者对入侵行为的完整纪录。你也可以采用多种方式来记录数据。例行报告也属于文档的组成部分。
基于你的IDS策略,你可以清楚的知道你的网络到底需要多少IDS探测器和其他资源,更精确的计算IDS的成本和费用。

1.3          Snort的部件
Snort在逻辑上可以分成多个部件,这些部件共同工作,来检测特定的功绩,并产生符合特定要求的输出格式。一个基于Snort的IDS包含下面的主要部件:
l 包解码器
l 预处理器
l 探测引擎
l 日志和告警系统
l 输出模块
图1-5显示了这些部件的关系。任何来自Internet的包到了包解码器,然后被送到输出模块,在这里或者被丢弃,或者产生日志或告警。
   在这个部分中,我们将简要介绍这些部件。在你通读这本书并建立一些规则后,你将对这些部件以及它们之间怎样相互作用更加熟悉。
1.3.1 包解码器
   包解码器从不同的网络接口中获取包并准备预处理或者送到探测引擎。网络接口可能是以太网、SLIP、PPP等等。
1.3.2 预处理器
   预处理器是Snort在探测引擎做出一些操作来发现数据包是否用来入侵之前排列或者修改数据包的组件或者插件。一些预处理器也可以通过发现数据包头部异常来执行一些探测工作,并产生告警。预处理器的工作对于任何IDS的探测引擎依据规则分析数据都是非常重要的。黑客有很多愚弄IDS的技术。比如,你建立这样一条规则,用来在HTTP包中发现包含“scripts/iisadmin”的入侵特征,如果你将字符匹配过于严格的限制,那么黑客只需要做一些细小的变通,就能很轻易的耍弄你。例如:
   “scripts/./iisadmin”
   “scripts/examples/../iisadmin”
   “scripts/.\iisadmin”
   为了使问题复杂化,黑客也会在字符中嵌入16位URI字符或者Unicode字符,这对web服务器来说是同样合法的,要注意web服务器能够理解所有这些字符,并将它们处理成为类似于“scripts/iisadmin”这样的字符。如果IDS严格匹配某一字符串,就可能不会探测到这种类型的攻击。预处理器可以将字符重新排列,以使IDS能够探测得到。
   预处理器也或来包分片的组装。当一个大的数据流传向主机的时候,通常数据包会被分割。例如,以太网中默认的最大数据包大小是1500字节,这个数值由网络接口的MTU(Maximus Transfer Unit)值来确定。这就意味着如果你发送的数据如果大于1500字节,它将会被分割成多个数据包,以使每个数据包的大小都小于或等于1500字节。接收方系统能够将这些小的分片重新组装,还原成原始的数据包。在IDS上,在可以对数据包进行特征分析之前,也需要重新组装数据包。例如,可能入侵特征的一般在一个数据包分片上,而另外一半在别的分片上面。为了使探测引擎能够准确的分析特征,就需要组装所有的分片。黑客也用数据分片来对抗入侵检测系统。
   预处理器用来对抗这些攻击。Snort的预处理器能够组装数据分片,解码HTTP URI,重新组装TCP流等等。这些功能是IDS中非常重要的部分。
1.3.3 探测引擎
   探测引擎是Snort中最重要的部分,它的作用是探测数据包中是否包含着入侵行为。探测引擎通过Snort规则来达到目的。规则被读入到内部的数据结构或者链表中,并与所有的数据包比对。如果一个数据包与某一规则匹配,就会有相应的动作(记录日志或告警等)产生,否则数据包就会被丢弃。
探测引擎是Snort中时间相关的组件,根据你的机器的处理能力和你所定义的规则的多少,探测引擎会消耗不同的时间来对不同的数据包做出响应。在Snort工作在NIDS模式的时候,如果网络中数据流量过大,有时可能会因为来不及响应而丢弃一些包。探测引擎的负载取决于以下因素:
l 规则的数量
l 运行Snort的机器的处理能力
l 运行Snort的机器的内部总线速度
l 网络的负载
当你在设计NIDS的时候,你应该考虑所有的相关因素。
你需要了解探测系统可以剖析数据包并把规则应用在高的不同部分,这些部分可能是:
l 包的IP头
l 包的传输层头,包括TCP、UDP或其他传输层协议头,也可以是ICMP头。
l 应用层头。应用层头包括DNS头,FTP头,SNMP头,SMTP头等等还有很多。有时你可以用一些间接的方法来获得应用头信息,比如位偏移等等。
l 包载荷。这意味着你可以建立这样一种规则,用探测引擎来寻找传输的数据中的字符。
在不同版本的Snort中,探测引擎由不同的工作方式。在所有1.x版的Snort中,一旦探测引擎将数据包匹配到某个规则的时候,就会停止进一步的过程,然后根据规则产生告警或者记录日志,这就意味着即使如果包匹配多条规则,仅仅第一个规则被应用,并不再进行其他的匹配,这样做有好处,但是除了下面的情况:如果包匹配的第一个规则是低优先级的,就只产生低优先级的告警,即使这个包也匹配高优先级的后面其他规则。这个问题在第二版的Snort中得到了修正:包先对所有的规则进行匹配,然后再产生告警,在对所有的规则进行匹配之后,选择最高优先级的规则告警。
第2版Snort的探测引擎是完全重写的,从而比先前版本的快了许多。在写这本书的时候,Snort 2.0还没有开始发行,早些时候的测试显示新的引擎比老的引擎要快将近18倍。
1.3.4 日志和告警系统
   依据在包中所找到的东西,一个包可以用来记录行为或者产生告警。日志可以存为简单的文本文件、tcpdump格式文件或者其他的形式。在默认情况下,所有的日志文件都存放在/var/log/snort目录中。你可以在命令行中用-l选项来修改日志和告警存放的位置。更多的命令行选项将在下一章中讨论。这些选项可以用来修改日志和告警的类型和细节等等。
1.3.5 输出模块
   输出模块或插件可以根据你指定的保存日志和告警系统产生的输出信息的方式来执行不同的动作。基本上这些模块用来控制日志和告警系统产生的输出信息的格式。根据配置,输出模块可以做下列事情:
l 简单的在/var/log/snort/alerts文件或其他文件中记录日志
l 发送SNMP trap
l 将日志记录到类似于MySQL或Oracle的数据库中。你将在这本书的后面了解更多的关于使用MySQL的信息
l 产生XML输出
l 修改路由其或者防火墙的配置
l 向Windows主机发送SMB消息
其他一些工具可以用来发送如e-mail信息或者web页面浏览等格式的告警,在后面的章节中你将了解更多的信息。表1-1是IDS各种部件的汇总。
表1-1 IDS的部件
名称 描述
包解码器 为处理过程准备包
预处理器或输入插件 分析协议头部,规格化头部,探测头部异常,包分片组装,TCP流组装
探测引擎 将包与规则比对
日志和告警系统 产生告警和日志
输出模块 将告警和日志输出到最终目标


1.4 关于交换机
根据你用的交换机的不同,你会有多种方式将Snort的机器安装在交换机端口上。一些交换机,比如CISCO,允许你复制所有的通信到你连接Snort机器的那个端口上,这样的端口通常指的是Spanning端口。安装Snort的最佳位置是直接连到路由其或者防火墙后面,这样Snort可以在数据进入交换机或HUB之前捕获所有的Internet数据流。例如,你的防火墙有连接Internet的T1线路,并用交换机连接内部网络,典型的连接方案如图1-6所示:
如果你的交换机有Spanning端口,你可以像图1-7所示的那样将IDS及器连接到spanning端口上,这样IDS可以看到所有的与Internet的通信以及内部通信。
你也可以将IDS连接到防火墙与交换之间的HUB上,这样所有的进入和流出的通信对于IDS也是可见的,此方案如图1-8所示。
但是要注意,如果IDS按图1-8安置,那么IDS将不能得到内部通信的数据包,只能来见与Internet之间的通信。这种方案对于内部网络是可信的,而预想的攻击来自外部是非常有用的。
1.5 跟踪TCP数据流
Snort新增加了一种叫做Stream4的预处理器,这种预处理器能够同时处理数千并发的数据流。关于它的配置将在第四章中讨论。它可以重新组装TCP数据流,并进行状态检测。这就意味着你可以组装一个特定的TCP会话,并从利用多个TCP包进行攻击的方式中找出异常。你也可以查找流向或(和)流出某个服务器端口的数据包。
1.6 Snort支持的平台
   Snort支持多种硬件平台和操作系统。目前Snort支持下列操作系统:
• Linux
• OpenBSD
• NetBSD
• Solaris (Sparc或者i386)
• HP-UX
• AIX
• IRIX
• MacOS
• Windows
你可以到Snort的网站http://www.snort.org查询Snort当前支持的平台的列表。
1.7 如何保护IDS自身
   有一个关键问题是,如何保护运行IDS的系统?如果IDS本身的安全受到了威胁,你收到的告警可能是错误的,也许就根本收不到告警。入侵者也许会在做出实际的攻击之间先让IDS失效。有许多方式来保护你的系统,从通用的建议到一些复杂的方法,下面会提到一些方法:
l 首先你可以做的事情是不要再你运行IDS探测器的机器上运行任何服务。网络服务是用来探寻系统最普遍的方式。
l 新的威胁出现后,厂商会发布相应的补丁,只是一个连续不断,永无休止的过程。你的IDS应该安装从厂商那里得到的最新的补丁。比如,如果你的Snort在Window机器上运行,你应该安装所有微软发布的最新的安全补丁。
l 配置你的IDS机器,使其不会对ping(ICMP echo)做出回应。
l 如果你在Linux机器上运行IDS,请用netfileter/iptables来阻止任何不必要的数据,这时Snort仍然可以看到所有的数据包。
l 如果你的IDS机器仅仅用来做入侵检测,那么除非完全有必要,不要在上面进行任何其他的活动以及设立其他用户账号。
除了这些通常的方法之外,Snort也可以在一些特殊方法下应用。下面有两种特别的技术来防止Snort遭到攻击。
1.7.1 在隐秘端口(Stealth Interface)上运行Snort
你可以在隐秘端口上运行Snort,这种端口仅仅监听进入数据包而不向外部发送任何的数据包。在隐秘端口上我们用一种特殊的电缆,在你运行Snort的主机上,将端口的1针和2针短路,3针和6针连到对端。你可以到Snort的FAQ页面http//www.snort.org/docs/faq.html寻找这种方法的更多信息。
1.7.2 在没有IP地址的接口上运行Snort
你也可以在一个没有配置IP地址的接口上运行Snort。例如在Linux机器上,你可以用“ifconfig eth0 up”这样的命令来激活没有配置IP地址的接口eth0。这种方法的好处是,因为Snort主机没有IP地址,因此没有人可以访问它。你可以在eth1上配置IP地址用来访问这个探测器。见图1-9。
   在Windows系统上,你可以用一个不绑定TCP/IP协议的接口,这样就不会在这个接口上出现IP地址了。不要忘记同时也要禁用其他协议和服务。在某些情况下,当接口不配置IP地址的时候,你会遇到wincap(Windows用来捕获包的库)不可用的提示,如果遇到这样的情况,你可以用下面的方法:
l 在你想做隐秘端口的网络接口上配置TCP/IP协议,同时禁用其他一切协议和服务。
l 启用DHCP客户端。
l 禁用DHCP服务器。
这样就会使网络接口没有IP地址,网络接口仍然可以绑定TCP/IP协议。
1.8 相关资源
1. 入侵检测 FAQ : http://www.sans.org/newlook/resources/IDFAQ/
ID_FAQ.htm
2. 蜜罐项目:http://project.honeynet.org/
3. Snort FAQ : http://www.snort.org/docs/faq.html
4. Honeyd 蜜罐: http://www.citi.umich.edu/u/provos/honeyd/
5. Winpcap : http://winpcap.polito.it/
6. Cisco systems : http://www.cisco.com
7. Checkpoint 网站: http://www.checkpoint.com
8. Netscreen :http://www.netscreen.com
9. Netfilter : http://www.netfilter.org
10. Snort :http://www.snort.org
11. Nmap工具: http://www.nmap.org
12. Nessus : http://www.nessus.org
13. MySQL 数据库:http://www.mysql.org
14. ACID: http://www.cert.org/kb/acid
15. Apache web 服务器: http://www.apache.org


第二章 安装Snort并开始初步工作
Snort可以仅仅安装为守护进程或者一个包括很多其他工具的完整系统。如果你仅仅安装Snort,你可以得到入侵数据的文本文件或二进制文件,然后可以用文本编辑器或其它类似于Barnyard的工具察看,本书的后面将对此做出描述。在简单安装的情况下,你也可以让告警信息以SNMP trap的形式发送到类似于HP OpenView或者OpenNMS之类的网管系统上。告警信息也可以以SMB弹出窗口的形式发送到Windows机器上。如果你与其它工具一起安装,你可以做一些更加复杂的操作,比如将Snort数据发送到数据库并通过Web界面来分析。分析工具能够让你对捕获的数据有更加直观的认识,而不用对晦涩的日志文件耗费大量时间。
其它一些可以用到的工具列在下面,它们中的没有特都有特定的任务。一个综合的Snort系统用这些工具来提供具有后台数据库Web用户界面。
MySQL用来Snort纪录告警日志。也可以用类似于Oracle的数据库,但在Snort环境中MySQL更加常用。事实上,Snort可以用任何ODBC兼容的数据库。
l Apache用作web服务器
l PHP用作web服务器和MySQL数据库之间的接口。
l ACID是用来Web界面来分析Snort数据的PHP软件包。
l GD库被ACID用来生成图表
l PHPLOT用来在ACID的web界面将数据表现为图表形式。为了是PHPLOT工作,GD库必须要正确配置。
l ADODB被ACID用来连接MySQL数据库。
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浏览器察看这些数据并加以分析。
但要了解这种配置存在一些实际问题:
l 所有的探测器在启动Snort的时候必须能够访问到数据库,如果不能,Snort就终止进程。
l 数据库必须保证让探测器所有的时间都能访问,否则,数据将丢失。
l 如果探测器和数据库服务器之间有防火墙,你要打开相应的端口,有时这样做会与防火墙的安全策略不匹配或者违背安全策略。
在探测器不能直接访问数据库服务器的时候,有一些变通的方法。探测器可以配置为将文件存储在本地,然后用类似于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目录,其中会存放Snort的规则文件和配置文件。
n 创建/var/log/snort目录,Snort的日志文件将会存放在这里。
n 创建/usr/share/doc/snort-1.9.0目录来存放Snort的文档文件,在这个目录中,你会看到类似于FAQ,README的文件和其他一些文件。
n 在/usr/sbin目录中创建一个叫做snort-plain的文件,这是Snort的守护进程。创建文件/etc/rc.d/init.d/snortd文件,这是启动和关闭脚本。在RedHat Linux中,它与/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个步骤:
1.运行configure脚本。
2.运行make命令。
3.运行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<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
              headers in a nonstandard directory <include dir>
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二进制文件,但是还有些事情要做:
1、创建/var/log/snort目录作为Snort默认的存放日至文件的地方。
2、创建一个存放配置文件的目录。我创建的是/opt/snort/etc目录,你可以创建自己的目录。
3、创建或者复制配置文件到/opt/snort/etc目录下。
4、创建目录/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..
注意:你可以下列情况,你可以不指定配置文件:
1、你在配置文件所在的目录启动Snort。
2、你已经将配置文件复制到你的属主目录中的.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:0x0 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 "###############################################################"
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics