29.6 UFS 磁盘加密
29.6.1 GELI 加密 GEOM 类概述
geli 是一种加密 GEOM 类。该控制工具支持多种加密方案,提供以下特性:
- 利用 crypto(9) 框架,并在可用时自动使用加密硬件。
- 支持多种加密算法,例如 AES-XTS、AES-CBC 和 Camellia-CBC(不建议将 CBC 模式用于新部署)。
- 可以加密根分区。系统引导时会要求输入密码来访问加密根分区。
- 可以使用两个独立的密钥。
- 执行简单的扇区到扇区的加密,因此速度很快。
- 可以备份和恢复主密钥。如果销毁了密钥,仍可恢复备份的密钥来访问数据。
- 可以使用随机的一次性密钥附加磁盘,这对交换分区和临时文件系统非常有用。
以下示例演示密钥文件的生成方法。加密提供者将挂载在 /mnt 下,密钥文件用于保护加密提供者的主密钥。该密钥文件提供随机数据用于加密主密钥。主密钥同时受密码保护。提供者的扇区大小设为 4kB。本示例还包含 geli 提供者的附加、文件系统创建、挂载、操作和卸载。
29.6.2 加载内核模块
加载 geli 支持模块。geli 支持作为可加载的内核模块提供。要配置系统在引导时自动加载该模块,将以下行添加到 /boot/loader.conf:
geom_eli_load="YES"要立即加载内核模块:
# kldload geom_eli29.6.3 生成密钥文件
生成密钥文件用于主密钥(作为磁盘元数据存储)。以下命令生成密钥文件,所有数据都将以此为凭据加密。可通过 geli setkey 更改用户密钥。用户密钥由密钥文件 /root/ada0.key 的随机字节与口令短语组合而成。本例使用 /dev/random 作为密钥文件的数据源:
# dd if=/dev/random of=/root/ada0.key bs=64 count=129.6.4 加密磁盘
使用 /root/ada0.key 加密磁盘 ada0:
# geli init -K /root/ada0.key -s 4096 /dev/ada0将显示如下输出:
Enter new passphrase: # 设置新密码:
Reenter new passphrase: # 再次输入新密码:
Metadata backup for provider /dev/ada0 can be found in /var/backups/ada0.eli
and can be restored with the following command:
# geli restore /var/backups/ada0.eli /dev/ada0不强制同时使用密码(允许直接回车为空)和密钥文件,可单独使用任意一种方法保护主密钥。
使用生成的密钥附加提供者。要附加提供者,请指定密钥文件、磁盘名称和密码:
# geli attach -k /root/ada0.key /dev/ada0
Enter passphrase: # 输入密码:这将创建扩展名为 .eli 的新设备 ada0.eli:
# ls -al /dev/ada0*
crw-r----- 1 root operator 0x6f May 18 06:17 /dev/ada0
crw-r----- 1 root operator 0x75 May 18 06:17 /dev/ada0.eli29.6.5 创建新文件系统
随后使用 UFS 文件系统格式化该设备,并将其挂载到现有挂载点:
# newfs -U /dev/ada0.eli
# mount /dev/ada0.eli /mnt此时可使用该加密文件系统:
# df -H
Filesystem Size Used Avail Capacity Mounted on
/dev/nda0p2 19G 1.9G 16G 11% /
devfs 1.0k 0B 1.0k 0% /dev
/dev/nda0p1 268M 1.4M 267M 1% /boot/efi
/dev/ada0.eli 5.2G 8.2k 4.8G 0% /mnt完成加密分区操作后,如果不再需要 /mnt 分区,可卸载并将 geli 加密分区从内核中分离,将该设备放入冷存储:
# umount /mnt
# geli detach ada0.eli29.6.6 持久化挂载
为简化引导时挂载 geli 加密设备的流程,系统提供了 rc.d 脚本。本例中将以下行添加到 /etc/rc.conf:
geli_devices="ada0"
geli_ada0_flags="-k /root/ada0.key"这将把 /dev/ada0 配置为 geli 设备,并指定 /root/ada0.key 作为用户密钥的密钥文件。此后,文件系统将挂载,通常通过 /etc/fstab 中的条目挂载(新增下行):
/dev/ada0.eli /mnt ufs rw 0 0系统关闭前,系统将自动将提供者从内核中分离。在引导过程中,脚本将提示输入密码,随后附加提供者。引导过程中的其他内核消息可能会在密码提示之前或之后显示。

如果引导过程停滞,请仔细查看其他消息中的密码提示。输入正确的密码后,将附加提供者。