第六章:GELI

GELI是FreeBSD最受欢迎的磁盘加密方法。非常适合在冷磁盘上隐藏数据。

首先要加载内核,可以将geom_eli_load="YES"添加到/boot/loader.conf中,然后重启;或者直接运行geli load命令。

GELI使用主密钥加密geom。

主密钥保存在物理存储设备上,但使用密钥文件和/或密码短语进行加密。

可以拥有多个密钥文件和密码短语,能够解密主密钥。如果员工忘记了笔记本电脑的密码,管理员可以为他解锁。

GELI优于GBDE。GELI允许加密计算机的根分区。可以验证文件的完整性,具有临时文件系统和交换空间上的一次性密钥的特定功能。甚至可以暂停和恢复加密设备。

在加密层之前,请记住随机化geom。geli手册页提供了更多信息。

GELI 扇区尺寸

在GELI中,扇区大小一词不仅仅是底层物理存储介质上最小分配单元的大小。这也是它加密数据块的大小。

如果将GELI提供者指定为具有512B扇区大小,则它会对每512B的存储执行加密。对写入512B扇区驱动器的文件进行加密所需的加密处理量是将同一个文件写入4096B扇区驱动器的8倍。

FreeBSD建议GELI始终使用4096B的扇区大小,即使底层媒体是512B的扇区,以最大限度提高性能。在创建GELI分区时,将其4K对其。

GELI基本使用

使用GELI需要创建密钥文件(key file),初始化GELI设备,在设备上创建文件系统,然后激活、使用和停用GELI设备。

创建GELI密钥文件

使用dd命令获取/dev/random并将其转储到文件中,用于创建GELI密钥。

以下示例将密钥文件写入/media上的geli-da0p1.key文件,提取一个64字节的块:

64字节是512位,足以满足大多数目的。GELI密钥不可读。

初始化GELI 提供者

GELI将其设置和主加密密钥存储在geom的最后一个扇区中。例如,如果将分区/dev/da0p1加密,则该分区的最后一个扇区就包含了GELI信息。

这与加密文件系统的最后一个扇区不同,后者可能位于底层分区的任何扇区上。

添加此信息会初始化分区。以下操作仅能执行一次,否则会销毁并重建加密分区:

元数据备份可以在/var/backups/da0p1.eli中找到。可以使用以下命令还原:

初始化例程有助于打印GELI元数据备份的位置,并为管理员提供如何还原它的说明。

将此备份文件复制到系统外的某个位置。如果底层硬盘发生故障,可以还原替换硬盘上的元数据。

激活GELI设备

现在已经有了一个密钥和一个准备好的分区。将密钥附加上去,启动GELI。

再一次使用-k指定密钥文件:

输入密码短语,GELI在物理分区上创建一个加密的磁盘设备。GELI将其放在/dev目录中,而不是/dev/geli目录中,并用设备名称加上扩展名.eli来命名它。例如/dev/da0p1.eli。

如果想要以只读方式挂载,可以加入-r选项。

虽然不能在只读设备上创建文件系统,但如果该设备上有文件系统,则可以将其作为自读设备挂载。

创建文件系统

一旦有了一个加密的存储设备,就可以在它上面创建一个文件系统。此书以UFS为例。

加密设备上的UFS文件系统可以使用软更新日志记录。可以在加密磁盘设备上使用任何文件系统功能。由于GEOM,加密发生在较低层。

停用(deactivating)GELI 设备

完成加密文件系统后,卸载它并将密钥从GELI设备中分离出来:

要再次访问数据,必须重新使用密钥挂载加密的设备。

GELI密钥技巧

多密钥

在某些环境中,可能需要多人能够解密GELI设备,每个人有自己单独的密钥。

每个GELI设备都有一个主密钥,在初始化GELI设备时创建。

密钥对每个GELI设备都是唯一的,只要设备存在,密钥就永远不会改变。

GELI使用密码和密码短语来加密和解密主密钥。可以更改密码,可以更改密码短语,但不能更改主密钥,甚至永远不会看到它。

GELI元数据有空间或slot(插槽),用于存储加密主密钥的两个副本。

GELI命令默认使用slot 0。可以在slot 1中添加第二个副本,使用不同的密钥和密码短语进行加密。

如果GELI可以解密主密钥的一个副本,它就可以解密设备并访问文件系统。

一旦有了一个可用的GELI设备,就可以添加第二个密钥和密码短语。使用geli setkey命令可以slot 1中的主密钥副本分配密钥文件和密码短语。

按提示输入第二个密码短语。

现在GELI设备有两个key。可以通过密码短语指定任意密钥来附加GELI设备。

更改密钥或密码短语

更改密钥文件或密码短语就像添加新密钥一样。

严格来说,不能更换密钥。而是用新的加密主密钥加载到两个slot中,覆盖掉现有的加密主密钥。

初始化GELI设备时,GELI会将密钥放在slot 0中,以下示例在那个slot中写入新密钥:

输入新的密码短语,然后就有了新的密钥和密码短语。

没有密码短语的密钥

没有密码短语的GELI密钥会降低GELI的保护。能做,但不该做。

初始化GELI密钥时,添加-P选项可以禁止请求密码短语:

将密钥附加到设备以解密分区时,使用-p标志抑制对密码的请求:

在进行无密码短语加密之前,请尝试想出另一种方法来解决试图解决的问题。

没有密钥文件的密钥

有时,可能希望仅使用密码短语保护GELI设备。

当使用GELI创建适度的隐私而不是保护高度机密的数据时,这是有道理的。比如对于笔记本电脑,可能只像加密设备,而不想必须随身携带单独的设备保存密钥文件。

分区仅使用密码短语保护。使用以下命令附加该设备:

输入密码短语后即可使用该设备。

擦除主密钥的副本

使用geli delkey可以销毁主密钥的两个副本之一。使用-n选项指定要删除的slot:

如果设备已经被附加,不需要指定slot号码。系统会自动销毁当前用于附加设备的主密钥。

记住,当设备被附加时,主密钥在系统内存中是未被加密的,因此可以使用geli setkey恢复密钥。一旦分离了一个没有主密钥副本的GEIL设备,将无法再次解密该设备,只能从备份中还原数据。

杀掉GELI设备

加密的目的之一是保护数据。销毁加密密钥可以防止数据泄露。

geli kill命令销毁设备上主密钥的所有副本并将其分离,强制卸载设备上的任何文件系统。

使用-a选项而不是设备分区,此命令会清除系统上所有打开的geli设备。

在被杀掉的设备上打开文件的任何进程都无法访问这些文件。这可能会破坏进程的稳定。

最佳情况下,它们会崩溃;最坏情况下,它们可能会损坏其他分区上的数据。

然而,如果正在杀死加密文件系统,系统的稳定性并不是首要问题。

备份和还原GELI元数据

在创建GELI设备时,GELI会自动备份元数据,包括主密钥的两个副本。

可以随时更新此备份,或在擦除所有密钥或终止设备后将备份还原到设备。

要备份设备的GELI元数据,在geli backup命令中使用带有底层设备名称和要放入备份的文件:

要还原设备的备份,使用geli restore命令。

只有在使用delkey或kill命令删除加密密钥后,或在元数据中以某种方式搞砸了这两个密钥后,才能恢复GELI元数据。

可以将此元数据还原到与原始分区大小相同的任何提供者。

恢复GELI元数据不会恢复设备上的任何文件系统或任何用户数据。

密码短语文件

密码短语可以保存在文件中,每个密码短语一行。

使用-J参数为geli init提供密码短语。

以下示例中,密钥放在一个移动设备上,密码短语放在另一个独立的移动设备上:

在geli attach命令中用-j指示密码文件:

可以让FreeBSD在启动时读取密码短语文件。后面详述。

一次性密钥

像swap那样的应用情况,可能只需要一次性的加密以防止被攻击。使用geli onetime命令告诉geli初始化并使用随机密钥附加提供者:

一次性密钥仅存在于系统内存中,并且在设备连接时存在。断开设备或重启系统时,密钥将永久丢失。

GELI调整大小

有时可能需要扩展GELI设备,比如使用虚拟化并扩展虚拟磁盘的大小。

这需要扩展底层物理设备,然后扩展GELI设备,然后扩展文件系统。

以下示例扩展disk 0上的分区1以填充所有可用空间:

GELI将元数据放在提供者的最后一个扇区。使用geli resize命令告诉GELI移动元数据。需要使用-s参数给出原始分区大小:

GELI元数据现在安全地存放于物理设备的末尾。将密钥附加到GELI设备,然后就可以扩展文件系统:

机密的文件系统现在填充了整个分区。

GELI启动

使用/boot/loader.conf在内核本身的引导过程早期配置您想要自动附加的任何GELI分区。

如果您希望在引导过程后期挂载GELI分区,请使用/etc/rc.conf。

在rc.conf中配置GELI

在/etc/rc.conf文件中的geli_devices选项中列出在多用于启动期间要配置的每个GELI设备。

以下示例使用两个GELI磁盘分区,一个GPT分区还一个标记为加密的分区:

对于列表中的每一个设备,添加一个rc.conf行以指定geli命令行参数以附加它。每行以geli_开头,给出设备名称,以 _flags结尾,例如:

如果没有指定密码文件,FreeBSD会中断引导以请求它们。

FreeBSD会在引导过程的早期附加所有GELI设备,因此,可以在/etc/fstab中引用它们。

以下示例自动挂载一个加密的数据库数据分区:

如果需要更早可用的GELI设备,则应在引导加载器中配置它们。

在启动加载器(boot loader)中配置GELI

如果希望GELI在单用户模式下连接并激活加密设备,则必须在初始化设备时使用-b参数。

没有此标志,引导加载程序将不知道如何尝试连接设备。

无法将此标志改装到现有的GELI设备上。

以下示例在标签/dev/label/enc上创建一个启动时连接的GELI设备:

将加密密钥文件放置于/boot分区。

在/boot/loader.conf中使用可调参数配置GELI启动设备。

还可以使用可调变量调试GELI。每个GELI设备需要三个loader.conf条目:

为您在单用户模式下配置的每个加密设备自定义name和provider。

此GELI设备是/dev/label/enc,因此使用enc作为名称。

提供程序始终是您要连接的设备节点,没有前导/dev/。此设备最终具有以下配置。

另外,在启动时加载GELI模块:

下次启动时,启动将停止以请求此设备的密码。

排错

如果无法找出问题所在,可尝试启用调试。两个有用的可调整参数时boot_verbose和kern.geom.eli.debug。

boot_verbose可调参数显示所有内核模块的调试输出,而不仅仅时GELI。通过观察详细的启动过程,可以深入了解系统。

将boot_verbose设置为1将启用详细引导。

如果详细引导没有提供有效的信息,可以尝试kern.geom.eli.debug。将其设置为1到3之间的值,以获得越来越多的调试信息。

如果事情变得非常奇怪,可以在键入GELI密码时让引导加载程序回显GELI密码。

在将其设置为1之前,请确保没有人在附近窥视。

在引导时连接GELI设备是全磁盘加密的必要前提。