CFS 和 TCFS 通过 NFS 客户/服务器模型来提供加密服务,只使用了 DES 算法来加密文件内容。这两种文件系统主要的缺点在于:难于使用、共享加密文件非常困难、用户不能选择加密算法、交换区或临时文件可能会泄漏明文以及性能较差等等。
Waycryptic 是一个堆叠式加密文件系统,通过修改 Linux 内核的虚拟文件系统层(VFS)来提供加密及解密的功能。Waycryptic 使用两种算法来加密文件:加密文件内容使用对称密钥算法,如AES,密钥随机产生;同时使用一种公开密钥算法,如RSA,加密刚才提及的密钥。这种综合两种加密算法的方式既保证了加密/解密的速度,又极大地提高了安全性。同时Waycryptic允许加密文件方便安全地在多个用户间共享;为了应对密钥的丢失,Waycryptic允许用户指定别的帐号来恢复文件。但是 Waycryptic 主要是一个研究项目,比较适合个人单机使用,无法满足企业或需要更高安全级别的用户的需求。
Windows EFS(Encrypting File System) 是对 NTFS 文件系统的功能扩充,可以方便地加密 NTFS卷上的文件或目录。Windows EFS 简单易用,功能强大,不足之处在于只能在 Windows 操作系统的 NTFS 卷上才能使用,文件内容使用的加密算法比较单一。此外,如果事先没有备份证书的话,一旦重装系统就无法再访问加密文件。
使用 eCryptfs eCryptfs 简介eCryptfs 是在 Linux 内核 2.6.19 版本中引入的一个功能强大的企业级加密文件系统,堆叠在其它文件系统之上(如 Ext2, Ext3, ReiserFS, JFS 等),为应用程序提供透明、动态、高效和安全的加密功能。
本质上,eCryptfs 就像是一个内核版本的 Pretty Good Privacy(PGP)[3] 服务,插在 VFS(虚拟文件系统层)和 下层物理文件系统之间,充当一个“过滤器”的角色。用户应用程序对加密文件的写请求,经系统调用层到达 VFS 层,VFS 转给 eCryptfs 文件系统组件(后面会介绍)处理,处理完毕后,再转给下层物理文件系统;读请求(包括打开文件)流程则相反。
eCryptfs 的设计受到OpenPGP 规范的影响,使用了两种方法来加密单个文件:
eCryptfs 先使用一种对称密钥加密算法来加密文件的内容,推荐使用 AES-128 算法,密钥 FEK(File Encryption Key)随机产生。有些加密文件系统为多个加密文件或整个系统使用同一个 FEK(甚至不是随机产生的),这会损害系统安全性,因为:a. 如果 FEK 泄漏,多个或所有的加密文件将被轻松解密;b. 如果部分明文泄漏,攻击者可能推测出其它加密文件的内容;c. 攻击者可能从丰富的密文中推测 FEK。
显然 FEK 不能以明文的形式存放,因此 eCryptfs 使用用户提供的口令(Passphrase)、公开密钥算法(如 RSA 算法)或 TPM(Trusted Platform Module)的公钥来加密保护刚才提及的 FEK。如果使用用户口令,则口令先被散列函数处理,然后再使用一种对称密钥算法加密 FEK。口令/公钥称为 FEFEK(File Encryption Key Encryption Key),加密后的 FEK 则称为 EFEK(Encrypted File Encryption Key)。由于允许多个授权用户访问同一个加密文件,因此 EFEK 可能有多份。
这种综合的方式既保证了加密解密文件数据的速度,又极大地提高了安全性。虽然文件名没有数据那么重要,但是入侵者可以通过文件名获得有用的信息或者确定攻击目标,因此,最新版的 eCryptfs 支持文件名的加密。
eCryptfs 使用方法eCryptfs 需要相应的内核模块和用户态的工具同时配合使用。用户态的工具可以从 https://launchpad.net/ecryptfs 获得,使用 Debian 或 Ubuntu 系统的用户,用 apt-get 命令安装 ecryptfs-utils 包即可。如果用户自行编译内核,则需要如下选项:
清单 1. 使用 eCryptfs 所需的内核选项General setup ---> [*] Prompt for development and/or incomplete code/drivers File systems ---> Miscellaneous filesystems ---> <M> eCrypt filesystem layer support (EXPERIMENTAL) Security options ---> <M> Enable access key retention support Cryptographic API ---> <M> MD5 digest algorithm <M> AES cipher algorithms
首先需要加载 eCryptfs 内核模块,执行modprobe ecryptfs。然后将 eCryptfs 挂载到准备存放加密文件的目录,执行 sudo mount -t ecryptfs real_pathecryptfs_mounted_path。推荐ecryptfs_mounted_path 和 真实目录 real_path 一致,这样非授权用户不能通过原路径访问加密文件。
图 1. eCryptfs 挂载结果