Linux平臺Snort入侵檢測系統實戰指南
我們都知道,企業的網絡目前威脅主要來自兩個位置:一個是內部,一個是外部。來自外部的威脅都能被防火墻所阻止,但內部的攻擊都不好防范。因為公司內部人員對系統了解很深且有合法訪問權限,所以內部攻擊更容易成功。
IDS為信息提供保護,已經成為深度防御策略中的重要部分。IDS與現實世界里的防竊報警裝置類似,它們都對入侵進行監控,當發現可疑行為時,就向特定的當事人發出警報。IDS分為兩類:主機IDS(HIDS)和網絡IDS(NIDS)。HIDS安裝在受監控主機上,擁有對敏感文件的訪問特權。HIDS利用這一訪問特權對異常行為進行監控。NIDS存在于網絡中,通過捕獲發往其他主機的流量來保護大量網絡設施。
HIDS和NIDS都有各自的優點和缺點,完整的安全解決方案應包括這兩種IDS,對于這一點比較難做到。不了解這一領域的人常常認為IDS就像一把萬能鑰匙,能解決所有安全問題。例如有的單位花了大筆的錢購置了商業IDS由于配置不當反而搞得連連誤報,一下子就把數據庫塞滿了大量丟包進而崩潰。這種態度使人們以為只要將IDS隨便安放在網絡中就萬事大吉了,不必擔心任何問題,實際上遠非如此。沒有人會認為Email服務器直接連在Internet上就能正確運作。同樣,你也需要正確的計劃IDS策略,傳感器的放置。下文以開源軟件Snort的安裝與維護為例,介紹正確地安裝和維護IDS的思路和方法。
安裝Snort
1、安裝準備工作
我們在安裝前我們要知道我們需要監控的內容,理想的狀況是對一切進行監控。所有網絡設備和任何從外部到企業的連接都處在Snort的監視之下。盡管這一計劃對小公司只有幾十臺機器是很可能實現的,但是當大型企業中連接上天臺網絡設備時,這成了難以施展的艱巨任務。
為了加強snort檢測的安全性,最好能為監控網段提供獨立的智能交換機,如果你需要配置分布式的配置,可以吧服務器和控制臺接在一個交換機上,二其他傳感器放置在不同的物理位置,但這樣的成本會有所增加。Snort IDS的維護問題是無法回避的。你遲早要對Snort特征更新并編寫定制的規則,所以你還需要一個懂得維護IDS的專業人士。#p#
2、深入Snort
Snort包含很多可配置的內部組件,它們對誤報、漏報以及抓包和記錄日志等的性能都有很大影響。能深入了解Snort的內幕有助于有效地利用Snort監控人侵。還會幫助你根據自己的網絡定制Snort,并且避免它的一些常見缺陷。
2.1、用Libpcap輸送Snort包
Snort沒有自己的捕包工具,它需要一個外部的捕包程序庫:libpcap。Snort利用libpcap獨立地從物理鏈路上進行捕包,它可以借助libpcap的平臺為一個真正的與平臺無關的應用程序。直接從網卡捕包的任務由libpcap承擔。這一捕獲原始包的工具是由底層操作系統提供給其他應用程序使用的。Snort需要數據保持原始狀態,它利用的就是原始包所有的協議頭信息都保持完整,未被操作系統更改的特性來檢測某些形式的攻擊。由于利用libpcap獲取原始包,一次只能處理一個包,這不是最好的方法,這也制約了它對千兆網絡進行監控的瓶頸。
2.2、包解碼器
包一被收集到Snort必須對每一個具體的協議元素進行解碼。在包通過各種協議的解碼器時,解碼后的包數據將堆滿一個數據結構。包數據一被存人數據結構中,就會迅速被送到預處理程序和檢測引擎進行分析。
2.3、預處理程序
Snort的預處理分為兩類。它們可以用來針對可疑行為檢查包或者修改包以便檢測引擎能對其正確解釋。預處理的參數可以通過snort.Conf配置文件調整。
預處理器:
Frag2
Stream4
Stream4_reassemble
Http_decode
RPC_decode
BO
Telnet_decode
ARPspoof
ASNI_decode
Fnord
Conversation
Portscan2
SPADE
2.4、檢測引擎
檢測引擎將流量與規則按其載人內存的順序依次進行匹配。是Snort的一個主要部件。
2.5、輸出插件
Snort的輸出插件接收Snort傳來的入侵數據。輸出插件的目的是將報警數據轉儲到另一種資源或文件中。#p#
2.6、Snort的性能問題
Snort有效工作的性能可能會受到以下幾種選擇的限制:硬件、操作系統和連網的組件。
對snort的性能影響最大的是snort的配置設定以及規則集設置。內部瓶頸則主要出現在包解碼階段,要snort檢查包的容,那么它比一般的規則都要更加耗費系統資源。啟用的檢查包內容的規則越多,snort的運行就需要越多的系統資源。如果要激活預處理程序中的某些設置選項,就會需要消耗額外的系統資源。最明顯的例子就是啟用在frag2預處理程序和stream4預處理程序中的“最大存儲容量(memcap)”選項。如果您打算激活大量耗費資源的預處理程序選項,最好確定有足夠的硬件資源的支持。我曾經遇到過一個用戶花了大筆的錢購買了最先進的 IDS由于配置不當,連檢測100M網都出現了丟包現象。
1)、SPAN端口監控
在監控時我們必然需要做SPAN,SPAN端口監控是另外一種在現有網絡結構中引入監控網段的方法。Cisco交換機的中高端產品都有SPAN端口或鏡像端口。Span端口既可以是一個專用端口,也可以通過該端口實現交換機上所有的端口的配置選項設定。利用SPAN端口的特點實現監控功能是一種實用的方法。使用SPAN端口監控法并不會給所要監控的網絡引入單點錯誤的問題。與網內Hub監控法相比,這是使用SPAN端口監控最大的優點。
注意:鏡像順序問題:當所監控的網絡要升級為高帶寬網絡時,可以先是只鏡像一個端口,對snort的性能觀察一段時間,并根據需要進行調整。當snort的這個端口調整好了之后,可以切合實際的、循序漸進的增加別的端口,要注意的是,千萬不能一下子增加過多的端口。用SPAN端口監控法將會降低本生交換設備的性能用SPAN端口會使交換設備的內存負擔過重,從而使設備的性能下降。對流量的映是一個非常耗費內存的過程。#p#
2.7、安裝Snort
操作系統:Red Hat Enterprise Linux 5.5
數據庫:MySQL:mysql-5.1
Web服務器:Apache:httpd-2.2
WEB語言:PHP:php-5.4
首先我們需要安裝MySQL 、Apache(必須安裝mod_ssl模塊) 、PHP、并進行配置Apache,其詳細安裝過程可以參見《Linux企業應用案例精解》一書不在這里講解。
1)、安裝主程序
#tar zxf snort-2.8.5.2.tar.gz
#cd snort-2.8.5.2
#./configure --with-mysql=/usr/local/mysql & make & make install
創建配置文件目錄mkdir /etc/snort
創建日志目錄mkdir /var/log/snort
2)安裝snort規則
tar zxf snortrules-snapshot-2860.tar.gz
tar zxf snortrules-snapshot-CURRENT.tar.gz
mv rules/ /etc/snort
cp * /etc/snort/
修改/etc/snort/snort.conf文件
監聽的本地網段 var HOME_NET 192.168.150.0/24
有五行以output database: 開頭的行,將其“#”號去掉。
3) 創建snort數據庫
mysql> create database snort;
mysql> connect snort;
mysql> source /usr/local/src/snort-2.8.4.1/schemas/create_mysql;
mysql>grant CREATE,INSERT,SELECT,DELETE,UPDATE on snort.* to snort;
mysql>grant CREATE,INSERT,SELECT,DELETE,UPDATE on snort.* to snort@localhost;
另外有興趣的網友可以嘗試使用phpMyadmin這一工具,phpMyAdmin是一個基于web的MySQL數據庫管理工具。它能夠創建和刪除數據庫,創建/刪除/修改表格,刪除/編輯/新增字段,執行SQL腳本等。#p#
2.8、啟動snort
正確安裝并配置完成以后,下一步我們需要啟動snort
#snort -c /etc/snort/snort.conf
為了snort安全應避免用root身份運行snort,這時需要創建專用的用戶和組#useradd snort,如果是redhat在創建用戶的同時就創建了snort組:
#snort –u snort –g snort –U –d –D –c /etc/snort/snort.conf
接下來就需要安裝Acid+Adodb+Jpgraph, ACID(Analysis Console for Incident Databases)是snort使用的標準分析員控制臺軟件。ACID是一個基于PHP的分析引擎,它能夠搜索、處理snort產生的數據庫。下面是安裝及配置過程。這一過程也非常簡單將adodb和jpgraph的tar包復制到Apache根目錄下,解開acid包后,修改acid_conf.php配置即可。注意Acid配置參數都在acid_config.php文件里,所有的值都必須放在雙引號內(“),而且后面要加上分號(;)必須現已SSL模式啟動Apache,定位到ACID的主頁https://IP地址/acid/,如圖1所示。
▲圖1 ACID界面
2.9、提高性能
如果是監控10/100M的網絡還行,如果流量過大就需要提高snort的監控性能,目前最經濟的方法是,在雙網卡上運行Snort程序,可以配置Snort來偵聽多個網卡,問題是Snort每個命令行選項(-i)只接受一個網卡。有種在多種網卡上運行Snort的方法:
1、為每個網卡運行一個獨立的Snort進程;
2、通過綁定Linux內核的特征將所有的網卡綁定在一起。
用Snort監控多個網卡時選擇哪種方法取決于你的環境和優先級等多種因素。運行多個Snort進程會增大工作量,并浪費大量的無法接受的處理器時間周期。如果你有可用的資源來運行兩個或多個Snort進程,那么你應該考慮一下數據管理問題。假設所有的Snort實例以同樣的方式配置,那么同樣的攻擊會被報告多次。這會令人侵檢測系統管理員頭疼,尤其是啟用時報警的時候。當你面對不同的網卡有不同的入侵檢測需求時,為每個網卡分配單個Snort程是最理想的。如果你為每個網卡都分配了一個獨立的Snort進程,那么你就為每個網卡創建一個類似虛擬的傳感器。在一個機器上架設幾個“傳感器”,你就可以為每個獨立的Snort進程載入不同的配置、規則和輸出插件。這最適合于獨立的Snort進程。另一方面,如果你不能這樣、或者不想為每個網卡啟用額外的Snort進程,你可以將兩個網卡綁定在一起。這樣當你啟用Snort時,就能用 -i命令選項指定個已被綁定的網卡(如bond0)。
為了實現這個目的,請編輯/etc/modules.conf,加入如下行:
alias bond0 bonding
現在,每次重啟機器,你都需要在將IP地址信息分配給網卡之后輸入下而的侖今桌漸活綁定的網卡:
ifconfig bondup
ifenslave bond0 eth0
ifenflave bond0 eth1
注意,你可將這些命令放在一個腳本里,在系統啟動時運行該腳本。當運行Snort時,可以按如下方式使用的bond0網卡:
snort < options> -i bond0
#p#
維護Snort
當你安裝好系統后就必然會對系統進行維護,或是對Snort做一些重要的改動以保持它的相關性,比如升級規則集,修改配置選項,最后升級Snort應用程序本身。如果你運行的是多個傳感器構成的分布式系統,雖然這些手工方法也是可取的,但手工修改多個傳感器就會變得相當困難,還容易出錯。
這是我們需要管理助手SnortCenter,它是一款基于Web方式升級和維護Snort配置的管理應用軟件。是一款用于遠程管理Snort傳感器的應用軟件。它用的是PHP/MySQL Web界面,安裝完成啟動界面如圖2所示。
▲圖2 SnortCenter 界面
特征:
◆ snort后臺進程狀態監視器;
◆ 遠程snort停止/啟動/重啟;
◆ snortcenter用戶的訪問控制;
◆ 傳感器組;
◆ ACID集成;
SnortCenter包括基于PHP的管理應用軟件和SnortCenter代理。SnortCenter管理控制臺安裝在Snort服務器上,而SnortCenter傳感器代理被安裝在所管理的傳感器中。SnortCenter增強了可能安裝在分布式系統上的Snort,服務器端需要如下的軟件包:
◆ MySQL;
◆ Apache;
◆ PHP;
◆ ADODB;
◆ OpenSSL;
◆ cURL
這里,除了cURL軟件包,其他的軟件包應該都是大家比較熟悉的,因為絕大多數的操作系統都包括這些軟件包,SnortCenter管理控制臺可運行在Windows、Linux和BSD系統上。SnortCenter傳感器代理需要安裝在基于UNIX操作系統的Perl上。該代理在一些附加的預編譯程序幫助下可以運行在基于Windows的傳感器上。
1、SnortCenter的安裝
前提是要安裝并配置好Acid,因此你應該預先在作為Snort服務器的機器上安裝MySQL,Apache,PHP,ADODB和OpenSSL。你可以將SnortCenter安裝在Linux系統上了。
1.1、SnortCenter管理控制臺
在安裝SnortCenter之前惟一還需要安裝的軟件包是cURL,這是一個不需要用戶干涉通過URL傳輸文件的命令行工具,它用于管理和控制Snort傳感器。你可以通過如下命令行檢查在Red Hat上是否安裝了該軟件包:
Rpm -qa | grep curl
該命令行將會查詢包含了curl字符串的軟件包,如果你沒有安裝cURL,可以去網上下載。
下一步在WEB根目錄下建立snortcenter目錄,將下載文件包解壓到這個目錄里,然后就通過配置config.php文件來配置SnortCenter 。
對于這個配置文件需要說明的有以下幾點:
◆ DBlib_path設定Adodb庫的位置。
◆ url_path該變量應設為cURL可執行文件的位置。
◆ DBtype這里設置你所安裝的數據庫的類型
◆ DB_dbname這是你在下一步中要創建的SnortCenter數據庫名
◆ DB_host DB_host是Snort服務器的主機名。如果SnortCenter管理控制臺和數據庫安裝在同一臺計算機上,應將該參數設為localhost;
◆ DB_user SnortCenter登錄數據庫所用的帳號。
◆ DB_ password數據庫—用戶的密碼;
◆ DB_ port DB_ port是數據庫運行的端口號。
保存修改并關閉config.php,下一個任務是建立DB_dbname變量指定的數據庫,首先需要登錄MysqL數據庫,然后創建SnortCenter數據庫,命令如下:
>create database snortcenter;
創建好數據庫之后,在Web瀏覽器中就可以看到SnortCenter管理控制臺(地址為https: //localhost/snortcenter)了。這里建立了SnortCenter需要的所有表。你也可以用位于tarball的snortcenter db.Mysql腳本創建它們。這就完成了SnortCenter管理控制臺部分的安裝。第一次登錄時,你需修改用戶名admin和口令。
1.2、安裝SnortCenter傳感器代理
要完成SnortCenter的安裝,還需在你想用SnortCenter管理的傳感器上安裝SnortCenter傳感器代理。安裝基于UNIX的代理需要Perl、OpenSSL和Perl模塊Net::SSLeay。前面我們已經在傳感器上安裝了OpenSSL和Perl,現在只需要進行Net::SSLeay模塊的安裝。你可以在網址http://search.cpan.org下載該模塊。
下載并安裝Net::SSLeay,首先在源目錄下執行下列命令:
Perl Makefile.pl
Make install
安裝好Net::SSLeay模塊后,需創建SnortCenter傳感器代理所用的目錄,即創建下列目錄:
◆ 程序目錄:/usr/local/snortcenter
◆ 配置目錄:/usr/local/snortcenter/conf
◆ 日志目錄:/usrAocal/snortcenter/log
◆ 策略目錄:/usr/local/snortcenter/rules
接著,你還需為SnortCenter創建一個SSL證書。用下面的命令行創建它:
#openssl req -new -x509 -days 365 -nodes -out snortcenter.pem -keyout snortcenter. pem
將snortcenter.pem文件復制到/usr/local/snortcenter/conf目錄下。現在你就可以準備安裝SnortCenter傳感器代理了,在http://users.pandora.be/larc/download/下載合適的版本。
將文件解壓并移動到/usr/local/snortcenter/目錄下。運行安裝的shell腳本:
#./setup.sh
安裝腳本會向你提出許多問題。你已經為Snort和SnortCenter創建所需的文件夾,當詢問時依次輸入這些目錄。代理可以運行在任何端口上的,可以任意指定,但要記住你選擇的是哪一個端口。指定SnortCeneter管理和偵聽的網卡IP地址。當出現啟用SSL選項時,選擇Yes。你也應該注意記住代理的登錄名和口令,在管理器控制臺中輸入認證信息。最后的選項是設置Snort服務器的IP地址。這樣就完成了SnortCenter傳感器代理的安裝。重復這個安裝過程,為你的Snort環境中的每個傳感器安裝代理。
注意配置snortcenter要想升級傳感器的多種配置,必須首先在snortcenter管理控制臺中添加他們。