GELI是FreeBSD最受欢迎的磁盘加密方法。非常适合在冷磁盘上隐藏数据。
首先要加载内核,可以将geom_eli_load="YES"添加到/boot/loader.conf中,然后重启;或者直接运行geli load命令。
GELI使用主密钥加密geom。
主密钥保存在物理存储设备上,但使用密钥文件和/或密码短语进行加密。
可以拥有多个密钥文件和密码短语,能够解密主密钥。如果员工忘记了笔记本电脑的密码,管理员可以为他解锁。
GELI优于GBDE。GELI允许加密计算机的根分区。可以验证文件的完整性,具有临时文件系统和交换空间上的一次性密钥的特定功能。甚至可以暂停和恢复加密设备。
在加密层之前,请记住随机化geom。geli手册页提供了更多信息。
在GELI中,扇区大小一词不仅仅是底层物理存储介质上最小分配单元的大小。这也是它加密数据块的大小。
如果将GELI提供者指定为具有512B扇区大小,则它会对每512B的存储执行加密。对写入512B扇区驱动器的文件进行加密所需的加密处理量是将同一个文件写入4096B扇区驱动器的8倍。
FreeBSD建议GELI始终使用4096B的扇区大小,即使底层媒体是512B的扇区,以最大限度提高性能。在创建GELI分区时,将其4K对其。
使用GELI需要创建密钥文件(key file),初始化GELI设备,在设备上创建文件系统,然后激活、使用和停用GELI设备。
使用dd命令获取/dev/random并将其转储到文件中,用于创建GELI密钥。
以下示例将密钥文件写入/media上的geli-da0p1.key文件,提取一个64字节的块:
xxxxxxxxxx
# dd if=/dev/random of=/media/geli-da0p1.key bs=64 count=1
1+0 records in
1+0 records out
64 bytes transferred in 0.000053 secs (1205932 bytes/sec)
64字节是512位,足以满足大多数目的。GELI密钥不可读。
GELI将其设置和主加密密钥存储在geom的最后一个扇区中。例如,如果将分区/dev/da0p1加密,则该分区的最后一个扇区就包含了GELI信息。
这与加密文件系统的最后一个扇区不同,后者可能位于底层分区的任何扇区上。
添加此信息会初始化分区。以下操作仅能执行一次,否则会销毁并重建加密分区:
xxxxxxxxxx
# geli init -s 4096 -K /media/geli-da0p1.key /dev/da0p1
Enter new passphrase: Feed Lucas good gelato!
Reenter new passphrase: Feed Lucas good gelato!
元数据备份可以在/var/backups/da0p1.eli中找到。可以使用以下命令还原:
xxxxxxxxxx
# geli restore /var/backups/da0p1.eli /dev/da0p1
初始化例程有助于打印GELI元数据备份的位置,并为管理员提供如何还原它的说明。
将此备份文件复制到系统外的某个位置。如果底层硬盘发生故障,可以还原替换硬盘上的元数据。
现在已经有了一个密钥和一个准备好的分区。将密钥附加上去,启动GELI。
再一次使用-k指定密钥文件:
xxxxxxxxxx
# geli attach -k geli-da0p1.key /dev/da0p1
Enter passphrase:
输入密码短语,GELI在物理分区上创建一个加密的磁盘设备。GELI将其放在/dev目录中,而不是/dev/geli目录中,并用设备名称加上扩展名.eli来命名它。例如/dev/da0p1.eli。
如果想要以只读方式挂载,可以加入-r选项。
虽然不能在只读设备上创建文件系统,但如果该设备上有文件系统,则可以将其作为自读设备挂载。
一旦有了一个加密的存储设备,就可以在它上面创建一个文件系统。此书以UFS为例。
xxxxxxxxxx
# newfs -j /dev/da0p1.eli
# mount /dev/da0p1.eli /mnt/
加密设备上的UFS文件系统可以使用软更新日志记录。可以在加密磁盘设备上使用任何文件系统功能。由于GEOM,加密发生在较低层。
完成加密文件系统后,卸载它并将密钥从GELI设备中分离出来:
xxxxxxxxxx
# umount /mnt
# geli detach da0p1.eli
要再次访问数据,必须重新使用密钥挂载加密的设备。
在某些环境中,可能需要多人能够解密GELI设备,每个人有自己单独的密钥。
每个GELI设备都有一个主密钥,在初始化GELI设备时创建。
密钥对每个GELI设备都是唯一的,只要设备存在,密钥就永远不会改变。
GELI使用密码和密码短语来加密和解密主密钥。可以更改密码,可以更改密码短语,但不能更改主密钥,甚至永远不会看到它。
GELI元数据有空间或slot(插槽),用于存储加密主密钥的两个副本。
GELI命令默认使用slot 0。可以在slot 1中添加第二个副本,使用不同的密钥和密码短语进行加密。
如果GELI可以解密主密钥的一个副本,它就可以解密设备并访问文件系统。
一旦有了一个可用的GELI设备,就可以添加第二个密钥和密码短语。使用geli setkey命令可以slot 1中的主密钥副本分配密钥文件和密码短语。
xxxxxxxxxx
# geli setkey -n 1 -K key2.key /dev/da0p1
按提示输入第二个密码短语。
现在GELI设备有两个key。可以通过密码短语指定任意密钥来附加GELI设备。
更改密钥文件或密码短语就像添加新密钥一样。
严格来说,不能更换密钥。而是用新的加密主密钥加载到两个slot中,覆盖掉现有的加密主密钥。
初始化GELI设备时,GELI会将密钥放在slot 0中,以下示例在那个slot中写入新密钥:
xxxxxxxxxx
# geli setkey -n 0 -K key3.key /dev/da0p1
输入新的密码短语,然后就有了新的密钥和密码短语。
没有密码短语的GELI密钥会降低GELI的保护。能做,但不该做。
初始化GELI密钥时,添加-P选项可以禁止请求密码短语:
xxxxxxxxxx
# geli init -Ps 4096 -K /media/geli-da0p1.key /dev/da0p1
将密钥附加到设备以解密分区时,使用-p标志抑制对密码的请求:
xxxxxxxxxx
# geli attach -pk geli-da0p1.key /dev/da0p1
在进行无密码短语加密之前,请尝试想出另一种方法来解决试图解决的问题。
有时,可能希望仅使用密码短语保护GELI设备。
当使用GELI创建适度的隐私而不是保护高度机密的数据时,这是有道理的。比如对于笔记本电脑,可能只像加密设备,而不想必须随身携带单独的设备保存密钥文件。
xxxxxxxxxx
# geli init -s 4096 /dev/da0p1
Enter new passphrase:
Reenter new passphrase:
分区仅使用密码短语保护。使用以下命令附加该设备:
xxxxxxxxxx
# geli attach /dev/da0p1
输入密码短语后即可使用该设备。
使用geli delkey可以销毁主密钥的两个副本之一。使用-n选项指定要删除的slot:
xxxxxxxxxx
# geli delkey -n 0 da0p1
如果设备已经被附加,不需要指定slot号码。系统会自动销毁当前用于附加设备的主密钥。
记住,当设备被附加时,主密钥在系统内存中是未被加密的,因此可以使用geli setkey恢复密钥。一旦分离了一个没有主密钥副本的GEIL设备,将无法再次解密该设备,只能从备份中还原数据。
加密的目的之一是保护数据。销毁加密密钥可以防止数据泄露。
geli kill命令销毁设备上主密钥的所有副本并将其分离,强制卸载设备上的任何文件系统。
xxxxxxxxxx
# geli kill da0p1
使用-a选项而不是设备分区,此命令会清除系统上所有打开的geli设备。
在被杀掉的设备上打开文件的任何进程都无法访问这些文件。这可能会破坏进程的稳定。
最佳情况下,它们会崩溃;最坏情况下,它们可能会损坏其他分区上的数据。
然而,如果正在杀死加密文件系统,系统的稳定性并不是首要问题。
在创建GELI设备时,GELI会自动备份元数据,包括主密钥的两个副本。
可以随时更新此备份,或在擦除所有密钥或终止设备后将备份还原到设备。
要备份设备的GELI元数据,在geli backup命令中使用带有底层设备名称和要放入备份的文件:
xxxxxxxxxx
# geli backup /dev/da0p1 geli-backup-da0p1
要还原设备的备份,使用geli restore命令。
只有在使用delkey或kill命令删除加密密钥后,或在元数据中以某种方式搞砸了这两个密钥后,才能恢复GELI元数据。
可以将此元数据还原到与原始分区大小相同的任何提供者。
xxxxxxxxxx
# geli restore geli-backup-da0p1 da0p1
恢复GELI元数据不会恢复设备上的任何文件系统或任何用户数据。
密码短语可以保存在文件中,每个密码短语一行。
使用-J参数为geli init提供密码短语。
以下示例中,密钥放在一个移动设备上,密码短语放在另一个独立的移动设备上:
xxxxxxxxxx
# geli init -s 4096 -K /media/key1.key -J /media2/ passphrase1.txt /dev/da0p1
在geli attach命令中用-j指示密码文件:
xxxxxxxxxx
# geli attach –k /media/key1.key –j /media2/passphrase1.key
可以让FreeBSD在启动时读取密码短语文件。后面详述。
像swap那样的应用情况,可能只需要一次性的加密以防止被攻击。使用geli onetime命令告诉geli初始化并使用随机密钥附加提供者:
xxxxxxxxxx
# geli onetime da0p1
一次性密钥仅存在于系统内存中,并且在设备连接时存在。断开设备或重启系统时,密钥将永久丢失。
有时可能需要扩展GELI设备,比如使用虚拟化并扩展虚拟磁盘的大小。
这需要扩展底层物理设备,然后扩展GELI设备,然后扩展文件系统。
以下示例扩展disk 0上的分区1以填充所有可用空间:
xxxxxxxxxx
# gpart resize -i 1 -a 1m da0
GELI将元数据放在提供者的最后一个扇区。使用geli resize命令告诉GELI移动元数据。需要使用-s参数给出原始分区大小:
xxxxxxxxxx
# geli resize -s 5g da0p1
GELI元数据现在安全地存放于物理设备的末尾。将密钥附加到GELI设备,然后就可以扩展文件系统:
xxxxxxxxxx
# growfs /dev/da1p1.eli
机密的文件系统现在填充了整个分区。
使用/boot/loader.conf在内核本身的引导过程早期配置您想要自动附加的任何GELI分区。
如果您希望在引导过程后期挂载GELI分区,请使用/etc/rc.conf。
在/etc/rc.conf文件中的geli_devices选项中列出在多用于启动期间要配置的每个GELI设备。
以下示例使用两个GELI磁盘分区,一个GPT分区还一个标记为加密的分区:
xxxxxxxxxx
geli_devices=”da1p1 label/encrypted”
对于列表中的每一个设备,添加一个rc.conf行以指定geli命令行参数以附加它。每行以geli_开头,给出设备名称,以 _flags结尾,例如:
xxxxxxxxxx
geli_da1p2_flags="-k /etc/geli/da1p2.key -j /etc/geli/da1p2.txt"
geli_label_encrypted1_flags="-k /etc/geli/encrypted1.key -j /etc/geli/encrypted1.txt"
如果没有指定密码文件,FreeBSD会中断引导以请求它们。
FreeBSD会在引导过程的早期附加所有GELI设备,因此,可以在/etc/fstab中引用它们。
以下示例自动挂载一个加密的数据库数据分区:
xxxxxxxxxx
/dev/label/db.eli /var/db/postgres ufs rw 2 2
如果需要更早可用的GELI设备,则应在引导加载器中配置它们。
如果希望GELI在单用户模式下连接并激活加密设备,则必须在初始化设备时使用-b参数。
没有此标志,引导加载程序将不知道如何尝试连接设备。
无法将此标志改装到现有的GELI设备上。
以下示例在标签/dev/label/enc上创建一个启动时连接的GELI设备:
xxxxxxxxxx
# geli init –b –s 4096 –K /boot/enc.key /dev/label/enc
将加密密钥文件放置于/boot分区。
在/boot/loader.conf中使用可调参数配置GELI启动设备。
还可以使用可调变量调试GELI。每个GELI设备需要三个loader.conf条目:
xxxxxxxxxx
geli_name_keyfile0_load="YES"
geli_name_keyfile0_type="provider:geli_keyfile0"
geli_name_keyfile0_name="/boot/enc.key"
为您在单用户模式下配置的每个加密设备自定义name和provider。
此GELI设备是/dev/label/enc,因此使用enc作为名称。
提供程序始终是您要连接的设备节点,没有前导/dev/。此设备最终具有以下配置。
xxxxxxxxxx
geli_enc_keyfile0_load="YES"
geli_enc_keyfile0_type="label/enc:geli_keyfile0"
geli_enc_keyfile0_name="/boot/enc.key"
另外,在启动时加载GELI模块:
xxxxxxxxxx
geom_eli_load=YES
下次启动时,启动将停止以请求此设备的密码。
如果无法找出问题所在,可尝试启用调试。两个有用的可调整参数时boot_verbose和kern.geom.eli.debug。
boot_verbose可调参数显示所有内核模块的调试输出,而不仅仅时GELI。通过观察详细的启动过程,可以深入了解系统。
将boot_verbose设置为1将启用详细引导。
如果详细引导没有提供有效的信息,可以尝试kern.geom.eli.debug。将其设置为1到3之间的值,以获得越来越多的调试信息。
如果事情变得非常奇怪,可以在键入GELI密码时让引导加载程序回显GELI密码。
在将其设置为1之前,请确保没有人在附近窥视。
xxxxxxxxxx
boot_verbose=1
kern.geom.eli.debug=3
kern.geom.eli.visible_passphrase=1
在引导时连接GELI设备是全磁盘加密的必要前提。