何詩佳,劉曉強(qiáng),李柏巖,蔡立志,胡 蕓
(1.東華大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院,上海 201620)(2.上海市計算機(jī)軟件評測重點實驗室,上海 201112)
網(wǎng)站是團(tuán)體和機(jī)構(gòu)必不可少的信息發(fā)布和交流平臺,易成為黑客攻擊的對象. 黑客攻擊網(wǎng)站時篡改網(wǎng)站內(nèi)容,篡改后的頁面往往會出現(xiàn)一些不良信息,對機(jī)構(gòu)形象和社會安定產(chǎn)生負(fù)面影響. 網(wǎng)站變更監(jiān)測的目標(biāo)是對網(wǎng)站頁面內(nèi)容進(jìn)行對比監(jiān)測,實時報告變更情況,便于監(jiān)控人員及時發(fā)現(xiàn)頁面中的篡改內(nèi)容,減少網(wǎng)站篡改帶來的損失,維護(hù)網(wǎng)站安全.
網(wǎng)站變更監(jiān)測存在著許多問題和難點. 實驗表明,網(wǎng)站變化的頻率與域名種類、頁面大小等因素密切相關(guān),大約有40%的網(wǎng)站在一周內(nèi)發(fā)生了變化,大約50天內(nèi)一半的網(wǎng)站都發(fā)生了變化,尤其是.com網(wǎng)站,一天內(nèi)就有25%的網(wǎng)站發(fā)生了變化[1]. 網(wǎng)絡(luò)中的網(wǎng)站數(shù)量龐大以及時刻動態(tài)變化的特性,使得對網(wǎng)站變化的監(jiān)測十分困難. 同時,為了監(jiān)測網(wǎng)站變化,反復(fù)重載所監(jiān)測的頁面進(jìn)行比較,對系統(tǒng)的并行性要求很高. 基于目前網(wǎng)站變更監(jiān)測的難點,本文設(shè)計和實現(xiàn)了一種基于非關(guān)系型數(shù)據(jù)庫和消息機(jī)制的網(wǎng)站變更監(jiān)測方案,可滿足大規(guī)模實時監(jiān)測需求. 在變更監(jiān)測算法上采用MD5值比較與基于文本比較算法的結(jié)合,檢測精度高,能夠定位到變更的具體位置. 此外,系統(tǒng)增加了監(jiān)測預(yù)警功能,可實現(xiàn)監(jiān)測實時處理告警及緊急切斷服務(wù)支持.
網(wǎng)站變更監(jiān)測的方案主要分為兩類:基于網(wǎng)站服務(wù)端的本地監(jiān)測和基于客戶端的遠(yuǎn)程監(jiān)測.
基于網(wǎng)站服務(wù)端的本地監(jiān)測主要采用事件觸發(fā)技術(shù)、核心內(nèi)嵌技術(shù)、外掛輪詢技術(shù)等方法,其優(yōu)點是可實時防護(hù)、技術(shù)精度高,但需在每個服務(wù)器上安裝專門的軟件,占用了服務(wù)器的系統(tǒng)資源,管理員操作復(fù)雜,不適合大規(guī)模的監(jiān)測[2].
基于客戶端的遠(yuǎn)程監(jiān)測只需知道網(wǎng)站的域名,適合大規(guī)模多網(wǎng)站的實時監(jiān)測服務(wù). 遠(yuǎn)程監(jiān)測網(wǎng)站變更主要采用以下算法:
(1)基于HTTP協(xié)議頭的狀態(tài)監(jiān)測
基于HTTP協(xié)議頭的狀態(tài)監(jiān)測常用屬性有Last-Modified和ETag. Last-Modified中記錄了網(wǎng)頁在服務(wù)器端最后被修改的時間,ETag中記錄了服務(wù)器根據(jù)網(wǎng)頁資源所生成的標(biāo)記號[3]. 服務(wù)器通過驗證Last-Modified字段和ETag值即可判斷網(wǎng)頁內(nèi)容是否發(fā)生變化. 該方法快速簡單,可節(jié)省大量不必要的網(wǎng)絡(luò)資源,適用于靜態(tài)網(wǎng)頁變更監(jiān)測. 對于動態(tài)網(wǎng)頁,Last-Modifed對應(yīng)服務(wù)器發(fā)送Response的時間并非網(wǎng)頁的最后更新時間,ETag通常為空值,該方法無效.
(2)基于網(wǎng)頁的MD5值監(jiān)測
MD5算法即Message-Digest Algorithm 5(信息-摘要算法5),監(jiān)測時通過比較前后網(wǎng)頁的MD5值來判斷頁面內(nèi)容是否發(fā)生變更. 該方法實現(xiàn)簡單,但過于嚴(yán)格,如頁面中存在統(tǒng)計訪問人數(shù)或記錄時間的腳本,一旦發(fā)生變化,也會導(dǎo)致MD5值的改變,而這些改變通常無意義. 此外,該方法無法定位到發(fā)生變更的具體位置.
(3)基于文本比較算法的對比監(jiān)測
網(wǎng)頁本質(zhì)上是純文本文件,可將網(wǎng)頁看成一個長字符串,通過文本比較算法來監(jiān)測兩個網(wǎng)頁之間的差異. 文本比較算法主要有基于文本的編輯距離(levenshtein distance,LD)算法和基于文本的最長公共子序列(longest common subsequence,LCS)算法. 基于文本比較的對比算法實現(xiàn)簡單、檢測速度快,但直接使用文本比較算法來計算網(wǎng)頁間的字符差異效率非常低.
(4)基于網(wǎng)頁結(jié)構(gòu)的對比監(jiān)測
基于網(wǎng)頁結(jié)構(gòu)的對比監(jiān)測是指根據(jù)網(wǎng)頁代碼生成一棵DOM樹,采用遍歷和樹節(jié)點一一比對的方法來定位網(wǎng)頁間的差異[4]. 其優(yōu)點是能夠全面比對網(wǎng)頁的內(nèi)容、結(jié)構(gòu)、樣式,適合只關(guān)注網(wǎng)頁某個部分的監(jiān)測,允許用戶定制. 該方法不適合結(jié)構(gòu)復(fù)雜的頁面,會導(dǎo)致DOM樹龐大,從而效率低、準(zhǔn)確性低.
本文基于客戶端的遠(yuǎn)程監(jiān)測系統(tǒng),將MD5值比較與基于文本比較算法結(jié)合以實現(xiàn)網(wǎng)站變更監(jiān)測,該方法實現(xiàn)簡單,檢測精度高,能夠定位到變更的具體位置. 由于傳統(tǒng)關(guān)系型數(shù)據(jù)庫不能滿足對大量網(wǎng)站內(nèi)容的快速查找,本系統(tǒng)采用非關(guān)系型分布式數(shù)據(jù)庫ElasticSearch存儲網(wǎng)頁內(nèi)容和變更結(jié)果[5],并采用高性能、易部署的NSQ消息隊列實時處理不斷新增的數(shù)據(jù)[6].
本文設(shè)計的網(wǎng)站變更監(jiān)測預(yù)警系統(tǒng)以B/S架構(gòu)為核心,有3個核心模塊,整體架構(gòu)如圖1所示.

圖1 網(wǎng)站變更監(jiān)測預(yù)警系統(tǒng)架構(gòu)Fig.1 The architecture of website change monitoring and early warning system
監(jiān)測管理模塊以Web網(wǎng)站形式向管理員提供對目標(biāo)網(wǎng)站的監(jiān)測和管理服務(wù),包括監(jiān)測任務(wù)管理、監(jiān)測結(jié)果查看和監(jiān)測報表生成. 用戶通過該模塊可以添加監(jiān)測網(wǎng)站、開啟或停止監(jiān)測任務(wù),使用MySQL數(shù)據(jù)庫存儲用戶信息及相關(guān)任務(wù)信息,從ElasticSearch數(shù)據(jù)庫中取出最終的監(jiān)測結(jié)果可視化展示在頁面上并生成對應(yīng)的報表便于管理員查看,管理員可針對異常情況發(fā)出關(guān)閉服務(wù)器命令.
任務(wù)調(diào)度模塊負(fù)責(zé)對監(jiān)測任務(wù)模塊進(jìn)行配置并初始化NSQ消息隊列. NSQ消息隊列可用于大規(guī)模系統(tǒng)中的實時消息服務(wù). 當(dāng)任務(wù)調(diào)度獲取到網(wǎng)站監(jiān)測任務(wù)開啟或關(guān)閉的信息后,能夠?qū)θ蝿?wù)的狀態(tài)進(jìn)行更新,通過NSQ消息隊列將任務(wù)信息分發(fā)到監(jiān)測任務(wù)模塊,啟動對應(yīng)的爬蟲任務(wù)或變更監(jiān)測分析任務(wù).
監(jiān)測任務(wù)模塊分為網(wǎng)頁爬取和變更分析兩類. 監(jiān)測任務(wù)開啟后,爬蟲定時去爬取被監(jiān)測網(wǎng)站的網(wǎng)頁信息并存儲到ElasticSearch數(shù)據(jù)庫中;變更監(jiān)測分析任務(wù)通過對比前后兩版頁面信息將變更結(jié)果存入ElasticSearch數(shù)據(jù)庫中,為最后以網(wǎng)頁形式為用戶呈現(xiàn)監(jiān)測結(jié)果提供動態(tài)數(shù)據(jù)支持.
網(wǎng)站變更監(jiān)測預(yù)警系統(tǒng)采用構(gòu)件化技術(shù),各模塊獨(dú)立運(yùn)行,根據(jù)系統(tǒng)負(fù)載情況及用戶需求適當(dāng)開啟監(jiān)控任務(wù),增強(qiáng)系統(tǒng)的穩(wěn)定性與生命周期. 根據(jù)網(wǎng)站的變化判斷是否正常,定義預(yù)警策略進(jìn)行消息告警,并支持服務(wù)切斷.
系統(tǒng)實現(xiàn)中,任務(wù)調(diào)度模塊的任務(wù)調(diào)度器和監(jiān)測任務(wù)模塊的爬蟲采用Golang語言開發(fā);監(jiān)測管理模塊和監(jiān)測任務(wù)模塊的變更分析采用Python語言開發(fā);網(wǎng)站W(wǎng)eb端基于Django框架;采用非關(guān)系型數(shù)據(jù)庫ElasticSearch存儲網(wǎng)頁內(nèi)容和變更分析結(jié)果,其他信息存儲在MySQL數(shù)據(jù)庫中.
用戶通過監(jiān)測任務(wù)管理模塊開啟監(jiān)測任務(wù)后,經(jīng)任務(wù)調(diào)度器發(fā)送任務(wù)信息給NSQ消息隊列,爬蟲任務(wù)啟動后監(jiān)聽NSQ中的任務(wù)信息進(jìn)行頁面爬取,爬取到的頁面內(nèi)容存儲在ElasticSearch數(shù)據(jù)庫中. 對同一URL的網(wǎng)頁,每次爬取頁面時會生成對應(yīng)的版本號,進(jìn)行對比分析時可根據(jù)爬蟲版本號每次從ElasticSearch數(shù)據(jù)庫中取出當(dāng)前URL所對應(yīng)版本的內(nèi)容與上一版本進(jìn)行變更對比,對比結(jié)果存入ElasticSearch數(shù)據(jù)庫中.
網(wǎng)站變更分析采用MD5值進(jìn)行初步比較,而后結(jié)合LCS算法進(jìn)行文本內(nèi)容比較.
3.2.1 采用MD5算法進(jìn)行初步比較
一旦網(wǎng)頁的MD5值發(fā)生變化,則網(wǎng)站的內(nèi)容一定發(fā)生了變化. 本系統(tǒng)采用Python的hashlib庫返回頁面的MD5值進(jìn)行比較. 若MD5一致,則表明頁面內(nèi)容未發(fā)生變化,不再進(jìn)行下一步比較.
3.2.2 采用LCS算法進(jìn)行文本內(nèi)容比較
當(dāng)對比頁面MD5值不同時,采用LCS算法進(jìn)行內(nèi)容變更比較. LCS算法中的子序列指不改變序列中元素的順序,從序列中刪除任意某些元素而獲得的新序列,例如字符串a(chǎn)cdfg與akdfc的最長公共子序列為adf. 對于LCS問題的解決思路采用動態(tài)規(guī)劃的方法.
《算法導(dǎo)論》第3版中通過構(gòu)建矩陣實現(xiàn)該算法的求解[7]. 設(shè)所給的兩個序列為X=和Y=. 由算法LCS計算出的結(jié)果Z為 ,求解過程如圖2所示.

圖2 LCS問題求解矩陣Fig.2 Sovling matrix of LCS
本文定義二維數(shù)組c[i][j]表示Xi和Yj的LCS的長度,b[i][j]中存放每次獲得的解的方向. 算法的核心思想如下:
1Len1=序列X的長度
2Len2=序列Y的長度
3 Fori=0 toLen1
4c[i][0]==0
5 Forj=0 toLen2
6c[0][j]==0
7 Fori=1 toLen1
8 Forj=1 toLen2
9 IfX[i]==Y[j]
10c[i][j]==c[i-1][j-1] + 1
11b[i][j]==1 // 1表示箭頭方向為 ↖
12 Else Ifc[i-1][j] >=c[i][j-1]
13c[i][j]==c[i-1][j]
14b[i][j]==2 // 2表示箭頭方向為 ↑
15 Else
16c[i][j]==c[i][j-1]
17b[i][j]==3 // 3表示箭頭方向為 ←
18Returnb,c
當(dāng)?shù)玫酵暾木仃囍?通過倒推來得到相應(yīng)的子序列. 從最后一個位置開始往前遍歷b數(shù)組(i,j代表當(dāng)前字符在數(shù)組中的位置):
若b[i][j]==1,則代表該字符是LCS的一員,存下該值后i-1,j-1,繼續(xù)向左上角查找;
若b[i][j]==2,則代表該字符不是LCS的一員,i-1,向上查找;
若b[i][j]==3,也代表該字符不是LCS的一員,j-1,向左查找.
在代碼實現(xiàn)時,每次回溯根據(jù)矩陣箭頭標(biāo)示生成初步的對比坐標(biāo)點,在合并對比結(jié)果時通過坐標(biāo)位置判斷內(nèi)容為新增、刪除或更改.
LCS算法的時間復(fù)雜度和空間復(fù)雜度與進(jìn)行比較的字符串長度成正比. 為了減少時間和空間耗費(fèi),本系統(tǒng)做出以下改進(jìn):
(1)在處理頁面時,將頁面以html標(biāo)簽“< >”切分為單位進(jìn)行比較;
(2)使用碎塊化對比,比對時若同一位置處兩段切分完全相同,用一維數(shù)組記錄下當(dāng)前位標(biāo),并將位標(biāo)增加100繼續(xù)查找,否則位標(biāo)加1;按照數(shù)組中記錄的下標(biāo)對比較對象進(jìn)行碎塊化,分別進(jìn)行LCS算法處理,與比較對象相同度越高時,對比速度越快.
通過網(wǎng)站變更算法處理,對爬蟲后的網(wǎng)頁源碼進(jìn)行標(biāo)記,標(biāo)記分為變更標(biāo)記和類型標(biāo)記. 以html標(biāo)簽為一個切分,監(jiān)測到增加部分在切分代碼前添加變更標(biāo)記“+”,減少部分添加變更標(biāo)記“-”,改變部分添加變更標(biāo)記“?”,未變部分添加變更標(biāo)記“=”. 通過html標(biāo)簽判斷變更類型,若改變部分為圖片,則添加類型標(biāo)記“I”;若改變部分為文本內(nèi)容,則添加類型標(biāo)記“T”,其他類型標(biāo)記為“N”. 處理后的網(wǎng)頁代碼存儲在ElasticSearch數(shù)據(jù)庫中.
變更結(jié)果以網(wǎng)頁形式實時展示,便于監(jiān)控人員更直觀地操作. 讀取數(shù)據(jù)庫中變更后的源碼,根據(jù)標(biāo)記加入相應(yīng)的span標(biāo)簽,通過標(biāo)簽引入對應(yīng)的CSS樣式,最終展示在頁面中.
圖3所示為東華大學(xué)研究生系統(tǒng)任務(wù)中在7月內(nèi)產(chǎn)生變更的網(wǎng)站及變更的具體信息. 記錄顯示了對應(yīng)網(wǎng)站變更狀態(tài)是否正常、變動范圍、變更是否可見及變更各項的統(tǒng)計.

圖3 變更統(tǒng)計詳情頁面Fig.3 Page of change statistics
如圖4所示,點擊查看詳情按鈕,即可查看到頁面中具體內(nèi)容的變化位置,并可通過高亮顏色來增強(qiáng)可視化效果.

圖4 變更結(jié)果展示頁面Fig.4 Page of change result
如圖5所示,對CSS、Javascript的改變不直接顯示在頁面上,管理員可通過系統(tǒng)中的代碼對比功能來判斷變化是否正常.
系統(tǒng)采用設(shè)置變更率閾值來判斷變更是否正常. 變更率閾值為增加、刪除、變化的內(nèi)容占整個網(wǎng)頁的比重. 如圖6所示,系統(tǒng)默認(rèn)設(shè)計了二級告警,當(dāng)閾值小于等于0.3時,定義為普通消息,普通信息顯示在系統(tǒng)主頁中進(jìn)行提示(圖6(a));當(dāng)閾值大于0.3時,變更異常,定義為告警消息,系統(tǒng)會向客戶單位發(fā)送郵件進(jìn)行告警(圖6(b)). 用戶可通過定義變更率閾值來定義預(yù)警策略. 若管理員通過系統(tǒng)發(fā)現(xiàn)網(wǎng)站存在惡意變更內(nèi)容,可緊急切斷服務(wù),待網(wǎng)站正常時恢復(fù)訪問.

圖6 預(yù)警消息Fig.6 Warning message
網(wǎng)站易成為黑客攻擊的對象,對網(wǎng)站變更的監(jiān)測往往能夠減少網(wǎng)站被篡改所帶來的不良影響. 本文所設(shè)計系統(tǒng)實現(xiàn)了對網(wǎng)站變更情況的實時監(jiān)測與預(yù)警,并支持對多網(wǎng)站的大規(guī)模監(jiān)測需求,為網(wǎng)站內(nèi)容安全監(jiān)控提供了一種基礎(chǔ)架構(gòu)和解決方案.
目前,系統(tǒng)中還存在以下問題需要進(jìn)一步研究和改進(jìn):
(1)對于LCS算法,由于回溯時左側(cè)值等于上方值時默認(rèn)向上回溯,最終只能得到一種結(jié)果,而實際上通過LCS算法回溯路徑不同可獲得多種結(jié)果. 在所有結(jié)果中,如何找出最符合網(wǎng)站變更情況的結(jié)果是下一步需要研究的方向;
(2)系統(tǒng)對CSS和Javascript的變更只能通過管理員代碼對比來判斷,而CSS和Javascript的改變往往會給網(wǎng)站帶來巨大的影響,因此在CSS和Javascript的監(jiān)測上還需要進(jìn)行優(yōu)化.