辛苗
摘 要:由于小型商業(yè)或自用網(wǎng)絡(luò)中心無法投入大量財(cái)力物力對(duì)其進(jìn)行全部防御,本文提出了一種自建入侵檢測系統(tǒng)與防火墻聯(lián)動(dòng)策略的實(shí)現(xiàn)方法來實(shí)現(xiàn)該類網(wǎng)站中心的基本防護(hù)。利用Libnids庫進(jìn)行二次開發(fā)實(shí)現(xiàn)了自建入侵檢測系統(tǒng)與防火墻聯(lián)動(dòng),該策略在進(jìn)行監(jiān)聽網(wǎng)絡(luò)通信期間,當(dāng)察覺到可疑的活動(dòng),系統(tǒng)就會(huì)自動(dòng)設(shè)置新的防火墻規(guī)則,阻止與可疑IP主機(jī)間的全部連接。實(shí)驗(yàn)證明,通過硬件、軟件的配合,可以有效對(duì)不符合規(guī)定的行為進(jìn)行即時(shí)阻斷和記錄。
關(guān)鍵詞:入侵檢測;防火墻聯(lián)動(dòng)策略;Libnids;主動(dòng)防御
1? 引言
目前,在全球信息化的同時(shí),各種攻擊、防護(hù)技術(shù)和方法(如對(duì)工業(yè)控制系統(tǒng)的攻擊、無界瀏覽器、網(wǎng)絡(luò)刷票、免殺、網(wǎng)絡(luò)身份證、云安全等)層出不窮。這些攻擊和防護(hù)技術(shù)所帶來的安全問題尤其突出,而對(duì)網(wǎng)絡(luò)進(jìn)行實(shí)時(shí)安全問題檢測,識(shí)別不同信息安全攻擊手段的威脅程度,并迅速做出解決方案,使其對(duì)網(wǎng)絡(luò)信息安全所帶來的風(fēng)險(xiǎn)和影響降到最低,是一種十分必要的網(wǎng)絡(luò)安全防護(hù)措施之一。國內(nèi)外圍繞網(wǎng)絡(luò)信息安全的研究十分活躍,其重要性不言而喻[1] [2]。
本文提了一種自建入侵檢測系統(tǒng)與防火墻聯(lián)動(dòng)策略實(shí)現(xiàn)方法是一種將被動(dòng)式入侵檢測系統(tǒng)變?yōu)橹鲃?dòng)式防御方法,其弊端較主動(dòng)式防御技術(shù)無論在風(fēng)險(xiǎn)方面還是其技術(shù)被不法分子利用方面都是極低的,且其十分靈活,造價(jià)及部署成本極低。
2? 技術(shù)概述
防火墻可以比喻為辦公室門口的警衛(wèi),用來檢查進(jìn)出者的身份。而入侵檢測系統(tǒng)就像是網(wǎng)上的警報(bào)器,當(dāng)發(fā)現(xiàn)入侵者時(shí),指出入侵者的來歷、他們正在做什么。入侵檢測系統(tǒng)被視為防火墻之后的第二道安全閘門。
2.1? 防火墻技術(shù)
防火墻技術(shù),最初是針對(duì) Internet 網(wǎng)絡(luò)不安全因素所采取的一種保護(hù)措施。顧名思義,防火墻就是用來阻擋外部不安全因素影響的內(nèi)部網(wǎng)絡(luò)屏障,其目的就是防止外部網(wǎng)絡(luò)用戶未經(jīng)授權(quán)的訪問。它是一種計(jì)算機(jī)硬件防火墻件和軟件的結(jié)合,使Internet與Intranet之間建立起一個(gè)安全網(wǎng)關(guān)(Security Gateway),從而保護(hù)內(nèi)部網(wǎng)免受非法用戶的侵入,防火墻主要由服務(wù)訪問政策、驗(yàn)證工具、包過濾和應(yīng)用網(wǎng)關(guān)4個(gè)部分組成,防火墻就是一個(gè)位于計(jì)算機(jī)和它所連接的網(wǎng)絡(luò)之間的軟件或硬件。該計(jì)算機(jī)流入流出的所有網(wǎng)絡(luò)通信均要經(jīng)過此防火墻。
防火墻的工作原理是按照事先規(guī)定的策略規(guī)則,監(jiān)控所有通過防火墻的數(shù)據(jù)信息,嚴(yán)格按照策略執(zhí)行通、斷動(dòng)作,同時(shí)保存日志信息,記錄其五元組(通常是指由源IP地址,源端口,目的IP地址,目的端口,和傳輸層協(xié)議號(hào)這五個(gè)量組成的一個(gè)集合),以便方便網(wǎng)絡(luò)管理員的檢測和跟蹤[3]。
防火墻的優(yōu)點(diǎn)是策略性強(qiáng),通過執(zhí)行人為定制的安全策略,能過濾掉管理員知識(shí)體系中已有的不安全服務(wù),拒絕可疑的訪問,大大降低非法攻擊的風(fēng)險(xiǎn),提高網(wǎng)絡(luò)安全系數(shù)[4]。
2.2? 入侵檢測系統(tǒng)
入侵檢測系統(tǒng)是一個(gè)強(qiáng)大的網(wǎng)絡(luò)入侵檢測系統(tǒng)。它具有實(shí)時(shí)數(shù)據(jù)流量分析和記錄IP網(wǎng)絡(luò)數(shù)據(jù)包的能力,能夠進(jìn)行協(xié)議分析,對(duì)網(wǎng)絡(luò)數(shù)據(jù)包內(nèi)容進(jìn)行搜索/匹配。它能夠檢測各種不同的攻擊方式,對(duì)攻擊進(jìn)行實(shí)時(shí)報(bào)警。此外,很多入侵檢測系統(tǒng)都是開源的,例如snort,具有很好的擴(kuò)展性和可移植性,本文這事利用開源入侵檢測系統(tǒng)進(jìn)行二次設(shè)計(jì)實(shí)現(xiàn)與防火墻聯(lián)動(dòng)[5] [6]。入侵檢測系統(tǒng)基本體系結(jié)構(gòu)如圖1所示:
如上圖所示,入侵檢測系統(tǒng)基本體系結(jié)構(gòu)由4大軟件模塊組成,它們分別是:
(1)數(shù)據(jù)包嗅探模塊——負(fù)責(zé)監(jiān)聽網(wǎng)絡(luò)數(shù)據(jù)包,對(duì)網(wǎng)絡(luò)進(jìn)行分析;
(2) 預(yù)處理模塊——該模塊用相應(yīng)的插件來檢查原始數(shù)據(jù)包,從中發(fā)現(xiàn)原始數(shù)據(jù)的“行為”,如端口掃描,IP碎片等,數(shù)據(jù)包經(jīng)過預(yù)處理后才傳到檢測引擎;
(3)檢測模塊——該模塊是核心模塊。當(dāng)數(shù)據(jù)包從預(yù)處理器送過來后,檢測引擎依據(jù)預(yù)先設(shè)置的規(guī)則檢查數(shù)據(jù)包,一旦發(fā)現(xiàn)數(shù)據(jù)包中的內(nèi)容和某條規(guī)則相匹配,就通知報(bào)警模塊;
(4) 報(bào)警/日志模塊——經(jīng)檢測引擎檢查后的數(shù)據(jù)需要以某種方式輸出。如果檢測引擎中的某條規(guī)則被匹配,則會(huì)觸發(fā)一條報(bào)警,這條報(bào)警信息會(huì)通過網(wǎng)絡(luò)、UNIX socket、Windows Popup(SMB)、SNMP協(xié)議的trap命令傳送給日志文件,甚至可以將報(bào)警傳送給第三方插件(如SnortSam),另外報(bào)警信息也可以記入SQL數(shù)據(jù)庫。
3? 自建入侵檢測系統(tǒng)與防火墻聯(lián)動(dòng)
本文使用Libnids(Library Network Intrusion Detection System)庫進(jìn)行二次編程實(shí)現(xiàn)自建入侵檢測系統(tǒng)與防火墻聯(lián)動(dòng)。Libnids是一個(gè)用于網(wǎng)絡(luò)入侵檢測開發(fā)的專業(yè)編程接口。它實(shí)現(xiàn)了基于網(wǎng)絡(luò)的入侵檢測系統(tǒng)的基本框架,并提供了一些基本的功能。使用Libnids可以快速地構(gòu)建基于網(wǎng)絡(luò)的入侵檢測系統(tǒng)[7] [8],并可以在此基礎(chǔ)上進(jìn)一步擴(kuò)展開發(fā)。
3.1? 開發(fā)實(shí)現(xiàn)TCP數(shù)據(jù)流重組
(1)TCP數(shù)據(jù)流重組
TCP報(bào)文在網(wǎng)絡(luò)傳輸過程中會(huì)有失序,重復(fù),還會(huì)有丟包的情況發(fā)生,在進(jìn)行上層協(xié)議分析之前,需要對(duì)TCP報(bào)文進(jìn)行重組以進(jìn)行TCP報(bào)文的重新排序,丟棄重復(fù)的數(shù)據(jù),并指示數(shù)據(jù)的丟失。簡單的講,重組僅關(guān)心TCP序號(hào)、應(yīng)答號(hào)及數(shù)據(jù),還有幾個(gè)特殊的TCP標(biāo)志(SYN,ACK,RST,F(xiàn)IN需特別處理) [9]。重組需要從SYN包獲取一個(gè)啟始序號(hào),ACK標(biāo)志表示應(yīng)答序號(hào)有效,RST、FIN將設(shè)置數(shù)據(jù)流的結(jié)束標(biāo)志,待所有數(shù)據(jù)接收完成,數(shù)據(jù)流才關(guān)閉[10]。
(2)利用Libnids二次開發(fā)實(shí)現(xiàn)TCP數(shù)據(jù)流重組
Libnids提供了TCP數(shù)據(jù)流重組的功能,它可以顯示任何基于TCP協(xié)議的應(yīng)用層協(xié)議。利用Libnids可以很好地實(shí)現(xiàn)顯示TCP的連接過程,并對(duì)它們的傳輸數(shù)據(jù)進(jìn)行詳細(xì)的分析。Libnids的TCP數(shù)據(jù)流重組開發(fā)流程如下:
(a) 首先用函數(shù)nids_init()進(jìn)行初始化;
(b) 調(diào)用函數(shù)nids_register_tcp()注冊(cè)用于分析TCP連接和TCP連接狀態(tài)的回調(diào)函數(shù),主要的工作在此回調(diào)函數(shù)中實(shí)現(xiàn);
(c) 調(diào)用函數(shù)nids_run()進(jìn)入循環(huán)捕獲數(shù)據(jù)包的狀態(tài)。
Libnids的TCP數(shù)據(jù)流重組開發(fā)流程示意圖如圖2所示:
(3)回調(diào)函數(shù)tcp_dialog
對(duì)TCP流重組的回調(diào)函數(shù)的類型定義如下:
void tcp_dialog(struct tcp_stream* tcp_connection, void** arg);
其中參數(shù)tcp_connection描述的是一個(gè)TCP連接的所有信息。
下面提供了對(duì)其幾個(gè)基本成員信息提取的方法,這些基本信息也是tcp_dailog所要實(shí)現(xiàn)完成的。
(a) 獲取TCP連接的地址和端口對(duì)。
提取tcp_stream地址端口對(duì)成員:
struct tuple4 ip_and_port = tcp_connection->addr。
將目的ip地址轉(zhuǎn)換為點(diǎn)式地址:
libnet_addr2name4( ip_and_port.saddr, 0 )。
獲取TCP源/目的端口:
ip_and_port.source/ip_and_port.dest。
(b) 判斷l(xiāng)ibnids狀態(tài)。
switch( tcp_connection->nids_state )
{
case NIDS_JUST_EST:
// 表示TCP客戶端與服務(wù)器建立連接狀態(tài)
tcp_connection->client.collect++;
tcp_connection->server.collect++;
case NIDS_CLOSE:
// 表示TCP連接正常關(guān)閉
case NIDS_RESET:
// 表示TCP連接被RST關(guān)閉
case NIDS_DATA:
// 表示有新的數(shù)據(jù)到達(dá),對(duì)新到達(dá)的數(shù)據(jù)進(jìn)行解析
// 調(diào)用自定義函數(shù)
parse_newdata(struct tcp_stream* tcp_connection,char * AddBuf )
}
3.2? 開發(fā)實(shí)現(xiàn)TCP端口掃描檢測
(1) 實(shí)現(xiàn)端口掃描檢測
在Libnids中提供了一些基本的檢測技術(shù),如對(duì)網(wǎng)絡(luò)掃描攻擊的檢測(包括端口掃描攻擊),以及對(duì)異常IP數(shù)據(jù)包、異常TCP數(shù)據(jù)包和異常UDP數(shù)據(jù)包的檢測。Libnids針對(duì)端口掃描攻擊的開發(fā)流程如下:
(a) 首先通過Libnids的全局參數(shù)對(duì)Libnids的一些環(huán)境參數(shù)進(jìn)行設(shè)置,就端口掃描檢測而言,此步驟完成的是注冊(cè)端口掃描檢測攻擊的函數(shù),方法如下:
nids_params.syslog = portscan_ids
其中nids_params為Libnids全局變量,成員syslog是一個(gè)函數(shù)指針,默認(rèn)值為nids_syslog()函數(shù)。
在syslog函數(shù)中可以檢測入侵攻擊,如端口掃描攻擊,也可以檢測一些異常情況,如無效TCP標(biāo)記。此處注冊(cè)的是回調(diào)函數(shù)portscan_ids,其定義類型如下:
void portscan_ids(int type, int errnum, IPV4_HEADER* iph,struct host* hostinfo)
入口參數(shù)說明如下:
參數(shù)type為Libnids報(bào)警類型;
參數(shù)errnum為IP、TCP報(bào)警類型;
參數(shù)iph為IP數(shù)據(jù)包頭結(jié)構(gòu),需要自定義,見common/pt_header.h;
參數(shù)hostinfo為掃描主機(jī)數(shù)據(jù)結(jié)構(gòu)。
設(shè)置之后的環(huán)境參數(shù)對(duì)整個(gè)Libnids都有效。
(b) 完成檢測攻擊函數(shù)的注冊(cè)后,接下來用函數(shù)nids_init()進(jìn)行Libnids初始化。
(c) 最后用函數(shù)nids_run()進(jìn)入循環(huán)捕獲數(shù)據(jù)包的狀態(tài)。
Libnids針對(duì)端口掃描攻擊的開發(fā)流程示意如圖3所示。
\
(2)掃描主機(jī)數(shù)據(jù)結(jié)構(gòu)
struct scan
{
unsigned int addr;/* 被掃描者的IP(網(wǎng)絡(luò)字節(jié)順序)*/
unsigned short port;/* 被掃描端口號(hào)*/
unsigned char flags;/* TCP掃描類型(SYN、FIN、NULL掃描)*/
}
struct host
{
struct host* next;/* 下一個(gè)主機(jī)結(jié)點(diǎn)*/
struct host* prev;/* 前一個(gè)主機(jī)結(jié)點(diǎn)*/
unsigned addr;/* 掃描源IP地址*/
unsigned modtime;/* 時(shí)間*/
unsigned n_packets;/* 掃描次數(shù)*/
struct scan* packets;/* 掃描信息*/
}
(3) 端口掃描檢測回調(diào)函數(shù)