分类: LINUX
2007-05-11 11:13:34
加密文件系统主要解决的是物理安全问题。通常依靠操作系统提供的安全机制来保护数据的安全。以普通的个人计算机来说,它们通常都允许通过启动软盘引导系统。这样对于在物理上能够接触到涉密计算机的入侵者来说,他可以简单启动另一个不同的操作系统,该系统完全由入侵者来控制,此时他就可以完全避开正常的权限检查。入侵者甚至有可能盗走保存有机密数据的硬盘,或者整台计算机。由于笔记本电脑在现今社会应用广泛,而且经常被随身携带,因此出现遗失和被窃的可能性自然大大增加。相对于通过计算机网络系统入侵,物理入侵带来的安全威胁相对要小一些,但是只要数据足够重要,这种安全威胁就绝对不能忽略。威胁的根源是数据在存储介质中以明文方式保存,而应对这种威胁的唯一方法就是使用数据加密技术。
1 加密文件系统介绍
1.1 基本原理
(1)文件系统
操作系统中负责管理和存取文件信息的软件机构称为文件管理系统,简称为文件系统。文件系统为用户提供了存取简便、格式统一、安全可靠的管理各种信息(文件)的方法。
(2)加密技术
采用密码技术将信息隐蔽起来,使信息即使被窃取或载获,窃取者也不能了解信息的内容,从而保证了信息的安全。
(3)加密文件系统
加密文件系统扩展了普通文件系统的功能,它以一种对用户透明的方式为用户提供了一个将数据以加密方式存放的功能。
1.2 存储系统的不同加密方式
存储系统的加密可以分为3大类。
(1)文件加密方式
最基本的文件加密方式是使用某种文件加密工具,它不需要操作系统支持。例如在E-mail通信时常用的PGP工具。用户通过自己选择的密码对文件进行加密。用户在访问加密过的文件的时候,需要使用工具对其先进行解密,使用完毕后再进行加密。这种繁琐的方式使得它在实际应用中缺乏足够的吸引力。而且这种方式由于需要用户参与较多,因此比较容易出错。如果用户遗忘了密码,文件内容将无法恢复,如果用户使用容易猜测的密码(用户通常倾向于使用比较容易记忆的口令,这往往是容易猜测的口令),就会增加非法访问者解密的可能性。同时处于使用状态的明文数据文件完全没有保护,入侵系统的非法用户也可以使用替换加密工具,记录用户键盘输入等方法得到数据的访问权,所以只适合对安全性要求不高的场合使用。
(2)存储介质加密方式
存储介质加密方式通常在设备驱动程序层实现。由驱动程序透明地进行加解密工作。它们通常使用创建一个容器文件,通过某种机制,例如loop设备(绕回设备),在此容器文件中创建一个文件系统。整个容器文件是加密的,作为一个虚拟分区被安装和使用。使用这种方式实现的加密系统有BestCrypt,PGPDisk和Linux cryptoloop.
(3)加密文件系统
加密文件系统是在文件系统基础上实现加密功能。它和使用存储介质加密方式一样,能够提供对用户透明的文件加密功能。相对于使用存储介质加密方式,它的主要特点是可以支持文件粒度的加密。也就是说,用户可以选择对哪些文件加密。由于是直接在物理设备而不是在容器文件内创建文件系统,再加上不用对整个存储卷加密,加密文件系统就能够提供更好的性能。
1.3 加密文件系统的分类
加密文件系统可以分为两类,两者的实现方式和目标都有比较大的区别。
一类是本地加密文件系统,它的目标是应对存储介质失窃的威胁,安全模型把加密文件系统所在的操作系统视为可信的。
另一类是面向网络存储服务的,通常是基于NFS客户和服务器模型,可以称为加密网络文件系统。在加密网络文件系统中,数据以密文的方式保存在加密网络文件系统中,用户通过客户机服务进程与网络文件服务器交互,网络文件服务器负责将用户请求的密文传递到客户机服务进程,由客户机服务进程进行解密再交给应用程序。在这个模型中,只要求客户机操作系统是可信的,而网络服务器由于不接触明文数据,不要求其可信。Crypt-FS属于前一类。
这里列举一些重要的加密文件系统,它们有的属于实验性质的文件系统,有的则属于商业软件,在这里不作详细介绍,仅供参考。
·CFS ( Cryptograhpic File System ):AT&T的Matt Blaze 开发,是比较早的加密文件系统;
·TCFS:意大利Salerno大学在CFS基础上开发的加密文件系统;
·Cryptfs:由Erez Zadok开发的加密文件系统,基于他本人提出的Stackable File System实现的加密文件系统;
·ReiserFS version 4:Linux上的著名日志文件系统,从v4开始支持加密功能;
· EFS:集成在微软公司的Window2000操作系统中的加密文件系统。
2.加密文件系统的实现
在设计加密文件系统的时候,面临两种选择:
一是在现有的文件系统的基础上对文件系统的存储结构加以调整以容纳加密信息,并修改文件系统代码来实现加密文件系统。StegFS和Reiserfs V4都以这种方式实现;
另一种是在Linux操作系统的虚拟文件系统中实现加密文件功能。我们选择了后者。这样我们的实现独立于具体的文件系统,用户可以自由地选择满足需求的文件系统,同时又拥有了加密文件系统的功能。
2.1 加密属性的存放
我们采用在目标文件系统中创建加密文件系统元文件来实现文件加密属性的保存。加密文件系统元文件是目标文件系统根目录中的普通文件,但是通过安全操作系统的强制访问控制机制加以保护(Crypt-FS是安全操作系统的一个子模块),所有用户都没有此元文件的访问权限,所以它是足够安全的。元文件的内容在系统启动前将由操作系统核心读取并构造相应的内存中的数据结构,在系统空闲的时候由一个核心进程将被修改的信息保存回加密文件系统元文件中。
2.2 加密的位置
Crypt-FS加密文件系统实现的难点在于找到Linux核心代码中合适的地点进行加解密的工作。这个地点有2个条件必须得到满足:(1)代码应该处理对齐的磁盘块数据;(2)应该在Page Cache层之下,以便充分利用Linux的缓冲机制提高加密文件系统的性能。 磁盘读写速度相对于计算机系统的处理能力实在是太慢了,Page Cache极大地增加了Linux操作系统的文件系统的效率。如果在Linux Page Cache 层之上进行加解密的话,意味着对于加密的文件,Page Cache中存在的将是密文,每次核心需要Page Cache中内容的话就要进行加解密的工作。而根据我们屏蔽了缓冲机制后的测试显示(使用同步方式安装文件系统,进行写操作) 对加密文件的操作由于涉及到费时的加密算法,对CPU为PII 266的服务器,CPU负荷相对于非加密文件的操作将提高5倍左右。可见开销还是相当大的。所以合理的方式是在数据块刚刚从磁盘中读取时即解密,对数据实际需要写入磁盘前才进行加密。这样Linux缓冲机制中缓存中存在的将是明文。只要数据在缓冲区内,实际性能将不会有明显的损失。
Crypt-FS的主要的加解密操作位置如下:
(1)在generic_make_request()函数中进行加密。Linux操作系统中generic_make_request()函数完成将实际的读写请求传递到下层的设备驱动的任务。
(2)在do_generic_file_read() 中将实际的数据解密。
2.3 文件名加密
虽然文件名不如文件数据敏感,但考虑到用户一般会使用有意义的命名文件,这样就会给入侵者提供某些信息,所以加密文件系统通常都考虑使用密文的方式保存加密文件的文件名。由于加密后的文件名通常包含不适合文件名要求的字符例如'/0'和其它不可读的字符,因此加密后要作一个转换,将加密后的文件名利用类似于BASE64的编码方式转化为符合文件系统对文件名规范的要求。这样有两个问题比较麻烦,一是减少了文件名可用长度,如果用户对足够长的文件名的文件加密,结果将超出文件系统对文件名长度的限制。第2个问题是加密后的文件名可能会和其它文件名重名。由于文件名加密算法不改变文件名的长度,而加密后对文件名的转换过程对文件名长度的变化是确定的。因此通过在加密工具中对原文件名长度作检测,避免了第一个问题,如果发现文件名过长,就拒绝加密请求。关于重名的问题还没有好的方法解决。