楊秉杰,薛 鈺
(國家計算機網絡與信息安全管理中心河南分中心,河南 鄭州 450000)
隨著互聯網的飛速發展,社會的發展已經與互聯網密不可分,網絡安全的重要性日益凸顯。 近年來,大規模的數據泄露事件頻頻發生,敏感信息泄露問題已經成了一個全球性的問題,在全球范圍帶來的損失與造成的影響與日俱增。 根據相關機構研究報告顯示,2022 年第一季度全球范圍內發生35 起影響較大的已公開信息泄露事件,數據泄露規模超過17 TB,敏感信息泄露涉及人數近9 000 萬人,涉及行業包括政府、金融、能源、交通、醫療等[1]。 造成敏感數據泄露頻發的原因主要有兩方面:一是來自外部的網絡攻擊形勢日益嚴峻,攻擊者為了獲取利益持續針對重點目標進行網絡攻擊,進而竊取單位內部敏感數據;二是內部員工缺乏安全意識,在工作中無意識進行了錯誤的系統配置或將未經審核的信息發布,造成敏感數據信息的非授權訪問等問題。 本文提出了一種基于爬蟲技術的網站敏感數據信息監測系統,利用Scrapyredis 框架定時對目標網站進行全量爬取,通過非授權URL 地址庫構造URL,檢測系統或網站是否存在敏感信息未授權訪問,通過敏感信息檢測規則對爬取結果進行分析,檢測網站內容是否存在敏感數據信息泄露。
Scrapy 框架是一個開源的Python 爬蟲框架,主要用于抓取網站和提取結構化數據,廣泛地用于數據挖掘、信息處理或歷史存檔等。 它可以處理從網頁爬取數據到處理HTML、XML、JSON 等各種格式的數據。Scrapy 框架采用Twisted 異步網絡庫,可以高效地處理異步IO 操作,支持并發、分布式爬取等多種高性能擴展,經常被用于構建大規模的爬蟲項目[2]。
Scrapy-redis 框架是在Scrapy 框架基礎上進行擴展的一種分布式爬蟲框架,它將Scrapy 框架的爬取、解析、存儲等功能與Redis 分布式隊列相結合,實現了高效、穩定的分布式爬取。 其重要特點包括5 個方面:(1)框架基于Redis 的分布式隊列管理,支持多個爬蟲節點同時抓取同一個網站,提高了爬取效率和速度。 (2)框架支持斷點續爬,即在網絡或程序異常中斷后能夠自動恢復爬取任務。 (3)框架支持分布式爬取過程中的數據去重,避免重復爬取。 (4)框架支持對爬取結果進行持久化存儲,支持多種數據存儲方式,如MySQL、MongoDB、Redis 等。 (5)框架支持自定義的中間件和擴展,方便進行各種自定義功能的開發和集成[3]。
網站敏感信息監測系統主要包含以下4 個功能模塊:定時任務模塊、非授權檢測模塊、網絡爬蟲模塊、數據分析與存儲模塊。
用戶通過配置定時任務,完成對目標網站的持續監測。 用戶需要配置爬蟲任務,定義爬蟲初設頁面(start_urls)和爬蟲作用域名范圍(allowed_domains)。用戶配置添加定時任務。 其中,爬蟲任務ID 與爬蟲任務進行關聯。 系統將根據定時任務啟動頻率(cron表達式)和最后啟動時間(last_start_time)定時啟動關聯的爬蟲任務。
根據已有知識配置可能造成非授權的URL 地址庫,構造非授權檢測URL,用于檢測網站非授權訪問情況。 非授權URL 地址庫是根據互聯網情報、知識積累等方式獲得的,并不斷進行更新增加的知識庫。其記錄的是可能存在非授權訪問情況的URL,比如管理員會無意間將備份文件(. bak)和配置文件(.settings)放在網站目錄下造成非授權訪問,還有一些網站配置不當導致目錄列出問題(如Upload、Edit、phpinfo 目錄),造成網站敏感配置信息或數據信息泄露。 URL 地址庫規則如“admin. {}”“Info. {}”“css.{}”等。 非授權檢測是根據域名啟動檢測的。 爬蟲過程中,系統持續獲取爬蟲隊列中URL 對應的域名,當發現隊列中存在未曾檢測的域名時,啟動非授權檢測模塊,將當前域名與非授權URL 地址庫按照規則構造檢測URL 并發送給爬蟲隊列進行檢測,數據分析與存儲模塊將根據爬蟲結果判斷是否存在敏感信息泄露情況。 在發送構造檢測URL 給爬蟲隊列后,系統會在request 請求時傳遞泄露類型參數(re_type),告知數據分析與存儲模塊此爬蟲隊列是在進行非授權檢測[4]。 如果構造的檢測URL 訪問不存在,則該隊列任務將直接結束,不進入數據結果分析。
啟動網站爬取任務,按照遞歸方式,完成站點所有頁面的爬取。 網絡爬蟲模塊主要利用Scrapy-redis框架實現針對目標網站的爬取。 該框架是在Scrapy框架基礎上,加入了Redis 分布式隊列支持的爬蟲框架。 網絡爬蟲模塊的功能如下:(1)引擎主要處理整個系統的數據流,觸發對應的事務。 (2)調度器模塊負責分發爬蟲的請求,并使用Redis 的Sorted Set 數據結構來管理爬取請求,并使用Redis 的Key-Value 數據結構來管理已爬取的URL 集合。 一方面調度器模塊從引擎接收新提取的URL 任務請求,將其壓入Redis 隊列中;另一方面當引擎請求爬取時,調度器模塊根據爬取優先級從Redis 中抽取URL 鏈接,返回給引擎啟動爬取任務。 調度器模塊在從Redis 隊列中抽取URL 時,使用Redis 的Set 數據結構來管理已經爬取過的URL,在調度時利用DupeFilter 防止重復爬取。 (3)隊列處理模塊主要進行爬取URL鏈接管理,供爬蟲使用。 Scrapy-redis 框架使用Redis 存儲需要爬取的URL,可以多個爬蟲實例共享同一個隊列,實現系統的分布式爬蟲。 (4)下載器模塊:接收調度器下發的請求,獲取下載URL 的Response 數據。 (5)爬蟲模塊:接收下載器下載到的HTML 頁面,通過Xpath 表達式和正則表達式提取網頁中的數據。
此外,系統采用遞歸式爬取方式,即每次下載器獲取到Response 數據后提取所有鏈接壓如爬蟲隊列,由系統進行URL 去重操作,刪除已經爬取的URL。Scrapy-redis 去重主要使用request_fingerprint 接口的Request 指紋計算和布隆過濾器實現。
根據下載器模塊提供的Response 數據進行數據結果分析,利用敏感信息檢測規則庫判斷Response 中是否存在敏感信息,并將結果存入MySQL 數據庫中。當Response 獲取的數據為Word、PDF 等文件,則需要借助Python-docx、PyPDF2 等第三方庫類完成文件讀取,獲取內容信息后再進行分析。
系統在進行結果數據分析和數據存儲時需要花費一定的時間,若使用同步方式處理,則造成線程的堵塞,影響系統的性能。 為了提高系統性能,系統采用異步方式進行數據分析及存儲,其方法是構造自定義pipeline 實例ProcessTwistedPipeline, 通過使用Twisted 框架實現異步處理和存儲。
敏感信息檢測規則庫:用戶可通過正則匹配等方法配置敏感信息檢測規則,用來檢測下載結果中是否存在敏感信息。 比如:檢測頁面中是否存在身份證號、手機號等敏感信息,檢測網頁源代碼中是否存在password、Secret_Key 等敏感代碼,檢測規則如:身份證號檢測((([1-9] d{5}(19|20) d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx])|身份證|身份證號|證件號))、手機號檢測(((13[4-9]|14[7-8]|15[0-27-9]|178|18[2-47-8]|198|13[0-2]|14[5-6]|15[5-6]|166|17[5-6]|18[5-6]|133|149|153|17[37]|18[0-19]|199|17[0-1])[0-9]{8}))等。
系統流程如圖1 所示,(1)根據初始URL 初始化隊列,啟動網絡爬取模塊開始進行數據爬取。 (2)隊列獲取目標URL,通過檢測去重,發送給下載器下載網頁。 同時,從目標URL 提取域名信息,如果判斷為新增域名,則同時啟動非授權檢測模塊,根據字典構造檢測URL 加入隊列。 (3)下載網頁完成后,提取頁面所有有效鏈接,重新加入爬蟲隊列,同時下載的頁面結果發送給數據分析和存儲模塊處理。 (4)數據分析和存儲模塊根據檢測規則,進行敏感信息泄露檢測,并將結果存入數據庫。

圖1 系統流程
系統測試部署在3 臺主機上(配置均為Intel Core i7-7500U CPU 2.7 GHz 2.90 GHz,32 G 內存),模擬監測鄭州大學敏感信息泄露情況。 配置起始URL為:www. zzu. edu. cn,配置域名作用范圍為zzu. edu.cn,運行24 h,獲取網站頁面信息約20 萬條,發現存在手機號泄露頁面3 102 個,郵箱泄露頁面5 138 個,部分數據如圖2 所示。
本文提出一個基于Scrapy 的網站敏感信息監測系統設計方案,通過實驗可以發現系統單日采集分析處理頁面約為20 萬條,系統性能滿足要求。 根據敏感信息檢測規則庫,系統能夠發現存在手機號或郵箱賬號泄露的頁面,達到系統預期的功能要求。 本文設計的系統具有一定的擴展性,用戶可根據需要增加非授權檢測URL庫和敏感信息檢測規則庫,后續在實際使用中,仍需進一步擴充相應的規則,達到更好的監測效果。