薛李濱 潘瑜
(1青海師范大學計算機學院 青海 810000;2江蘇理工學院計算機工程學院 江蘇 213001)
隨著網(wǎng)絡的普及和互聯(lián)網(wǎng)技術的飛速發(fā)展,網(wǎng)絡安全問題日益突出,針對網(wǎng)絡的攻擊行為,在互聯(lián)網(wǎng)中也變得越來越嚴重。防火墻技術,數(shù)據(jù)加密技術,安全路由技術等作為傳統(tǒng)的網(wǎng)絡安全保護的第一道防線已經(jīng)阻擋不了越來越高科技的犯罪,這時迫切需要一種更加安全的機制,來對重要部門的網(wǎng)絡進行實時的入侵跟蹤和檢測,而不是像防火墻那樣僅在靜態(tài)范圍內(nèi)對網(wǎng)絡資源提供保護。因此,承擔網(wǎng)絡安全第二道防線任務的入侵檢測系統(tǒng)[1](Intrusion Detection System,IDS)就應運而生。IDS能夠實現(xiàn)對網(wǎng)絡信息的收集、分析、攻擊識別并及時做出反應, IDS能夠檢測出最常見的因特網(wǎng)攻擊,這些攻擊類型主要有三種:第一是拒絕服務攻擊[2](Denial of service attacks),即IDS能夠檢測出通過使系統(tǒng)癱瘓的方式來拒絕向用戶提供服務的攻擊,第二種是分布式拒絕服務攻擊(Distributed Denial of service attacks),即IDS能夠檢測出從多個分散的主機發(fā)動攻擊,從而使一個系統(tǒng)的遠程資源耗盡的攻擊,第三種是特洛伊木馬,即IDS能夠對包含惡意軟件并以合法形式出現(xiàn)的軟件進行監(jiān)控和檢測。按照收集信息的類型不同,IDS分為基于網(wǎng)絡和基于分布式的兩種主要類型。因為目前國內(nèi)外的IDS都是商用軟件,價格昂貴,大多數(shù)的小型企業(yè)都希望能使用一些開源的IDS,Snort是一種開源的IDS,并且它是免費的,因此受到很多用戶的歡迎。
Snort是一種免費、跨平臺、用C編寫的開放源碼的IDS,它符合GPL[3],經(jīng)過多次版本更新,已經(jīng)發(fā)展成為高效穩(wěn)定的IDS。
Snort支持擴充定制以及各種形式的插件,同時能夠跟蹤IP網(wǎng)絡數(shù)據(jù)包的日志記錄,探測異常的入侵軌跡,Snort兼具在功能強大的同時實現(xiàn)可移植性和代碼簡潔的優(yōu)點,在Linux這些開源工具中,Snort數(shù)百萬的下載量,使得其成為名符其實的行業(yè)標準。
Snort的特點:(1)Snort壓縮后只有1.8M的簡潔代碼,卻能夠實現(xiàn)相對強大的功能,充分體現(xiàn)了它輕量級的優(yōu)點。(2)除了Windows,Linux, Solaris, Snort還能夠支持Irix,HP-ux等操作系統(tǒng),跨平臺的可移植性能極佳。(3)Snort能夠分析TCP、UDP、ICMP和對端口掃描、緩沖區(qū)溢出攻擊、CGI攻擊等多種攻擊方式進行探測,并能夠探測可能存在的系統(tǒng)指紋特征。(4)Snort具有良好的可擴展性,能迅速探測到新的攻擊。 (5)Snort符合GPL,使得所有個人或企業(yè)均可根據(jù)自身需求自由使用。
首先,數(shù)據(jù)包進入目標系統(tǒng)進行訪問,接著數(shù)據(jù)包、審計數(shù)據(jù)等通過rub轉數(shù)據(jù)copy給Snort,Snort就開始通過數(shù)據(jù)收集器進行數(shù)據(jù)收集了,收集完成后,通過其內(nèi)部機制傳遞給Snort的檢測器,檢測器通過配置信息里的配置進行檢測,然后通過數(shù)據(jù)庫或規(guī)則知識庫進行規(guī)則匹配,匹配完成后,若發(fā)現(xiàn)此行為是定義的入侵攻擊方式,即開始報警,將報警信息傳遞給內(nèi)在的控制器,這個控制器開始內(nèi)在的控制操作,從而對目標系統(tǒng)進行安全性的防范,體系架構如圖1所示。
其中檢測器和知識庫的檢測流程分為兩大步:第一步是規(guī)則解析流程,它首先讀取規(guī)則文件,從規(guī)則文件中讀取每一條規(guī)則并對其進行解析, 用對應的語法表示出來,然后在內(nèi)存中建立規(guī)則語法樹,規(guī)則語法樹其實就是一個二維鏈表,規(guī)則由規(guī)則頭和若干規(guī)則選項組成, 規(guī)則頭存放源IP及端口、目的IP及端口、指向下一規(guī)則頭的指針和指向歸屬于它的規(guī)則選項的指針。規(guī)則選項存放規(guī)則信息、關聯(lián)規(guī)則頭和下一規(guī)則選項的指針。所有的規(guī)則頭組成規(guī)則頭鏈(主鏈),規(guī)則選項以規(guī)則頭為鏈首組成規(guī)則選項鏈(從鏈)。
第二步規(guī)則匹配流程,它對捕獲到的每條數(shù)據(jù)報文同第一步所建立的規(guī)則樹進行匹配, 根據(jù)數(shù)據(jù)報的IP和端口在主鏈中搜索對應的規(guī)則頭,找到后在此規(guī)則頭為鏈首的從鏈中匹配規(guī)則選項,如果發(fā)現(xiàn)存在規(guī)則匹配該報文,就表示檢測到一個入侵行為,則根據(jù)規(guī)則指定的行為進行處理,如果搜索完所有規(guī)則都沒有匹配到報文,就表示該報文是正常行為。
圖1 Snort體系架構圖
研究Snort源程序,應由幾個主要的源文件入手:
snort.c(h)文件,實現(xiàn)main函數(shù)和一系列輔助函數(shù),是snort的主程序文件。
decode.c(h)層層解碼數(shù)據(jù)包后,分析其包的協(xié)議和特征,是snort的包解碼文件。
Mstring.c(h)采用Boyer_More[4]算法,實現(xiàn)字符串的匹配。
rules.c(h)通過檢測入侵所需要的函數(shù)和設置規(guī)則,檢測攻擊的特征。
log.c(h)利用多種編碼格式記錄日志和實時報警。
(1)Snort主程序及main函數(shù)分析
分析之前,首先來介紹一下在snort.c(h)的主程序文件中的兩個重要數(shù)據(jù)結構,主程序中是通過PV來記錄命令行參數(shù),以便于Snort根據(jù)參數(shù)來確定怎樣工作;主程序同時通過PacketCount這一起到計數(shù)器作用的變量來統(tǒng)計處理數(shù)據(jù)包過程中增加的全局變量pc的閾值。
有了這兩個數(shù)據(jù)結構,就便于main函數(shù)展開工作了,在主函數(shù)中首先調(diào)用snortMain函數(shù)對一些主程序的缺省值進行初始化,然后對命令行的參數(shù)進行解析,最后將變量值和參數(shù)的解析結果存入pv結構中,得到pv的值,此解析結果便能確定具體的工作方式了;注意在Daemon的運行方式下,則是通過GoDaemon函數(shù)創(chuàng)建的重定向IO守護進程來實現(xiàn)的。
Snort采用文件讀取和實時采集數(shù)據(jù)兩種形式不同,實質相同的方式獲取數(shù)據(jù),在Unix中,網(wǎng)卡依然被當作文件作為openPcap的參數(shù),打開采集過程,而其他系統(tǒng)中openPcap的參數(shù)即是網(wǎng)卡的接口。接著,根據(jù)不同的數(shù)據(jù)結構網(wǎng)絡,定義不同拆分數(shù)據(jù)包的函數(shù),具體實現(xiàn)過程是將全局變量datalink的值傳入setPktProcessor函數(shù)中,設定出不同的解析拆包函數(shù),存入指針變量中,不同的拆包解析函數(shù)都已Decode為首字母,存在于decode.c中。
拆分并解析數(shù)據(jù)包后,便可進行插件函數(shù)的初始化,需要初始化的插件包括預處理器(Preprocessor),定義日志和報警的規(guī)則插件(outputplugin)和檢測插件(plugin)三種插件進行初始化后接著解析規(guī)則文件,最后根據(jù)報警和日志的模式,設置對應的函數(shù),進行需要時的響應,若不需響應,則直接關閉采集的過程。
(2)數(shù)據(jù)包處理流程
圖2 InterfaceThread函數(shù)實現(xiàn)流程圖
對數(shù)據(jù)包的處理主要在InterfaceThread函數(shù)中實現(xiàn),Interface Thread函數(shù)的處理流程如圖2所示,在調(diào)用pcap_loop函數(shù)不斷抓包后,存入重要的處理函數(shù)ProcessPacket函數(shù)中,該函數(shù)調(diào)用DecodeEthPkt函數(shù),DecodeEthPkt顧名思義就是拆解數(shù)據(jù)包,首先按照以太網(wǎng)包頭的協(xié)議層次類型,調(diào)用DecodeTCP,DecodeUDP等函數(shù)對下層協(xié)議類型進行判斷并解碼,系統(tǒng)進而調(diào)用Preprocess函數(shù),進行預處理,最后調(diào)用Detect函數(shù)檢測數(shù)據(jù)包,并對符合檢測指定情況的規(guī)則,按照已定義的響應方式,進行報警和日志記錄。
(3)Snort鏈表的建立
Snort首先按照對數(shù)據(jù)包的警報,記錄,丟棄,激活,來保持空間的五種狀態(tài),分成五種規(guī)則類型,按照規(guī)則類型建立鏈表,用以存儲所有的規(guī)則文件。Snort從Snort.conf中讀取配置信息后,便利用ParseRulesFile()函數(shù)讀取規(guī)則文件,接著利用Customize your rules(c)鏈接文件,最終建立鏈表。
社區(qū)局域網(wǎng)定義[5]:解釋社區(qū)型局域網(wǎng)之前,首先要說一下社區(qū)的涵義。社區(qū)實際上是個小社會。社區(qū)是社會學的一個基本概念,是指聚居在一定地域中的人們所組成的社會生活共同體。目前我國城市社區(qū)的范圍。一般是指經(jīng)過社區(qū)體制改革后作了規(guī)模調(diào)整的居民委員會轄區(qū)。
隨著計算機技術、網(wǎng)絡技術的高速發(fā)展,社區(qū)建設也步入了數(shù)字時代,出現(xiàn)了社區(qū)局域網(wǎng)。社區(qū)局域網(wǎng)是指在社區(qū)中組建計算機局域網(wǎng),通過計算機網(wǎng)絡平臺實現(xiàn)社區(qū)成員之間以及本社區(qū)與其他社區(qū)之間的信息交流與共享。社區(qū)局域網(wǎng)結構由接入網(wǎng)、信息服務中心和小區(qū)內(nèi)部網(wǎng)絡三部分構成。接入網(wǎng)指局域網(wǎng)與Internet的聯(lián)接方式。信息服務中心是社區(qū)局域網(wǎng)的心臟,由路由器、防火墻等硬件設備和網(wǎng)絡操作系統(tǒng)、Internet應用服務等軟件組成。其內(nèi)部網(wǎng)絡是用戶通過社區(qū)警務室連接到信息服務中心的高速公路和運載工具。社區(qū)局域網(wǎng)的主干網(wǎng)采用全連接的網(wǎng)絡拓撲結構,接入網(wǎng)的用戶端采用星型拓撲結構,可以使用有線網(wǎng)絡、無線網(wǎng)絡,以及有線無線混合網(wǎng)絡。
社區(qū)局域網(wǎng)除在技術層面有很多無法解決的問題外,網(wǎng)絡安全而導致的病毒入侵等問題也給數(shù)據(jù)的安全帶來很多隱患,常見的社區(qū)局域網(wǎng)面臨的安全威脅主要有:
第一:軟件的欺詐性降低了數(shù)據(jù)的安全性。
社區(qū)局域網(wǎng)中的大部分共享資源都具有“開放性”的特點,隨著局域網(wǎng)開放性共享資源的增多,導致數(shù)據(jù)易被公開篡改或刪除,安全性下降。
第二:局域網(wǎng)內(nèi)部的安全防御脆弱。
局域網(wǎng)內(nèi)部傳輸數(shù)據(jù)的速率極快,而防火墻雖然阻隔了外來的攻擊,然而卻無法阻擋來自局域網(wǎng)內(nèi)部的攻擊,例如內(nèi)部其中某臺感染病毒的電腦與服務器通信后,這臺服務器便感染了病毒,進而在高速傳輸?shù)木钟蚓W(wǎng)內(nèi)部將病毒傳染給所有與它通信的電腦。
第三:用戶對安全軟件的更新滯后而導致的病毒威脅。
社區(qū)局域網(wǎng)中的用戶由于未在網(wǎng)絡中及時更新防毒軟件或系統(tǒng)補丁,從而造成安全軟件的更新滯后,進而極易造成病毒的入侵并迅速傳播至整個社區(qū)的局域網(wǎng)絡。
第四:用戶信息的泄密和IP沖突導致的數(shù)據(jù)丟失。
社區(qū)局域網(wǎng)用戶使用U盤等移動存儲設備及將外網(wǎng)電腦接入內(nèi)網(wǎng)網(wǎng)線而造成的病毒入侵內(nèi)網(wǎng)并在內(nèi)網(wǎng)中快速傳遞。此外,隨著用戶的不斷增多,IP地址會不時地出現(xiàn)沖突,也會導致數(shù)據(jù)的丟失。
與此同時,社區(qū)局域網(wǎng)大多因資金投入不足而架構簡單,安全措施較少,而商用IDS價格昂貴,不宜應用到社區(qū),這種安全防護上的真空為為病毒的傳播提供了通道,埋下了信息的安全的諸多隱患。因此,迫切需要一種安全、高效、經(jīng)濟適用的安全防護與檢測軟件對其進行防護,Snort做為一種開源而免費的IDS就是一個不錯的選擇。
Snort是一種開源的輕量級IDS,應用于社區(qū)局域網(wǎng)除了可以簡化網(wǎng)絡結構,提高性價比,易于擴展網(wǎng)絡等多種優(yōu)點外,還有以下特點:
并行處理[6]:在不同的網(wǎng)絡分支中分別安裝IDS進行檢測,從而避免在共享傳輸信道上因主干道流量過大而阻塞。
(2)特征庫[7]的完備性:由于社區(qū)局域網(wǎng)具有復雜而龐大的系統(tǒng)特性,因而特征檢測的數(shù)據(jù)庫中是否包含足夠的入侵方式和攻擊種類,顯得尤為重要。
(3)定義特定主機之間的特定協(xié)議:不屬于已定義行為列表的操作被視為潛在的入侵,而特定系統(tǒng)之間使用特定協(xié)議通信,則被視為可接受的策略。
(4)攻擊源追蹤:針對假冒源地址的DDoS攻擊,需要能有效地確定攻擊者的來源,特別是對于局域網(wǎng)內(nèi)部發(fā)起的攻擊,應該能確定其大致物理位置。本系統(tǒng)要設計成一個網(wǎng)絡IDS,可以實現(xiàn)以規(guī)則匹配為主的誤用檢測技術,同時也提供可選的基于異常檢測的工作方式。
IDS系統(tǒng)的結構由檢測核心和人機界面兩部分組成,如圖3所示。
其中,Snort內(nèi)核包括數(shù)據(jù)包嗅探器,預處理器及檢測引擎等功能。Snort內(nèi)核通過嗅探器取得網(wǎng)絡中的數(shù)據(jù)后,經(jīng)檢測引擎過濾所有的規(guī)則鏈表后,按照自定義的規(guī)則進行匹配,若相符合,則將檢測出的數(shù)據(jù)整合報警信息輸出到UI模塊。
圖3 社區(qū)局域網(wǎng)檢測核心
由此可見,Snort成熟的內(nèi)核在局域網(wǎng)的構建上具有動態(tài)靈活等多種優(yōu)點,系統(tǒng)除根據(jù)需要自定義的規(guī)則外,還可利用Snort已有的大量規(guī)則,減少了原生代碼量。
本文從IDS及 Snort兩方面入手,對Snort系統(tǒng)架構和源碼進行了詳細的分析,在討論社區(qū)局域網(wǎng)體系結構和網(wǎng)絡安全面臨的問題的基礎上,以Snort為基礎設計了一個輕型的、適合于社區(qū)局域網(wǎng)絡的入侵檢測系統(tǒng)原型,能夠實現(xiàn)對社區(qū)局域網(wǎng)保護,為和諧社區(qū)的建設做出應有的貢獻。
[1] 谷小剛.Snort的高效規(guī)則匹配算法[J].計算機工程, 2006,25(1):36—38.
[2] Steven J.Tepdump.Scott Lawrence Berkeley National Laboratory,2003.
[3] 陳際紅.GUN GPL的規(guī)則與Linux在中國的發(fā)展.信息網(wǎng)絡與高新技術法律前沿.北京:法律出版社,2003.
[4]SNorthcutt S.網(wǎng)絡入侵檢測分析員手冊[M].北京:人民郵電出版社, 2000.
[5]張年年.利用社區(qū)局域網(wǎng)構建數(shù)字化學習型社區(qū).臨沂大學教育學院, 2011.
[6] 姚蘭,王新梅.防火墻與入侵檢測系統(tǒng)的聯(lián)動分析[J].信息安全與通信保密,2002,(18).
[7] 鐘誠,趙躍華.信息安全概論[M].武漢:武漢理工大學出版社,2003.