加密文件系统
在“迈阿密风云”的一集中,克罗凯特和塔布斯设法访问了一个毒贩的电脑,却因电脑坚持要求输入密码才能显示犯罪证据而受阻。不用担心——在尝试了三次不成功的猜测后,这台乐于助人的电脑主动提出向我们的英雄透露秘密密码。嘲笑这种情节发展很容易,但许多原本聪明的人仍在继续做同样愚蠢的事情。
想想律师事务所,法律文件总是保存在锁着的门后的锁着的柜子里。局域网上的每台电脑也都可以访问“密码保护”的文字处理文档,但是使用现成的软件可以在几秒钟内破解加密。这个程序的名称以及它可以破解的文件都在 sci.crypt FAQ 中。这些文件可能被为清洁承包商“工作”的敌对特工检索到。
或者考虑一下销售办事处遍布全国的公司。高度敏感的定价和联系信息通过 CD-ROM 光盘分发,一旦每张新光盘到达,这些光盘就会被丢弃。或者,销售员的笔记本电脑可能在出差时被盗。(参见《实用 UNIX 和互联网安全》,加芬克尔和斯帕福德,奥莱利和 Associates,1996 年。)
或者考虑一下将系统送到商店免费安装升级的个人电脑所有者。其中一名员工悄悄复制了一些文件,等到受害者了解到身份盗窃的程度时,为时已晚——他已经向他的几个朋友推荐了这家商店,因为他们的服务异常出色。
对于每个复杂的问题,都有一个清晰、简单且错误的答案。——H. L. 门肯
这些问题的简单解决方案是文件加密。但是这个解决方案由于以下几个原因存在缺陷
由于美国的出口管制,程序内部的加密通常很弱,以至于毫无用处。
程序外部的加密需要显式操作才能解密和重新加密。如果文件只需要由单个用户访问,那么这个问题可能是可管理的,但是如果几个人需要共享访问,那么这个问题就更加困难。
显式加密需要共享密码,拥有密码的人越多,就越有可能有人将密码记在显眼的位置。
显式加密可能使心怀不满的员工能够使用不同的密码加密文件。
解密文件会增加未加密版本保留在磁盘或备份介质上的风险。
我们的解决方案是加密整个文件系统。用户程序看到的是一个常规文件系统——甚至可能是一个原生支持加密的文件系统。只能看到物理磁盘的攻击者看到的是乱码。
这种方法并非完美。最值得注意的是,某些实现可能会将解密的数据保留在磁盘缓存中可见。如果攻击者已经入侵了 root,那么核心中的缓存只是一个小问题(您会遇到更严重的问题),但如果这些页面被写入交换空间,那将是一个主要问题。
另一方面,内核确保在读取期间解密磁盘扇区,并在写入期间重新加密磁盘扇区。对用户的影响是最小的。在一个实际场景中,“负责人”将在早上挂载加密文件系统。(这需要加密密钥。)在晚上,最后一个离开的人可以卸载文件系统,或者可以通过 cron 作业自动卸载它。
宁可与熟悉的魔鬼打交道...——匿名
我们已经就加密文件系统的可取性达成一致。但是我们应该使用哪种加密算法呢?错误的选择会给我们带来虚假的安全感。
编写我们自己的加密例程是一种可能性。缺点是加密算法的设计和实现众所周知地困难。问题在于设计者不知道别人会觉得什么困难。他只知道他觉得什么困难。数学领域到处都是“困难”问题的尸体,但在一个人灵光一闪之后,这些问题变得微不足道。
实际上,我们应该将搜索范围限制在众所周知的加密算法上。这还有一个额外的好处,即允许我们以最小的麻烦与他人共享加密文件系统。
大多数程序员学习的第一个加密算法是低级的 xor 算法。要加密数据,我们用密钥对其进行 XOR 运算(如果我们使用多字节加密,则以密钥长度为模)。要解密数据,我们再次用密钥对其进行 XOR 运算。
优点:快速且可导出
缺点:容易破解
概要:阻止随意的窥探者
DES 有着备受争议的过去。它是政府认可的非机密用途算法,但有些人认为政府故意引入了弱点。另一方面,数十年的研究只揭示了相对较小的弱点。大型公司在经济上可以制造一台 DES 破解机。
优点:强大、经过良好测试、56 位密钥(称为三重 DES 的变体使用 112 位密钥。)
缺点:不可导出
概要:一个合理的选择
DES 是为硬件实现而设计的——并且在软件中难以有效实现。IDEA 是围绕小型处理器上常见的底层操作而设计的。它不是美国联邦标准,也没有被可怕的 TLA(三个字母的首字母缩写词,例如 DEC 和 FBI)削弱。另一方面,虽然 TLA 无疑分析过它,但他们并没有说话。
优点:强大、经过测试、64 位密钥(PGP 内部使用)
缺点:不可导出
概要:一个合理的选择
RSA 加密是一种相对无效的算法。许多人认为,PGP 的主要弱点在于 IDEA 密钥的 1024 位 RSA 加密,而不是实际数据的 IDEA 加密。
优点:公钥加密问题的解决方案,128 位密钥
缺点:需要至少 1024 位才能获得与 IDEA 相当的安全性,非常慢
概要:不合适
初生牛犊不怕虎。——亚历山大·蒲柏
毫无疑问,现在有些人感到有冲动跑出去编写一个加密文件系统。我们其余的人转向密码朋克。他们发布了一组针对 2.0.11 内核的补丁,这些补丁在“环回”设备中实现了 DES 和 IDEA 加密。这些补丁的主要来源是:ftp://ftp.csua.berkeley.edu/pub/cypherpunks/filesystems/linux。
有四个补丁
loopfix-2.0.11.patch:对环回设备的修改
export-2.0.11.patch:更多补丁,主要是针对文档和 makefile
crypto-2.0.11.patch:出口限制补丁:DES 和 IDEA
mount-2.5k.patch:对 mount 的修改以传递加密密钥。
美国政府继续以禁止通过电子方式出口有意义的密码软件的方式解释《国际武器贸易条例》(ITAR)。以印刷形式出口相同材料或随后从北美以外的站点分发该材料没有任何限制。
crypto-2.0.11.patch 中的源代码实现了 DES 和 IDEA 加密,即使该源代码在世界范围内很容易获得,也不能合法出口。违反出口限制将无助于促进强大加密的自由使用,因为政府可以将其用作需要加强对国内分发的限制的证据。
构建新内核与应用任何其他补丁集没有什么不同。此补丁适用的最新稳定内核版本是 2.0.30。为方便起见,我将假设它存储在 /usr/src/linux-2.0.30.tar.gz 中。接下来,构建内核的参考版本。然后,按照以下步骤操作
获取最新的加密文件系统补丁。为方便起见,我将假设它们是 2.0.11 补丁,并存储在 /usr/src/cryptfs 中。
将补丁应用于内核,保留参考副本。在我的系统上,这涉及到创建一个工作目录,并应用补丁和修复问题。我通过发出以下命令创建了工作目录
cd /usr/src rm linux tar xzpf linux-2.0.30.tar.gz mv linux linux-2.0.30.efs ln -s linux-2.0.30.efs linux
我使用以下命令应用了补丁cd linux patch < ./cryptfs/export-2.0.11.patch patch < ./cryptfs/loopfix-2.0.11.patch patch < ./cryptfs/crypto-2.0.11.patch
我使用以下命令修复了问题mv *.h linux/include/linux mv des.c linux/kernel mv idea.c linux/drivers/block mv loopfix.txt linux/Documentation
配置并构建新内核。记住启用环回设备和文件系统加密。
获取 mount 的源代码并应用所需的补丁。构建它。
使用您的新内核重新启动系统。
此时,一切都应该准备就绪,但是我在构建后遇到了问题。我相信我的问题是由于补丁应用不当造成的,可能是由于 2.0.11 和 2.0.30 及更高版本内核之间的更改导致了基于顺序的不稳定性。urandom 命令发生了一个反复出现的问题
od -x /dev/urandom | more给出此命令会产生内核警告消息。如果这种情况发生在您身上,请重新安装内核源代码和补丁,并仔细检查您的警告。
找到几个空白软盘,用于测试加密文件系统。然后,使用 DES 加密创建一个加密文件系统
# dd if=/dev/urandom of=/dev/fd0 bs=1k count=1440 # losetup -e des /dev/loop0 /dev/fd0 Pass phrase: des test # mke2fs /dev/loop0 # losetup -d /dev/loop0
关于此示例的一些注意事项
第一个命令使用随机数据初始化软盘。将磁盘初始化为零数据会将空白磁盘简化为“已知明文”密码学问题——这不是一个好主意。
第二个命令指定我们想要一个环回设备,以使用 DES 加密层覆盖软盘设备驱动程序。我们可以用文件名替换 /dev/fd0。密码短语不会回显。此外,密码短语可以是 120 个字符长——并且绝对应该超过 8 个字符!
第三个命令是普通的 mkfs(1) 实用程序。
第四个命令释放环回设备。
最后,再创建一对使用不同密码的磁盘。(如果您想异常地反常,请在第二个 DES 测试磁盘上使用您之前的 IDEA 测试密码短语,反之亦然。)
现在我们准备挂载这些磁盘。首先,尝试使用标准挂载命令挂载软盘
# mount /dev/fd0 /mnt -text2
这些命令应该会失败,并显示“找不到 EXT2 文件系统”。现在尝试再次挂载每个软盘
# mount /dev/fd0 /mnt -text2,loop,encryption=idea # mount /dev/fd0 /mnt -text2,loop,encryption=des在每种情况下,系统都应该提示您输入密码短语。不用说,当指定 IDEA 加密时,您不应该能够挂载 DES 加密磁盘,反之亦然。同样,您不应该能够使用第二个密码或反之亦然挂载 DES 加密磁盘 1,并且当您指定正确的加密格式和密码时,您应该能够挂载文件系统。
这是我的系统上出现小精灵的另一个领域。曾经 IDEA 加密工作正常,但 /dev/urandom 失败;在另一种情况下,/dev/urandom 工作正常,但 IDEA 加密在每个偶数扇区上都产生内核警告。
现在进行更多测试。编辑 /etc/fstab 文件以添加这些条目
/dev/fd0 /mnt/des ext2 defaults,noauto,loop,encryption=des 0 0 /dev/fd0 /mnt/idea ext2 defaults,noauto,loop,encryption=idea 0 0
尝试在 /mnt/des 和 /mnt/idea 上挂载您的测试磁盘。您将再次被提示输入密码短语,并且只有当加密算法和密码短语匹配时才会成功。
最后,重新启动您的系统并重复这些测试。如果可能,请在第二台系统上安装修改后的内核,并验证您是否可以在系统之间交换介质。这就是技术前沿的生活。
现在我们有了加密文件系统,我们可以做什么?
我们可以为不支持强加密的程序添加强加密,并将它们的文件保存在加密文件系统上。
我们可以为分布式媒体添加强加密。有些人已经通过环回设备在文件中构建 ISO-9660 映像;生成加密映像将是微不足道的。
基于 CD-ROM 的备份协议变得更具吸引力。过时的备份光盘可以丢弃,而无需担心垃圾箱潜水者访问关键信息。
我们可以提高系统安全性。诸如 Tripwire 之类的程序记录关键文件的加密签名,传统上需要只读介质以防止攻击者修改参考信息。内部攻击者仍然有可能更换此关键磁盘。现在,我们可以轻松地以加密形式保存此关键信息,从而使伪造磁盘的难度大大增加。
我们可以为整个不支持强加密的系统添加一定程度的强加密。加密文件系统应该可以通过 NFS 或 SMB 导出——数据包嗅探器仍然是一个问题,但磁盘将受到保护。
即使粗略地看一下安全软件的趋势,人们也会注意到反复出现的主题。加密文件系统保护磁盘上的数据。SSH(安全外壳)加密和验证通信。Secure-RPC(远程过程调用)加密进程间通信。RPM 验证软件升级。
毫无疑问,加密和身份验证例程属于内核吗?加密密钥可以与每个设备和进程一起存储,并且系统内外任何需要它的进程之间自动协商唯一的会话密钥。不会有不必要的相同例程重复,也不必担心出口限制,因为这些问题已经得到解决。如有必要,加密例程可以本地化到可加载模块,但这会引发某些安全问题。
缺点是任何具有 root 访问权限的人都可以从系统表中获取加密密钥;但是,一旦 root 被入侵,一切都完了。另一方面,在内核中提供强大的加密和身份验证服务应该降低 root 被入侵的风险。此外,DH 密钥协商意味着即使我与被入侵的人交谈,我的密钥也不会被泄露。
Bear Giles bear@coyotesong.com,来自 Coyote Song LLC,是一位拥有近 15 年经验的 UNIX 顾问。他从 pre-0.99 时代就开始在家中使用 Linux。