基于Snort的入侵检测系统方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Snort的入侵检测系统
用Snort,Apache,MySQL,PHP及ACID构建高级IDS
第一章入侵检测系统及Snort介绍
在当今的企业应用环境中,安全是所有网络面临的大问题。
黑客和入侵者已成功的入侵了一些大公司的网络及。
目前已经存在一些保护网络架构及通信安全的方法,例如防火墙、虚拟专用网(VPN)、数据加密等。
入侵检测是最近几年出现的相对较新的网络安全技术。
利用入侵检测技术,我们可以从已知的攻击类型中发现是否有人正在试图攻击你的网络或者主机。
利用入侵监测系统收集的信息,我们可以加固自己的系统,及用作其他合法用途。
目前市场中也有很多弱点检测工具,包括商品化的和开放源码形式的,可以用来评估网络中存在的不同类型的安全漏洞。
一个全面的安全系统包括很多种工具:
●防火墙:用来阻止进入及走出网络的信息流。
防火墙在商业化产品和开放源
码产品中都有很多。
最著名的商业化防火墙产品有Checkpoint (.checkpoint.), Cisco (.cisco.)及Netscreen(.netscreen.)。
最著名的开放源码防火墙是Netfilter/Iptables()。
●入侵检测系统(IDS):用来发现是否有人正在侵入或者试图侵入你的网络。
最著名的IDS是Snort,可以在下载。
●弱点评估工具:用来发现并堵住网络中的安全漏洞。
弱点评估工具收集的信
息可以指导我们设置恰当的防火墙规则,以挡住恶意的互联网用户。
现在有许多弱点评估工具,比如Nmap(/)和Nessus(/).
以上这些工具可以配合使用,交互信息。
一些产品将这些功能捆绑在一起,形成一个完整的系统。
Snort是一个开放源码的网络入侵检测系统(NIDS),可以免费得到。
NIDS 是用来检测网络上的信息流的入侵检测系统(IDS)。
IDS也包括安装在特定的主机上并检测攻击目标是主机的行为的系统。
IDS迄今为止还是一门相当新的技术,而Snort在IDS中处于领先的地位。
本书由入侵检测介绍及相关概念入手,你将学习如何安装及管理Snort以及与Snort协同工作的其他产品。
这些产品包括MySQL数据库()、入侵数据库分析管理工具ACID(/kb/acid)。
Snort能够将日志数据(例如告警和其他日志消息)记录到数据库中。
MySQL用作存储所有这些数据的数据库引擎。
利用ACID及Apache (.apache.)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.1IDS
入侵检测系统或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检测到入侵者,它将用告警来通知安全管理员。
告警的形式可以使弹出窗口、终端显示及发送等等。
告警同时也被存储到日志文件或者数据库中,以便供安全专家察看。
在本书的后面,你将得到关于告警的详细信息。
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.2IDS应该放在网络中的什么位置?
根据你的网络拓扑结构的不同,你应该在一个或多个位置放置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,同时设置你的防火墙和路由器,使黑客对服务器某些端口的访问重定向到蜜罐上面,那么入侵者就会把蜜罐当成是真正的服务器。
你应当仔细的考虑告警产生机制,以使你的蜜罐受到威胁的时候可以立刻得到信息。
将日志存放在其他机器上是个好主意,这样即使黑客侵入了蜜罐,也无法删除日志文件。
那么什么时候你应该安装蜜罐呢?那要根据你的情况来决定:
如果你的机构有足够的资源用来追踪黑客,那么你应该建立一个蜜罐。
所谓资源包括硬件以及人力。
如果你没有足够的资源,那么安置蜜罐就没有什么必要,要知道获取你不会用到的信息是没有什么意义的。
⏹仅仅当你可以以某种方式来用蜜罐取得的信息的时候,蜜罐才是有用的。
⏹如果你想收集有关行为的证据来起诉黑客,那么你也可以用到蜜罐。
理想的情况下,蜜罐应该看起来像一个真实的系统,你可以制作一些假的数据文件,假的账户等等,使黑客信以为真,这样才能使黑客在上面逗留足够长的时间,从而你可以记录更多的活动。
你可以在蜜罐项目/上面取得更多的信息,可以找到一些你感兴趣的资料,是你能够对蜜罐有进一步的了解。
你也可以去另外一个蜜罐/u/provos/honeyd/了解他们的开放源码的密罐的相关信息。
其他一些可以取得更多信息的地方是:
南佛罗里达蜜罐项目:
相关白皮书:/whites/howto.html
1.1.4 安全区域和信任等级
一段时间以前,人们将网络划分为两大类区域:安全区域和非安全区域。
某些时候这种划分也就意味着网络是在路由器或防火墙的部或者外部。
现在典型的网络通常根据不同的安全策略等级和信任等级划分为多个区域。
例如,公司的财务部门拥有非常高的安全等级,在这个区域中仅仅允许对少数服务的操作,不允许Internet服务;而在DMZ或称非军事化区中,网络是向Internet开放的,此区域的信任等级与财务部门迥然不同。
根据信任等级和安全策略的不同,你应该在不同的区域中应用不同的入侵检测规则和策略。
对安全等级要求不同的网络在物理上是分离的。
你可以
在对安全要求不同的每个区域都安装一套具有不同规则的IDS来检测可疑的网络活动。
例如,在财务部门的网络中没有web服务器,指向80端口的数据包将被纪录为入侵行为,而这样的规则不能用在DMZ中,因为DMZ 中的web服务器是对每个人开放的。
1.2IDS 策略
在你在网络中安装IDS之前,你必须有一个能够检测入侵者并做出相应动作的策略。
一个策略必须能够指示一系列的规则以及这些规则如何应用。
IDS 策略应当包含以下的容,并且你可以根据你的要求添加更多的容:
谁来察看IDS信息?IDS提供给你对入侵行为产生告警信息的机制。
告警系统或者是简单的文本文件形式,或者更加复杂,也许集成到类似于HpOpenView这样的网管软件或MySQL这样的数据库中。
在你的系统中需要有人负责来监视入侵行为和制定策略。
入侵行为可以通过弹出窗口或web页面实时监视。
在这种情况下,操作者必须要了解告警的意义所在以及告警信息中事件的安全等级。
谁来管理IDS,维护日志等等?对于所有的系统,都需要建立一个日常维护体制,IDS也一样。
谁来处理安全事件?如果没有安全事件处理机制,也就根本没有必要安装IDS。
根据安全事件的安全等级的需要,某些情况可能需要政府机构的介入。
事件处理程序是什么样的?策略应当规定一些事件响应机制,根据涉及安全等级的高低向不同的管理层汇报。
例行报告:总结前一天、上一周、或者上一个月所发生的相关事情。
特征库的升级:黑客总是不断的创造新的攻击方法。
如果IDS了解攻击的特
征,就能够检测到攻击。
Snort规则用攻击特征库来检测攻击。
因为攻击的特征经常在改变,你也必须为你的IDS规则更新特征库。
你可以定期直接在Snort上取得特征库的更新,也可以在一种新的攻击方式被发现时自己更新。
每个项目都需要文档系统。
IDS策略应当描述当攻击被检测到时应当记录什么样的文档。
文档可以包括简单的日志或者对入侵行为的完整纪录。
你也可以采用多种方式来记录数据。
例行报告也属于文档的组成部分。
基于你的IDS策略,你可以清楚的知道你的网络到底需要多少IDS探测器和其他资源,更精确的计算IDS的成本和费用。
1.3Snort的部件
Snort在逻辑上可以分成多个部件,这些部件共同工作,来检测特定的
功绩,并产生符合特定要求的输出格式。
一个基于Snort的IDS包含下
面的主要部件:
●包解码器
●预处理器
●探测引擎
●日志和告警系统
●输出模块
图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模式的时候,如果网络中数据流量过大,有时可能会因为来不及响应而丢弃一些包。
探测引擎的负载取决于以下因素:
●规则的数量
●运行Snort的机器的处理能力
●运行Snort的机器的部总线速度
●网络的负载
当你在设计NIDS的时候,你应该考虑所有的相关因素。
你需要了解探测系统可以剖析数据包并把规则应用在高的不同部分,这些部分可能是:
●包的IP头
●包的传输层头,包括TCP、UDP或其他传输层协议头,也可以是ICMP
头。
●应用层头。
应用层头包括DNS头,FTP头,SNMP头,SMTP头等等
还有很多。
有时你可以用一些间接的方法来获得应用头信息,比如位偏
移等等。
●包载荷。
这意味着你可以建立这样一种规则,用探测引擎来寻找传输的
数据中的字符。
在不同版本的Snort中,探测引擎由不同的工作方式。
在所有1.x版的Snort 中,一旦探测引擎将数据包匹配到某个规则的时候,就会停止进一步的过程,然后根据规则产生告警或者记录日志,这就意味着即使如果包匹配多条规则,仅仅第一个规则被应用,并不再进行其他的匹配,这样做有好处,但是除了下面的情况:如果包匹配的第一个规则是低优先级的,就只产生低优先级的告警,即使这个包也匹配高优先级的后面其他规则。
这个问题在第二版的Snort中得到了修正:包先对所有的规则进行匹配,然后再产生告警,在对所有的规则进行匹配之后,选择最高优先级的规则告警。
第2版Snort的探测引擎是完全重写的,从而比先前版本的快了许多。
在写这本书的时候,Snort 2.0还没有开始发行,早些时候的测试显示新的引擎比老的引擎要快将近18倍。
1.3.4 日志和告警系统
依据在包中所找到的东西,一个包可以用来记录行为或者产生告警。
日志可以存为简单的文本文件、tcpdump格式文件或者其他的形式。
在默认情况下,所有的日志文件都存放在/var/log/snort目录中。
你可以在命令行中用-l选项来修改日志和告警存放的位置。
更多的命令行选项将在下一章中讨论。
这些选项可以用来修改日志和告警的类型和细节等等。
1.3.5 输出模块
输出模块或插件可以根据你指定的保存日志和告警系统产生的输出信息的方式来执行不同的动作。
基本上这些模块用来控制日志和告警系统产生的输出信息的格式。
根据配置,输出模块可以做下列事情:
●简单的在/var/log/snort/alerts文件或其他文件中记录日志
●发送SNMP trap
●将日志记录到类似于MySQL或Oracle的数据库中。
你将在这本书的后面
了解更多的关于使用MySQL的信息
●产生XML输出
●修改路由其或者防火墙的配置
●向Windows主机发送SMB消息
其他一些工具可以用来发送如信息或者web页面浏览等格式的告警,在后面的章节中你将了解更多的信息。
表1-1是IDS各种部件的汇总。
表1-1 IDS的部件
名称描述
包解码器为处理过程准备包
预处理器或输入插件分析协议头部,规格化头部,探测头部。