個人防火牆

個人防火牆

電腦信息安全設備
在計算機計算領域中,防火牆(英文:firewall)是一項協助确保信息安全的設備,會依照特定的規則,允許或是限制傳輸的數據通過。防火牆是一台專屬的硬件或是架設在一般硬件上的一套軟件。個人防火牆是防止您電腦中的信息被外部侵襲的一項技術,它能在您的系統中監控、阻止任何未經授權允許的數據進入或發出到互聯網及其他網絡系統。
    軟件名稱: 軟件平台: 軟件語言: 開發商: 軟件授權: 軟件版本: 軟件大小: 中文名:個人防火牆 外文名:Personal FireWall 屬性:網絡設備

簡介

個人防火牆(Personal FireWall)顧名思義是一種個人行為的防範措施,這種防火牆不需要特定的網絡設備,隻要在用戶所使用的PC上安裝軟件即可。由于網絡管理者可以遠距離地進行設置和管理,終端用戶在使用時不必特别在意防火牆的存在,極為适合小企業等和個人等的使用。

個人防火牆把用戶的計算機和公共網絡分隔開,它檢查到達防火牆兩端的所有數據包,無論是進入還是發出,從而決定該攔截這個包還是将其放行,是保護個人計算機接入互聯網的安全有效措施。

常見的個人防火牆有:天網防火牆個人版、瑞星個人防火牆、360木馬防火牆、費爾個人防火牆、江民黑客防火牆和金山網标等。

個人防火牆産品如著名Symantec公司的諾頓、Network Ice公司的BlackIce Defender、McAfee公司的思科及Zone Lab的free ZoneAlarm等,都能幫助您對系統進行監控及管理,防止電腦病毒、流氓軟件等程序通過網絡進入您的電腦或在您未知情況下向外部擴散。這些軟件都能夠獨立運行于整個系統中或針對對個别程序、項目,所以在使用時十分方便及實用。

優缺點

優點:成本低,不需要額外的硬件源,可以抵擋内部的攻擊。

缺點:個人防火牆主要的缺點是對公共網絡隻有一個物理接口,個人防火牆本身可能會容易受到威脅。

發展背景

Internet的出現及其迅速發展給現代人的生産和生活都帶來了前所未有的飛躍,它促進了信息的廣泛交流,大大提高了工作效率,豐富了人們的精神生活。然而,随着計算機網絡技術的突飛猛進,網絡安全的問題已經日益突出地擺在各類用戶的面前,網絡的安全性成為Internet上最為熱門的焦點之一,它關系着Internet的進一步發展和普及,甚至關系着Internet的生存。随着網絡安全問題日益嚴重,網絡安全産品逐漸被人們重視起來。

防火牆作為最早出現的和使用量最大的網絡安全産品,受到了用戶和許多研發機構的青睐。防火牆對網絡系統具有很好的保護作用。它通過對流經它的網絡信息進行監控以實現安全防護。比如用禁止特定端口的方法設置對外通信來防止木馬;或者禁止來自特殊站點的訪問,從而防止來自入侵者的所有通信。從應用角度來看防火牆基本上可以分為網絡級的防火牆和個人防火牆兩種。個人用戶對網絡安全的需要在不斷增加,而Windows操作系統是使用最為廣泛的PC操作系統,因此如何在Windows操作系統下開發個人防火牆變的越來越重要了。個人防火牆就是一個位于計算機和它所連接的網絡之間的軟件。

該計算機與網絡的所有通信均要經過此防火牆。在Windows操作系統下比較著名的防火牆有國外的ZoneAlarm,NortonPersonalFirewall以及SygatePersonalFirewall等,國内的有天網防火牆等産品。個人防火牆有很多優點:它能對公共網絡中的單個系統提供保護;它不需要額外的硬件資源就能增加對系統的保護;它在抵擋外來攻擊的同時,還可以抵擋來自内部的攻擊;另外,它的價格相對來說十分的便宜。尤其是對一個使用Modem或ISDN/ADSL上網的家庭用戶來說,一個硬件防火牆實在是太昂貴或者太麻煩(需要煩瑣的配置),而使用個人防火牆足以能夠隐蔽用戶暴露在網絡上的信息,對其提供足夠的安全保護。

類型

個人防火牆,通常是在一部計算機上具有封包過濾功能的軟件,如ZoneAlarm及Windows XP SP2後内置的防火牆程序。而專用的防火牆通常做成網絡設備,或是擁有2個以上網絡接口的計算機。以作用的TCP/IP堆棧區分,主要分為網絡層防火牆和應用層防火牆兩種,但也有些防火牆是同時運作于網絡層及應用層。

網絡層防火牆

網絡層防火牆可視為一種IP封包過濾器,運作在底層的TCP/IP協議堆棧上。我們可以以枚舉的方式,隻允許符合特定規則的封包通過,其餘的一概禁止穿越防火牆。這些規則通常可以經由管理員定義或修改,不過某些防火牆設備可能隻能套用内置的規則。我們也能以另一種較寬松的角度來制定防火牆規則,隻要封包不符合任何一項“否定規則”就予以放行。操作系統及網絡設備大多已内置防火牆功能。較新的防火牆能利用封包的多樣屬性來進行過濾,例如:來源IP地址、來源端口号、目的IP地址或端口号、服務類型(如WWW 或是FTP)。也能經由通信協議、TTL值、來源的網域名稱或網段...等屬性來進行過濾。

應用層防火牆

應用層防火牆是在TCP/IP堆棧的“應用層”上運作,使用浏覽器時所産生的數據流或是使用FTP時的數據流都是屬于這一層。應用層防火牆可以攔截進出某應用程序的所有封包,并且封鎖其他的封包(通常是直接将封包丢棄)。理論上,這一類的防火牆可以完全阻絕外部的數據流進到受保護的機器裡。

防火牆借由監測所有的封包并找出不符規則的屬性,可以防範計算機蠕蟲或是木馬程序的快速蔓延。不過就實現而言,這個方法既煩且雜(因軟件種類極其繁多),所以大部分的防火牆都不會考慮以這種方法設計。

XML防火牆是一種新型态的應用層防火牆。

代理服務

代理服務(Proxy)設備(可能是一台專屬的硬件,或隻是普通計算機上的一套軟件)也能像應用程序一樣回應輸入封包(例如連接要求),同時封鎖其他的封包,達到類似于防火牆的效果。

代理會使從外部網絡竄改一個内部系統更加困難,且隻要對于代理有良好的設置,即使内部系統出現問題也不一定會造成安全上的漏洞。相反地,入侵者也許劫持一個公開可及的系統和使用它作為代理人為他們自己的目的;代理人僞裝作為那個系統對其它内部機器。當對内部地址空間的用途加強安全,破壞狂也許仍然使用方法譬如IP欺騙(IP spoofing)試圖通過小包對目标網絡。

防火牆經常有網絡地址轉換(NAT)的功能,并且主機被保護在防火牆之後共同地使用所謂的“私人地址空間”,定義在RFC1918。

防火牆的适當的配置要求技巧和智能,它要求管理員對網絡協議和計算機安全有深入的了解,因小差錯可使防火牆不能作為安全工具。

主要功能

個人防火牆的主要功能為網絡數據包處理、安全規則和日志。

網絡數據包處理

在Internet上,所有往來的信息都被分割成許許多多一定長度的信息包,信息包的包頭包括IP源地址、IP目标地址、内裝協議(TCP、UDP、ICMP、或IPTunnel)、TCP/UDP目标端口、ICMP消息類型、包的進入接口和出接口等信息。個人防火牆會檢查所有通過的信息包中的包頭信息,并按照用戶所設定的安全過濾規則過濾信息包。如果防火牆設定某一IP為危險的話,從這個地址而來的所有信息都會被防火牆屏蔽掉。由此可見,個人防火牆核心技術是實現在Windows操作系統下的網絡數據包攔截。

安全規則設置

防火牆的安全規則就是對計算機所使用的局域網、互聯網的内制協議進行設置,使網絡數據包處理模塊可以根據設置對網絡數據包進行處理,從而達到系統的最佳安全狀态。個人防火牆軟件的安全規則方式可分為兩種:一種是定義好的安全規則。就是把安全規則定義成幾種方案,一般分為低、中、高三種,這樣不懂網絡協議的用戶,也可以根據自己的需要靈活的設置不同的安全方案。還有一種就是用戶自定義的安全規則。這需要用戶在了解了網絡協議的情況下,根據自己的安全需要對某個協議進行單獨設置。

日志

日志是每個防火牆軟件必不可少的主要功能,它記錄着防火牆軟件監聽到發生的一切事件,比如入侵者的來源、協議、端口、時間等等。日志的實現比較簡單,将監聽到的事件信息寫入文件即可。

攔截數據的類型

用戶态(user-mode)和内核态(kernel-mode)。

1)用戶态(user-mode)。

在用戶态下進行網絡數據包的攔截有三種方法:WinsockLayeredServiceProvider(LSP)、Windows2000包過濾接口、替換系統自帶的WINSOCK動态連接庫。在用戶态下進行數據包攔截最緻命的缺點就是隻能在Winsock層次上進行,而對于網絡協議棧中底層協議的數據包無法進行處理。因此,這些方法并不适合個人防火牆。

2)内核态(kernel-mode)。

a)TDI過濾驅動程序(TDIFilterDriver)。當應用程序要發送或接收網絡數據包的時候,都是通過與協議驅動所提供的接口來進行的。協議驅動提供了一套系統預定義的标準接口來和應用程序之間進行交互。因此,隻需要開發一個過濾驅動來截獲這些交互的接口,就可以實現網絡數據包的攔截。當應用程序要發送或接收網絡數據包的時候,都是通過與協議驅動所提供的接口來進行的。協議驅動提供了一套系統預定義的标準接口來和應用程序之間進行交互。

在Windows2000/NT下,ip,tcp,udp是在一個驅動程序裡實現的,叫做tcp.sys,這個驅動程序創建了5個設備:DeviceRawIp,DeviceUdp,DeviceTcp,DeviceIp,DeviceMULTICAST。應用程序所有的網絡數據操作都是通過這些設備進行的。因此,我們隻需要開發一個過濾驅動來截獲這些交互的接口,就可以實現網絡數據包的攔截。另外,TDI層的網絡數據攔截還可以得到操作網絡數據包的進程詳細信息,這也是個人防火牆的一個重要功能。

但是,TDI傳輸驅動程序有一個缺陷,TDIFilterdriver屬于Upperdriver,位于TcpIP.sys之上,這就意味着由TcpIP.sys接收并處理的數據包不會傳送到上層,從而無法過濾某些接收的數據包,例如ICMP包。ICMP的應答包直接由TcpIP.sys生成并回應,而上面的過濾驅動程序全然不知。另外,該方法需要在系統核心層編寫驅動程序,需要編寫人員對Windows操作核心層的工作機制非常熟悉,同時,驅動程序對代碼質量要求非常高,稍有不慎就會使系統崩潰。

b)Win2kFilter-HookDriver。這是從Windows2000開始系統所提供的一種驅動程序,該驅動程序主要是利用Ipfiltdrv.sys所提供的功能來攔截網絡數據包。Filter-HookDriver的結構非常簡單,易于實現。但是正因為其結構過于簡單,并且依賴于Ipfiltdrv.sys,Microsoft并不推薦使用Filter-HookDriver。

c)NDISHookDriver。該方法在Windows2000/xp下是非公開的,因此這種方法對平台的依賴性比較大,需要在程序中判斷不同的操作系統版本而使用不同的方法。

d)NDIS中間層驅動程序(NDISIntermediateDriver)。NDIS(NetworkDriverInterfaceSpecification)是Microsoft和3Com公司開發的網絡驅動程序接口規範的簡稱,它支持如下三種類型的網絡驅動程序:微端口驅動程序、中間層驅動程序(IntermediateDriver)和協議驅動程序。其中中間層驅動介于協議層驅動和小端口驅動之間,其功能非常強大,可以提供多種服務,能夠截獲所有的網絡數據包(以太幀),過濾微端口驅動程序,實現特定的協議或其他諸如數據包加密、認證等功能。綜上所述,在NDIS中間層進行網絡數據包截獲的方法結構規範,功能強大,該技術極其适合個人防火牆所采用。

中間層驅動程序(NDIS)的内部結構

NDIS支持3種驅動:微端口驅動,中間層驅動和協議驅動。

1)微端口驅動。就是網卡驅動,它負責管理網卡,包括通過網卡發送和接受數據,它也為上層驅動提供接口。

2)中間層驅動。它通常位于微端口驅動和傳輸協議驅動之間,是基于鍊路層和網絡層之間的驅動,由于中間層驅動在驅動層次中的中間層位置,它必須與其上層的協議和下層的微端口驅動通信,并且導出兩種協議的函數。雖然中間層驅動導出MINIPORTXX函數,但它并不真正的管理物理網卡,而是導出一個或者多個虛拟适配器,上層協議可以綁定到上面。

對于協議驅動來說,中間層導出的虛拟适配器看起來像一個物理網卡,當它向這個虛拟适配器發送封包或者請求時,中間層驅動将這些封包和請求傳播到下層微端口驅動;當下層微端口驅動向上指示接收封包或者狀态時,中間層驅動向上到綁定虛拟适配器上的協議驅動。中間層驅動的主要作用就是過濾封包,其優點是能夠截獲所有的網絡數據包。

3)協議驅動,即網絡協議。它位于NDIS體系的最高層,經常用作實現傳輸協議堆棧的傳輸驅動中的最底層驅動。傳輸協議驅動申請封包,從發送應用程序将數據複制到封包中,通過調用NDIS函數将這些封包發送到下層驅動。協議驅動也是提供了一個協議接口來接收來自下層驅動的封包。傳輸協議驅動将收到的封包傳遞給相應的客戶應用程序。在下層,協議驅動與中間層微端口驅動交互。協議驅動調用NDISXX函數發送封包,讀取和設置下層驅動維護的信息,使用操作系統服務。協議驅動也要導出一系列的入口點,NDIS調用它來指示封包的接受,指示下層驅動的狀态,或者是和其他協議驅動的通信。

中間層内部的工作流程

1)中間層對數據包的管理

中間層驅動程序從高層驅動程序接收數據包描述符,并在網絡上發送,該包描述符與一個或多個鍊式數據緩沖區相關聯。中間層驅動程序能夠對數據進行重新打包,并使用新的數據包描述符進行數據傳輸,也可以直接将數據包傳遞給低層驅動程序,如果驅動程序下邊界面向無連接,可調用NdisSend或NdisSendPackets函數完成該功能,如果驅動程序下邊界是面向連接的,可調用NdisCoSendPackets函數完成此項功能。

中間層驅動程序也可以進行一些操作改變鍊式緩沖區的内容,或者調整内入數據包相對于其他發送任務的發送次序或發送定時。但是,即使中間層驅動程序隻是向下層傳遞上層引入的數據報,例如,僅僅隻是對數據包進行計數,也必須分配新的數據包描述符,并且要管理部分或者全部新的包結構。

每一個中間層驅動程序都必須分配自己的包描述符來代替高層的數據包描述符。如果中間層驅動程序要把數據包從一種格式轉化為另一種格式,也必須分配緩沖區描述符來映射用于複制轉配數據的緩沖區,該緩沖區由中間層驅動程序進行分配。

如果有與複制的包描述符相關的OOB數據,那麼可以将這些數據複制到與包描述符(中間層驅動程序分配的)相關的新OOB數據塊,其過程是,首先,用NDIS_OOB_DATA_FROM_PACKET宏獲取OOB數據區的指針,然後,調用disMoveMemory将其内容移入與新包描述符相關的OOB數據區。該驅動程序也能夠用NDIS_GET_PACKET_XXX或NDIS_SET_PACKET_XXX宏從與老的包描述符相關的OOB數據區中,讀取相關的内容,并寫入與新包描述符相關的OOB數據區。

包描述符通過調用以下NDIS函數進行分配:

a)調用NdisAllocatePacketPool或者NdisAllocatePacketPoolEx,為固定尺寸包描述符(由呼叫器指定數量)分配并初始化一組非可分頁池。

b)調用NdisAllocatePacket函數,從NdisAllocatePacketPool(Ex)已經分配的池中分配包描述符。根據中間層驅動程序目的的不同,驅動程序能夠對引入包描述符連接的緩沖區進行重新打包。例如,中間層驅動程序可以在接下來的情況下分配包緩沖池、對引入包數據重新打包.如果中間層驅動程序從高層協議驅動程序接收到的數據緩沖區,比低層介質能夠發送的單個緩沖區更大,那麼中間層驅動程序必須将引入的數據緩沖分割成更小的、滿足低層發送要求的數據緩沖。中間層驅動程序在将發送任務轉交低層驅動程序之前,可以通過壓縮或加密數據方式來改變内入數據包的長度。調用以下NDIS函數分配上面所要求的緩沖區:

NdisAllocateBufferPool獲取用于分配緩沖區描述符的句柄;NdisAllocateMemory或NdisAllocateMemoryWithTag分配緩沖區;

c)調用NdisAllocateBuffer分配和設置緩沖區描述符,映射由NdisAllocateMemory(WithTag)分配的緩沖區,并鍊接到NdisAllocatePacket分配的包描述符上。驅動程序可以通過調用NdisChainBufferAtBack或NdisChainBufferAtFront函數,将緩沖區描述符和包描述符進行鍊接。調用NdisAllocateMemory(WithTag)返回的虛拟地址和緩沖區長度,将被傳遞給NdisAllocateBuffer函數來初始化其所映射的緩沖區描述符。符合典型要求的包描述符能夠在驅動程序初始化時根據要求進行分配,也可以通過ProtocolBindAdapter函數調用來實現。

如果必要或者出于性能方面的考慮,中間層驅動程序開發者可以在初始化階段,分配一定數量的包描述符和由緩沖區描述符映射的緩沖區,這樣,就為ProtocolReceive複制内入數據(将向高層驅動程序指示)預先分配了資源,也為MiniportSend或MiniportSendPackets向相鄰低層驅動程序傳遞引入的發送數據包,準備了可用的描述符和緩沖區。

如果在中間層驅動程序複制接收/發送數據到一個或多個緩沖區時,最末的一個緩沖的實際數據長度比緩沖區的長度小,那麼,中間層驅動程序将調用NdisAdjustBufferLength把該緩沖區描述符調節到數據的實際長度。當該包返回到中間層驅動程序時,應再次調用該函數将其長度調節到完整緩沖區的實際尺寸。

2)下邊界面向無連接的中間層驅動程序的工作流程

通過ProtocolReceivePacket函數,從低層NIC驅動程序以完整數據包形式接收内入數據,該數據包由NDIS_PACKET類型的包描述符指定,也能夠通過将内入數據指示給ProtocolReceive函數,并将數據複制到中間層驅動程序提供的數據包中。下邊界面向連接的中間層驅動程序總是用ProtocolCoReceivePacket函數,從低層NIC驅動程序接收數據作為一個完整的數據包。

在如下情況下,中間層驅動程序能夠保持對接收數據包的所有權:當下邊界面向無連接的中間層驅動程序向ProtocolReceivePacket函數指示完整數據包時,當下邊界面向連接的中間層驅動程序向ProtocolCoReceivePacket函數指示數據包時,其中DIS_PACKET_OOB_DATA的Status成員設置為除NDIS_STATUS_RESOURCES以外的任何值。在這些情況下,中間層驅動程序能夠保持對該包描述符和其所描述的資源的所有權,直到所接收數據處理完畢,并調用NdisReturnPackets函數将這些資源返還給低層驅動程序為止。

如果ProtocolReceivePacket向高層驅動程序傳遞其所接收的資源,那麼至少應該用中間層驅動程序已經分配的包描述符替代引入包描述符。根據中間層驅動程序目的的不同,當其從低層驅動程序接收完整數據包時,将有幾種不同的包管理策略。例如,以下是幾種可能的包管理策略:複制緩沖區内容到中間層驅動程序分配的緩沖區中,該緩沖區被映射并鍊接到一個新的包描述符,向低層驅動程序返回該輸入包描述符,然後可以向高層驅動程序指示新的數據包;創建新的包描述符,将緩沖區(與被指示包描述符相關聯)鍊接到新的包描述符,然後将新的包描述符指示給高層驅動程序。

當高層驅動程序返回包描述符時,中間層驅動程序必須拆除緩沖區與包描述符間的鍊接,并将這些緩沖區鍊接到最初從低層驅動程序接收到的包描述符,最後向低層驅動程序返還最初的包描述符及其所描述的資源。即使下邊界面向無連接的中間層驅動程序支持ProtocolReceivePacket函數,它也提供ProtocolReceive函數。當低層驅動程序不釋放包描述符所指示資源的所有權時,NDIS将調用ProtocolReceive函數,當這類情況出現時,中間層驅動程序必須複制所接收的數據到它自己的緩沖區中。

對于下邊界面向連接的中間層驅動程序,當低層驅動程序不釋放包描述符所指示資源的所有權時,則将數據包的NDIS_PACKET_OOB_DATA的Status成員設為NDIS_STATUS_RESOURCES,然後驅動程序的ProtocolCoReceivePacket函數必須将接收到數據複制到自己的緩沖區中。

3)中間層驅動過濾數據包的原理

NDIS中間層驅動程序在NDIS中起着轉發上層驅動程序送來的數據包,并将其向下層驅動程序發送的接口功能。當中間層驅動程序從下層驅動程序接收到數據包時,它要麼調用NdisMXxxIndicateReceive函數,要麼調用NdisMindicateReceivePacket函數向上層指示該數據包中間層驅動程序通過調用NDIS打開和建立一個對低層NIC驅動程序或者NDIS中間層驅動程序的綁定。中間層驅動程序提供MiniportSetInformation和MiniportQueryInformation函數來處理高層驅動程序的設置和查詢請求,某些情況下,可能還要将這些請求向低層NDIS驅動程序進行傳遞,

如果其下邊界是面向無連接的可通過調用NidsRequest實現這一功能,如果其下邊界是面向連接的則通過調用NidsCoRequest實現該功能。中間層驅動程序通過調用NDIS提供的函數向網絡低層NDIS驅動程序發送數據包。例如,下邊界面向無連接的中間層驅動程序必須調用NdisSend或NdisSendPackets來發送數據包或者包數組,而在下邊界面向連接的情況下就必須調用NdisCoSendPackets來發送包數組數據包。如果中間層驅動程序是基于非NDISNIC驅動程序的,那麼在調用中間層驅動程序的MiniportSend或Miniport(Co)SendPackets函數之後,發送接口對NDIS将是不透明的。

NDIS提供了一組隐藏低層操作系統細節的NdisXxx函數和宏。例如,中間層驅動程序可以調用NdisMInitializeTimer來創建同步時鐘,可以調用NdisInitializeListHead創建鍊表。中間層驅動程序使用符合NDIS标準的函數,來提高其在支持Win32接口的微軟操作系統上的可移植性。

在防火牆的設計中,最核心的部分應該是數據包的過濾。其他的功能都是建立在數據包過濾的基礎之上,如:入侵檢測功能和郵件檢測功能都是建立在數據包過濾的基礎之上。

數據包過濾中主要是IP包頭的分析,例如:在以太網中,得到的數據報大緻是如下結構,以太幀頭14個字節,放在PUCHAR結構數組的第0個元素到第13個元素中,其中前六個字節是目的MAC地址,然後六個字節源MAC地址,然後兩個字節是協議類型,通常的協議類型有0x080x00->IP,0x080x06->ARP,0x080x35->RARP,所以,可以通過數組的第12個元素和第13個元素來判斷協議類型。過濾規則就是在這個基礎之上建立。如果要過濾特定協議,隻要在相應的字節讀取數據,判斷是否符合要過濾的規則就可以了,當然實際的過濾規則要複雜的多的多,比如對指定的端口指定的IP的過濾。

開發重點

(1)需要完整的了解WINDOWS的運行原理,這包括内核部分和用戶部分。

(2)需要熟悉用DDK,完整的了解網絡驅動的運行機制。

(3)需要了解防火牆的工作原理。

補充

所謂個人防火牆,應該具有普及概念,一般的用戶無法做到了解WINDOWS的運行原理。

所以,個人防火牆的普及性及易用性,應該有所凸顯。

重點和難點的提出,隻适合針對開發者而言。

相關詞條

相關搜索

其它詞條