摘要:在對防火墻的性能和效率分析和改進的基礎上,設計并實現了一個基于 Windows平臺的個人防火墻。個人防火墻在實現過程中應用了這些效率和性能改進的策略,并取得了良好效果。
關鍵詞:網絡安全;個人防火墻;驅動程序;系統服務
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2009)33-9559-03
Personal Firewall System Architecture Design and Implementation
SUN Xing-wen
(Central South University, Institute of Information Science and Engineering, Changsha 410083, China)
Abstract: In firewall performance and efficiency of analysis and improvement, based on the design and implementation of a personal firewall on Windows platform. Personal Firewall application in the realization of the process of improving the efficiency and performance of these strategies, and achieved good results.
Key words: network security; personal firewall; windows driver; NDISNT service
防火墻作為最早出現的和使用量最大的網絡安全產品,受到了用戶和許多研發機構的青睞。防火墻具有很好的保護作用,它通過對流經它的網絡通信進行監控來實現安全防護。從應用角度來看防火墻基本上可以分為網絡級的防火墻和個人防火墻兩種。目前個人用戶對網絡安全的需要在不斷增加,而 Windows操作系統是使用最為廣泛的PC操作系統,本文將重點討論如何在Windows操作系統下開發個人防火墻。
1 防火墻系統的設計
根據個人計算機的安全管理和實際需求,在設計個人防火墻時主要完成了以下的功能:數據包過濾,文件系統監控,進程線程監控。
本系統總共分成三個模塊:表示層模塊,中間層服務模塊和驅動層模塊。用戶界面層模塊就是傳統的Windows應用程序,中間服務層模塊主要是Windows系統服務;驅動層模塊就是Windows驅動程序。表示層模塊和中間層服務服務模塊是用戶模式的應用程序,驅動層模塊是則是一個工作在系統內核模式的驅動程序。
表示層是一個用戶界面的接口,提供用戶和防火墻之間的對話。用戶通過界面可以輸入規則,然后向中間服務模塊和驅動層模塊傳遞規則。然后中間服務模塊向主程序傳遞統計日志信息。
中間層服務程序,主要是同上面的表示層,以及下面的驅動層進行通信,同時執行必要的計算,向上層和下層傳遞數據。
驅動層模塊主要包括三個模塊,NDIS中間層驅動模塊,文件系統監控模塊和WinSock2 SPI HOOK模塊。NDIS中間層驅動模塊主要功能是對進出系統的數據包進行分析過濾;文件系統監控模塊主要對系統內的進程線程讀寫進行監控;Winsock2SPI HOOK模塊主要對應用程序訪問網絡的行為做出判斷。
系統劃分為三層結構帶來以下的優點:
1) 系統的架構非常清晰,三個層次各司其職;
2) 層次之間非常獨立,這樣當某一層的需求發生改變時,只需在該層增加或減少相應的功能,其余兩層稍作相應的改動即可,應用程序不會出現牽一動百的情況;
3) 表示層不能直接通信驅動層,只有中間服務層可以同驅動層通信,這樣可以保證表示層不會出現不能響應的現象。
4) 系統擴展新增強,模塊化的設計使系統在橫向和縱向都很容易擴充,可以在中間層增加新的系統服務;
5) 系統可并行開發,縮短了開發周期,在定義完層次之間的接口之后,三個層就可以并行開發。
2 防火墻系統的實現
系統表示層模塊包含了整個系統的用戶界面部分,主程序主要實現了一下的功能:加載中間層服務模塊,顯示規則表;顯示當前網絡狀態文件;顯示數據包攔截過濾信息;顯示應用程序網絡監控信息;顯示當前進程線程信息;設置各種規則;同中間服務層通信。
中間層服務模塊主要分成5個模塊:表示層處理模塊,NDIS層通信模塊,SPI監控通信模塊,進程監視通信模塊,讀寫模塊。
驅動層分成3個模塊:NDIS中間層驅動,文件系統監控模塊以及Winsock2 SPI HOOK模塊。
3 防火墻系統核心功能實現
驅動模塊主要分成3個部分分別是NDIS中間層驅動模塊,文件系統監控模塊,Winsock2 SPI網絡監控模塊。
3.1 數據包過濾監控
NDIS 中間層驅動插入在網卡和上層協議中間,可以拿到所有的數據包,發送數據包和接收數據包的截獲主要是靠這三個函數實現的。
MP Send Packet:這個函數可以獲取將要發送的數據包,將數據包傳到下面一層miniport,或者直接將數據包丟棄;
PT Receive:這個函數主要用于鏈式結構的包收取策略,用于老式網卡或低檔網卡如rtl8139等等。這個函數將接收的數據包傳往上層或者丟棄;
PT Receive Packet:這個函數主要用于大緩沖包收取策略,用于新式和高檔網卡。在這三個函數里面對數據包進行分析,并同規則表進行匹配,就可以實現數據包過濾的功能。
NDIS 發送基本流程如圖1所示。
PT Receive和PT Receive Packet的基本流程如圖2所示。
當微端口層不能一次收到完整的數據報文的情況,見圖3所示。
1) 底層驅動通過調用函數Ndis M Indicate Receive/ Ndis MEth Indicate Receive通知上層已經收到數據報文;
2) 在Pt Receive中通過Ndis Get Received Packet得不到一個完整的packet,就直接調用Ndis MEth Indicate Receive函數通知NDIS;
3) 當底層miniport驅動收到了完整的數據報文后,會調用Ndis MEth Indicate Receive Complete函數通知,然后NDIS會調用函數Pt Receive Complete;
4) 同樣,在函數Pt Receive Complete里面也會繼續調用函數Ndis MEth Indicate Receive Complete,通知NDIS收到完整的報文;
5) 當上層協議驅動得知底層已經收到了完整的數據報文后,就會調用Ndis Transfer Data,要求下層上傳數據;
6) 然后NDIS接著調用MP Transfer Data例程。在 MP Transfer Data 中,再調用 Ndis Transfer Data。如果返回值為success,就說明數據立刻就上傳上去了,此時就可以返回了,不用再進行(7)和(8)兩步了;如果返回pending,表明底層現在處于阻賽,底層會在稍后再進行第(7)步;
7) 當底層 miniport 驅動上傳完了完整的packet,會調用Ndis Transfer Data Complete;
8) 同樣在中間層的Pt Transfer Data Complete 再作一次同樣的調用。至于驅動和中間服務層的通信問題,可以查看后文中驅動層同中間服務層的通信接口。
3.2 進程線程監控
木馬,蠕蟲等軟件中大量使用遠程線程技術,通過在目標進程中插入線程的方式運行插入的線程,實現方式在前文已經介紹過了。因此如何防止這種遠程線程注入也是個人防火墻的重要功能之一。
實現對進程和線程的監控主要是通過Ps Set Create Process Notify Routine()和Ps Create Thread Notify Routine()兩個函數實現的。這兩個函數向系統注冊一個Call Back函數對進程和線程進行監視。啟動流程如圖4所示。
1) 調用Ps Create Thread Notify Routine函數;
2) 調用Ps Set Create Process Notify Routine函數。
3.3 驅動層同中間服務層的接口
驅動層同中間的服務層之間的接口主要通過共享事件和Device IO Control接口來實現。
中間的服務層主動通信驅動層主要是通過Device IO Control接口的Device IO Control、函數實現的。Device IO Control函數原形如下:
BOOL Device IO Control(
HANDLE h Device,
DWORD dw IO Control Code,
LPVOID lp In Buffer,
DWORD n In Buffer Size,
LPVOID lp Out Buffer,
DWORD n Out Buffer Size,
LPDWORD lp Bytes Returned,
LPOVERLAPPED lp Over lapped);
其中:h Device [in]:是一個只向將要進行操作的設備的句柄,該句柄可以通過Create File函數得到;
Dw In Control Code[in]:操作控制碼。將操作控制碼傳給設備后,以決定采取何種操作;
Lp In Buffer[in]:一個指向輸入給設備的數據區的指針;
N In Buffer Size[in]:輸入設備的數據區的大小;
Lp Out Buffer[out]:一個指向從設備輸出的數據區的指針;
N Out Buffer Size[in]:設備輸出的數據區的大小;
Lp Bytes Returned[out]:一個指向輸出數據緩沖區大小的指針;
Lp Over lapped[in]:一個指向 OVERLAPPED 結構的指針。
驅動層主動同中間層通信主要是通過共享內存和事件實現的。
1) 中間服務層通過函數Create Event創建Event,然后通過函數Device IO Control將 Event傳遞到驅動層;
2) 驅動層通過調用Ob Reference Object By Handle函數就可以得到傳遞進來的事件的指針;
3) 中間服務層通過函數Device IO Control得到驅動層創建的共享內存的地址。然后在中間服務層運行Wait For Single Object函數或者Wait For Multpl Object函數,等待驅動層的事件通知。當驅動層想通知中間服務層時就通過調用Ke Set Event 函數,這樣中間層就可以收到驅動層的事件通知了。
4 結束語
本文對從五個系統性能和效率瓶頸出發:1)規則表的匹配低效;2)驅動層同中間層的繁忙通信;3)進程間的繁忙數據交換;4)文件讀寫的低效;5)策略表的低效查找。針對這些瓶頸,我們給出了解決瓶頸的七點改進策略:1)優化規則表;2)規則表細分;3)共享內存和事件的通信方式;4)內存映射;5)直接驅動層計算;6)二分查找;7)使用索引表。采用上面的改進策略構造了一個單機防火墻系統。實現了對本地系統的網絡數據包,文件系統以及進程線程的監控功能。
參考文獻:
[1] 陳琪,屈光,高傳善.Windows單機版防火墻包過濾多種方案比較與實現[J].計算機應用與軟件,2005,22(5):114-116.
[2] 晁汾濤,鄭鋒.基于中間驅動程序的數據包截獲技術[J].空軍雷達學院學報,2005(2):50-53.
[3] 郭興陽,高峰,唐朝京.一種NDIS中間層數據包過濾方法[J].計算機工程,2004(17):102-103,145.
[4] 王永彪,徐凱聲.用包過濾技術實現個人防火墻[J].計算機安全,2005(5):21-22.
[5] 王萍霞.今后的防火墻將何去何從[J].辦公自動化,2005(5):25-26.