基于NDIS中间层驱动和SSL协议的安全通信
2011-03-14赵春平刘文丽
赵春平 刘文丽
江南计算技术研究所 江苏 214083
0 前言
在SSLVPN中,通过虚拟网卡和SSL协议可以实现安全通信,保护IP和链路层数据安全。Openvpn是这种技术的开源实现,它通过实现一个虚拟网卡将IP或链路层数据传输到应用层,在应用层通过SSL隧道通信,以达到安全目的。
通过虚拟网卡技术实现IP和链路层层的安全有一些缺点:
(1)对于建立SSL隧道的两台机器,只有通过对方的虚拟地址访问时,数据才被保护。从根本上说(在不采用其他安全措施,比如防火墙),两台机器之间仍然存在明文通信;
(2)虚拟网卡技术依赖虚拟IP地址,可能会影响上层应用的访问方式。
本文提出了一种基于Window NDIS协议和SSL协议来进行安全通信的方法,并在原型通信的基础上给出了多种安全通信方式。本方法可以实现下面的安全通信方式:
(1)构建远程访问模式SSLVPN;
(2)构建局域网访问模式SSLVPN;
(3)任意两台计算机的安全通信;
(4)构建加密网络。
本方法的安全通信仅需要物理IP地址,并且安全通信不影响非安全通信,安全通信和非安全通信使用相同的IP地址。
本方法借鉴了虚拟网卡方式SSLVPN的思想:实现一个SSLVPN,开发人员需要通过各种不同的手段来截获通信数据,然后将通信数据在SSL隧道中传输。虚拟网卡工作方式的SSLVPN从根本上讲是将windows内核态协议栈中的数据通过IO控制传递到用户态的SSL隧道中进行传输,它的实现手段是虚拟网卡。本文介绍的方法通过IO控制将windows的NDIS层数据传递到用户态进行安全传输。
1 NDIS介绍
NDIS(Network Driver Interface Specification)是微软实现的网络驱动接口规范。它包括NDIS协议驱动,NDIS小端口驱动和NDIS中间层驱动,各种驱动遵循规范进行交互。
通过NDIS中间层可以进行网络数据的截获,NDIS中间层截获的数据为数据链路层数据。
微软的WDK中提供了passThru实现范例,它是一个透明的NDIS中间层驱动。开发人员可以修改passThru范例来达到自己的目的。
2 SSL协议介绍
SSL(Security Socket Layer)协议是广泛使用的安全通信协议。SSL客户端和SSL服务端在socket层协商秘密信息,并在此基础上进行安全通信。
3 实现原理
本方法通过NDIS中间层驱动来截获网络数据,通过操作系统 IO控制,将数据传递到操作系统应用层来进行安全通信。安全通信的方式可以是SSL协议或其他自定义通信协议。大致的通信示意图如图1所示。
图1 通信示意图
应用数据发送过程如下:
(1)发送方发送数据时,网络数据被NDIS中间层截获,存入缓冲区;
(2)用户态进程读取NDIS中间层截获的网络数据;
(3)用户态进程采用SSL通道发送给目标;
(4)目标机器应用层进程从SSL通道接收数据;
(5)目标机器应用层进程将收到的数据写入NDIS中间层驱动;
(6)目标机器NDIS中间层驱动将数据提交给上层协议。
为了避免出现环路通信,使 SSL通道能够正常工作,NDIS中间层必须放过SSL通道的网络通信,有目的的截获。NDIS截获时,可以根据需求进行截获。
NDIS截获的数据是链路层数据,因此,此种方法能保证链路层之上的所有安全通信。
4 原型及其模式演化
4.1 通信原型
基于NDIS中间层驱动和SSL协议的原型如图2所示。
图2 NDIS安全通信原型
在原型中,发起方的网络数据通过NDIS中间层驱动传递到SSL模块,然后通过SSL模块发送;接收方通过SSL模块接收,再通过NDIS中间层驱动传递到上层。
4.2 远程访问模式
在上述原型中,将接收方的SSL模块与NDIS中间驱动层剥离,那么,它将演化为远程SSLVPN访问。如图3所示。
图3 远程SSLVPN访问模式
此种工作方式下,远程访问者的机器需要安装NDIS中间层驱动和 SSL模块。受保护网络需要有一台前置的 SSL转发服务器,目标机器上需要安装 NDIS中间层驱动。SSL转发服务器与目标机器间采用socket进行明文通信。
4.3 局域网访问模式
在远程访问模式下,将远程访问者一端进行剥离,那么将转化为局域网访问模式。如下图所示:
图4 SSLVPN 局域网工作模式
4.4 通过中转的加密网络
在局域网模式下,如果将两台SSL转发服务器合二为一,那么将组成一个通过中间服务转发的加密网络,如下图所示:
图5 通过中转的加密网络
4.5 点对点安全通信
如果不通过SSL转发,可以实现任意两台机器间的安全通信,相当于构造了一个加密网络。如下图所示:
图6 点对点安全通信
5 实现方法
下面给出了主要模块的大致实现方法:
(1)NDIS驱动
NDIS驱动以微软WDK中提供的Passthru范例为基础,增加读写文件操作。在读文件操作中,需要NDIS驱动缓存MPSendPackets中的发送数据,如何缓存以及如何读取,可以参考openvpn的实现方式。在写文件操作中,我们需要构造一个数据包提交给上层协议,调用 NdisMEthIndicateReceive函数。
(2)SSL协议
SSL协议可以使用openssl来实现。
按照上述方式实现的NDIS驱动,完全可以替换openvpn中的虚拟网卡驱动来实现安全通信。
6 总结
通过NDIS中间层驱动和SSL协议来实现安全通信时,所使用的均为实际的物理地址,即一个物理地址即能做到明文通信同时也在进行明文通信。并且,NDIS的截获可以只针对特定目标,完全不影响其他的正常通信。
[1]rfc2246,The TLS Protocol Version.1.0.
[2]WDKDocs_12112009.chm.windows wdk.帮助文档.