第五章:文件系统加密 101

FreeBSD运行加密磁盘上的数据。本章讨论所有磁盘加密方法的共同元素。


FreeBSD允许您加密磁盘上的数据。磁盘加密解决了一大堆问题,即使它也会产生其他问题。在深入探讨FreeBSD的特定加密支持之前,本章讨论了所有磁盘加密方案的共同元素。

第五章:文件系统加密 101你需要磁盘加密吗?FreeBSD磁盘加密方法共同元素密码(cryptographic)健全性加密(encryption)性能密码(cryptographic)密钥密码短语(Passphrases)随机化加密设备文件系统和加密设备保护与访问

你需要磁盘加密吗?

磁盘加密会增加风险,可能导致数据丢失,并可能无法防御试图解决的问题。

聪明的攻击者不需要解密硬盘,而是等用户解密数据时从用户那里获取数据。

磁盘加密是造成大量数据丢失的原因。简单的系统管理错误可能会破坏整个文件系统和数据,或者造成无法访问。

过海关时加密的磁盘可能遇到意外阻拦。

对于大多数人来说,磁盘加密提供的保护超过了风险。

但磁盘加密可以提供强大的学习体验。


在部署磁盘加密之前,请考虑一下你是否真的需要它。是的,政府(包括我经常投票反对的政府)监视他们的公民、其他国家的公民,以及他们能监视的几乎任何人,没有比“因为我们能”(because we can)更好的理由了。我当然不反对人们加密东西——毕竟我是编写《PGP&GPG》的人!但在盲目加密所有内容之前,请考虑其缺点。磁盘加密会增加风险,可能导致数据丢失,并且可能无法防御您试图解决的问题。

一个足智多谋的攻击者不需要解密你的硬盘来从你那里获取数据。等到你选择解密数据,然后从你那里窃取数据,这要容易得多。磁盘加密也是造成大量数据丢失的原因——当我听到有人宣布他们已经加密了整个硬盘驱动器时,我会对未来产生一种心理上的憧憬:同一个人说“我丢失了所有的数据!”当然,这是不公平的——我并没有听说磁盘加密总是透明的,但我确实听说它经常灾难性地失败。(这并不是要求你告诉我它对你有效的所有时间,所以不要向我讲述你的成功故事。拜托。)使用磁盘加密时,简单的系统管理错误可能会破坏你的文件系统和数据,或者使它们无法访问。

磁盘加密也会引发社会问题。你笔记本电脑中的加密硬盘会让工作过度、工资过低、精神疲惫的机场安保人员认为你需要进行更彻底的搜索吗?也许吧。任何技术人员都会声明,笔记本电脑上的 Enter passphrase: 提示永远不会激发对你最亲密的体腔的深入调查。但它会激发这种搜索吗?再一次——也许吧。如果你需要磁盘加密,但你遇到了这种社会问题,可以考虑使用安装了小型商业操作系统的双引导笔记本电脑作为默认诱饵。

磁盘加密并不能保护您免受所有威胁。一个经典的例子是:如果你去一个政府特工经常破坏外国人笔记本电脑的国家旅行怎么办?这是一个常见的故事,虽然很难证实,但我相信这些地方确实存在。如果能把笔记本电脑放在酒店房间里,不用担心有人会复制你的硬盘,那当然很好,不是吗?这将是伟大的——除了加密硬盘意味着外国特工将安装一个硬件击键记录器,或者可能是摄像机,以捕获你的密码并标记你,以便稍后进行更详细的检查。如果你正在访问一个当地人经常破坏游客电子设备的国家,磁盘加密不会阻止他们访问你的设备。如果你要去一个可疑的地方旅行,我建议你:

你是否有宁愿被销毁也不愿被披露的数据?你是否把公司的重要机密放在笔记本电脑上,你希望小偷完全无法用你的硬件偷走你的生计?那么磁盘加密可能是一个很好的选择。

如果你看看加密历史,加密通常会保护人们,而不是保存加密数据的人。加密并不能拯救饱受战争蹂躏国家的救援人员,但它确实拯救了那些与他们合作的人。被抓获的间谍不会因为他使用了加密数据而免于被捕,但加密保护了他的消息来源和亲信名单。

在加密文件系统之前,想想你面临的威胁。加密是解决安全风险的好方法吗?这更有可能导致您丢失数据吗?哪些攻击最有可能发生?对于一些人来说,磁盘加密提供的保护超过了风险。对许多人来说,磁盘加密提供了强大的学习体验。取决于你。

FreeBSD磁盘加密方法

FreeBSD主要使用两种方法加密磁盘:GBDE和GELI。

GBDE(GEOM-Based Disk Encryption)基于GEOM,专为保护用户与隐藏数据同样重要的情况而设计。

它的密钥包括用户提供的密码和存储再磁盘上的密钥。如果任一密钥不可用,系统将无法解锁文件系统。GBDE会提示用户丢失了哪个密钥。

GELI比GBDE更灵活,功能更多,但它不会提示丢失了哪个密钥。

GELI允许加密根分区。

FreeBSD的加密文件系统不需要加密整个磁盘分区。

文件系统位于GEOM之上,GEOM可以是磁盘分区,也可以是文件备份的内存设备。


FreeBSD支持几种不同的磁盘加密方法,但两种主要的方法是GBDE和GELI。这两种工具的工作方式非常不同,使用不同的加密技术,并且针对不同的威胁模型而设计。如果你需要磁盘加密,我建议你在选择方法之前学习这两种方法。

GBDE——GEOM-Based Disk Encryption,即基于GEOM的磁盘加密,专为保护用户与隐藏数据同样重要的情况而设计。它的密钥包括用户提供的密码和存储在硬盘上的私钥。如果任一密钥不可用,系统将无法解密文件系统。GBDE还宣布丢失了哪个密钥。这真的很重要——如果有人说“解密文件系统,否则你就完蛋了”,我希望计算机说我输入了正确的密码,但在我接触机器之前,密钥已被销毁。我不希望出现像 Cannot decrypt disk(无法解密磁盘)这样的通用错误。在第一种情况下,我仍然有作为人质对着镜头胡言乱语的价值,我可能有机会逃跑;而面对后面一种情况,要么我死了,要么攻击者使用更激烈的方法对付我。可能使用木工工具。

GELI比GBDE更灵活,功能也更多,但它不会像GBDE那样保护你免受身体伤害。GELI允许您加密根分区。如果有人可能会窃取你的笔记本电脑上的机密文件,或者如果一个不受信任的用户可能会窥探系统的虚拟内存以收集机密,GELI可能就足够了。GELI不是首字母缩略词,但你可以将其传播到你的数据中。

FreeBSD的加密文件系统不需要你加密整个磁盘分区。记住,文件系统位于geom之上。geom可以是磁盘分区,但也可以是文件备份的内存设备。利用这种灵活性,使您的加密文件系统不超过所需的大小。

共同元素

所有磁盘加密方法都有一些共同点。

FreeBSD的所有加密文件系统都需要加载内核模块。


所有磁盘加密方法都有一些共同点。我将首先介绍这些,然后我们将分别讨论每种技术。FreeBSD的所有加密文件系统都需要加载内核模块。其他共同点稍微复杂一些…

密码(cryptographic)健全性

FreeBSD的文件系统加密代码并没有受到广泛的公众审查——相对于OpenPGP之类的公共加密算法。

这两种磁盘加密系统都可能存在密码缺陷,允许未经授权的用户破解密码。修复这些缺陷可能需要从备份中恢复数据(也就是说任何加密算法的升级,都可能会丢失被加密的数据)。


虽然人们已经研究了GELI和GBDE的加密特性,并且两者都已经使用了几年,但FreeBSD的文件系统加密代码并没有像OpenPGP这样的公共加密算法那样受到广泛的公众审查。我在这里不是在谈论代码的质量,而是在谈论由该代码实现的加密算法的质量。完美和安全的机器代码是很好的,但如果该代码实现了一个被破解的加密算法,您的数据就不安全了。FreeBSD并不像OpenPGP那样成为备受瞩目的目标,也没有那么多人花时间试图破解FreeBSD的加密技术,所以它没有受到那么多的审查。请注意,我强烈怀疑各国政府的机构都对GELI和GBDE进行了秘密评估,哪怕只是因为它们是给新人的好项目。

这两种磁盘加密系统都可能存在密码缺陷,允许未经授权的用户破解密码。FreeBSD团队会尽快解决他们发现的任何缺陷,但修复这些缺陷可能需要从备份中恢复数据。

gbde(8) 手册中对此进行了警告,但它同样适用于 geli(8) 。同时,我鼓励你要求当地政府的间谍机构就他们所学到的东西提交错误报告。

加密(encryption)性能

加密和解密数据都需要处理时间和内存。加密文件系统总是比未加密的文件系统要慢。

提高性能的最佳方法是只加密必须加密的内容


加密和解密数据需要处理器时间和内存。许多FreeBSD开发人员对他们的硬盘进行加密,当他们遇到性能问题时,他们会努力修复它们,但加密文件系统总是比未加密文件系统慢。

提高性能的最佳方法是只加密必须加密的内容。那是什么?这完全取决于你的威胁模型。

密码(cryptographic)密钥

这两种磁盘加密方法都使用加密密钥来加密和解密文件系统。虽然使用的密钥类型不同,但每种密钥背后的原理都是相同的。

密钥是一块数据,用于将文件系统转换为加密状态或从加密状态转换。

密钥应该是非常随机的,由软件而不是人类生成。

此密钥可能位于文件中,如GELI,也可能存储在特殊块中,如GBDE。

大多数加密密钥要么是人类无法读取的二进制数据,要么是像在SSH和SSL密钥中看到的乱码文本。

如果丢失或销毁了加密文件系统的密钥,则无法再解密该文件系统。

一种常见的选择是将密钥保存在可移动驱动器上,例如U盘。可移动驱动器充当安全令牌。

建议不要把密钥保留在硬盘上。

对私钥进行备份,如果密钥存储在U盘上,应确保有第二个U盘做备。并定期测试这些备份。不要将备份保存到加密驱动器上。

不要重复使用加密密钥。每个加密的驱动器、分区或文件系统都应该有它自己的密钥。

切勿在不同机器之间共享加密密钥。


这两种磁盘加密方法都使用加密密钥来加密和解密文件系统。虽然使用的密钥类型不同,但每种密钥背后的原理都是相同的。密钥是一块数据,用于将文件系统转换为加密状态或从加密状态转换。密钥应该是非常随机的,由软件而不是人类生成。此密钥可能位于文件中,如GELI,也可能存储在特殊块中,如GBDE。大多数加密密钥要么是人类无法读取的二进制数据,要么是像您在SSH和SSL密钥文件中看到的乱码文本。

如果丢失或销毁了加密文件系统的密钥,则无法再解密该文件系统。如果在销毁密钥时文件系统恰好被挂载和解密,请在卸载或关闭加密文件系统之前,从加密文件系统中复制您想要的任何文件。如果丢失或销毁密钥时未解密文件系统,则表示丢失了文件系统。

一种常见的选择是将密钥保存在可移动驱动器上,例如USB闪存驱动器。可移动驱动器充当安全令牌——您必须拥有该驱动器才能访问数据。如果有人偷了你的笔记本电脑,但没有拿到你钥匙链上的闪存盘,他们就无法访问数据。直接在可移动驱动器上创建密钥,而不是在本地文件系统上。删除文件实际上并不会覆盖文件写入的块,因此即使在删除后,密钥也会保留在硬盘上。即使在删除文件几天或几周后,熟练的入侵者也可以恢复密钥。如果私钥永远不会接触到永久连接的存储,那么你是最安全的。

【这是真正的威胁吗?我怎么知道?是你决定需要一个加密的文件系统。现在不要偷工减料。Sheesh。】

备份您的私钥。如果您将密钥存储在USB闪存驱动器上,请确保保留第二个闪存驱动器,以备第一个闪存驱动器损坏时使用。(“廉价——Inexpensive”不是“便宜——cheap”的同义词。闪存驱动器两者都是。)定期测试这些备份。不要将备份保存在加密驱动器上。

不要重复使用加密密钥。密钥的使用范围越广,攻击者试图破解它的“表面积”就越大。每个加密的驱动器、分区或文件系统都应该有自己的密钥。切勿在机器之间共享加密密钥。

密码短语(Passphrases)

密码短语类似于密码,但更长。

一个正确的密码短语包括空格、单词、特殊字符、数字以及可以键入的任何其他内容。密码短语形成第二个加密密钥。

密码短语应该有几个单词长,便于记忆,别人不易猜到。包括特殊字符,来自专门的非计算词汇表的特殊单词,避免使用流行文化或个人流行语。

从技术上讲,密码短语可以是一个单词,但单字密码容易被破解。


密码短语类似于密码,但更长。一个正确的密码短语包括空格、单词、特殊字符、数字以及您可以键入的任何其他内容。密码短语形成第二个加密密钥。

为什么要使用人类可读的密钥和数字文件?数字文件可能会在你不知情的情况下被盗。密码短语只能从您那里获得,或者通过物理方式破坏您的硬件。需要两个单独密钥的加密系统更难妥协。

密码短语应该有几个单词长,你可以很容易地记住,别人也不容易猜到。包含特殊字符,如 #!~ 等。来自专业非计算(non-computing)词汇表的特殊单词很有用。避免使用流行文化或个人流行语。

【我不能使用像“再告诉我一次;我为什么要关心这个?”或“我想你很糟糕”这样的短语,因为我的同事、朋友和家人会立刻猜到它们。】

从技术上讲,密码短语可以是一个单词,就像密码一样。这是个坏主意。单字密码短语很容易被破解。如果你要费心加密你的数据存储,请使用一个像样的密码短语。

随机化加密设备

创建文件系统只涉及超级块,这些超级块记录了索引节点所属的位置。这只是磁盘上块的一小部分。

加密设备上的文件系统以相同的方式工作。

若要强行解密硬盘,第一项工作是识别哪些块包含加密数据。

FreeBSD有一个随机设备 /dev/random ,使用 dd 命令向分区中注入一层欺骗性随机性。

以下示例对分区 /dev/da0p1 进行随机化:

以上实例指定了块大小为1m(bs=1m),但没有给出计数(count),所以 dd 会一直运行到分区结束。

覆盖磁盘所需的时间与磁盘速度成正比。用随机性填充这个1TB的分区大约需要8小时。

如果在创建加密设备之前忘记随机化分区,则始终可以在创建文件系统之前随机化加密设备。创建文件系统之后,添加这种随机性需要备份数据、应用随机化并恢复数据(大约就是重建?)。

在创建文件系统之前,应先对加密设备进行随机化。


创建文件系统只涉及超级块(superblocks),这些超级块记录了索引节点所属的位置。这只是磁盘上块的一小部分。加密设备上的文件系统以相同的方式工作。如果你回收了这个磁盘,入侵者会看到磁盘上以前文件系统的块,与新文件系统的加密数据扇区混合在一起。如果这是一个新磁盘,入侵者将看到散布在零沙漠中的几个加密数据块。

如果有人想强行解密你的硬盘,他的第一项工作是识别哪些块包含加密数据。如果他扫描驱动器并发现一些加密块和大量空白空间,他就知道加密块实际上是数据。如果他扫描驱动器,发现每个块都充满了看起来像垃圾的东西,他必须流汗才能用实际数据识别磁盘扇区。

FreeBSD有一条巨大的随机河流,/dev/random 。使用 dd(1) 向分区中注入一层欺骗性随机性。在这里,我随机化了分区 /dev/da0p1 。我指定了一个1兆字节(1m)的块大小,但没有给出计数,因此 dd(1) 一直运行到分区结束。

覆盖磁盘所需的时间与磁盘速度成正比。用随机性填充这个1TB的分区大约需要8个小时。 如果在创建加密设备之前忘记随机化分区,则始终可以在创建文件系统之前随机化加密设备。创建文件系统后,添加这种随机性需要备份数据、应用随机性并恢复数据。

如果你使用加密来防止机会主义的笔记本电脑小偷访问你的文件,你可能不需要这样加密驱动器。如果你携带的是敏感文档,有人可能会为了它们而狠狠地打你一顿,那么在创建文件系统之前,先对加密设备进行随机化。

文件系统和加密设备

GEOM允许以任何方式堆叠磁盘设备和文件系统。对于加密磁盘,最好在磁盘分区上放置一层加密,然后在加密层上放置一个文件系统。


GEOM允许您以任何方式堆叠磁盘设备和文件系统。对于加密磁盘,最好在磁盘分区上放置一层加密,然后在加密层上放置一个文件系统。你可以用其他方式来做,但这对简单的部署来说是最有意义的。

掌握了这种安排后,您将了解如何将加密磁盘分区用作GEOM RAID或ZFS池的成员。

保护与访问

加密磁盘仅保护冷磁盘或离线数据。必须将加密数据联机才能使用。如果对主目录(home directory)进行加密,则必须在登录过程中对其进行解密。

解密密钥的线索可能仍然存在于RAM中。DMA或FireWire等硬件接口可以直接访问内存。入侵者可以利用USB线路和某些设备搜索系统的 idle 内存,有可能会找到密钥。

不使用时,应将机器冷关机,而不是休眠。休眠会将内存写入磁盘,并且不能保证会从内存中清除所有密码的痕迹。


加密磁盘仅保护冷磁盘或离线数据。您必须将加密数据联机才能使用。如果您对主目录进行加密,则必须在登录过程中对其进行解密。

如果攻击者在数据解密时访问了您的系统,加密的保护就会消失。仅仅在你外出吃午饭时分离加密的文件系统是不够的,因为解密密钥的线索可能仍然存在于RAM中。一个熟练、有动力的攻击者可以利用他的方式进入系统并读取内存。此外,DMA或FireWire等硬件接口可以直接访问内存。入侵者可以走到你的桌面,插入USB电缆,搜索你系统的 idle 内存,直到找到密钥。

你想保护你的加密数据吗?不使用时,请将机器冷关机。不要休眠它。休眠会将内存写入磁盘,并且不能保证您的操作系统在午睡前确实会从内存中清除所有密码的痕迹。

现在让我们来看看几个具体的加密方案。