高亮,鄭榮鋒
(四川大學(xué)網(wǎng)絡(luò)空間安全學(xué)院,成都610065)
隨著信息化水平的不斷提升,電子信息成為了信息的主要存儲介質(zhì)。金融、社交、文化、生產(chǎn)力的信息化發(fā)展,在網(wǎng)絡(luò)上存放的個人數(shù)據(jù)和企業(yè)數(shù)據(jù)甚至是政府職能部門的數(shù)據(jù)也越來越多,而信息存放的安全和設(shè)備的安全成為了信息儲存首要考慮的問題。
本文主要研究網(wǎng)絡(luò)入侵檢測和反制技術(shù),利用OpenWrt 平臺的和編程特性和Snort 的入侵報文檢測系統(tǒng),結(jié)合網(wǎng)絡(luò)入侵手段和其反制方法,設(shè)計了一個入侵檢測和反制系統(tǒng),最后以O(shè)penWrt 平臺和Python 編程語言實現(xiàn)該系統(tǒng)。
計算機漏洞的產(chǎn)生方式主要有兩種:第一種是相關(guān)編程人員或者網(wǎng)絡(luò)協(xié)議標(biāo)準(zhǔn)制定小組出現(xiàn)紕漏,設(shè)計的程序、協(xié)議中出現(xiàn)了明顯的邏輯漏洞,這些漏洞一旦被利用起來,可以達成繞過系統(tǒng)驗證、強行插入修改刪除數(shù)據(jù)、造成系統(tǒng)崩潰而拒絕服務(wù)等效果。第二種漏洞屬于編程內(nèi)部的漏洞,這種漏洞表現(xiàn)的最為明顯的就是堆棧溢出攻擊,利用了馮·洛伊曼計算機結(jié)構(gòu)的特點,數(shù)據(jù)程序一起存儲,而且在一定條件下可以進行相互轉(zhuǎn)換。該種類型的入侵往往可以造成目標(biāo)計算機系統(tǒng)決絕服務(wù),甚至是奪取目標(biāo)計算機系統(tǒng)控制權(quán),并于目標(biāo)計算機上安裝持續(xù)化控制后門[7-8]。
計算機病毒作為后門安裝時,存在的行為如下:
(1)收集目標(biāo)系統(tǒng)的信息。對于服務(wù)器而言,主要收集日志,服務(wù)器登錄賬戶密碼,服務(wù)器上部署的主要系統(tǒng)配置,數(shù)據(jù)庫內(nèi)容,管理員操作記錄等信息。對于普通用戶而言,主要收集文檔、圖片、視頻、以及各種對計算機輸入的文本信息[6]。
(2)加深對系統(tǒng)的控制和持久化控制。病毒往往會將自身替換為正常的系統(tǒng)程序或者用戶程序,以達到偽裝,并將自己加入開機項,保證在重啟后仍然可以對系統(tǒng)進行控制。
(3)Shell 后門。病毒制作者為了進行快捷的病毒升級、擴展、并訪問受害者的機器,往往會在后門中加入直接可以操作的Shell 接口,可以提供遠程的命令訪問[1]。
對于計算機病毒的后門特征而言,第一點和第三點可以作為網(wǎng)絡(luò)特征而進行檢測,而第一點實現(xiàn)較為復(fù)雜,且需要大量時間進行信息收集所需要守護的系統(tǒng)中存在的內(nèi)容特征。所以本設(shè)計選擇以第三點作為網(wǎng)絡(luò)特征的檢測的主要出發(fā)點,檢測成功率會比較大[9-11]。
Snort 是由Martin Roesch 在1998 年用C 語言開發(fā)的入侵檢測系統(tǒng),并且Snort 代碼開源,屬于開源項目。Snort 經(jīng)常被用于部署在各種網(wǎng)絡(luò)中的關(guān)鍵位置,其基本架構(gòu)如圖1 所示。
圖1 Snort基本框架
圖1 中指出,Snort 的體系結(jié)構(gòu)由四個基本部分組成:
嗅探器:網(wǎng)絡(luò)嗅探器將網(wǎng)卡設(shè)置為監(jiān)聽模式,使得Snort 可以監(jiān)聽所有到達該網(wǎng)卡的網(wǎng)絡(luò)流量。
●預(yù)處理器:預(yù)處理器接收嗅探器傳入的數(shù)據(jù)包,并分析數(shù)據(jù)包中的網(wǎng)絡(luò)層次和數(shù)據(jù)內(nèi)容,再交由相關(guān)的插件處理,這些插件是針對數(shù)據(jù)包中的網(wǎng)絡(luò)層次和特征行為的。一旦數(shù)據(jù)包具有“特征行為”,那么該數(shù)據(jù)包將被發(fā)送到檢測引擎。
●檢測引擎。檢測引擎是Snort 中基于特征的入侵檢測系統(tǒng)的主體。檢測引擎接收來自預(yù)處理器的數(shù)據(jù),這些數(shù)據(jù)會通過配置規(guī)則中的配置所進行檢測。檢測的方法是先讀入配置規(guī)則,再解析內(nèi)容中的字符串和偏移信息,最后對內(nèi)容字符串進行正則匹配。如果正則表達式匹配返回成功,則表明規(guī)則與數(shù)據(jù)包中的內(nèi)容匹配,產(chǎn)生一個警報事件。
●輸出插件。網(wǎng)絡(luò)流量數(shù)據(jù)如果與引擎內(nèi)的某規(guī)則相匹配則觸發(fā)警報。警報將通過網(wǎng)絡(luò)連接、UNIX 套接字、E-mail、MySQL 數(shù)據(jù)庫寫入等方式發(fā)出,并記錄日志,這些通訊接口即為Snort 系統(tǒng)本身與外部系統(tǒng)進行通訊的主要接口,通過對Snort 輸出進行檢測和編程,即可進行防御操作。
OpenWrt 在產(chǎn)生之初是作為一個嵌入式的Linux發(fā)行版而出現(xiàn)的,提供了一個完全可寫的文件系統(tǒng),并且也具有分支軟件倉庫和管理工具opkg,OpenWrt 倉庫中包含了大量的常用軟件,這使得在OpenWrt 上進行系統(tǒng)部署更加高效。
OpenWrt 基于Linux 內(nèi)核,所以其內(nèi)部的網(wǎng)絡(luò)轉(zhuǎn)發(fā)由iptables 防火墻和router 路由表項完成。netfilter/iptables 進行源地址偽裝、目的地址修改等數(shù)據(jù)轉(zhuǎn)發(fā)的最大優(yōu)點是它可以配置有動態(tài)的、有狀態(tài)的防火墻,這是許多其他防火墻所不能提供的。在這種防火墻系統(tǒng)下,能夠記住發(fā)送或接收信息包所建立的連接的狀態(tài),并給上級內(nèi)核組件進行通訊[2]。
對于netfilter/iptables 的內(nèi)部系統(tǒng)而言,其內(nèi)置表有raw、mangle、nat、filter 四張,如圖2 所示[3]。內(nèi)置規(guī)則鏈有PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD 五條規(guī)則鏈[4]。規(guī)則鏈?zhǔn)侵饕奶幚頂?shù)據(jù)包流向和執(zhí)行DNAT、SNAT、過濾的規(guī)則,所有經(jīng)過路由的流量都需要進行規(guī)則判斷,并進行一定的規(guī)則操作,使得網(wǎng)絡(luò)通訊能夠正常、高效地完成。
圖2 iptables的四個表
而數(shù)據(jù)包進入系統(tǒng)后,iptables 防火墻對數(shù)據(jù)包轉(zhuǎn)發(fā)的主要流程如圖3 所示,通過該機制與router 路由條例所配合,可以將數(shù)據(jù)包發(fā)送到對應(yīng)的網(wǎng)絡(luò)接口[5]。
圖3 數(shù)據(jù)包在Linux內(nèi)部的傳遞過程
首先使用VMware 搭建系統(tǒng)實現(xiàn)所需的網(wǎng)絡(luò)環(huán)境,再部署OpenWrt 系統(tǒng)與網(wǎng)絡(luò)環(huán)境進行聯(lián)通,于Open-Wrt 上配置Python 與Snort 的運行環(huán)境與檢測規(guī)則,搭建Windows XP 客戶端虛擬機和病毒特征庫Ubuntu 遠程數(shù)據(jù)庫系統(tǒng)。最后通過Python 在OpenWrt 上進行編程,解析Snort 的報警文件日志作為主要的消息源,檢測到消息源中產(chǎn)生了報警后,調(diào)用郵件客戶端進行郵件預(yù)警,并調(diào)動iptables 防火墻進行主動防御。
整個實驗環(huán)境由VMware 虛擬機進行部署,大致的網(wǎng)絡(luò)構(gòu)思如圖4 和圖5 所示,其中圖4 主要作為正常用戶網(wǎng)絡(luò)模擬,圖5 作為模擬各入侵防御系統(tǒng)連入VPN 進而使用病毒特征庫的內(nèi)部網(wǎng)絡(luò)。
圖4 實驗中的網(wǎng)絡(luò)架構(gòu)
圖5 仿VPN的虛擬網(wǎng)絡(luò)架構(gòu)
首先在VMware 中設(shè)置兩個虛擬網(wǎng)絡(luò),打開VMware 的虛擬網(wǎng)絡(luò)編輯器,設(shè)置5 個虛擬網(wǎng)絡(luò),并分別進行網(wǎng)絡(luò)設(shè)置。其設(shè)置羅列如下:
VMnet0,用于接入整個實驗系統(tǒng)的外部Internet,為實驗系統(tǒng)提供SMTP 郵件發(fā)送的網(wǎng)絡(luò)接口和通過opkg 從源部署Python3、Python 數(shù)據(jù)庫、郵件服務(wù)接口模塊、Snort 系統(tǒng)等。該網(wǎng)絡(luò)設(shè)置為NAT 模式,通過宿主機進行SNAT 接入外部網(wǎng)絡(luò)。
VMnet1,作為接入Router1 與Router2 之間的虛擬網(wǎng)絡(luò),以模擬兩個網(wǎng)絡(luò)互訪的情況。該網(wǎng)絡(luò)設(shè)置為僅主機模式,并取消勾選將主機適配器連接到該虛擬網(wǎng)絡(luò)。
VMnet2,作為Router2 給其內(nèi)部局域網(wǎng)通訊的虛擬網(wǎng)絡(luò),以實現(xiàn)基本的DHCP-client 到路由的通訊功能。該網(wǎng)絡(luò)設(shè)置為僅主機模式,并取消勾選將主機適配器連接到該虛擬網(wǎng)絡(luò)。
VMnet3,作為Router1 給其內(nèi)部局域網(wǎng)通訊的虛擬網(wǎng)絡(luò),以實現(xiàn)基本的DHCP-client 到路由的通訊功能。該網(wǎng)絡(luò)設(shè)置為僅主機模式,并取消勾選將主機適配器連接到該虛擬網(wǎng)絡(luò)。
VMnet4,作為Router1-1 給其內(nèi)部局域網(wǎng)通訊的虛擬網(wǎng)絡(luò),以實現(xiàn)一個第三層交換機基本的通訊鏈路。
VMnet5,提供網(wǎng)絡(luò)入侵防御系統(tǒng)一個內(nèi)部通訊局域網(wǎng),可以快速的進行調(diào)試和給網(wǎng)絡(luò)入侵防御系統(tǒng)互相通訊與訪問病毒特征流量數(shù)據(jù)庫一個安全的鏈路。
在整個系統(tǒng)中具有兩種數(shù)據(jù)庫,一個是本地數(shù)據(jù)庫,使用Python 自帶的SQLite 數(shù)據(jù)庫作為實現(xiàn)系統(tǒng),另一個是搭建在Ubuntu 上的網(wǎng)絡(luò)MySQL 數(shù)據(jù)庫,該數(shù)據(jù)庫上設(shè)定了root 用戶的網(wǎng)絡(luò)權(quán)限和MySQL 的網(wǎng)絡(luò)訪問配置,而且在Linux 防火墻上放行了MySQL 的網(wǎng)絡(luò)接口,這樣的設(shè)計可以讓系統(tǒng)更具有靈活性。
儲存系統(tǒng)信息的有Filter_IP 表、Filter_MAC 表、Warning 表。對于遠程病毒數(shù)據(jù)庫而言,儲存系統(tǒng)信息的有IDS_Rule 表和Virus_Data 表。
Filter_IP 表如表1 所示,用來儲存被過濾的IP 地址列表,該表中存放的信息有:IP 地址、被加入該表的原因(INFO)、事件的編號UID。
表1 Filter_IP 表
Filter_MAC 表如表2 所示,用來儲存被過濾的MAC 地址列表,該表中存放的信息有:MAC 地址、被加入該表的原因(INFO)、事件的編號UID。
表2 Filter_MAC 表
Warning 表如表3 所示,該表中存放的信息有:入侵者的IP 地址,入侵IP 的源端口、入侵事件中被害者的IP 地址,入侵事件中被害者IP 的源端口、入侵事件的時間、事件的編號UID、病毒編號SID、觸發(fā)事件額外信息INFO。
表3 Warning 表
Virus_Data 表如表4 所示,用來儲存病毒的信息,該表中存放的信息有:病毒的編號UID、病毒的名稱Name、病毒的版本Ver、病毒的危害等級Level、病毒的額外說明信息INFO。
表4 Virus_Data 表
IDS_Rule 表如5 所示,用來存儲IDS 規(guī)則信息,在該表中存放的信息有:IDS 額外規(guī)則、IDS 額外規(guī)則編號。
表5 IDS_Rule 表
郵件客戶端是通過Python 的SMTP 庫實現(xiàn)的,使用163 的郵箱賬戶作為系統(tǒng)的郵件發(fā)送者賬號,使用QQ 郵箱作為管理員郵箱,并進行消息推送。
SMTP/POP3 郵件客戶端的核心代碼如下:
email_client=smtplib.SMTP("smtp.163.com")
email_client.login(from_account,from_passwd)
msg=MIMEText(content,'plain','utf-8')
msg['Subject']=Header(subject,'utf-8')
msg['From']=from_account
msg['To']=to_account
email_client.sendmail(from_account, to_account, msg.as_string())
email_client.quit()
其中content 是消息內(nèi)容,subject 鍵值是郵件的標(biāo)題,F(xiàn)rom 是郵件中發(fā)信人的賬戶名稱,To 是郵件中接收人的賬戶名稱。通過設(shè)置郵件消息編碼、郵件服務(wù)器通訊地址、郵件內(nèi)容,最后調(diào)用發(fā)送郵件函數(shù)和退出發(fā)信函數(shù),即可完成郵件的發(fā)送。
Server 醬的API 接口代碼如下:
url='https://sc.ftqq.com/
SCU46567T452503e152853ef807fa65ebe08ce1eb5c8dbac14d2f
d.send'
data['text']='IDS Warning From%s'%Router_name
data['desp']=Message
req=requests.post(url,data=data)
其中,url 是Server 醬的API 通訊地址,data 作為HTTP 請求中POST 方法的傳遞參數(shù)進行數(shù)據(jù)傳輸,包含了微信消息的標(biāo)題和內(nèi)容,requests.post 向指定URL發(fā)送帶POST 參數(shù)的數(shù)據(jù),使用Server 醬的微信通訊API 進行微信推送,所以管理員也能很快得知網(wǎng)絡(luò)內(nèi)發(fā)生的安全事件。
運行虛擬機,開啟OpenWrt 路由系統(tǒng)和Windows XP 操作系統(tǒng),如圖6、圖7 所示,并開啟OpenWrt 中的Python 程序和Snort 系統(tǒng),并確認網(wǎng)絡(luò)通路正常和系統(tǒng)正常運行,記錄其IP 地址。
圖6 開啟虛擬環(huán)境
圖7 測試通訊程序
在xshell 中連入OpenWrt 路由器,并輸入指令
snort-c"snort.conf"-i"eth0"--daq-dir/usr/lib/daq-l./
和指令python3 main_program.py 來執(zhí)行程序
命令結(jié)果如圖8 所示。
圖8 Snort運行圖
分別在兩臺系統(tǒng)上執(zhí)行測試程序,代碼和運行截圖如圖9、圖10 所示。
圖9 通訊程序運行截圖
可以看到通訊程序已經(jīng)可以成功連接了服務(wù)器,收到了來自服務(wù)器端的消息提示,這表明各虛擬網(wǎng)絡(luò)之間可以相互通信,網(wǎng)絡(luò)路由協(xié)議配置無誤,可以開始進行下一步操作。
圖10 服務(wù)端通訊程序響應(yīng)圖
在OpenWrt 路由器的IPS 防御系統(tǒng)中,也出現(xiàn)了警報數(shù)據(jù),并輸出了病毒ID 為10000001,警告信息warning report,警告時間,還有源和目的IP 信息,以及流量中的報文特征,如圖11 所示。
圖11 Python代碼輸出獲取到Snort的輸出日志
防御系統(tǒng)也已經(jīng)對其進行了網(wǎng)絡(luò)封鎖,使得三層通訊中斷,數(shù)據(jù)會在經(jīng)過路由時被丟棄,無法繼續(xù)進行網(wǎng)絡(luò)通訊,如圖12 所示。微信客戶端收到了通知信息,如圖13 所示。
本文主要針對入侵檢測與入侵防御進行研究,在研究了相關(guān)技術(shù)之后使用開源的Snort 入侵檢測系統(tǒng)作為整個系統(tǒng)的檢測引擎,配合開源的OpenWrt 路由系統(tǒng)作為整個入侵防御系統(tǒng)的基本運行平臺,實現(xiàn)了一個安全的網(wǎng)絡(luò)系統(tǒng),并且通過實驗證明該系統(tǒng)的有效性。
圖12 連接被截斷圖
圖13 郵件通知圖