企业级加密文件系统 eCryptfs 详解


近年来,保护个人敏感数据成为人们关注的热点问题,使用加密技术成为一种比较成功的保护方法。eCryptfs 是一个功能强大的企业级加密文件系统,通过堆叠在其它文件系统之上(如 Ext2, Ext3, ReiserFS, JFS 等),为应用程序提供透明、动态、高效和安全的加密功能。本文先介绍加密文件系统的背景,然后介绍 eCryptfs 的使用方法,最后阐述 eCryptfs 的设计原理。

加密文件系统概述

什么是加密文件系统

近年来,保护敏感数据不被泄漏成为人们关注的热点问题。入侵者除了直接盗取物理存储设备,还可以通过网络攻击来窃夺文件数据;而且,由于共享的需求,敏感数据会由多人访问,这也增大了泄漏的可能性。对数据或文件进行加密已经成为一种公认的比较成功的保护方法。事实上,人们早已开发了许多优秀的加密算法,如 DES、AES、RSA 等,并且有一些应用程序如 crypt 使用这些加密算法,用户通过这些工具手工地完成加密、解密的工作。由于这些应用程序操作麻烦、没有和整个系统紧密地结合而且容易受到攻击,因此一般用户并不愿意使用。

加密文件系统通过将加密服务集成到文件系统这一层面来解决上面的问题。加密文件的内容一般经过对称密钥算法加密后以密文的形式存放在物理介质上,即使文件丢失或被窃取,在加密密钥未泄漏的情况下,非授权用户几乎无法通过密文逆向获得文件的明文,从而保证了高安全性。与此同时,授权用户对加密文件的访问则非常方便。用户通过初始身份认证后,对加密文件的访问和普通文件没有什么区别,就好像该文件并没有被加密过,这是因为加密文件系统自动地在后台做了相关的加密和解密的工作。由于加密文件系统一般工作在内核态,普通的攻击比较难于奏效。还有一类系统级加密方案是基于块设备,与它们相比,加密文件系统具有更多的优势,例如:

  1. 支持文件粒度的加密,也就是说,用户可以选择对哪些文件或目录加密。而且,应用程序不用关心文件是否被加密,可以完全透明地访问加密文件。
  2. 无需预先保留足够的空间,用户可以随时加密或恢复文件。
  3. 对单个加密文件更改密钥和加密算法比较容易。
  4. 不同的文件可以使用不同的加密算法和密钥,增大了破解的难度。
  5. 只有加密文件才需要特殊的加密/解密处理,普通文件的存取没有额外开销。
  6. 加密文件转移到别的物理介质上时,没有额外的加密/解密开销。

加密文件系统的分类

加密文件系统基本上可以分为两大类,两类的实现方式和目标都有比较大的区别。一类是面向网络存储服务的,通常是基于 NFS 客户/服务器模型,通常称为网络加密文件系统。在网络加密文件系统中,数据以密文的方式保存在网络文件系统中,用户通过客户机服务进程与网络文件服务器交互,网络文件服务器负责将用户请求的密文传递到客户机服务进程,由客户机服务进程进行解密再交给应用程序。在这个模型中,只要求客户机操作系统是可信的,而网络服务器由于不接触明文数据,不要求其可信。另一类是本地加密文件系统,密文数据直接存放在本地物理介质上(硬盘,U 盘等),由操作系统或服务进程完成数据的读取、加密/解密工作。本地加密文件系统的目标是应对存储介质失窃的威胁,安全模型同样把加密文件系统所在的操作系统视为可信的。

本地加密文件系统又可以细分为两种,一种是在原有的普通文件系统上直接加入加密功能,如 Reiser4,但是现有的 Ext2, Ext3 等常用文件系统并不支持加密功能,因此用户不得不转换整个文件系统;另一种被称为堆叠式加密文件系统(Stackable Cryptographic File System)。这种加密文件系统可以看成一个加密/解密的转换层,而并不是一个真实的全功能文件系统。堆叠式加密文件系统没有相应的磁盘布局,也不实现数据在物理介质上存取的功能。它必须架构在别的普通文件系统之上,读加密文件时先通过下层普通文件系统将文件的密文读入内存,解密后再将明文返回到上层的用户进程;写加密文件时先将内存中的明文加密,然后传给下层普通文件系统,由它们真正地写入物理介质。堆叠式加密文件的优势在于实现相对容易(因为功能相对简单)且用户可以任意选择下层的普通文件系统来存放加密文件。本文讨论的 eCryptfs 属于本地堆叠式加密文件系统的范畴。

现有加密文件系统的不足

加密文件系统的概念由来已久,现实世界中已有诸多的实现,例如 CFS[2], TCFS, Crypt-FS, FSFS, Waycryptic 和 Windows EFS 等,但是这些加密文件系统有着内在的局限和安全问题。

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 规范的影响,使用了两种方法来加密单个文件:

  1. eCryptfs 先使用一种对称密钥加密算法来加密文件的内容,推荐使用 AES-128 算法,密钥 FEK(File Encryption Key)随机产生。有些加密文件系统为多个加密文件或整个系统使用同一个 FEK(甚至不是随机产生的),这会损害系统安全性,因为:a. 如果 FEK 泄漏,多个或所有的加密文件将被轻松解密;b. 如果部分明文泄漏,攻击者可能推测出其它加密文件的内容;c. 攻击者可能从丰富的密文中推测 FEK。
  2. 显然 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 挂载结果

eCryptfs 挂载结果

eCryptfs默认使用 AES-128 算法以及用口令加密 FEK,更多挂载选项请参考 eCryptfs 的 man page。如果用户想使用公钥加密算法加密 FEK,需要事先用 OpenSSL 产生公钥/私钥对。用户还可以在主目录下的 .ecryptfsrc 文件中写入缺省选项,配置文件的格式请参阅 http://ecryptfs.sourceforge.net/README 。

更多详情见请继续阅读下一页的精彩内容:

  • 1
  • 2
  • 下一页

相关内容