趙春平 劉文麗
江南計算技術(shù)研究所 江蘇 214083
在SSLVPN中,通過虛擬網(wǎng)卡和SSL協(xié)議可以實現(xiàn)安全通信,保護IP和鏈路層數(shù)據(jù)安全。Openvpn是這種技術(shù)的開源實現(xiàn),它通過實現(xiàn)一個虛擬網(wǎng)卡將IP或鏈路層數(shù)據(jù)傳輸?shù)綉?yīng)用層,在應(yīng)用層通過SSL隧道通信,以達到安全目的。
通過虛擬網(wǎng)卡技術(shù)實現(xiàn)IP和鏈路層層的安全有一些缺點:
(1)對于建立SSL隧道的兩臺機器,只有通過對方的虛擬地址訪問時,數(shù)據(jù)才被保護。從根本上說(在不采用其他安全措施,比如防火墻),兩臺機器之間仍然存在明文通信;
(2)虛擬網(wǎng)卡技術(shù)依賴虛擬IP地址,可能會影響上層應(yīng)用的訪問方式。
本文提出了一種基于Window NDIS協(xié)議和SSL協(xié)議來進行安全通信的方法,并在原型通信的基礎(chǔ)上給出了多種安全通信方式。本方法可以實現(xiàn)下面的安全通信方式:
(1)構(gòu)建遠程訪問模式SSLVPN;
(2)構(gòu)建局域網(wǎng)訪問模式SSLVPN;
(3)任意兩臺計算機的安全通信;
(4)構(gòu)建加密網(wǎng)絡(luò)。
本方法的安全通信僅需要物理IP地址,并且安全通信不影響非安全通信,安全通信和非安全通信使用相同的IP地址。
本方法借鑒了虛擬網(wǎng)卡方式SSLVPN的思想:實現(xiàn)一個SSLVPN,開發(fā)人員需要通過各種不同的手段來截獲通信數(shù)據(jù),然后將通信數(shù)據(jù)在SSL隧道中傳輸。虛擬網(wǎng)卡工作方式的SSLVPN從根本上講是將windows內(nèi)核態(tài)協(xié)議棧中的數(shù)據(jù)通過IO控制傳遞到用戶態(tài)的SSL隧道中進行傳輸,它的實現(xiàn)手段是虛擬網(wǎng)卡。本文介紹的方法通過IO控制將windows的NDIS層數(shù)據(jù)傳遞到用戶態(tài)進行安全傳輸。
NDIS(Network Driver Interface Specification)是微軟實現(xiàn)的網(wǎng)絡(luò)驅(qū)動接口規(guī)范。它包括NDIS協(xié)議驅(qū)動,NDIS小端口驅(qū)動和NDIS中間層驅(qū)動,各種驅(qū)動遵循規(guī)范進行交互。
通過NDIS中間層可以進行網(wǎng)絡(luò)數(shù)據(jù)的截獲,NDIS中間層截獲的數(shù)據(jù)為數(shù)據(jù)鏈路層數(shù)據(jù)。
微軟的WDK中提供了passThru實現(xiàn)范例,它是一個透明的NDIS中間層驅(qū)動。開發(fā)人員可以修改passThru范例來達到自己的目的。
SSL(Security Socket Layer)協(xié)議是廣泛使用的安全通信協(xié)議。SSL客戶端和SSL服務(wù)端在socket層協(xié)商秘密信息,并在此基礎(chǔ)上進行安全通信。
本方法通過NDIS中間層驅(qū)動來截獲網(wǎng)絡(luò)數(shù)據(jù),通過操作系統(tǒng) IO控制,將數(shù)據(jù)傳遞到操作系統(tǒng)應(yīng)用層來進行安全通信。安全通信的方式可以是SSL協(xié)議或其他自定義通信協(xié)議。大致的通信示意圖如圖1所示。
圖1 通信示意圖
應(yīng)用數(shù)據(jù)發(fā)送過程如下:
(1)發(fā)送方發(fā)送數(shù)據(jù)時,網(wǎng)絡(luò)數(shù)據(jù)被NDIS中間層截獲,存入緩沖區(qū);
(2)用戶態(tài)進程讀取NDIS中間層截獲的網(wǎng)絡(luò)數(shù)據(jù);
(3)用戶態(tài)進程采用SSL通道發(fā)送給目標;
(4)目標機器應(yīng)用層進程從SSL通道接收數(shù)據(jù);
(5)目標機器應(yīng)用層進程將收到的數(shù)據(jù)寫入NDIS中間層驅(qū)動;
(6)目標機器NDIS中間層驅(qū)動將數(shù)據(jù)提交給上層協(xié)議。
為了避免出現(xiàn)環(huán)路通信,使 SSL通道能夠正常工作,NDIS中間層必須放過SSL通道的網(wǎng)絡(luò)通信,有目的的截獲。NDIS截獲時,可以根據(jù)需求進行截獲。
NDIS截獲的數(shù)據(jù)是鏈路層數(shù)據(jù),因此,此種方法能保證鏈路層之上的所有安全通信。
基于NDIS中間層驅(qū)動和SSL協(xié)議的原型如圖2所示。
圖2 NDIS安全通信原型
在原型中,發(fā)起方的網(wǎng)絡(luò)數(shù)據(jù)通過NDIS中間層驅(qū)動傳遞到SSL模塊,然后通過SSL模塊發(fā)送;接收方通過SSL模塊接收,再通過NDIS中間層驅(qū)動傳遞到上層。
在上述原型中,將接收方的SSL模塊與NDIS中間驅(qū)動層剝離,那么,它將演化為遠程SSLVPN訪問。如圖3所示。
圖3 遠程SSLVPN訪問模式
此種工作方式下,遠程訪問者的機器需要安裝NDIS中間層驅(qū)動和 SSL模塊。受保護網(wǎng)絡(luò)需要有一臺前置的 SSL轉(zhuǎn)發(fā)服務(wù)器,目標機器上需要安裝 NDIS中間層驅(qū)動。SSL轉(zhuǎn)發(fā)服務(wù)器與目標機器間采用socket進行明文通信。
在遠程訪問模式下,將遠程訪問者一端進行剝離,那么將轉(zhuǎn)化為局域網(wǎng)訪問模式。如下圖所示:
圖4 SSLVPN 局域網(wǎng)工作模式
在局域網(wǎng)模式下,如果將兩臺SSL轉(zhuǎn)發(fā)服務(wù)器合二為一,那么將組成一個通過中間服務(wù)轉(zhuǎn)發(fā)的加密網(wǎng)絡(luò),如下圖所示:
圖5 通過中轉(zhuǎn)的加密網(wǎng)絡(luò)
如果不通過SSL轉(zhuǎn)發(fā),可以實現(xiàn)任意兩臺機器間的安全通信,相當于構(gòu)造了一個加密網(wǎng)絡(luò)。如下圖所示:
圖6 點對點安全通信
下面給出了主要模塊的大致實現(xiàn)方法:
(1)NDIS驅(qū)動
NDIS驅(qū)動以微軟WDK中提供的Passthru范例為基礎(chǔ),增加讀寫文件操作。在讀文件操作中,需要NDIS驅(qū)動緩存MPSendPackets中的發(fā)送數(shù)據(jù),如何緩存以及如何讀取,可以參考openvpn的實現(xiàn)方式。在寫文件操作中,我們需要構(gòu)造一個數(shù)據(jù)包提交給上層協(xié)議,調(diào)用 NdisMEthIndicateReceive函數(shù)。
(2)SSL協(xié)議
SSL協(xié)議可以使用openssl來實現(xiàn)。
按照上述方式實現(xiàn)的NDIS驅(qū)動,完全可以替換openvpn中的虛擬網(wǎng)卡驅(qū)動來實現(xiàn)安全通信。
通過NDIS中間層驅(qū)動和SSL協(xié)議來實現(xiàn)安全通信時,所使用的均為實際的物理地址,即一個物理地址即能做到明文通信同時也在進行明文通信。并且,NDIS的截獲可以只針對特定目標,完全不影響其他的正常通信。
[1]rfc2246,The TLS Protocol Version.1.0.
[2]WDKDocs_12112009.chm.windows wdk.幫助文檔.