论文部分内容阅读
摘 要:使用加密文件系统是保护重要数据的一种有效手段。传统的加密文件系统因为数据保护不彻底、效率低下等缺陷,无法很好地满足用户需求。本文介绍了一种加密文件系统的设计与实现,该文件系统基于Linux操作系统,采用标准加密算法,利用堆叠式文件系统来实现。
关键词:加密文件系统 Linux 堆叠 OpenSSL
中图分类号:TP316文献标识码:A文章编号:1672-8882(2011)07-084-02
随着信息技术的发展,电子文档被广泛使用在各行各业,如何确保这些电子信息的安全已经成为人们日益关注的问题。加密文件系统作为一种有效的数据保密技术而受到人们的青睐,它可以有效防止非法入侵者窃取用户的机密数据。同时,在多个用户共享一个系统的情况下,可以很好地保护用户的私有数据。所以,在高安全等级的操作系统中引入加密文件系统将对系统整体安全性起到至关重要的作用。
现在已经有很多成熟的加密文件系统,如Windows的EFS(Encrypting File System),Linux的CFS(Cryptographic File System)、TCFS(Transparent Cryptographic File System)、AFS(Andrew File System)等。这些加密文件系统对文档安全提供了一定程度的保护,但是它们普遍存在性能比较低下、保护机制不完整等一些问题。所以,本文的目标是设计一种使用方便、性能高效的加密文件系统,实现文档信息在操作系统底层的安全保密。
1. 现有加密文件系统的分析
现有的加密文件系统主要有如下几个:
1.1 CFS
CFS是比较早的一个经典的加密文件系统。它利用NFS文件系统的工作原理,在一个NFS服务器将数据写入磁盘时对数据进行加密,从磁盘读出数据时对数据进行解密,从而保证了数据在磁盘上的密文存储。CFS的加密操作在用户层完成,需要频繁地进行用户层到核心层的数据交换,因此CFS最大的缺点在于其效率低下。
1.2 TCFS
TCFS是在CFS基础上开发的加密文件系统,与CFS的不同在于它是一个NFS客户端。TCFS可以在不同级别上进行密钥管理,另外TCFS的数据加/密操作在核心层完成,所以性能有所改善。因其基于NFS的工作机制,每次读写操作都会涉及到核心层与用户层之间的数据交换,所以其效率的依然低下。另外,TCFS的安全性主要依赖于存放在磁盘上的用户登陆密码,在一定程度上降低了系统的安全性。
1.3 AFS
AFS是一个分布式加密文件系统,它通过一个统一的访问接口把多个服务器连接起来,使用户能够方便、高效地共享分布在网络中的文件。AFS提供了一个安全的加密数据传输路径,并通过鉴权数据库与访问控制列表ACL(Access Control Lists)的配合为用户提供更高的安全性。AFS的数据在服务器端是明文存储,其数据的存储安全性没有得到根本的保护。同时,因为AFS使用分布式的数据存储方式,一台服务器崩溃或被入侵,就会严重破坏整个系统的安全性。
2、堆叠(Stackable layer)文件系统[1]
Linux系统的一个重要特征就是支持多种不同的文件系统。它通过虚拟文件系统(VFS)把实际文件系统的具体细节抽象出来,将实际的文件系统和系统服务分离开来,以便提供一个统一的接口[2]。每一个具体的文件系统负责实现VFS系统调用的底层操作。可以根据实际需要设计特殊的文件系统,然后通过VFS来支持它。
堆叠式文件系统是把要实现的文件系统功能加载到原有文件系统之上,形成一个新的文件系统。可以将多层堆叠式文件系统叠加在一起,实现文件系统的“堆叠”式开发,以提供更强大的功能。其中上层文件系统调用下层文件系统的功能,直到底层文件系统。这样每一层只关注和其直接关联的下层,和其他的层没有直接关系。
利用现有文件系统的功能,把要开发的堆叠式文件系统插入到VFS和底层文件系统之间。也就是说,需要实现的新功能都由堆叠式文件系统来提供,而对于底层的文件系统则不做任何的修改。所以,开发、测试工作的焦点就是这个堆叠式文件系统,而基本不涉及底层文件系统。具有性能损失小、开发代价低等优点。同时,为了提高文件系统的效率,堆叠式文件系统以内核模块的形式实现。
这样开发者可以把主要精力放在文件系统的新功能上,不用考虑内核中的文件系统和底层文件系统的关联,同时避免了用户级文件系统过多的上下文切换和数据拷贝降低了该类文件系统性能的缺陷。
3、FiST[3](File-System Translator)语言
为方便堆叠式文件系统的开发,哥伦比亚大学教授E.Zado设计了FiST语言。FiST包括语言规范、代码产生器(Fistgen)和文件系统模板(Basefs Template)三部分。
Basefs Template的主要功能是处理有关的内核细节,如Cache缓存、操作返回值和内存映射等。开发者只需用FiST规范编写一个输入文件(FiST input file),Fistgen读取输入文件和Basefs Template,产生一个新的文件系统的C源代码(图1)。这样就可以在其中添加功能形成新的文件系统。
FiST开发一个堆叠式文件系统的一般步骤:
1) 按FiST语言规范编写FiST input file文件;
2) 将FiST input file和Basefs Templates作为输入文件,运行fistgen生成文件系统的功能模块代码;
3) 在功能模块代码中实现encode_data,decode_data,encode_filename和decode_filename等API函数;
4) 修改VFS中super_block,inode,file和dentry等的操作函数以及有关内存映射操作的函数;
5) 将重写后的代码编译成可内核可加载模块(Kernel Loadable Module)并将其加载(insmod)到运行的操作系统中;
6) 加载该文件系统,按功能要求测试并调试。
4、加密文件系统的设计
考虑到现有加密文件系统中存在的数据保护不完全、效率低下等问题,以及文件系统的实现方式,本文设计了一种具有良好的安全性能和运行效率的内核级的加密文件系统(图2)。
其设计思路是:使用堆叠式文件系统的概念构建加密文件系统,将其插入在底层文件系统和VFS之间,用于处理处理上下两层之间所有的数据交互,同时使用OpenSSL[4]对文件数据进行加/解密操作。
该文件系统提供的是一种透明的加密方式,存储在磁盘上的信息是以密文形式存在的。只有合法用户访问它的时候,系统才会自动的对该密文进行解密,并以明文的形式呈现给用户;而当非授权用户试图访问时,即使拥有普通文件系统的read权限,看到的只是没有被解密的密文。
当加密文件系统加载成功之后,系统可以在内核自动截获所有的文件I/O操作,从而可根据需要自动提供一种内核级的、透明的安全机制。当用户要处理的加密文件,它会根据当前用户的权限和密钥进行相应处理;而对于那些普通的目录或文件,加密文件系统将作为一个过渡的文件系统。
这样,在整个文件系统结构当中,加密文件相对于底层文件系统来说,它是VFS;而相对于VFS来说,它又是底层的文件系统。对于用户来说,当使用加密文件系统时,与普通文件系统是一样的,用户可以很方便地进行各种操作。
5、加密文件系统的模块结构
该加密文件系统主要由三大模块组成:安全项管理模块、密码处理模块和I/O模块。
5.1 安全项管理模块
该模块容许每个用户配置自己的安全项,这些安全项的是本系统安全的关键。安全项的内容包括:要进行安全保护的目录或文件、密码算法的选择、加密的初始化向量和生成的相应密钥等。这个密钥是通过调用密码处理模块经计算而获得的。添加安全项成功之后,相应的目录下的内容将采用该安全项进行数据保护。
一个新的安全项,以加密格式存储在一个安全项文件中,并且使用用户密码进行保护。每个用户可以设置自己的一个或多个安全项。
同时该模块具有维护这些安全项的功能:删除、修改安全项,设置、修改和删除用户密码等功能。这些功能的使用同样也需要对安全项文件执行解密、再加密过程。
用户密码只与安全项文件的加/解密有关。如果需要修改用户密码的话,就只需要对安全项文件重新加密,而不需要对所有的文件都进行解密、再加密。
5.2 密码处理模块
本模块中使用BlowFish加密算法,采用CFB的对称加密算法模式[5],对数据块进行加密和解密。
BlowFish是一种可变长密钥分组加密算法,特点是执行速度快,适用于存储容量大、密钥不是经常改变的系统。
采用CFB(加密反馈模式)主要是因为该模式具有以下优点:
1) 能够将重复的明文加密成不同的密文,隐藏明文的数据模式。因为CFB模式下加密算法的输入是当前明文组和上一个密文组的异或,而使用的密钥是相同的。加密算法的每次输入与本明文组没有固定的关系。
2) 在某种程度上能识别攻击者在密文传输中是否作了数据窜改。
3) 能适应用户不同数据格式的需要。
为了将相同的明文加密成不同的密文,CFB使用加密随机数据作为第一个分组,这个随机数据分组被称之为“初始化向量”。它没有任何意义,它的作用是使每个密文唯一化。在密码处理模块中,对同一文件下的所有数据块加/解密处理使用的初始向量是相同的(当然也可对不同的数据块采用不同的初始化向量)。
本文中对文件内的数据的加/解密不是一次性的对整个文件数据进行处理,是以数据块为单位进行加/解密操作。每个数据块与数据块之间的数据的加/解密是无关联的。而针对同一个数据块中的数据,则采用相应密码算法进行相应处理。
5.3 I/O模块
在Linux中,对硬盘上的文件系统的访问采用了分层模型,即上层的驱动调用低层的驱动。底层隐藏自己的实现细节,对上层提供一个标准的接口。最底层的为硬盘驱动程序,它直接控制硬件。其上是常规的文件系统的驱动程序,它们把硬盘看作是连续存储介质,而不必不关心硬盘的物理特性。最上层的是VFS驱动部分,它为系统中可能共存的多种文件系统提供一个统一的接口。
I/O模块就介于常规文件系统和VFS之间。当合法用户要读磁盘数据时,I/O模块会调用低层驱动程序读出磁盘数据,通过密码处理模块解密,再返回给上层的VFS;写操作则与此相反,先由密码处理模块加密,然后再通过I/O模块使用低层文件驱动程序写到磁盘上。I/O模块对上层来说是透明的。
5.4 模块整合
加密文件系统各功能模块之间的关系如图4所示。
在实际的读写操作中,要经过密码处理模块进行相应的加/解密操作。而密码处理模块所需要的密码算法及密钥则由安全项管理模块来提供。用户可以设置和删除安全项,也可以设置和修改保存安全项时要用的用户密码。
加密文件系统装载之后,当前用户所有的安全项的都已经置于超级块中,在随后的读写操作中,系统会根据所操作文件的路径来获取相应的安全项,并采用该安全项中指定的密码算法和密钥进行相关的加/解密工作。
6、总结
在本文中,基于设计方案和功能模块的划分,首先采用FiST编写实现加密文件系统的主体框架,并在该框架上作必要的修改以添加特定功能。然后使用OpenSSL对密码处理模块进行封装和重组,实现了对多用户、多安全项的管理。最后将这三个模块结合到一起,共同实现对文件系统中文档的安全保护。本文介绍的加密文件系统已经运行在Linux环境下,应用情况良好。
关键词:加密文件系统 Linux 堆叠 OpenSSL
中图分类号:TP316文献标识码:A文章编号:1672-8882(2011)07-084-02
随着信息技术的发展,电子文档被广泛使用在各行各业,如何确保这些电子信息的安全已经成为人们日益关注的问题。加密文件系统作为一种有效的数据保密技术而受到人们的青睐,它可以有效防止非法入侵者窃取用户的机密数据。同时,在多个用户共享一个系统的情况下,可以很好地保护用户的私有数据。所以,在高安全等级的操作系统中引入加密文件系统将对系统整体安全性起到至关重要的作用。
现在已经有很多成熟的加密文件系统,如Windows的EFS(Encrypting File System),Linux的CFS(Cryptographic File System)、TCFS(Transparent Cryptographic File System)、AFS(Andrew File System)等。这些加密文件系统对文档安全提供了一定程度的保护,但是它们普遍存在性能比较低下、保护机制不完整等一些问题。所以,本文的目标是设计一种使用方便、性能高效的加密文件系统,实现文档信息在操作系统底层的安全保密。
1. 现有加密文件系统的分析
现有的加密文件系统主要有如下几个:
1.1 CFS
CFS是比较早的一个经典的加密文件系统。它利用NFS文件系统的工作原理,在一个NFS服务器将数据写入磁盘时对数据进行加密,从磁盘读出数据时对数据进行解密,从而保证了数据在磁盘上的密文存储。CFS的加密操作在用户层完成,需要频繁地进行用户层到核心层的数据交换,因此CFS最大的缺点在于其效率低下。
1.2 TCFS
TCFS是在CFS基础上开发的加密文件系统,与CFS的不同在于它是一个NFS客户端。TCFS可以在不同级别上进行密钥管理,另外TCFS的数据加/密操作在核心层完成,所以性能有所改善。因其基于NFS的工作机制,每次读写操作都会涉及到核心层与用户层之间的数据交换,所以其效率的依然低下。另外,TCFS的安全性主要依赖于存放在磁盘上的用户登陆密码,在一定程度上降低了系统的安全性。
1.3 AFS
AFS是一个分布式加密文件系统,它通过一个统一的访问接口把多个服务器连接起来,使用户能够方便、高效地共享分布在网络中的文件。AFS提供了一个安全的加密数据传输路径,并通过鉴权数据库与访问控制列表ACL(Access Control Lists)的配合为用户提供更高的安全性。AFS的数据在服务器端是明文存储,其数据的存储安全性没有得到根本的保护。同时,因为AFS使用分布式的数据存储方式,一台服务器崩溃或被入侵,就会严重破坏整个系统的安全性。
2、堆叠(Stackable layer)文件系统[1]
Linux系统的一个重要特征就是支持多种不同的文件系统。它通过虚拟文件系统(VFS)把实际文件系统的具体细节抽象出来,将实际的文件系统和系统服务分离开来,以便提供一个统一的接口[2]。每一个具体的文件系统负责实现VFS系统调用的底层操作。可以根据实际需要设计特殊的文件系统,然后通过VFS来支持它。
堆叠式文件系统是把要实现的文件系统功能加载到原有文件系统之上,形成一个新的文件系统。可以将多层堆叠式文件系统叠加在一起,实现文件系统的“堆叠”式开发,以提供更强大的功能。其中上层文件系统调用下层文件系统的功能,直到底层文件系统。这样每一层只关注和其直接关联的下层,和其他的层没有直接关系。
利用现有文件系统的功能,把要开发的堆叠式文件系统插入到VFS和底层文件系统之间。也就是说,需要实现的新功能都由堆叠式文件系统来提供,而对于底层的文件系统则不做任何的修改。所以,开发、测试工作的焦点就是这个堆叠式文件系统,而基本不涉及底层文件系统。具有性能损失小、开发代价低等优点。同时,为了提高文件系统的效率,堆叠式文件系统以内核模块的形式实现。
这样开发者可以把主要精力放在文件系统的新功能上,不用考虑内核中的文件系统和底层文件系统的关联,同时避免了用户级文件系统过多的上下文切换和数据拷贝降低了该类文件系统性能的缺陷。
3、FiST[3](File-System Translator)语言
为方便堆叠式文件系统的开发,哥伦比亚大学教授E.Zado设计了FiST语言。FiST包括语言规范、代码产生器(Fistgen)和文件系统模板(Basefs Template)三部分。
Basefs Template的主要功能是处理有关的内核细节,如Cache缓存、操作返回值和内存映射等。开发者只需用FiST规范编写一个输入文件(FiST input file),Fistgen读取输入文件和Basefs Template,产生一个新的文件系统的C源代码(图1)。这样就可以在其中添加功能形成新的文件系统。
FiST开发一个堆叠式文件系统的一般步骤:
1) 按FiST语言规范编写FiST input file文件;
2) 将FiST input file和Basefs Templates作为输入文件,运行fistgen生成文件系统的功能模块代码;
3) 在功能模块代码中实现encode_data,decode_data,encode_filename和decode_filename等API函数;
4) 修改VFS中super_block,inode,file和dentry等的操作函数以及有关内存映射操作的函数;
5) 将重写后的代码编译成可内核可加载模块(Kernel Loadable Module)并将其加载(insmod)到运行的操作系统中;
6) 加载该文件系统,按功能要求测试并调试。
4、加密文件系统的设计
考虑到现有加密文件系统中存在的数据保护不完全、效率低下等问题,以及文件系统的实现方式,本文设计了一种具有良好的安全性能和运行效率的内核级的加密文件系统(图2)。
其设计思路是:使用堆叠式文件系统的概念构建加密文件系统,将其插入在底层文件系统和VFS之间,用于处理处理上下两层之间所有的数据交互,同时使用OpenSSL[4]对文件数据进行加/解密操作。
该文件系统提供的是一种透明的加密方式,存储在磁盘上的信息是以密文形式存在的。只有合法用户访问它的时候,系统才会自动的对该密文进行解密,并以明文的形式呈现给用户;而当非授权用户试图访问时,即使拥有普通文件系统的read权限,看到的只是没有被解密的密文。
当加密文件系统加载成功之后,系统可以在内核自动截获所有的文件I/O操作,从而可根据需要自动提供一种内核级的、透明的安全机制。当用户要处理的加密文件,它会根据当前用户的权限和密钥进行相应处理;而对于那些普通的目录或文件,加密文件系统将作为一个过渡的文件系统。
这样,在整个文件系统结构当中,加密文件相对于底层文件系统来说,它是VFS;而相对于VFS来说,它又是底层的文件系统。对于用户来说,当使用加密文件系统时,与普通文件系统是一样的,用户可以很方便地进行各种操作。
5、加密文件系统的模块结构
该加密文件系统主要由三大模块组成:安全项管理模块、密码处理模块和I/O模块。
5.1 安全项管理模块
该模块容许每个用户配置自己的安全项,这些安全项的是本系统安全的关键。安全项的内容包括:要进行安全保护的目录或文件、密码算法的选择、加密的初始化向量和生成的相应密钥等。这个密钥是通过调用密码处理模块经计算而获得的。添加安全项成功之后,相应的目录下的内容将采用该安全项进行数据保护。
一个新的安全项,以加密格式存储在一个安全项文件中,并且使用用户密码进行保护。每个用户可以设置自己的一个或多个安全项。
同时该模块具有维护这些安全项的功能:删除、修改安全项,设置、修改和删除用户密码等功能。这些功能的使用同样也需要对安全项文件执行解密、再加密过程。
用户密码只与安全项文件的加/解密有关。如果需要修改用户密码的话,就只需要对安全项文件重新加密,而不需要对所有的文件都进行解密、再加密。
5.2 密码处理模块
本模块中使用BlowFish加密算法,采用CFB的对称加密算法模式[5],对数据块进行加密和解密。
BlowFish是一种可变长密钥分组加密算法,特点是执行速度快,适用于存储容量大、密钥不是经常改变的系统。
采用CFB(加密反馈模式)主要是因为该模式具有以下优点:
1) 能够将重复的明文加密成不同的密文,隐藏明文的数据模式。因为CFB模式下加密算法的输入是当前明文组和上一个密文组的异或,而使用的密钥是相同的。加密算法的每次输入与本明文组没有固定的关系。
2) 在某种程度上能识别攻击者在密文传输中是否作了数据窜改。
3) 能适应用户不同数据格式的需要。
为了将相同的明文加密成不同的密文,CFB使用加密随机数据作为第一个分组,这个随机数据分组被称之为“初始化向量”。它没有任何意义,它的作用是使每个密文唯一化。在密码处理模块中,对同一文件下的所有数据块加/解密处理使用的初始向量是相同的(当然也可对不同的数据块采用不同的初始化向量)。
本文中对文件内的数据的加/解密不是一次性的对整个文件数据进行处理,是以数据块为单位进行加/解密操作。每个数据块与数据块之间的数据的加/解密是无关联的。而针对同一个数据块中的数据,则采用相应密码算法进行相应处理。
5.3 I/O模块
在Linux中,对硬盘上的文件系统的访问采用了分层模型,即上层的驱动调用低层的驱动。底层隐藏自己的实现细节,对上层提供一个标准的接口。最底层的为硬盘驱动程序,它直接控制硬件。其上是常规的文件系统的驱动程序,它们把硬盘看作是连续存储介质,而不必不关心硬盘的物理特性。最上层的是VFS驱动部分,它为系统中可能共存的多种文件系统提供一个统一的接口。
I/O模块就介于常规文件系统和VFS之间。当合法用户要读磁盘数据时,I/O模块会调用低层驱动程序读出磁盘数据,通过密码处理模块解密,再返回给上层的VFS;写操作则与此相反,先由密码处理模块加密,然后再通过I/O模块使用低层文件驱动程序写到磁盘上。I/O模块对上层来说是透明的。
5.4 模块整合
加密文件系统各功能模块之间的关系如图4所示。
在实际的读写操作中,要经过密码处理模块进行相应的加/解密操作。而密码处理模块所需要的密码算法及密钥则由安全项管理模块来提供。用户可以设置和删除安全项,也可以设置和修改保存安全项时要用的用户密码。
加密文件系统装载之后,当前用户所有的安全项的都已经置于超级块中,在随后的读写操作中,系统会根据所操作文件的路径来获取相应的安全项,并采用该安全项中指定的密码算法和密钥进行相关的加/解密工作。
6、总结
在本文中,基于设计方案和功能模块的划分,首先采用FiST编写实现加密文件系统的主体框架,并在该框架上作必要的修改以添加特定功能。然后使用OpenSSL对密码处理模块进行封装和重组,实现了对多用户、多安全项的管理。最后将这三个模块结合到一起,共同实现对文件系统中文档的安全保护。本文介绍的加密文件系统已经运行在Linux环境下,应用情况良好。