1 概述
网络、可移动存储等技术的普及方便了计算机系统与外界信息交换,同时,也增加了计算机系统受攻击的可能性。在此情况下,很难从根本上确保计算机系统的安全,只能通过采用各种安全防护手段来提高入侵的代价,减少入侵带来的损失,实现相对安全。
目前,隔离和还原仍是较有效的安全防护手段,但操作系统对隔离和还原的支持很有限。例如,操作系统主要针对多任务环境提供进程地址空间的隔离,并未提供磁盘存储空间的隔离,该隔离机制是不彻底的,一旦系统被攻击,恶意代码有可能获取系统中的任何文件,导致信息泄漏。再如,虽然Windows XP等操作系统提供了系统还原功能,但该功能是基于文件的,且当系统崩溃无法引导时,该功能将无法使用。
为弥补操作系统在隔离和还原方面的不足,出现了一些存储隔离和系统还原方案。主流的存储隔离方法是基于硬件隔离卡”。它虽可以实现物理层次上的存储隔离,但要增加专门的硬件设备,一般仅能实现2个隔离区域,且需要为每个隔离区域安装操作系统。
目前,还存在一些存储还原软件,但它们一般仅提供单一的还原点。可见,尚未出现任何产品同时实现存储隔离与还原两种安全防护手段。
本文给出一种存储隔离与还原系统的工作原理、设计思路及实现方案。本系统具有成本优势以及很好的扩展性。系统中的每个隔离区域共享操作系统存储空间,且无须为每个隔离区域安装操作系统,提高了磁盘空问的利用率,同时降低了部署和维护成本。系统通过软件配置,可以为每个隔离区域创建任意多个还原点,用户可以将系统恢复到以前的某个安全状态。
2 工作原理
多任务操作系统为每个进程维护一套页表结构,来保存逻辑地址到物理地址问的映射关系,不同进程的用户地址空间到物理地址空间的映射关系是不同的,从而实现了用户地址空间的隔离。而不同进程的内核地址空间到物理地址空间的映射关系是相同的,从而实现了进程对操作系统的共享。与操作系统的内存管理类似,本文通过增加一层地址映射关系来实现磁盘存储空间的隔离与共享。图1给出了本系统的工作原理。
一般情况下,磁盘请求的发起者给出的块地址将直接作为物理块地址被提交至磁盘读写逻辑。本系统增加了一层映射关系,磁盘请求的发起者将使用逻辑块地址而不是物理块地址来访问磁盘,逻辑块地址被转换成物理块地址后才被提交至磁盘读写逻辑。
为避免因维护地址映射关系占用过多的系统资源,提高地址映射机制的效率,本系统以簇为基本磁盘组织单位。簇的大小可配置,在默认情况下,簇为256个连续的块。逻辑地址空间和物理地址空间的总簇数相同,且均被划分为一系列大小相等的簇,逻辑地址和物理地址可看作由簇号和簇内偏移2个部分组成。在进行地址映射时,逻辑地址中的逻辑簇号(Logical Cluster Number,LCN)部分将被映射为物理簇号(Physical Cluster Number,PCN),簇内偏移保持不变。
本系统维护一张全局的磁盘分配表(Disk AllocationTable,DAT),记录已用和空闲块的簇。为每个隔离区域维护一张地址映射表(Address Mapping Table,AMT),记录LCN到PCN的映射关系。在初始状态下,每个隔离区域的AMT是相同的,即所有隔离区域共享操作系统及已有的应用程序。之后,除对共享块的访问之外,不同隔离区域中使用相同LCN的读写请求将被映射到不同的PCN,以实现存储的隔离。若某个隔离区域对共享块进行写操作,写时拷贝机制将对该写操作重定向,根据DAT分配空闲磁盘块,将共享块的内容拷贝到新分配的物理块,并利用写缓冲区的内容更新该新分配的物理块的内容。
在某一时刻,AMT确定了其所对应的隔离区域的存储状态,因此,通过备份AMT就可以实现对隔离区域的快照。本文将AMT的备份称作还原点映射表(Revert Point MappingTable,RPMT),系统支持对AMT进行多次备份,以后使用某个RPMT覆盖AMT就可以使存储恢复到此前的某个状态,从而实现多点还原。RPMT的结构与AMT是完全相同的。
3 系统设计
本系统使用一块连续的空闲磁盘空间保存DAT,AMT,RPMT等管理数据,将该部分磁盘卒间称作管理数据区,其大小由磁盘容量、簇大小、隔离区域个数和还原点个数等因素共同决定。管理数据区受到保护,不允许被本系统以外的软件写入。
3.1磁盘分配表
本系统接管磁盘空间的分配和回收,为此定义DAT来记录物理磁盘的使用情况。系统在分配物理簇时,要查询DAT。DAT的表项个数与磁盘的总簇数相同,DAT的第N个表项描述了磁盘上的第.Ⅳ个簇的使用情况。DAT的每个表项为1 Byte,记录一个簇的使用情况,其布局如图2所示。
图2磁盘分配袁项字节布局
其中,0/M(original/management)位的第7位表示对应的簇是否保存原始数据或管理数据,若是则O/M位为1,否则为0。由于一个簇可能被多个隔离Ⅸ域或还原点引用,即可能有多个映射关系指向同一簇,因此使用Ref-Count(第0位~第6位)记录对该簇的引用计数。Ref-Count为0表示本簇窑闲,否则表示被使用。目前,一个簇最多可以被127个映射所指向。
安装本系统时DAT被初始化,所有已使用的磁盘空间所对应的DAT表项的O/M位为1,Ref.Count也为1,未使用的磁盘空间对应的DAT表项为0。之后每次创建一个隔离区域或簇被隔离区域中的一个还原点所引用,则簇的引用计数将加1,每次删除一个引用该簇的还原点或隔离区域,引用计数将减1。
当引用计数为0时,表示该簇空闲,可被再次分配。对于保存原始数据或管理数据的簇,其引用计数永远大于或等于1,因此,这部分磁盘空间永远不会被释放。
3.2地址映射表
每个隔离区有一张地址映射表,表项的个数与磁盘的总簇数相同,保存某个隔离区域的LCN到PCN的映射关系,即第N个表项保存着逻辑地址空间上第N簇到物理簇号的对应关系。图3给出了簇大小为256块时的AMT表项格式。
图3 AMT表项的结构
其中,Reserved字段保留;P位表示表项中的映射关系是否有效,P=1表示LCN对应的PCN存在,P=O表示该表项是无效的。此时其他字段无意义,其原因可能是隔离区域尚未使用该LCN所对应的逻辑簇。对于某个逻辑簇LCN,若其对应的AMT表项中的P位为0,则对该簇的读操作返回全0,对该簇的写操作需进行如下处理:
(1)分配一个空闲物理簇(设其簇号为PCN),并在DAT中设置该簇的引用计数为1;
(2)将PCN写入AMT中第LCN个表项的PCN字段;
(3)AMT中第LCN个表项的P位置1,表示逻辑簇到物理簇的映射已存在;
(4)AMT中第LCN个表项的RO位置0,表示所对应的物理簇可写;
(5)将写请求缓冲区中的内容写入物理簇PCN中。
其中,RO位表示物理簇是否是只读的。RO=1表示该物理簇只读,否则表示可写。若P位为1,在对簇号为LCN的逻辑簇进行写之前,参照RO位。若RO=1,则需要重新建立映射,以确保原有簇的内容不被覆盖,操作如下:
(1)分配一个空闲物理簇(设其簇号为PCN.new),并在DAT中置该簇的引用计数为1;
(2)设AMT中第LCN个表项的PCN字段为PCN.old,将物理簇PCN.old的内容拷贝到物理簇PCN.new;
(3)在DAT中将对PCN.old簇的引用计数减1;
(4)将PCN.new写入AMT的第LCN个表项的PCN字段,P位保持为1不变,将RO位置为0;
(5)将写请求缓冲区中的内容写入物理簇PCN.new中。AMT表项中P和RO位的组合关系及其含义如表1所示。
表1 P和RO位的组合关系及其含义
实际读写请求中,逻辑地址是连续的,但物理簇地址可能是不连续的,需要将读写请求分散到多个不连续的物理簇上。
3.3还原点映射表
还原点映射表是某个隔离区域的AMT的备份,其表项的格式及数量与AMT完全一致。每个隔离区域可以有多个RPMT。
3.4 隔离区域的创建和删除
创建隔离区域的工作就是创建AMT并初始化的过程,操作如下:
(1)从管理数据区中为AMT分配空间,并将每个表项的P位初始化为0;
(2)遍历DAT,若第Ⅳ个表项的O/M位为1,则将AMT的第N个表项的PCN字段设为N,并将P和RO位置1,同时将DAT中第N个表项的Ref-Count字段加1。
在删除隔离区域前,确保已删除了属于该隔离区域的还原点。删除隔离区域的主要操作是删除该隔离区域对应的AMT,并释放一部分的物理簇空间。操作如下:
(1)遍历AMT,若表项的P位为1,则在DAT中将表项中PCN字段对应的物理簇的引用计数减1;
2)释放管理数据区中AMT所占用的空间。
3.5还原点的创建、删除和系统还原
创建还原点主要是备份AMT到RPMT的过程,操作如下:
(1)从管理数据区中分配一块空间作为RPMT;
(2)遍历AMT,若表项的P位为1,则将RO位置1,由于新建的还原点将引用PCN字段所对应的簇,因此该簇将被写保护;
(3)遍历AMT,若表项的P位为1,则在DAT中将PCN字段所对应的簇的引用计数加1;
(4)将AMT的内容复制到RPMT。
在删除某个还原点后,该还原点所保存的磁盘状态将丢失,并释放某些引用计数为0的簇。操作如下:
(1)遍历要删除的还原点对应的RPMT,若表项的P位为1,在DAT中将PCN字段所对应的物理簇的引用计数减1;
(2)在第(1)步操作中,若PCN字段所对应的物理簇的引用计数为1,则将RO位置0,此时表明除了隔离区域之外,已没有对该簇的引用,应该将该簇设为可写;
(3)释放管理数据区中RPMT所占用的空间。
还原的主要工作是用指定还原点的RPMT覆盖当前隔离区域的AMT。操作如下:
(1)遍历当前AMT,若表项的P位为1,则在DAT中将PCN字段所对应的物理簇的引用计数减1;
(2)拷贝还原点的RPMT到当前AMT;
(3)检查当前AMT,若表项的P位为1,则在DAT中将PCN字段所对应的物理簇的引用计数加1。
4 系统实现
本文基于x86平台在Windows XP系统上对以上设计进行实现,下文介绍实现过程中的一些细节。
在安装本系统后,将替换磁盘的主引导记录磁盘上原有的主引导记录将被保存。因此,计算机每次引导时,代码将首先获得控制权。
在安装本系统后的初次引导时,将首先执行一段工作在实模式下的初始化程序init。init能识别各个磁盘分区的起止位置以及FAT32和NTFS文件系统的格式,以确定磁盘空间的使用情况,并从中查找一块足够大的连续空间作为管理数据区,并根据磁盘使用情况初始化磁盘分配表,根据DAT初始化创建至少一个隔离区域,并初始化其地址映射表。
在安装本系统后的每次引导时,将执行一段工作在实模式下的管理程序manager。manager通过读写管理数据区,向用户提供管理界面,以进行隔离区域的创建、删除,以及还原点的创建、删除和系统还原操作。用户还可以通过管理界面,选择本次引导需要使用的隔离区域。
在Windows系统上,磁盘读写主要通过2种方式进行:
(1)通过BIOS INT 13H访问磁盘,使用该方式的代码主要是系统引导代码,如MBR,Ntldr等;
(2)通过磁盘驱动程序访问磁盘,在内核初始化之后,所有的磁盘访问均使用该方式。
为了进行地址映射,在manager程序的结尾以挂钩的形式截获了所有使用BIOS INT 13H系统调用进行的磁盘I/O,并在Windows XP内核中以磁盘过滤驱动程序的方式截获了所有发给磁盘驱动程序的磁盘I/O。因此,所有的磁盘I/O都会被本系统重新映射,从而实现存储的隔离。
由于各隔离区域共享同一块物理磁盘,因此可能出现如下情况:某个隔离区域的文件系统认为分区上还有剩余磁盘空间,但实际上已经没有物理磁盘空间可用。因此,本文实现一个文件系统过滤驱动程序,该驱动程序截获所有的文件系统写操作,并在每次写操作前,向磁盘过滤驱动程序查询剩余的物理磁盘空间,当剩余物理地址空问小于某个预设的值时,向文件写请求的发起者返回磁盘空间不足信息,并提示用户删除一些数据、还原点或隔离区域,以释放磁盘空间。
5 结束语
本文给出一种存储隔离和还原系统的软件解决方案及其实现,实验结果表明,该方案较好地解决目前系统安全面临的一些问题。通过划分存储隔离区域,一台计算机可分时地工作在互联网和内网环境中,避免了组织内部的信息泄漏到互联网上,也避免了互联网上的恶意代码感染属于内网的存储区域。通过系统还原,即使计算机感染了恶意代码,也可以利用存储还原机制将存储状态恢复到以前的某个安全状态。
下一步的研究包括事务性的磁盘修改操作,多硬盘的支持等。