辛苗



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