我有一台运行 Linux 的笔记本电脑,我不希望担心有人读取其中包含的个人信息,以防它丢失或被盗。我的登录密码可能会阻止某人启动它,但这并不能阻止攻击者移除硬盘并读取其数据。我需要更强的保护。
幸运的是,使用加密相对容易,这样如果硬盘数据落入坏人之手,将变得不可读。加密不仅对笔记本电脑等便携式计算机有用,它还可以用于保护任何包含个人信息的计算机。我用加密来保护我电脑上的文件,原因和我锁上家里的文件柜是一样的。为了进一步激励您,您可能有兴趣阅读 Michael Crawford 的您为什么应该使用加密。
我可以只加密某些文件,例如我的主目录中的文件。这将保护文件,但随后我将不得不担心信息泄漏到磁盘上其他未加密的地方。相反,我加密整个磁盘,这样我就不必管理这个问题了。
有很多加密算法可供选择。我选择了 AES,因为它已获得美国政府 国家标准与技术研究院 的批准,并受到密码学界的高度评价。我希望我对它的使用能够抵抗字典攻击,所以我使用了一个长而随机生成的密钥。我不可能记住这样一个密钥,所以我把它保存在一种我可以轻松携带的形式中:在我钥匙链上的 USB 闪存驱动器上。我用一个密码短语加密密钥,这样我的数据就受到双重保护:a) 我拥有的东西(USB 闪存驱动器)和 b) 我知道的东西(密码短语)。我甚至可以在不泄露我的密码短语的情况下让朋友访问我的电脑——她使用她自己的 USB 闪存驱动器和她自己的密码短语。
操作系统始终将数据加密存储在磁盘上,并在使用时才在 RAM 中解密。这样,如果计算机突然断电,数据仍将受到保护。解密密钥在启动时加载到 RAM 中,并在计算机开启时保存在那里,所以我启动计算机后不需要一直插着 USB 闪存驱动器。
本 HOWTO 中概述的程序是为 Linux 内核 2.4 版本编写的。随着 Linux 2.6 的发布,它将变得不那么复杂,Linux 2.6 将内置对加密的支持,并在环回设备中更好地管理分区。
本文档假设读者具有中等水平的 Linux 使用经验(您应该能够熟练地修补和编译内核以及分区、挂载和卸载磁盘)。
加密是通过一种特殊的环回设备实现的。环回设备本身不存储任何数据;相反,它接收到的所有数据存储和检索请求都会传递给真正的存储设备,例如磁盘或文件。当数据通过时,它可以被过滤,在我们的例子中,使用的过滤器是加密。
当系统部署时,可移动介质(USB 闪存驱动器)使用 GRUB、内核和 initrd 启动。密钥和内核都从 GRUB 菜单中选择,允许单个可移动介质用于多台计算机。initrd 包含足够的工具来请求密码短语、设置加密的环回设备并挂载它。挂载后,pivot_root用于从加密设备恢复启动过程。环回设备偏移量用于代替分区来访问加密环回设备内的单独交换空间和根文件系统空间,因为 2.4 内核不提供对环回设备内分区的访问。偏移量方法不能推广到多个分区(不幸的是),因为losetup理解的最大偏移量为 2GB。
根据 GNU 自由文档许可证 1.2 版或自由软件基金会发布的任何后续版本的条款,允许复制、分发和/或修改本文档;不包含不变部分、封面文本和封底文本。许可证副本包含在附录 A中。
Linux 是 Linus Torvalds 的注册商标。®
对于本文档的内容不承担任何责任。使用本文档中的概念、示例和信息,风险自负。可能存在错误和不准确之处,可能会对您的系统造成损害,您可能会丢失重要数据。请谨慎操作,尽管这种情况极不可能发生,但作者不承担任何责任。
所有版权均归各自所有者所有,除非另有明确说明。本文档中术语的使用不应被视为影响任何商标或服务标记的有效性。特定产品或品牌的命名不应被视为认可。
我知道您讨厌阅读说明,并且想直接跳到实质内容,但我建议您在动手操作之前先阅读完整文档。我知道所有的 HOWTO 都这么说,但对于这篇,我是认真的。这是值得的;相信我。您可能还想在测试系统上首先运行一遍该过程,然后再处理生产系统。
感谢 Linus Torvalds、Jari Ruusu 以及所有为他们的软件做出贡献的开发人员,没有他们,本 HOWTO 将不可能实现。
感谢国家标准与技术研究院认真选择了一种强大而开放的加密算法。
感谢 linux-crypto 邮件列表和 Linux 文档项目邮件列表上的 Mark Garboden 和其他人,他们花时间批评我的写作并提出建议。
感谢警惕的读者 Ladislao Bastetti 和 Norris Pouhovitch,他们努力解决不寻常的硬件配置,发现 HOWTO 中的错误,并提出了好的想法。
我们可以采用三种不同的方法来加密磁盘:加密整个磁盘、单个分区或单个文件。我强烈建议采用第一种方法以获得最佳安全性。前两种方法假设您将从可移动介质(例如 USB 闪存驱动器或名片大小的 CD-ROM)启动。如果您不想这样做,您可以通过创建一个小的、未加密的启动分区来修改该方法以从磁盘启动。如果您想使用 USB 闪存驱动器启动您的计算机,请首先确保您的主板可以做到这一点。在撰写本文时,许多主板都不能。
为了避免在任何地方都必须列举所有三种方法,我将把您要保护的东西称为资产。我将把用于存储密钥的可移动介质称为钥匙链。我称之为钥匙链而不是密钥,因为我们可以在同一介质上存储许多密钥,每个密钥用于不同的计算机。
使用加密来保持数据机密性的一个问题是数据喜欢移动。想象一下加密就像围绕您的数据的栅栏。当数据在栅栏内时,它是安全的。然而,为了最有用,数据喜欢在网络上传输、放在 CD-ROM 等可移动磁盘上并与朋友共享。每当您的数据离开围栏区域时,它就不受保护。我们不能在数据可能播放的所有可能位置周围设置加密围栏,但我们确实希望使围栏尽可能大。通过将加密围栏围绕您的整个硬盘驱动器放置,您不必担心数据跳到磁盘的另一部分时会变得不受保护。
![]() | 在这种方法中,我们创建一个交换空间和一个根文件系统。有些人想要不止一个加密分区用于根文件系统。不幸的是,此处详述的方法依赖于losetup的偏移量参数来在资产内创建“子分区”。偏移量参数的最大值限制为 2GB,这限制了除最后一个分区之外的所有分区的大小为 2GB。这对于交换空间来说效果很好,交换空间在 i386 架构上已经限制为 2GB,但我猜测对于其他用途来说这并不实用。将它用于创建小于 2GB 的多个分区留给读者作为练习。 处理多个分区的另一种方法是分别加密每个分区(使用相同的密钥)以避免上述技术限制。这不像加密整个磁盘那样安全,因为分区表是暴露的。当攻击者试图破解加密时,他做的第一件事就是试图弄清楚它加密的是什么。列出 Linux 分区的分区表是一个很大的提示。因此,我不鼓励分别加密多个分区,但可以说,这对于绕过当前的losetup限制来说是一个很好的折衷方案。另一种选择是简单地等待 Linux 2.6 的发布,因为它有望使偏移量参数变得不必要。 |
为了很好地保护我们的资产,我们必须首先了解我们要保护它免受什么侵害。一般想法是您有一台容易被盗或丢失的笔记本电脑,并且您的钥匙链上有一个 USB 闪存驱动器,而它不容易被盗或丢失,因此该系统旨在处理您的笔记本电脑被盗的情况。我猜您的钥匙链不会那么容易被盗,因为它在您的口袋里,而且因为攻击者不会知道它很重要。如果您从口袋里掏出 USB 闪存驱动器,并且有不懂技术的人惊呼“那是什么?”,请告诉他们它是PEZ 糖果分配器。
![]() | 当涉及到似是而非的否认时,该系统就显得不足了,这意味着无法隐藏您的个人数据已被加密的事实。这就像把你的珠宝锁在保险箱里,然后把保险箱放在你客厅的中间。只有你可以打开保险箱,但是一个拿枪的人可以告诉你为他打开保险箱。因此,如果您担心您的计算机被传唤并被告知交出您的笔记本电脑、钥匙链和密码短语,您最好看看其他解决方案,例如 StegFS。 Norris Pouhovitch 提出了以下针对可否认性问题的解决方案。应该可以在磁盘的前面安装一个最小的 Windows 分区,并加密其余部分。当计算机在没有钥匙链的情况下打开时,它会正常启动 Windows。当钥匙链启动时,它会跳过 Windows 分区,解密磁盘的其余部分,并启动 Linux。 该方案的优点是,如果笔记本电脑被盗并打开,它看起来会像一个普通的攻击者期望看到的那样(一台 Windows 计算机)。另一方面,一个认真的攻击者可能会注意到异常小的分区并变得可疑。我将在未来版本的 HOWTO 中进一步充实这个想法。 |
表 1. 攻击树
攻击 | 反应 | 注释 | |||
---|---|---|---|---|---|
攻击者偷走笔记本电脑 | 当它开启时 | SOL | 当计算机运行时,资产不受保护,因为加密密钥在 RAM 中。您可以通过使用空闲注销(第 2.6.3 节)来降低风险,但如果您认为您的笔记本电脑即将被盗,请立即关闭电源并快速阅读 合气道 HOWTO。 | ||
当它关闭时 | 攻击者没有偷走钥匙链 | 新密钥 | |||
攻击者偷走钥匙链 | 攻击者知道您的密码短语 | SOL | |||
攻击者不知道您的密码短语 | 新密钥 | ||||
攻击者偷走钥匙链但没有笔记本电脑 | 攻击者知道密码短语 | 新密钥 | 您的资产处于风险之中,因为攻击者可以解密它。 | ||
攻击者不知道密码短语 | 您感到懒惰,或者您确信钥匙链丢失了,而不是被盗 | 新密码短语 | 您可能不需要更改资产密钥,因为攻击者在没有密码短语的情况下无法解密资产。 | ||
您感到偏执 | 新密钥 | ||||
攻击者说服您通过网络发送数据 | SOL | ||||
攻击者说服您将数据复制到可移动介质 | SOL | ||||
您只加密一个分区,而一个进程将数据写入到不同的分区 | SOL | ||||
您只加密一个文件,而一个进程将数据从 RAM 复制到未加密的交换空间,或复制到/tmp中的文件,或未加密磁盘上的其他位置 | SOL | ||||
攻击者威胁地挥舞橡胶软管,要求您交出笔记本电脑、钥匙链和密码短语 | SOL | 系统中没有内置似是而非的否认。 |
此方法尚不能与 Linux 软件挂起一起使用。
加密磁盘无疑会降低其速度。我不知道会降低多少。如果有人做过一些基准测试,请发送给我。
此方法中没有任何内容支持似是而非的否认(参见第 1.7 节)。
它无法阻止通过网络和可移动磁盘的信息泄漏。
加密备份超出了本 HOWTO 的范围。
一台带有易于访问的可移动介质读取器(例如 USB 端口或 CD-ROM 驱动器)的计算机
支持从可移动介质启动的主板(仔细检查 USB,并非所有主板都支持)
可移动介质(例如USB 闪存驱动器),用作钥匙链
Linux 2.4
市场上有许多选择。当我购买我的时,我发现了一个符合以下要求的
物理尺寸小(我把它放在我的物理钥匙链上)
支持全速 USB 2.0
具有写保护开关,这样我就不会意外地损坏我的加密密钥
您可能会想购买一个带有指纹读取器的。我强烈建议您不要这样做。最初这可能看起来是个好主意,因为通过添加生物识别技术,您的安全保护扩展到
您拥有的东西(USB 闪存驱动器)
您知道的东西(密码短语)
您是什么(您的指纹,或其他任何东西)
但是,假设出了问题。如果您现在问自己,“会出什么问题?”,那么您为什么要阅读本 HOWTO?如果出了问题,您会做出更改(请参阅纠正措施)
通过使用不同的 USB 闪存驱动器来更改您拥有的东西。
通过学习新的密码短语来更改您知道的东西。
您无法改变您是什么。
停下来思考最后一行一会儿。
我编写本文档时使用的是 2.4 内核。Linux 2.6 引入了 Device-mapper,我们将能够使用它来避免使用 losetup 偏移量玩游戏。Linux 2.6 还引入了 dm-crypt,Device-mapper 的加密层,它看起来非常优雅。不幸的是,它不安全! 希望有一天它会被修复,但在那之前,最好的方法是坚持使用 loop-AES。
未来版本的 HOWTO 将解释如何将 Device-mapper 与 Linux 2.6 一起使用。