入侵检测原理
在网络安全领域,网络至少应该包含三个要素:数据、关系和能力1。网络安全的意义,就在于为以上三个要素提供保护,保证这三者能够为所应为,为合适的人服务,而且只为合适的人服务。相应地,网络安全包含数据保护、(信赖)关系保护和能力保护三方面的内容。在实践经验和一些理论研究的基础上,提出了一些安全模型,其中比较有代表性的就是PDR模型,如图1 所示。
PDR 模型包括策略(Policy)、防护(Protection)、检测(Detection)、响应(Response)三个部分。策略是这个模型的核心,它意味着网络安全要达到的目标,网络安全的其他几个方面要围绕着策略进行。一般而言,防护是安全的第一步,它的基础是检测与响应的结果;防护相对于攻击来说总是滞后的,一个漏洞的发现或者攻击手段的发明与响应的防护手段的采用之间,总会有一个时间差,检测就是弥补这个时间差的必要手段;在发现了攻击企图或者攻击之后,需要系统及时地进行反应。应该注意的是,图1 中虽然是一个平面的循环,但实际上应该是一个螺旋上升的过程,经过一个PDR 循环之后,进行防护的水平应该是提高的。
入侵检测就是PDR 模型中的检测,它的作用在于承接防护和响应的过程,是PDR 模型作为一个动态安全模型的关键所在。在网络中,只有防护是不够的,在设计现有防护系统的时候,只可能考虑到已知的安全威胁与有限范围内的未知安全威胁。防护技术只能做到尽量组织攻击企图的得逞或者延缓这个过程,而不能阻止各种攻击事件的发生。一个完善的入侵检测系统必须具有经济性、时效性、安全性和可扩展性,并且可以通用地划分为数据提取模块、数据分析模块和结构处理模块三部分,其系统结构如图2 所示。数据提取模块的作用在于为系统提供数据,将处理过(如果必要)的数据提交给数据分析模块;数据分析模块的作用在于对数据进行深入地分析,发现攻击并根据分析的结果产生事件,传递给结果处理模块。结构处理模块的作用在于警告与反应,从非技术的角度来说,结果处理模块的告警是通知管理员。
根据着眼点的不同,对入侵检测技术的分类方法很多,根据数据分析方法(也就是检测方法的不同)可以分为异常检测模型和误用检测模型。由于入侵检测系统的核心在于分析模块,因此这里着重根据分析方法的不同来叙述入侵检测系统的异常检测模型和误用检测模型。
Snort 是一个用C 语言编写的开发源代码的软件,是一个跨平台、轻量级的网络入侵检测软件,实际上是一个基于libpcap的网络数据包嗅探器和日志记录工具,可以用于入侵检测。从入侵检测分类上来看,Snort 是一个基于网络和误用的入侵检测系统。Snort 采用基于规则的网络信息搜索机制,对数据包进行内容的模式匹配,从中发现入侵和探测行为。Snort具有实时报警能力,它的警报信息可以发往syslog、Server Message Block(SMB)、WinPopup Message 或者单独的alert 文件。Snort 可以通过命令行进行交互,并对可选的BPF(Berkeley Packet Filter)命令进行配置。Snort 安装在一台主机上对整个网络进行监视。本实验使用的版本为snort-2.7.0。
附:LAMP(Linux+Apache+MySQL+PHP)技术简介。
LAMP 是一组常用于来搭建动态网站或者服务器的开源软件平台,由四个组件组成,呈分层结构。每一层都提供了整个软件栈的一个关键部分:
Linux:Linux 处在最低层,提供操作系统。其他每个组件实际上也在 Linux 上运行。但是,并不一定局限于 Linux,如有必要,其他组件也可以在 Microsoft Windows、Mac OS X 或 UNIX 上运行。
Apache:次低层是 Apache,它是一个 Web 服务器。Apache 提供可让用户获得 Web 页面的机制。Apache 是一款稳定的、支持关键任务的服务器,Internet 上超过 65% 的网站都使用它作为 Web 服务器。PHP 组件实际上是在 Apache 中,动态页面可以通过 Apache 和 PHP 创建。
MySQL:MySQL 提供 LAMP 系统的数据存储端。有了 MySQL,便可以获得一个非常强大的、适合运行大型复杂站点的数据库。在 Web 应用程序中,所有数据、产品、帐户和其他类型的信息都存放在这个数据库中,通过 SQL 语言可以很容易地查询这些信息。
PHP:PHP 是一门简单而有效的编程语言,它像是粘合剂,可以将 LAMP 系统所有其他的组件粘合在一起。可以使用 PHP 编写能访问 MySQL 数据库中的数据和 Linux 提供的一些特性的动态内容。
作为开源软件的组合,LAMP最大的优势就是它的开放性。对开发人员来说,开放程度越高,其可选择东西也就越多,去描述需求的逻辑结构就很*。社区化的开发背景决定了LAMP是一种平民化的技术。在LAMP的发展过程中,也并没有一个强有力的公司去推动它,它的出现不是主导性公司的市场销售力量推动的结果,而是完全依赖底层开发人员的认同。
随着开源潮流的蓬勃发展,开放源代码的LAMP已经与J2EE和.Net商业软件形成三足鼎立之势,受到整个IT界的关注。越来越多的供应商、用户和企业投资者日益认识到,经过LAMP单个组件的开源软件组成的平台用来构建以及运行各种商业应用和协作构建各种网络应用程序变为一种可能和实践,变得更加具有竞争力,更加吸引客户。LAMP无论是性能、质量还是价格都将成为企业、*信息化所必须考虑的平台。
Snort的安装
(安装环境是ubuntu,版本7.10,已完成更新)
一、安装apache+php5+mysql
$su
$apt-get install apache2 libapache2-mod-php5 php5 php5-mysql mysql-server mysql-client
安装web服务器和数据库的目的是配合snort进行入侵检测,而且数据库有利于snort日志的存储和查询,这是一种通用的做法,而且在一般服务器上也有入侵检测的需要。
二、安装完成后进入mysql进行设置
建立mysql存储snort输出的数据库snortdb;
$mysql
mysql>create database snortdb;
建立管理该数据库的帐号snort@localhost,权限都给。
$mysql --user=root mysql
mysql> insert into user (Host,User,Password) values('localhost','snort','');
mysql> flush privileges;
mysql> grant all privileges on snortdb.* to 'snort'@'localhost';
三、安装snort-mysql,会自动安装snort-common,snort-rules-default
$apt-get install snort-mysql
可以手动修改/etc/snort/snort.conf /etc/snort/rules/* 来迎合自己的系统情况。
四、安装acidlab
#apt-get install acidlab
也要回答几个问题。
好了,已经大功告成,下面看看snort的配置与使用。这是输入snort后输出的帮助信息:
$ snort
,,_ -*> Snort! <*-
o" )~ Version 2.7.0 (Build 35)
'''' By Martin Roesch & The Snort Team: http://www.snort.org/team.html
(C) Copyright 1998-2007 Sourcefire Inc., et al.
USAGE: snort [-options] <filter options>
Options:
-A Set alert mode: fast, full, console, or none (alert file alerts only)
"unsock" enables UNIX socket logging (experimental).
-b Log packets in tcpdump format (much faster!)
-B <mask> Obfuscated IP addresses in alerts and packet dumps using CIDR mask
-c <rules> Use Rules File <rules>
-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 <bpf> Read BPF filters from file <bpf>
-g <gname> Run snort gid as <gname> group (or gid) after initialization
-G <0xid> Log Identifier (to uniquely id events for multiple snorts)
-h <hn> Home network = <hn>
-i <if> Listen on interface <if>
-I Add Interface name to alert output
-k <mode> Checksum mode (all,noip,notcp,noudp,noicmp,none)
-K <mode> Logging mode (pcap[default],ascii,none)
-l <ld> Log to directory <ld>
-L <file> Log to this tcpdump file
-M Log messages to syslog (not alerts)
-m <umask> Set umask = <umask>
-n <cnt> Exit after receiving <cnt> 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 <snap> Set explicit snaplen of packet (default: 1514)
-q Quiet. Don't show banner and status report
-r <tf> Read and process tcpdump file <tf>
-R <id> Include 'id' in snort_intf<id>.pid file name
-s Log alert messages to syslog
-S <n=v> Set rules file variable n equal to value v
-t <dir> Chroots process to <dir> after initialization
-T Test and report on the current Snort configuration
-u <uname> Run snort uid as <uname> 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 <file> Set the performonitor preprocessor file path and name
-z Set assurance mode, match on established sesions (for TCP)
-? Show this information
<Filter Options> are standard BPF options, as seen in TCPDump
Longname options and their corresponding single char version
--logid <0xid> Same as -G
--perfmon-file <file> Same as -Z
--pid-path <path> Specify the path for the Snort PID file
--snaplen <snap> Same as -P
--help Same as -?
--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 <file> Load a dynamic detection engine
--dynamic-engine-lib-dir <path> Load all dynamic engines from directory
--dynamic-detection-lib <file> Load a dynamic rules library
--dynamic-detection-lib-dir <path> Load all dynamic rules libraries from directory
--dump-dynamic-rules <path> Creates stub rule files of all loaded rules libraries
--dynamic-preprocessor-lib <file> Load a dynamic preprocessor library
--dynamic-preprocessor-lib-dir <path> Load all dynamic preprocessor libraries from directory
--dump-dynamic-preproc-genmsg <path> 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 <count> In combination with the -r <tf> option, this will read the tcpdump file continuously
for <count> times. A value of 0 will read the pcap until Snort is killed.
Uh, you need to tell me to do something...
配置
编辑/etc/snort/snort.conf 文件,找到“var HOME_NET any”行,把any 换为自己机器所在子网地址,自己机器上的IP 地址可以通过运行ifconfig eth0 查看,如本机地址为202.38.73.121, 则将该行改为“var HOME_NET 202.38.73.121”; 另外, 找到“var EXTERNAL_NET …”行,将该行改为“var EXTERNAL_NET !202.38.73.121”(注意感叹号和后面的地址之间没有空格),其它的环境变量一般使用默认值即可。接着找到output log_tcpdump一行,这是日志格式的配置选项,应该为mysql数据库方式,将这行改为
output database: log, mysql, dbname=snortdb user=snort host=localhost
然后保存文件。
最后在mysql数据库中建立相关表项。使用snort用户在snortdb库中执行如下命令:
这些命令可在/usr/share/doc/snort-mysql/create_mysql.gz解压后的文件中得到。也可以直接执行该文件运行这些命令,如下:
$gunzip /usr/share/doc/snort-mysql/create_mysql.gz
$mysql -usnort
mysql> use snortdb
Database changed
mysql> source /usr/share/doc/snort-mysql/create_mysql