2004-01-15
修订历史 | ||
---|---|---|
修订 1.2 | 2004-03-12 | 修订者:rh |
添加了关于 dm-crypt 的信息,更新了 loop-AES 信息,添加了更多关于安全性的信息 | ||
修订 1.1 | 2004-01-24 | 修订者:rh |
更新了关于修补 util-linux、Loop-AES、Best Crypt 的信息 | ||
修订 1.0 | 2004-01-17 | 修订者:rh |
初始版本,由 LDP 的 TM 审阅。 | ||
修订 v0.9 | 2004-01-15 | 修订者:rh |
更新并转换为 DocBook XML。 |
本 HOWTO 描述了如何在 2.6 Linux 内核系列中使用 Cryptoloop 环回设备加密。Cryptoloop 使得在分区或文件系统中的另一个文件中创建加密文件系统成为可能。这些加密文件可以移动到 CD、DVD、USB 记忆棒等。Cryptoloop 使用了环回设备。该设备是一个伪设备,充当 “环回”,每次对文件系统的调用都必须通过它。这样,可以处理数据以便对其进行加密和解密。自从内核 2.6 以来,Crypto API 已经集成到主内核中,设置加密文件系统变得容易得多。不需要额外的内核补丁。需要更新一些用户空间实用程序。不幸的是,到目前为止,Cryptoloop 的使用记录不是很完善。本 HOWTO 试图使每个人都可以轻松使用标准 Cryptoloop 功能创建加密文件系统。Cryptoloop 基于 2.6 Linux 内核中的 Crypto API。不应将其与 Loop-AES 混淆,Loop-AES 是一个完全独立的项目。Cryptoloop 类似于作为 2.4 内核系列的单独补丁提供的 Crypto API。新版本与旧版本不兼容。
本文档,Cryptoloop HOWTO,版权 � 2004 Ralf H�lzer 所有。根据 GNU 自由文档许可证 1.1 版或自由软件基金会发布的任何后续版本的条款,允许复制、分发和/或修改本文档;不包含不变部分,不包含封面文本,不包含封底文本。许可证副本可在 https://gnu.ac.cn/copyleft/fdl.html 获取。
Linux 是 Linus Torvalds 的注册商标。
对于本文档的内容不承担任何责任。使用文中的概念、示例和信息,风险自负。可能存在错误和不准确之处,可能会对您的系统造成损害。请谨慎操作,尽管这种情况极不可能发生,但作者不承担任何责任。
所有版权均由各自所有者持有,除非另有特别说明。本文档中术语的使用不应被视为影响任何商标或服务标记的有效性。特定产品或品牌的命名不应被视为认可。
目前,除了使用 Cryptoloop 之外,还有一些替代方案。Loop-AES (http://loop-aes.sourceforge.net) 可能是最知名的。它提供了与 Cryptoloop 非常相似的功能。Aes-loop 目前比 Cryptoloop 更成熟,速度也更快(据 loop-AES 的作者称,速度大约快两倍),因为它对 AES 使用了高度优化的汇编器实现。这并不意味着 Cryptoloop 很慢。在日常工作中处理正常数量的 I/O 时,我没有注意到 Cryptoloop 加密分区和非加密分区之间有任何明显的速度差异。除非 I/O 性能对您来说极其重要,否则 Cryptoloop 应该可以很好地满足您的需求。Loop-AES 提供了一些 Cryptoloop 内核实现中尚不存在的附加功能。Loop-AES 需要修改后的用户空间工具(mount、losetup),这些修改与 Cryptoloop 不兼容。您将无法同时使用 Cryptoloop 和 Loop-AES。
在安全性方面,Cryptoloop 表现尚可。密钥通常从密码生成,其哈希值用作 AES 的密钥。这导致了 已知明文攻击 的可能性。Loop-AES 在这方面更胜一筹,因为它生成一个随机密钥并单独加密该密钥,从而使已知明文攻击更加困难。Loop-AES 还支持多密钥模式,其中扇区使用 64 个单独的 AES 密钥进行加密。总的来说,如果您选择一个弱密码,对您的密码进行暴力破解攻击可能非常有效。为了安全起见,您的密码应至少为 20 个字符长。否则,对密码进行暴力破解攻击将比直接暴力破解 AES 加密容易得多。
标准内核中的 Cryptoloop 功能提供了一个稳定且干净的实现,无需额外的补丁。由于它仍然相当新,因此可能尚未在安全性方面获得必要的审查。您必须自己决定什么适合您。
重要提示:Cryptoloop 在最新的 2.6 内核中已被标记为已弃用。这意味着它将不再被积极维护。Cryptoloop 的继任者将是 dm-crypt。Dm-crypt 自 2.6.4 起已在主内核中可用。Cryptoloop 在很长一段时间内仍将在主内核中可用,但 dm-crypt 将成为未来磁盘加密的首选方法。Dm-crypt 基于设备映射器,并提供与 Cryptoloop 几乎相同的功能。它仍然非常新,并且还没有易于使用的用户空间工具。Dm-crypt 被认为比 Cryptoloop 代码更简洁,但它们之间存在一些重要的差异。例如,在文件中创建加密文件系统仍然需要通过环回设备,但此支持仍在开发中。
还有其他工具允许您创建加密文件系统。BestCrypt 是 Jetico 的一款商业产品。它允许您创建加密容器,并有多种密码选择。它还提供一些巧妙的功能,例如隐藏容器。它适用于 Windows 和 Linux,这使其适合在 Windows 和 Linux 之间交换加密容器。BestCrypt 现在也可以在 2.6 内核上编译。Cryptoloop 还可以创建可以移动的容器,方法是在文件中创建加密文件系统,如下所述。我不知道有什么方法可以从其他操作系统(如 Windows)访问 Cryptoloop 加密文件。在这种情况下,BestCrypt 可能是您唯一的选择。
还有其他商业磁盘加密工具,例如 PGP 磁盘,但据我所知,它们没有 Linux 支持。
为了使用 Cryptoloop,您需要激活一些内核选项。您可以选择将这些需求编译为模块,也可以直接将其编译到内核中。以下步骤将它们作为模块启用。如果您不熟悉构建 2.6 内核,则应参考 Linux Kernel HOWTO。以下说明仅提供最少的步骤。
转到包含您的内核源代码树的目录(通常是/usr/src/linux/),然后启动配置
make menuconfig |
启用通用环回设备支持。激活 “环回设备支持” 在
Device Drivers -> Block Devices -> Loopback device support |
在同一部分中启用 Cryptoloop 支持。一旦您启用通用环回支持,该选项就会显示出来。
通过从主菜单转到 “加密选项” 来启用加密 API。您可以在此处安全地启用大多数算法。我建议您启用以下选项
-- Cryptographic API <*> HMAC support < > Null algorithms <*> MD4 digest algorithm <*> MD5 digest algorithm <*> SHA1 digest algorithm <*> SHA256 digest algorithm <*> SHA384 and SHA512 digest algorithms <*> DES and Triple DES EDE cipher algorithms <*> Blowfish cipher algorithm <*> Twofish cipher algorithm <*> Serpent cipher algorithm <*> AES cipher algorithms <*> CAST5 (CAST-128) cipher algorithm <*> CAST6 (CAST-256) cipher algorithm <*> Deflate compression algorithm < > Testing module |
如果您决定将它们作为模块,请确保在继续之前在启动时加载适当的模块(cryptoloop、aes 等)。
制作您的内核和模块并安装它们。例如,如果您在 x86 机器上使用 lilo,则可以像这样完成
make make modules_install cp arch/i386/boot/bzImage /boot/kernel-2.6.1 lilo |
在启动时加载所需的模块。在各种发行版上,处理方式有所不同。例如,在 Gentoo 上,可以将这些模块添加到/etc/modules.autoload/kernel-2.6。如果您已将 Cryptoloop 编译为模块,则必须首先加载它。它也会自动加载基本环回设备模块。您可以使用以下命令手动加载模块
modprobe cryptoloop |
Cryptoloop 驱动程序需要更新的用户空间工具才能实际创建和挂载加密文件系统。需要更新的 util-linux 包,可以从 http://ftp.cwi.nl/aeb/util-linux/util-linux-2.12.tar.gz 获取。最新版本是 2.12。很快就会有新版本发布,可能会引入重大更改,因此在升级到较新版本之前,请务必查看本 HOWTO 以获取更新。不幸的是,util-linux 有很多补丁。创建和挂载加密分区的方式存在差异。为了将 util-linux 2.12 与 2.6 内核一起使用,至少需要应用以下两个补丁
下载 util-linux 包和上述两个补丁。首先解压 util-linux 包,然后应用这两个补丁
tar xvfz util-linux-2.12.tar.gz cd util-linux-2.12 patch -p1 < /path_to_patchfile/losetup-combined.patch patch -p1 < /path_to_patchfile/util-linux-2.12-kernel-2.6.patch |
应用补丁后,根据 INSTALL 文件中的说明编译并安装 util-linux。
我建议使用 Gentoo Linux,它在 emerging util-linux 补丁时会自动应用这些补丁。其他发行版可能有 util-linux 版本可用,这些版本也已应用了这些补丁。
Cryptoloop 可以用于文件或整个文件系统。以下描述了如何在特定分区上设置它。此分区可以是您喜欢的任何分区;以下示例使用/dev/sda1。我选择使用 AES 作为密码,但您可以替换您喜欢的任何已在内核中启用的密码。您可以通过查看/proc/crypto来获取当前运行的内核支持的算法列表。讨论不同加密算法的出色资源是 Bruce Schneier 的书籍,《应用密码学》和《实用密码学》。AES 和 Serpent 可能都是合理的选择。AES 已经过大量密码分析,到目前为止尚未发现任何严重的弱点。Serpent 尚未经过大量分析,但被认为甚至比 AES 稍强。但是,Serpent 也比 AES 慢。远离 DES,它既慢又弱。Triple-DES 可能是一个选择,但 AES 可能更安全、更快,因此真的没有理由再使用 Triple-DES 了。
建议您在分区上创建加密文件系统之前,先格式化分区并用随机数据填充它。这将使攻击者更难检测到您的加密分区中的模式。
警告!
请小心在此处为您的分区键入的内容。如果您犯了错误,您很容易用随机垃圾覆盖错误的分区!
可以用以下方法用随机数据填充分区
dd if=/dev/urandom of=/dev/sda1 bs=1M |
您可能会收到设备已满的错误消息。您可以忽略它。
选择密码和密钥大小。可以从/proc/crypto获取内核支持的密码列表。我建议您使用 AES 和 256 位密钥。
设置环回设备。这是使用 util-linux 包中的 losetup 命令完成的。以下命令使用环回设备 0 在设备上使用 AES 密码和 256 位密钥创建加密文件系统/dev/sda1:
losetup -e aes-256 /dev/loop0 /dev/sda1 |
该命令会提示您输入密码。选择一个强密码,并尝试记住它,而无需在显示器上贴 Post-It 便签。使用 Cryptoloop 有一个很大的缺点。由于密码被哈希以创建加密密钥,因此以后不容易更改密码。更改密码最直接的方法是创建一个新的加密分区或文件,并将所有数据移入其中。因此,请确保从一开始就选择一个强密码。AES 可能是一种强大的算法,但如果您选择了弱密码,那么安全性就会大打折扣。
如果 losetup 失败并显示 INVALID ARGUMENT 错误消息,则您的 util-linux 包存在问题。请确保您已按照上面的说明安装了修补版本的 util-linux。较旧且未修补的版本使用不同的方式传递密钥大小,并且无法与 2.6 Crypto API 一起使用。
创建文件系统。您可以选择您喜欢的任何文件系统。以下命令使用环回设备创建 ext3 文件系统
mkfs.ext3 /dev/loop0 |
挂载加密文件系统。首先,您需要创建一个挂载点,例如/mnt/crypto:
mkdir /mnt/crypto |
然后您需要挂载文件系统。在此阶段,您需要明确告诉 mount 要使用哪个环回设备
mount -t ext3 /dev/loop0 /mnt/crypto |
现在您可以玩您的加密文件系统,直到您感到无聊为止。
卸载文件系统。玩完后,卸载文件系统
umount /mnt/crypto |
分离环回设备。环回设备仍然连接到您的分区。使用以下命令分离它
losetup -d /dev/loop0 |
对于 Cryptoloop 设备上的所有操作,重要的是加载必要的模块。您至少需要加载 Cryptoloop 模块和每个密码的模块,使用 modprobe。如果这些功能直接编译到内核中,则不需要这样做。
为了挂载上面创建的加密文件系统,您可以使用 util-linux 中的标准 mount 命令
mount -t ext3 /dev/sda1 /mnt/crypto/ -oencryption=aes-256 |
系统将提示您输入密码,文件系统将像任何其他文件系统一样被挂载。由于加密选项意味着这是一个 Cryptoloop 文件系统,因此它将自动选择一个可用的环回设备。
完成后,使用以下命令卸载它
umount /mnt/crypto |
您可以将以下行添加到/etc/fstab:
/dev/sda1 /mnt/crypto ext3 noauto,encryption=aes-256 0 0 |
现在您可以简单地使用以下命令挂载设备
mount /mnt/crypto |
就是这样。玩得开心。
在另一个文件系统上的文件中创建加密文件系统同样容易。如果您想通过将其刻录到 DVD 等来备份此文件,这将特别有用。然后,您也可以轻松地将该文件移动到其他机器。
要最初创建一个包含 100MB 随机数据的文件,请使用以下命令
dd if=/dev/urandom of=/mystuff.aes bs=1k count=100000 |
如果您想更改文件的大小,请更改count值。上面的命令创建了 100000 个大小为 1k 的块,但您可以将其更改为您喜欢的任何值。只需确保它不太小,无法容纳您选择的文件系统。您可以选择任何文件名和路径,而不是/mystuff.aes,只要分区上有足够的空间即可。
然后,您可以在此文件中创建加密文件系统,类似于上面的方法
losetup -e aes-256 /dev/loop0 /mystuff.aes |
现在您可以创建文件系统
mkfs.ext3 /dev/loop0 |
并挂载它
mount -t ext3 /dev/loop0 /mnt/crypto |
最后,卸载并分离环回设备
umount /mnt/crypto losetup -d /dev/loop0 |
然后您可以稍后按如下方式挂载文件系统
mount /mystuff.aes /mnt/crypto -oencryption=aes-256 |
如果您想移动文件或将其刻录到 CD 或 DVD,请确保先 卸载 它。