在当今社会随着计算机与网络技术的不断发展,企业信息化程度也越来越高,而企业局域网信息安全也成为研究的热点。其中内网信息安全也因其重要性成为众多企业关注的焦点,然而企业很难做到有效控制员工将数据外流泄密的行为,虽然企业对此做出了监控,但是还是防不胜防,在这种情况下可以采取文件加密方式,传统的文件加密方式总会改变用户的操作习惯,并且不能做到强制性加密,局域网透明文件加密由此应运而生。所谓的透明文件加密,就是指对用户来说是未知的。当用户打开或编辑指定文件时,系统将自动对未加密的文件进行加密,对已加密的文件自动解密。文件在硬盘上是密文,在内存中是明文。一旦离开使用环境,由于应用程序无法得到自动解密的服务而无法打开,从而起到保护文件内容的效果。
一、文件过滤驱动原理
目前对于文件加密技术这一领域,主要出现的有微软推出的加密文件系统以及基于钩子(Hook)技术的文件加密技术,但这两种技术也存在缺陷。下面将详细讨论文件过滤驱动的工作原理。
文件系统驱动主要是负责维护各种文件系统的磁盘结构以及用户与底层非易失型存储介质之间的交互。文件系统驱动工作原理主要是依赖I/o管理器的,在文件驱动接收到应用程序Open、Create、Read、Write和Close文件的请求之前,I/O管理器要取得文件驱动层在管理器中的注册信息,这样当截取到上层应用程序发送的访问磁盘逻辑卷请求时,I/O管理器就能够识别这一动作,将请求发送到文件驱动层。当文件系统驱动处理完请求后会将处理完的请求发送到底层的存储设备驱动程序,通过存储设备驱动程序将文件信息写到物理磁盘上面,如图1所示。
由于Windows文件系统的驱动模型WDK( Win-dows Driver Kit)是采用分层的结构,这样在使用IRP机制的内核层,可以使驱动程序通过将构造的匿名设备对象负载在已知的设备对象上,而这个匿名的设备对象就是所谓的驱动设备对象,与之相关联的驱动程序就是过滤驱动程序。这种分层的结构允许在IRP包到达目标设备对象之前首先会判断有没有匿名的设备对象,如果有就将IRP包发送给匿名设备,匿名设备然后会根据IRP包的信息调用相应的驱动程序处理,当匿名设备加载完成特定的功能之后,然后将IRP包发往下层驱动设备。
二、基于过滤驱动的透明文件安全加密方法
在改进现有的文件安全加密技术的基础上,设计了基于文件过滤驱动的透明文件加密方法,如图2所示。
新设计的方法主要分为两大部分:客户端和服务端。客户端模块的主要作用是给终端用户提供客户端身份认证、透明加密和解密服务、访问控制服务等功能。客户端按操作系统的运行可分为用户态和内核态,用户态主要实现通信代理、策略配置、密钥管理、读/写操作等功能,而内核模态主要实现过滤驱动技术也是要讨论的重点,用户态主要是为内核模态提供加密服务的;服务端模块的主要作用是方便管理员有效地控制整个加密系统,并为客户端提供策略分配服务,所有的客户端请求都将通过策略服务器得到响应。
过滤驱动关键技术:
为了实现对文件的加解密与访问控制,需要拦截上层发送的包(r/o Request Packet,IRP),如图2所示。当拦截到加密写操作IRP包时,则申请新密钥与文件加密标志,从IRP指定的地址中读取明文,用对称加密算法对其加密,并且向下层传递IRP将密文写入磁盘上,最后在完成方法中恢复明文信息,同时把文件的相关信息记录到文件加密属性中,否则正常处理。
当拦截到读操作IRP包时首先判断当前文件是否存在密钥,如果存在,则解密,否则直接把数据向下提交。
以上分析了加解密的主要流程,下面将对获取机密进程、加密标志设置以及加密处理等关键技术进行研究。
1、获取机密进程
在经过加密的操作系统中,所有的进程被分为两类:机密进程和普通进程,但是由于进程的名字很容易被伪造,所以在内核中,可以对进程名与同名可执行文件的内容进行验证,来防止非法的仿冒行为。首先获取当前进程的名字,EPROCESS结构是Windows内部的每个进程都维护的一个保存进程名的结构。在内核模块的DriverEntry函数总会执行一个名为“Sys-tem”的进程,那么可以确定DriverEntry当前进程名为“System”。虽然不知道EPROCESS结构的具体内容,但是可以在EPROCESS中搜索“System”这个字符串,一旦搜索到,记录下偏移位置。
这样,以后要从EPROCESS获得进程名字时,就可以直接从这个位置取了。下面介绍具体的伪代码实现。
首先在获取进程名字之前要先进行初始化,初始化函数为cfCurPtocNamelnit,这个函数必须在DriverEntry中调用,否则cfCurProcName将不起作用。并且设置静态变量size_t_cf_proc_name_offset=0;保存要寻找的偏移位置,这个函数很简单。先通过PsGct-CurrentProcess得到当前EPROCFSS的位置,然后充分相信其中有一个字符串“System”,搜索后得到偏移位置保存在一个静态变量中,下面的cfCurProName函数就是获取程序名字的关键代码。
ULONG cfCurProName( PUNICODE_STRING name)
{
PEPROCESS curproc;//声明一个EPROCESS指针
ULONG i,need_len;
if( s_cf_proc_name_offset==0)
retum O;
curpro= PsGetCurrentProcess();//获得当前进程,然后移动一个偏移位置得到进程名所在的位置
}
2、加密标志设置
当机密进程获取一个文件时,如何判断这个文件是已经加密的还是未加密的,这需要在硬盘中保留一个文件是否已经被加密的信息,这种信息称为加密标志。这种信息必须保存在硬盘上,和文件一起存在。一个选择是,在文件以外的地方保存这个信息。比如另建一个隐藏文件,保存当前目录下其他文件的加密标志,但是这种方法非常麻烦,所以在此选择在文件内容中保存加密标志,在文件内容中保存加密标志也有两种选择:基于文件头和文件尾,基于文件尾比较容易实现但是有安全隐患,在此选择基于文件头,选择文件头的好处是稳固可靠,位置固定缺点是实现起来相对要困难。由于要实现对所有的机密进程隐藏这个头部,则所有文件都要增加一个偏移,下面给出了一个记事本隐藏文件头的设置偏移,比如记事本如果试图把文件大小设置为1kB,假设文件头为4kB大小,那么实际的文件应该被设置为SkB,实现的伪代码如下:
//对所有设置请求进行修改,使之隐去前面的4kB文件头
void , PIO_STACK_I.O-C.ATION irpsp)
{
PUCHAR buffcr=irp ->Associatedlrp. System-Buffer;//取得文件缓冲句柄
NTSTATUS status;
ASSERT( irp一>MajorFUNCTION=IRP_ MJ_SET_INFORMATION);//用于调试环境的声明
switch( irpsp - >PArameters. SetFile. Filelnformation-Class)
case FileAllocationlnformation:{
......//增加在FileAlloca-tionlnformation条件下的文件偏移
}
......};
}
上面只给出了FileAllocationlnformation一种情况,其他情况类似,通过隐藏文件头,就可以在文件头设置加密标志。
3、加密处理
当上层的应用程序对某一类文件设置加密操作的规则,底层的过滤驱动层截取到文件创建的IRP请求时,则首先读取文件加密标志,根据加密标志来决定是否要进行加密操作,如果需要进行加密操作,则通过事先写好的加密函数一般使用AES加密算法,从服务器获取加密密钥对文件进行加密。当加密好文件之后根据写IRP请求将加密好的文件写入物理磁盘。
当对加密过的文件进行读请求时,首先判断是否可以通过FastIODispatch例程在Cache管理器处获取。如果可以的话直接从Cache中读取明文,否则调用底层驱动从磁盘读取数据,在应用层获得服务器的解密密钥通过I/O完成例程对文件数据进行解密操作‘10 -12]。下面的代码主要针对文件的加密操作:
NTSTATUS EFWrite (IN PDEVICE_OBJECT Devi-ceObject, IN PIRP Irp)
{
.....
if( IS_ControI_MY _DEVICE_ OBJECT( DeviceOb-ject))
{
......
CompletionIoRequest(Irp, JO.NO—INCRF-MENT);//完成不需要加密的请求
retum STATUS—IRP一- INVALID—DEVICE—RE-QUEST;
}
IoCopyCurrentFileToNextlrpStackLocation(IrP),//拷贝需要写入文件的数据到新开辟的MDL内存
EncriptMyFile( dataBuffer,length,key);//加密函数的调用
}
解密操作类似。
三、实验与结果分析
建立测试环境如下:acer台式机一台,CPU为Pentium( R) Dual-Core E5300 2.60GHz,内存为2G,硬盘250G,操作系统为Windows XP( SP2)。
通过配置了TXT文档的文件保护策略并使用了AES对称加密算法,在一个既有FAT分区也有NTFS格式分区的操作系统中,进行文件的操作,结果表明系统可以在FAT分区和NTFS分区很好的工作,对所有txt类型文件都进行了加密存储,写入的明文如图3所示:
当在另外一台没有加密方法的电脑上看这些文件都是乱码,看不到真实信息,如图4所示:
并且还对加密过程使用DebugView进行了检测,通过使用DebugView的检测可以对内核态程序的运行过程有一一个大致的了解,如图5所示:
实验结果表明基于过滤驱动的文件加密方法可以在不改变用户的使用习惯的情况下很好地提供加密与解密操作。
小知识之透明加密
透明加密技术是近年来针对企业文件保密需求应运而生的一种文件加密技术。所谓透明,是指对使用者来说是未知的。当使用者在打开或编辑指定文件时,系统将自动对未加密的文件进行加密,对已加密的文件自动解密。文件在硬盘上是密文,在内存中是明文。一旦离开使用环境,由于应用程序无法得到自动解密的服务而无法打开,从而起来保护文件内容的效果。