dm-crypt/全盘加密
以下是使用 dm-crypt 进行全系统加密的常见场景示例。它们解释了对正常 安装步骤 所需做的所有调整。所有必要的工具都在 安装镜像 中。
如果您想加密现有的未加密文件系统,请参阅 dm-crypt/设备加密#加密现有的未加密文件系统。
概述
从功能和性能方面来看,保护根文件系统是 dm-crypt 的优势所在。与选择性地加密非根文件系统不同,加密的根文件系统可以隐藏诸如已安装的程序、所有用户帐户的用户名以及常见的数据泄漏途径(如 locate 和 /var/log/
)等信息。此外,加密的根文件系统使篡改系统变得更加困难,因为除了 引导加载器 和(通常)内核之外的所有内容都已加密。
以下说明的所有场景都具有这些优点,下面总结了区分它们的其他优点和缺点
场景 | 优点 | 缺点 |
---|---|---|
#分区上的 LUKS
展示了全 LUKS 加密根目录的基本且直接的设置。 |
|
|
#带有 TPM2 和安全启动的分区上的 LUKS
与上述示例类似,安全启动和 TPM2 提供了额外的安全层。 |
与上述相同的优点,以及
|
|
#LVM on LUKS
通过在单个 LUKS 加密分区内使用 LVM 来实现分区灵活性。 |
|
|
#LUKS on LVM
仅在 LVM 设置完成后使用 dm-crypt。 |
|
|
#软件 RAID 上的 LUKS
仅在 RAID 设置完成后使用 dm-crypt。 |
|
|
#Plain dm-crypt
使用 dm-crypt plain 模式,即没有 LUKS 标头及其用于多个密钥的选项。 |
| |
#加密的引导分区 (GRUB)
展示了如何使用 GRUB 引导加载器加密引导分区。 |
|
|
#Root on ZFS |
虽然以上所有方案都比加密的辅助文件系统提供更大的外部威胁防护,但它们也存在一个共同的缺点:任何拥有加密密钥的用户都能够解密整个驱动器,因此可以访问其他用户的数据。如果这是一个问题,则可以使用块设备和堆叠文件系统加密的组合,并获得两者的优点。请参阅 静态数据加密 以提前规划。
有关方案中使用的分区策略的概述,请参阅 dm-crypt/驱动器准备#分区。
另一个需要考虑的领域是是否设置加密的交换分区以及哪种类型的交换分区。有关替代方案,请参阅 dm-crypt/交换分区加密。
如果您预计不仅要保护系统数据免受物理盗窃,而且还需要采取预防逻辑篡改的措施,请在遵循其中一个方案后,参阅 dm-crypt/Specialties#保护未加密的引导分区 以了解更多可能性。
对于 固态硬盘,您可能需要考虑启用 TRIM 支持,但请注意,这存在潜在的安全隐患。有关更多信息,请参阅 dm-crypt/Specialties#固态硬盘 (SSD) 的 Discard/TRIM 支持。
- 在任何情况下,都不要直接在加密卷上使用文件系统修复软件(如 fsck),否则会破坏任何恢复用于解密文件的密钥的方法。此类工具必须在解密(打开)的设备上使用。
- Argon2 密钥派生函数的设计使其具有高 RAM 使用率,每个加密映射器默认为 1 GiB。RAM 较低和/或并行解锁多个 LUKS2 分区的机器在启动时可能会出错。请参阅
--pbkdf-memory
选项以控制内存使用量。[1] - GRUB 对 LUKS2 的支持有限;有关详细信息,请参阅 GRUB#加密 /boot。对于 GRUB 需要解锁的分区,请将 LUKS2 与 PBKDF2 (
cryptsetup luksFormat --pbkdf pbkdf2
) 一起使用。
分区上的 LUKS
本示例介绍了在使用 dm-crypt + LUKS 的简单分区布局中进行全系统加密
+-----------------------+------------------------+-----------------------+ | Boot partition | LUKS encrypted root | Optional free space | | | partition | for additional | | | | partitions to be set | | /boot | / | up later | | | | | | | /dev/mapper/root | | | |------------------------| | | /dev/sda1 | /dev/sda2 | | +-----------------------+------------------------+-----------------------+
第一步可以直接在启动 Arch Linux 安装镜像后执行。
准备磁盘
在创建任何分区之前,您应该了解安全擦除磁盘的重要性和方法,这在 dm-crypt/驱动器准备 中进行了描述。
然后创建所需的分区,至少一个用于 /
(例如 /dev/sda2
)和一个用于 /boot
(/dev/sda1
)。请参阅 分区。
准备非引导分区
本节和下一节替换了 安装指南#格式化分区 的说明。
以下命令创建并挂载加密的根分区。它们对应于 dm-crypt/设备加密#使用 LUKS 模式加密设备 中详细描述的步骤。如果您想使用特定的非默认加密选项(例如,密码、密钥长度、扇区大小),请在执行第一个命令之前参阅 加密选项。
# cryptsetup -v luksFormat /dev/sda2 # cryptsetup open /dev/sda2 root
在 解锁的 LUKS 设备上 创建文件系统。例如,要创建 Ext4 文件系统,请运行
# mkfs.ext4 /dev/mapper/root
将根卷挂载到 /mnt
# mount /dev/mapper/root /mnt
检查映射是否按预期工作
# umount /mnt # cryptsetup close root # cryptsetup open /dev/sda2 root # mount /dev/mapper/root /mnt
如果您创建了单独的分区(例如 /home
),则必须为所有分区调整和重复这些步骤,除了 /boot
。有关如何在启动时处理其他分区,请参阅 dm-crypt/加密非根文件系统#自动解锁和挂载。
请注意,每个块设备都需要自己的密码。这可能不方便,因为它会导致在启动期间输入单独的密码。另一种方法是使用存储在根分区中的密钥文件,通过 crypttab
解锁单独的分区。有关说明,请参阅 dm-crypt/设备加密#使用 LUKS 和密钥文件格式化分区。
准备引导分区
您必须设置的是一个未加密的 /boot
分区,这是加密根目录所必需的。对于 UEFI 系统上的 EFI 系统分区,执行
# mkfs.fat -F32 /dev/sda1
或者对于 BIOS 系统上的普通引导分区
# mkfs.ext4 /dev/sda1
之后,创建挂载点目录并挂载分区
# mount --mkdir /dev/sda1 /mnt/boot
挂载设备
在 安装指南#挂载文件系统 中,您将必须挂载映射的设备,而不是实际的分区。当然,未加密的 /boot
仍然必须直接挂载。它应该挂载在 /mnt
下。
配置 mkinitcpio
在遵循 安装指南#Initramfs 之前,您必须对新系统执行以下操作
如果使用默认的基于 busybox 的 initramfs,请将 keyboard
和 encrypt
hooks 添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别添加 keymap
和 consolefont
hooks。
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt filesystems fsck)
如果使用基于 systemd 的 initramfs,则改为添加 keyboard
和 sd-encrypt
hooks。如果您使用非美国控制台键盘布局或非默认控制台字体,则另外添加 sd-vconsole
hook。
HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt filesystems fsck)
保存更改后,重新生成 initramfs。有关详细信息以及您可能需要的其他 hooks,请参阅 dm-crypt/系统配置#mkinitcpio。
配置引导加载器
为了在启动时解锁加密的根分区,引导加载器需要设置以下 内核参数
cryptdevice=UUID=device-UUID:root root=/dev/mapper/root
如果使用 sd-encrypt hook,则需要改为设置以下参数
rd.luks.name=device-UUID=root root=/dev/mapper/root
device-UUID
指的是 LUKS 超级块的 UUID,在本例中是 /dev/sda2
的 UUID。有关详细信息,请参阅 持久块设备命名。
另请参阅 dm-crypt/系统配置#内核参数 了解更多详细信息。
/boot
分区在同一磁盘上,并且您的 UEFI 引导加载器支持 GPT 分区自动挂载,您可以配置 分区类型 GUID(类型应为 “Root partition”,而不是 “LUKS partition”),并依赖 systemd-gpt-auto-generator(8) 而不是使用内核参数。带有 TPM2 和安全启动的分区上的 LUKS
本示例类似于 #分区上的 LUKS,但集成了 安全启动 和 可信平台模块 (TPM) 的使用,增强了启动过程的整体安全性。
在此配置中,只有 EFI 系统分区 保持未加密状态,其中包含 统一内核镜像 和 systemd-boot—两者都已签名以用于安全启动。如果禁用安全启动或篡改了其密钥数据库,TPM 将不会释放密钥以解锁加密分区。这种方法类似于 Windows 上的 BitLocker 或 macOS 上的 FileVault。还将创建一个恢复密钥,以确保在 TPM 解锁机制出现问题(未签名的引导加载器或内核更新、固件更新等)时,数据仍然可访问。或者,可以设置 TPM 密码,以便在启动时需要密码,以防止完全自动解锁。
请务必仔细阅读 可信平台模块#LUKS 加密 中的讨论和警告。
在本示例中,分区的创建遵循 systemd#GPT 分区自动挂载,不需要 fstab 或 crypttab 文件。
+-----------------------+---------------------------------+ | EFI system partition | LUKS encrypted root partition | | | | | | | | /boot | / | | | | | | /dev/mapper/root | | |---------------------------------| | /dev/sda1 | /dev/sda2 | +-----------------------+---------------------------------+
准备磁盘
在创建任何分区之前,您应该了解安全擦除磁盘的重要性和方法,这在 dm-crypt/驱动器准备 中进行了描述。
使用 GUID 分区表 (GPT) 分区 驱动器。然后创建所需的分区。
创建一个 EFI 系统分区(本例中为 /dev/sda1
),大小适当。稍后它将挂载在 /boot
下。
在驱动器的剩余空间中,创建一个根分区(本例中为 /dev/sda2
),该分区将被加密并稍后挂载到 /
。将其分区类型 GUID 设置为 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709
(fdisk 中的 “Linux root (x86-64)”,gdisk 中的 8304
)。
准备根分区
以下命令创建并挂载加密的根分区。它们对应于 dm-crypt/设备加密#使用 LUKS 模式加密设备 中详细描述的步骤。
如果您想使用特定的非默认加密选项(例如,密码、密钥长度),或者如果您不想使用基于 TPM 的解密,请在执行第一个命令之前参阅 加密选项。
创建 LUKS 卷(您可以简单地使用空白密码,因为它稍后将被擦除)并挂载它
# cryptsetup luksFormat /dev/sda2 # cryptsetup open /dev/sda2 root
在 解锁的 LUKS 设备上 创建文件系统。例如,要创建 Ext4 文件系统,请运行
# mkfs.ext4 /dev/mapper/root
将根卷挂载到 /mnt
# mount /dev/mapper/root /mnt
准备 EFI 系统分区
按照 EFI 系统分区#格式化分区 中的说明格式化新创建的 EFI 系统分区,然后挂载它。
# mount --mkdir /dev/sda1 /mnt/boot
继续安装过程,直到 安装指南#Initramfs。您可以跳过 安装指南#Fstab。
配置 mkinitcpio
要构建一个可用的基于 systemd 的 initramfs,请按如下方式修改 mkinitcpio.conf 中的 HOOKS=
行
HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt filesystems fsck)
接下来,请参阅 统一内核镜像#mkinitcpio,以配置 mkinitcpio 以用于 统一内核镜像。
不要 现在 重新生成 initramfs,因为 /boot/EFI/Linux
目录需要由引导加载器安装程序首先创建。
安装引导加载器
您可以配置您的系统以直接启动 UEFI 镜像而无需任何引导加载器,请参阅 Unified_kernel_image#直接从 UEFI 启动。
如果需要引导加载器,请继续使用以下命令安装 systemd-boot
# bootctl install
mkinitcpio 生成的 统一内核镜像 将被自动识别,并且不需要在 /boot/loader/entries/
中添加条目。
有关更多配置,请参阅 systemd-boot#更新 UEFI 启动管理器 和 systemd-boot#加载器配置。
完成安装
首先,重新生成 initramfs,并确保镜像生成成功。
确保您没有忘记 设置 root 密码,重启 以完成安装。
安全启动
您现在可以对引导加载器可执行文件和 EFI 二进制文件进行签名,以启用 安全启动。有关快速简便的方法,请参阅 统一可扩展固件接口/安全启动#使用 sbctl 辅助处理。
注册 TPM
在对引导加载器可执行文件进行签名并启用安全启动后,您现在可以注册 TPM,以便使用它来解锁 LUKS 卷。以下命令将删除在 LUKS 格式化过程中创建的空密码,创建一个绑定到 TPM PCR 7 (安全启动 状态和注册证书) 的密钥,并创建一个恢复密钥,以在出现任何问题时使用。只要引导链不被篡改,TPM 就会自动释放密钥。请参阅 systemd-cryptenroll#可信平台模块 和 systemd-cryptenroll(1)。
# systemd-cryptenroll /dev/sda2 --recovery-key # systemd-cryptenroll /dev/sda2 --wipe-slot=empty --tpm2-device=auto --tpm2-pcrs=7
--tpm2-with-pin=yes
以要求在启动时需要额外的 PIN 码才能解锁。LVM on LUKS
直接的方法是在加密分区之上而不是相反的方式设置 LVM。从技术上讲,LVM 设置在一个大的加密块设备内部。因此,在块设备解锁并且在启动期间扫描和挂载底层卷结构之前,LVM 是不可见的。
本示例中的磁盘布局为
+-----------------------------------------------------------------------+ +----------------+ | Logical volume 1 | Logical volume 2 | Logical volume 3 | | Boot partition | | | | | | | | [SWAP] | / | /home | | /boot | | | | | | | | /dev/MyVolGroup/swap | /dev/MyVolGroup/root | /dev/MyVolGroup/home | | | |_ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _| | (may be on | | | | other device) | | LUKS encrypted partition | | | | /dev/sda1 | | /dev/sdb1 | +-----------------------------------------------------------------------+ +----------------+
encrypt
hook,但此方法不允许您将逻辑卷跨越多个磁盘;请使用 sd-encrypt 或参阅 dm-crypt/Specialties#修改 encrypt hook 以支持多个分区。- dm-crypt/Specialties#使用分离的 LUKS 标头的加密系统 中的说明使用此设置,并将分离的 LUKS 标头放在 USB 设备上,以实现双因素身份验证。
- dm-crypt/Specialties#加密的 /boot 和 USB 设备上分离的 LUKS 标头 中的说明使用此设置,并将分离的 LUKS 标头、加密的
/boot
分区和加密的密钥文件都放在 USB 设备上。
准备磁盘
在创建任何分区之前,您应该了解安全擦除磁盘的重要性和方法,这在 dm-crypt/驱动器准备 中进行了描述。
创建一个分区,大小为 1 GiB 或更大,以挂载到 /boot
。
/boot
。创建一个分区,该分区稍后将包含加密容器。
在指定分区上创建 LUKS 加密容器。输入两次选择的密码。
# cryptsetup luksFormat /dev/sda1
有关可用的 cryptsetup 选项的更多信息,请在执行上述命令之前参阅 LUKS 加密选项。
打开容器
# cryptsetup open /dev/sda1 cryptlvm
解密的容器现在可在 /dev/mapper/cryptlvm
中使用。
准备逻辑卷
在打开的 LUKS 容器之上创建物理卷
# pvcreate /dev/mapper/cryptlvm
创建一个卷组(在本例中命名为 MyVolGroup
,但它可以是您想要的任何名称),并将先前创建的物理卷添加到其中
# vgcreate MyVolGroup /dev/mapper/cryptlvm
在卷组上创建所有逻辑卷
-l 100%FREE
创建最后一个卷后,可以通过使用 lvreduce -L -256M MyVolGroup/home
减小其大小来实现此目的。# lvcreate -L 4G -n swap MyVolGroup # lvcreate -L 32G -n root MyVolGroup # lvcreate -l 100%FREE -n home MyVolGroup
格式化 每个逻辑卷上的文件系统。例如,对根卷和 home 卷使用 Ext4
# mkfs.ext4 /dev/MyVolGroup/root # mkfs.ext4 /dev/MyVolGroup/home # mkswap /dev/MyVolGroup/swap
挂载文件系统
# mount /dev/MyVolGroup/root /mnt # mount --mkdir /dev/MyVolGroup/home /mnt/home # swapon /dev/MyVolGroup/swap
准备引导分区
引导加载器从 /boot
目录加载内核、initramfs 及其自身的配置文件。引导加载器可以读取的磁盘上的任何文件系统都符合条件。
在用于 /boot
的分区上创建 文件系统。对于 UEFI 系统上的 EFI 系统分区,执行
# mkfs.fat -F32 /dev/sdb1
或者对于 BIOS 系统上的普通引导分区
# mkfs.ext4 /dev/sdb1
将分区挂载到 /mnt/boot
# mount --mkdir /dev/sdb1 /mnt/boot
此时,恢复常见的 安装指南#安装 步骤。返回此页面以自定义 Initramfs 和 引导加载器 步骤。
配置 mkinitcpio
如果使用默认的基于 busybox 的 initramfs,请将 keyboard
、encrypt
和 lvm2
hooks 添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别添加 keymap
和 consolefont
hooks。
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck)
如果使用基于 systemd 的 initramfs,则改为添加 keyboard
、sd-encrypt
和 lvm2
hooks。如果您使用非美国控制台键盘布局或非默认控制台字体,则另外添加 sd-vconsole
hook。
HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt lvm2 filesystems fsck)
保存更改后,重新生成 initramfs。有关详细信息以及您可能需要的其他 hooks,请参阅 dm-crypt/系统配置#mkinitcpio。
注意:当使用 dracut 时,不需要额外的设置,因为所需的模块已包含在内。
配置引导加载器
为了在启动时解锁加密的根分区,引导加载器需要设置以下 内核参数
cryptdevice=UUID=device-UUID:cryptlvm root=/dev/MyVolGroup/root
如果使用 sd-encrypt hook,则需要改为设置以下参数
rd.luks.name=device-UUID=cryptlvm root=/dev/MyVolGroup/root
device-UUID
指的是 LUKS 超级块的 UUID,在本例中是 /dev/sda1
的 UUID。有关详细信息,请参阅 持久块设备命名。
如果使用 dracut,已知这些参数有效
rd.luks.uuid=device-UUID root=/dev/MyVolGroup/root
您可能需要更广泛的参数列表,请尝试
rd.luks.uuid=luks-deviceUUID rd.lvm.lv=MyVolGroup/root rd.lvm.lv=MyVolGroup/swap root=/dev/mapper/MyVolGroup-root rootfstype=ext4 rootflags=rw,relatime
有关详细信息,请参阅 dm-crypt/系统配置#内核参数。
LUKS on LVM
要在 LVM 之上使用加密,首先设置 LVM 卷,然后将其用作加密分区的基础。这样,也可以混合使用加密和非加密卷/分区。
以下简短示例创建了一个 LUKS on LVM 设置,并混合使用了用于 /home 分区的密钥文件和用于交换分区的临时加密卷。从安全角度来看,这被认为是可取的,因为当重新初始化加密时,没有潜在的敏感临时数据会在重启后幸存下来。如果您对 LVM 有经验,您将能够根据您的计划忽略/替换 LVM 和其他细节。
如果您想跨已设置的多个磁盘扩展逻辑卷,或扩展 /home
(或任何其他卷)的逻辑卷,请参阅 dm-crypt/Specialties#在多个磁盘上扩展 LVM 中描述的步骤。重要的是要注意,LUKS 加密容器也必须调整大小。
准备磁盘
分区方案
+----------------+-------------------------------------------------------------------------------------------------+ | Boot partition | dm-crypt plain encrypted volume | LUKS encrypted volume | LUKS encrypted volume | | | | | | | /boot | [SWAP] | / | /home | | | | | | | | /dev/mapper/swap | /dev/mapper/root | /dev/mapper/home | | |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| | | Logical volume 1 | Logical volume 2 | Logical volume 3 | | | /dev/MyVolGroup/cryptswap | /dev/MyVolGroup/cryptroot | /dev/MyVolGroup/crypthome | | |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| | | | | /dev/sda1 | /dev/sda2 | +----------------+-------------------------------------------------------------------------------------------------+
根据 dm-crypt/Drive preparation#在空设备或分区上进行 dm-crypt 擦除,随机化 /dev/sda2
。
准备逻辑卷
# pvcreate /dev/sda2 # vgcreate MyVolGroup /dev/sda2 # lvcreate -L 4G -n cryptswap MyVolGroup # lvcreate -L 32G -n cryptroot MyVolGroup # lvcreate -l 100%FREE -n crypthome MyVolGroup
# cryptsetup luksFormat /dev/MyVolGroup/cryptroot # cryptsetup open /dev/MyVolGroup/cryptroot root
在 解锁的 LUKS 设备上创建文件系统 并挂载它。例如,要创建 Ext4 文件系统,请运行
# mkfs.ext4 /dev/mapper/root # mount /dev/mapper/root /mnt
有关加密选项的更多信息,请参见 dm-crypt/Device encryption#LUKS 模式的加密选项。请注意,/home
将在 #加密逻辑卷 /home 中加密。
open
操作将允许您这样做。准备引导分区
在用于 /boot
的分区上创建 文件系统。对于 UEFI 系统上的 EFI 系统分区,执行
# mkfs.fat -F32 /dev/sda1
或者对于 BIOS 系统上的普通引导分区
# mkfs.ext4 /dev/sda1
之后,创建挂载点目录并挂载分区
# mount --mkdir /dev/sda1 /mnt/boot
配置 mkinitcpio
如果使用默认的基于 busybox 的 initramfs,请将 keyboard
、encrypt
和 lvm2
hooks 添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别添加 keymap
和 consolefont
hooks。
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block lvm2 encrypt filesystems fsck)
如果使用基于 systemd 的 initramfs,则添加 keyboard
、sd-encrypt
和 lvm2
钩子。如果您使用非美国控制台键盘布局或非默认控制台字体,则另外添加 sd-vconsole
钩子。
HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt lvm2 filesystems fsck)
保存更改后,重新生成 initramfs。有关详细信息以及您可能需要的其他 hooks,请参阅 dm-crypt/系统配置#mkinitcpio。
配置引导加载器
为了在启动时解锁加密的根分区,引导加载器需要设置以下 内核参数
cryptdevice=UUID=device-UUID:root root=/dev/mapper/root
如果使用 sd-encrypt hook,则需要改为设置以下参数
rd.luks.name=device-UUID=root root=/dev/mapper/root
device-UUID
指的是 LUKS 超级块的 UUID,在本例中是 /dev/MyVolGroup/cryptroot
的 UUID。有关详细信息,请参见 持久块设备命名。
有关详细信息,请参阅 dm-crypt/系统配置#内核参数。
配置 fstab 和 crypttab
需要 crypttab 和 fstab 条目才能解锁设备并分别挂载文件系统。以下行将在每次重启时重新加密交换卷
/etc/crypttab
swap /dev/MyVolGroup/cryptswap /dev/urandom swap,cipher=aes-xts-plain64,size=256,sector-size=4096
/etc/fstab
/dev/mapper/root / ext4 defaults 0 1 UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /boot ext4 defaults 0 2 /dev/mapper/swap none swap defaults 0 0
加密逻辑卷 /home
由于此方案使用 LVM 作为主映射器,dm-crypt 作为辅助映射器,因此每个加密的逻辑卷都需要自己的加密。然而,与上面配置的具有易失性加密的临时文件系统不同,/home
的逻辑卷当然应该是持久的。以下内容假设您已重启进入已安装的系统,否则您必须调整路径。为了节省在启动时输入第二个密码,将创建一个 密钥文件
# dd bs=512 count=4 if=/dev/random iflag=fullblock | install -m 0600 /dev/stdin /etc/cryptsetup-keys.d/home.key
逻辑卷使用它进行加密
# cryptsetup luksFormat -v /dev/MyVolGroup/crypthome /etc/cryptsetup-keys.d/home.key # cryptsetup -d /etc/cryptsetup-keys.d/home.key open /dev/MyVolGroup/crypthome home
在 解锁的 LUKS 设备上创建文件系统 并挂载它。例如,要创建 Ext4 文件系统,请运行
# mkfs.ext4 /dev/mapper/home # mount /dev/mapper/home /home
/etc/crypttab
home /dev/MyVolGroup/crypthome none
/etc/fstab
/dev/mapper/home /home ext4 defaults 0 2
LUKS on software RAID
此示例基于工作站级笔记本电脑的真实设置,该笔记本电脑配备了两个大小相等的 SSD 和一个额外的 HDD 用于大容量存储。最终结果是基于 LUKS 的全盘加密(包括 /boot
),用于所有驱动器,SSD 位于 RAID0 阵列中,并且使用密钥文件在 GRUB 在启动时获得正确的密码后解锁所有加密。
此设置利用非常简单的分区方案,所有可用的 RAID 存储都挂载在 /
(没有单独的 /boot
分区),解密的 HDD 挂载在 /data
。
请注意,在此设置中,定期 备份 非常重要。如果任何一个 SSD 发生故障,则 RAID 阵列中包含的数据实际上将无法恢复。如果容错对您很重要,您可能希望选择不同的 RAID 级别。
在此设置中,加密不是可否认的。
为了以下说明的缘故,使用了以下块设备
/dev/sda = first SSD /dev/sdb = second SSD /dev/sdc = HDD
+---------------------+---------------------------+---------------------------+ +---------------------+---------------------------+---------------------------+ +---------------------------+ | BIOS boot partition | EFI system partition | LUKS encrypted volume | | BIOS boot partition | EFI system partition | LUKS encrypted volume | | LUKS encrypted volume | | | | | | | | | | | | | /efi | / | | | /efi | / | | /data | | | | | | | | | | | | | | /dev/mapper/root | | | | /dev/mapper/root | | | | +---------------------------+---------------------------+ | +---------------------------+---------------------------+ | | | | RAID1 array (part 1 of 2) | RAID0 array (part 1 of 2) | | | RAID1 array (part 2 of 2) | RAID0 array (part 2 of 2) | | | | | | | | | | | | | | | /dev/md/ESP | /dev/md/root | | | /dev/md/ESP | /dev/md/root | | /dev/mapper/data | | +---------------------------+---------------------------+ | +---------------------------+---------------------------+ +---------------------------+ | /dev/sda1 | /dev/sda2 | /dev/sda3 | | /dev/sdb1 | /dev/sdb2 | /dev/sdb3 | | /dev/sdc1 | +---------------------+---------------------------+---------------------------+ +---------------------+---------------------------+---------------------------+ +---------------------------+
请务必用适合您设置的设备名称替换它们,因为它们可能有所不同。
准备磁盘
在创建任何分区之前,您应该了解安全擦除磁盘的重要性和方法,这在 dm-crypt/驱动器准备 中进行了描述。
对于带有 GPT 的 BIOS 系统,创建一个大小为 1 MiB 的 BIOS 启动分区,供 GRUB 存储 BIOS 启动加载程序的第二阶段。不要挂载该分区。
对于 UEFI 系统,创建一个大小合适的 EFI 系统分区,稍后将挂载在 /efi
。
在驱动器上的剩余空间中,为 “Linux RAID” 创建一个分区(本例中为 /dev/sda3
)。为 MBR 选择分区类型 ID fd
,或为 GPT 选择分区类型 GUID A19D880F-05FC-4D3B-A006-743F0F84911E
。
一旦在 /dev/sda
上创建了分区,就可以使用以下命令将其克隆到 /dev/sdb
。
# sfdisk -d /dev/sda > sda.dump # sfdisk /dev/sdb < sda.dump
HDD 使用覆盖整个驱动器的单个 Linux 分区在 /dev/sdc1
上准备。
构建 RAID 阵列
为 SSD 创建 RAID 阵列。
- EFI 系统分区 RAID 阵列的所有部分都必须单独可用,这意味着 ESP 只能放置在 RAID1 阵列中。
- RAID 超级块必须使用
--metadata=1.0
放置在 EFI 系统分区的末尾,否则固件将无法访问该分区。
# mdadm --create --verbose --level=1 --metadata=1.0 --raid-devices=2 /dev/md/ESP /dev/sda2 /dev/sdb2
此示例对根目录使用 RAID0,您可能希望根据您的偏好或要求替换为不同的级别。
# mdadm --create --verbose --level=0 --metadata=1.2 --raid-devices=2 /dev/md/root /dev/sda3 /dev/sdb3
准备块设备
如 dm-crypt/Drive preparation 中所述,设备使用随机数据进行擦除,利用 /dev/zero
和具有随机密钥的加密设备。或者,您可以使用带有 /dev/random
或 /dev/urandom
的 dd
,尽管这会慢得多。
# cryptsetup open --type plain --sector-size 4096 --key-file /dev/urandom /dev/md/root to_be_wiped # dd if=/dev/zero of=/dev/mapper/to_be_wiped bs=1M status=progress # cryptsetup close to_be_wiped
并对 HDD(本例中为 /dev/sdc1
)重复上述操作。
为 /dev/md/root
设置加密
cryptsetup luksFormat --pbkdf pbkdf2
)。# cryptsetup -v luksFormat --pbkdf pbkdf2 /dev/md/root # cryptsetup open /dev/md/root root
在 解锁的 LUKS 设备上 创建文件系统。例如,要创建 Ext4 文件系统,请运行
# mkfs.ext4 /dev/mapper/root
将根卷挂载到 /mnt
# mount /dev/mapper/root /mnt
并对 HDD 重复操作
# cryptsetup -v luksFormat /dev/sdc1 # cryptsetup open /dev/sdc1 data # mkfs.ext4 /dev/mapper/data # mount --mkdir /dev/mapper/data /mnt/data
对于 UEFI 系统,设置 EFI 系统分区
# mkfs.fat -F32 /dev/md/ESP # mount --mkdir /dev/md/ESP /mnt/efi
配置 GRUB
通过使用以下内容编辑 /etc/default/grub
,为 LUKS 加密系统配置 GRUB
GRUB_CMDLINE_LINUX="cryptdevice=/dev/md/root:root" GRUB_ENABLE_CRYPTODISK=y
如果您的新系统上有 USB 键盘,请在固件中启用旧式 USB 支持,或将以下内容添加到 /etc/default/grub
GRUB_TERMINAL_INPUT="usb_keyboard" GRUB_PRELOAD_MODULES="usb usb_keyboard ohci uhci ehci"
否则,您可能无法在 LUKS 提示符下使用键盘。
有关详细信息,请参见 dm-crypt/System configuration#内核参数 和 GRUB#加密 /boot。
完成 GRUB 安装到两个 SSD(实际上,仅安装到 /dev/sda
即可)。
# grub-install --target=i386-pc /dev/sda # grub-install --target=i386-pc /dev/sdb # grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB # grub-mkconfig -o /boot/grub/grub.cfg
创建密钥文件
接下来的步骤可让您在启动系统时避免两次输入密码(一次是 GRUB 可以解锁 LUKS 设备,第二次是 initramfs 接管系统控制)。这是通过为加密创建一个 密钥文件 并将其添加到 initramfs 映像中,以允许加密钩子解锁根设备来完成的。有关详细信息,请参见 dm-crypt/Device encryption#使用嵌入在 initramfs 中的密钥文件。
- 创建 密钥文件 并将密钥添加到
/dev/md/root
。 - 为 HDD (
/dev/sdc1
) 创建另一个密钥文件,以便也可以在启动时解锁它。为方便起见,保留上面创建的密码,因为如果您需要,这可以使恢复更容易。编辑/etc/crypttab
以在启动时解密 HDD。请参见 dm-crypt/System configuration#使用密钥文件解锁。
配置系统
编辑 fstab 以挂载根和数据块设备以及 ESP
/dev/mapper/root / ext4 rw,noatime 0 1 /dev/mapper/data /data ext4 defaults 0 2 /dev/md/ESP /efi vfat rw,relatime,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,tz=UTC,errors=remount-ro 0 2
保存 RAID 配置
# mdadm --detail --scan >> /etc/mdadm.conf
编辑 mkinitcpio.conf 以包含您的密钥文件并添加正确的钩子
FILES=(/crypto_keyfile.bin) HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block mdadm_udev encrypt filesystems fsck)
有关详细信息,请参见 dm-crypt/System configuration#mkinitcpio。
Plain dm-crypt
与 LUKS 相反,dm-crypt plain 模式不需要加密设备上的标头:此方案利用此功能在未分区的加密磁盘上设置系统,该系统与填充随机数据的磁盘无法区分,这可能允许 可否认加密。另请参见 wikipedia:Disk encryption#全盘加密。
请注意,如果不需要全盘加密,则上面各节中描述的使用 LUKS 的方法对于系统加密和加密分区都是更好的选择。LUKS 功能(如使用多个密码/密钥文件的密钥管理、主密钥备份或就地重新加密设备)在 plain 模式下不可用。
Plain dm-crypt 加密可能比 LUKS 更能抵抗损坏,因为它不依赖于加密主密钥,如果损坏或强制销毁,加密主密钥可能成为单点故障。但是,使用 plain 模式还需要更多手动配置加密选项才能达到相同的加密强度。另请参见 Data-at-rest encryption#加密元数据。如果担心 dm-crypt/Specialties#固态驱动器 (SSD) 的 Discard/TRIM 支持 中解释的问题,也可以考虑使用 plain 模式。
- 使用 cryptsetup
--header
选项的 带有分离标头的 dm-crypt LUKS 模式。它不能与标准 encrypt 钩子一起使用,但可以修改该钩子。 - tcplay,它提供无头加密,但具有 PBKDF2 功能。
此方案使用两个 USB 驱动器
- 一个用于启动设备,这也允许存储打开/解锁 bootloader 配置中 plain 加密设备所需的选项,因为每次启动时都输入它们容易出错;
- 另一个用于加密密钥文件,假设它以原始位存储,以便在可能获得 usbkey 的不知情的攻击者看来,加密密钥将显示为随机数据,而不是可见为普通文件。另请参见 Wikipedia:Security through obscurity,按照 dm-crypt/Device encryption#密钥文件 准备密钥文件。
磁盘布局是
+----------------------+----------------------+----------------------+ +----------------+ +----------------+ | Logical volume 1 | Logical volume 2 | Logical volume 3 | | Boot device | | Encryption key | | | | | | | | file storage | | / | [SWAP] | /home | | /boot | | (unpartitioned | | | | | | | | in example) | | /dev/MyVolGroup/root | /dev/MyVolGroup/swap | /dev/MyVolGroup/home | | /dev/sdb1 | | /dev/sdc | |----------------------+----------------------+----------------------| |----------------| |----------------| | disk drive /dev/sda encrypted using plain mode and LVM | | USB stick 1 | | USB stick 2 | +--------------------------------------------------------------------+ +----------------+ +----------------+
- 也可以使用单个 USB 密钥物理设备
- 通过将密钥放在 USB 存储设备 (/dev/sdb) 的另一个分区 (/dev/sdb2) 上。
- 通过将密钥文件直接复制到 initramfs。例如,通过在
/etc/mkinitcpio.conf
中设置FILES=(/etc/cryptsetup-keys.d/root.key)
,示例密钥文件/etc/cryptsetup-keys.d/root.key
将被复制到 initramfs 映像。指示encrypt
钩子读取 initramfs 映像中的密钥文件的方法是在文件名之前使用rootfs:
前缀,例如cryptkey=rootfs:/etc/cryptsetup-keys.d/root.key
。
- 另一种选择是使用具有良好 熵 的密码。
准备磁盘
至关重要的是,映射的设备必须填充随机数据。特别是这适用于我们在此处应用的场景用例。
请参见 dm-crypt/Drive preparation 和 dm-crypt/Drive preparation#dm-crypt 特定方法
准备非启动分区
有关详细信息,请参见 dm-crypt/Device encryption#plain 模式的加密选项。
使用设备 /dev/sda
,使用 aes-xts 密码,密钥大小为 512 位,并使用密钥文件,我们有以下方案选项
# cryptsetup open --type plain --cipher=aes-xts-plain64 --offset=0 --key-file=/dev/sdc --key-size=512 --sector-size 4096 /dev/sda cryptlvm
与使用 LUKS 加密不同,每当需要重新建立映射时,都必须完整执行上述命令,因此记住密码和密钥文件详细信息非常重要。
我们现在可以检查是否为 /dev/mapper/cryptlvm
创建了映射条目
# fdisk -l
- cryptsetup FAQ 中提倡的一种比使用 LVM 更简单的替代方案(对于不需要 LVM 的情况)是在整个映射的 dm-crypt 设备上创建文件系统。
- 如果逻辑卷将使用 ext4 格式化,则在卷组中至少保留 256 MiB 的可用空间,以便可以使用 e2scrub(8)。在创建最后一个卷
-l 100%FREE
后,可以通过使用lvreduce -L -256M MyVolGroup/home
减小其大小来实现。
接下来,我们在映射的设备上设置 LVM 逻辑卷。有关更多详细信息,请参见 在 LVM 上安装 Arch Linux
# pvcreate /dev/mapper/cryptlvm # vgcreate MyVolGroup /dev/mapper/cryptlvm # lvcreate -L 32G MyVolGroup -n root # lvcreate -L 4G MyVolGroup -n swap # lvcreate -l 100%FREE MyVolGroup -n home
我们格式化并挂载它们并激活交换。有关更多详细信息,请参见 文件系统#创建文件系统
# mkfs.ext4 /dev/MyVolGroup/root # mkfs.ext4 /dev/MyVolGroup/home # mount /dev/MyVolGroup/root /mnt # mount --mkdir /dev/MyVolGroup/home /mnt/home # mkswap /dev/MyVolGroup/swap # swapon /dev/MyVolGroup/swap
准备引导分区
/boot
分区可以是 USB 驱动器上典型的 FAT32 格式分区(如果需要)。但是如果需要手动分区,则只需一个小的 1 GiB 分区即可。使用您选择的 分区工具 创建分区。
在用于 /boot
的分区上创建 文件系统
# mkfs.fat -F32 /dev/sdb1 # mount --mkdir /dev/sdb1 /mnt/boot
配置 mkinitcpio
如果使用默认的基于 busybox 的 initramfs,请将 keyboard
、encrypt
和 lvm2
hooks 添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别添加 keymap
和 consolefont
hooks。
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck)
保存更改后,重新生成 initramfs。有关详细信息以及您可能需要的其他 hooks,请参阅 dm-crypt/系统配置#mkinitcpio。
配置引导加载器
为了启动加密的根分区,需要 bootloader 设置以下 内核参数(请注意,64 是 512 位中的字节数)
cryptdevice=/dev/disk/by-id/disk-ID-of-sda:cryptlvm:sector-size=4096 cryptkey=/dev/disk/by-id/disk-ID-of-sdc:0:64 crypto=:aes-xts-plain64:512:0:
disk-ID-of-disk
指的是引用磁盘的 ID。有关详细信息,请参见 持久块设备命名。
有关详细信息和您可能需要的其他参数,请参见 dm-crypt/System configuration#内核参数。
/boot
分区相同的 USB 上。对于 BIOS
# grub-install --target=i386-pc --recheck /dev/sdb
对于 UEFI
# grub-install --target=x86_64-efi --efi-directory=/boot --removable
安装后
您可能希望在启动后移除 USB 驱动器。由于 /boot
分区通常不需要,因此可以将 noauto
选项添加到 /etc/fstab
中的相关行
/etc/fstab
# /dev/sdb1 UUID=XXXX-XXXX /boot vfat noauto,rw,noatime 0 2
但是,当需要更新 initramfs 中使用的任何内容、内核或 bootloader 时;/boot
分区必须存在并挂载。由于 fstab
中已存在条目,因此可以使用以下命令简单地挂载它
# mount /boot
加密的启动分区 (GRUB)
此设置利用与之前的 #LVM on LUKS 章节相同的分区布局和配置,不同之处在于使用了 GRUB 启动加载程序,因为它能够从 LVM 逻辑卷和 LUKS 加密的 /boot
启动。另请参见 GRUB#加密 /boot。
本示例中的磁盘布局为
+---------------------+----------------------+----------------------+----------------------+----------------------+ | BIOS boot partition | EFI system partition | Logical volume 1 | Logical volume 2 | Logical volume 3 | | | | | | | | | /efi | / | [SWAP] | /home | | | | | | | | | | /dev/MyVolGroup/root | /dev/MyVolGroup/swap | /dev/MyVolGroup/home | | /dev/sda1 | /dev/sda2 |----------------------+----------------------+----------------------+ | unencrypted | unencrypted | /dev/sda3 encrypted using LVM on LUKS | +---------------------+----------------------+--------------------------------------------------------------------+
- 所有方案都旨在作为示例。当然,也可以将上述两个不同的安装步骤应用于其他方案。另请参见 #LVM on LUKS 中链接的变体。
- 您可以使用 cryptbootAUR 软件包中的
cryptboot
脚本来简化加密启动管理(挂载、卸载、升级软件包),并作为使用 UEFI 安全启动 防御 Evil Maid 攻击的方法。有关更多信息和限制,请参见 cryptboot 项目页面。
准备磁盘
在创建任何分区之前,您应该了解安全擦除磁盘的重要性和方法,这在 dm-crypt/驱动器准备 中进行了描述。
对于 UEFI 系统,创建一个大小合适的 EFI 系统分区,稍后将挂载在 /efi
。
对于 BIOS/GPT 设置,创建一个大小为 1 MiB 的 BIOS 启动分区,供 GRUB 存储 BIOS 启动加载程序的第二阶段。不要挂载该分区。对于 BIOS/MBR 设置,这不是必需的。
创建一个类型为 8309
的分区,该分区稍后将包含 LVM 的加密容器。
创建 LUKS 加密容器
cryptsetup luksFormat --pbkdf pbkdf2
)。# cryptsetup luksFormat --pbkdf pbkdf2 /dev/sda3
有关可用的 cryptsetup 选项的更多信息,请在执行上述命令之前参阅 LUKS 加密选项。
您的分区布局应类似于这样
# gdisk -l /dev/sda
... Number Start (sector) End (sector) Size Code Name 1 2048 4095 1024.0 KiB EF02 BIOS boot partition 2 4096 2101247 1024.0 MiB EF00 EFI system partition 3 2101248 69210111 32.0 GiB 8309 Linux LUKS
打开容器
# cryptsetup open /dev/sda3 cryptlvm
解密的容器现在可在 /dev/mapper/cryptlvm
中使用。
准备逻辑卷
此示例的 LVM 逻辑卷遵循与 #LVM on LUKS 方案完全相同的布局。因此,请按照上面的 #准备逻辑卷 进行操作,并根据需要进行调整。
对于 UEFI 系统,为 EFI 系统分区 创建一个挂载点,位于 /efi
,以便与 grub-install
兼容,并挂载它
# mount --mkdir /dev/sda2 /mnt/efi
此时,您应该在 /mnt
中具有以下分区和逻辑卷
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 550M 0 part /mnt/efi └─sda3 8:3 0 100G 0 part └─cryptlvm 254:0 0 100G 0 crypt ├─MyVolGroup-swap 254:1 0 4G 0 lvm [SWAP] ├─MyVolGroup-root 254:2 0 32G 0 lvm /mnt └─MyVolGroup-home 254:3 0 60G 0 lvm /mnt/home
现在,在此处继续通用的 安装指南#安装 步骤。返回此页面以自定义 Initramfs 和 Boot loader 步骤。
配置 mkinitcpio
如果使用默认的基于 busybox 的 initramfs,请将 keyboard
、encrypt
和 lvm2
hooks 添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别添加 keymap
和 consolefont
hooks。
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck)
如果使用基于 systemd 的 initramfs,则添加 keyboard
、sd-encrypt
和 lvm2
钩子。如果您使用非美国控制台键盘布局或非默认控制台字体,则另外添加 sd-vconsole
钩子。
HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt lvm2 filesystems fsck)
保存更改后,重新生成 initramfs。有关详细信息以及您可能需要的其他 hooks,请参阅 dm-crypt/系统配置#mkinitcpio。
配置 GRUB
配置 GRUB 以允许从 LUKS 加密分区上的 /boot
启动
/etc/default/grub
GRUB_ENABLE_CRYPTODISK=y
设置内核参数,以便 initramfs 可以解锁加密的根分区。使用 encrypt
钩子
/etc/default/grub
GRUB_CMDLINE_LINUX="... cryptdevice=UUID=device-UUID:cryptlvm ..."
如果使用 sd-encrypt hook,则需要改为设置以下参数
/etc/default/grub
GRUB_CMDLINE_LINUX="... rd.luks.name=device-UUID=cryptlvm ..."
有关详细信息,请参见 dm-crypt/System configuration#内核参数 和 GRUB#加密 /boot。device-UUID
指的是 LUKS 超级块的 UUID,在本例中是 /dev/sda3
的 UUID(包含根文件系统的 lvm 的分区)。请参见 持久块设备命名。
将 GRUB 安装到已挂载的 ESP 以进行 UEFI 启动
# grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB --recheck
将 GRUB 安装到磁盘以进行 BIOS 启动
# grub-install --target=i386-pc --recheck /dev/sda
生成 GRUB 的 配置文件
# grub-mkconfig -o /boot/grub/grub.cfg
如果所有命令都完成且没有错误,则 GRUB 应在下次重启后提示输入密码以解锁 /dev/sda3
分区。
避免必须输入两次密码
虽然 GRUB 在上述说明之后要求输入密码以解锁 LUKS 加密分区,但分区解锁不会传递到 initramfs。因此,您必须在启动时输入两次密码:一次用于 GRUB,一次用于 initramfs。
本节讨论额外的配置,以使系统仅通过在 GRUB 中输入一次密码即可启动。这是通过 使用嵌入在 initramfs 中的密钥文件 来完成的。
首先创建密钥文件并将其添加为 LUKS 密钥
# dd bs=512 count=4 if=/dev/random iflag=fullblock | install -m 0600 /dev/stdin /etc/cryptsetup-keys.d/cryptlvm.key # cryptsetup -v luksAddKey /dev/sda3 /etc/cryptsetup-keys.d/cryptlvm.key
将密钥文件添加到 initramfs 映像
/etc/mkinitcpio.conf
FILES=(/etc/cryptsetup-keys.d/cryptlvm.key)
设置以下内核参数以使用密钥文件解锁 LUKS 分区。使用 encrypt
钩子
GRUB_CMDLINE_LINUX="... cryptkey=rootfs:/etc/cryptsetup-keys.d/cryptlvm.key"
当使用 sd-encrypt 钩子时,默认情况下将使用 /etc/cryptsetup-keys.d/name.key
,因此无需设置额外的内核参数。
如果由于某种原因密钥文件无法解锁启动分区,systemd 将回退到要求输入密码以进行解锁,并且如果密码正确,则继续启动。
/boot
分区以防止离线篡改威胁,则已贡献 mkinitcpio-chkcryptoboot 钩子以提供帮助。使用 USB 驱动器解锁 /boot
为了避免记住复杂的密码,或使用可能被猜到的简单密码,可以使用存储在外部 USB 驱动器上的密钥文件来解锁 LUKS 卷。为了确保安全,不使用时必须将此 USB 驱动器安全地存放在远离计算机的地方。
首先,以与 #避免必须输入两次密码 中相同的方式生成密钥文件。不要使用相同的密钥文件,因为如果 USB 驱动器丢失或泄露,您将需要替换嵌入在 initramfs 中的密钥文件。
将此密钥文件复制到您的 USB 驱动器并创建一个新的 GRUB 配置文件
/boot/grub/grub-pre.cfg
set crypto_uuid=UUID-of-the-luks-volume set key_disk=UUID-of-the-volume-with-the-key cryptomount -u $crypto_uuid -k ($key_disk)/the-location-of-the-key-on-your-usb set root=UUID-of-the-unlocked-volume-as-in-grub.cfg set prefix=($root)/boot/grub insmod normal normal
创建 GRUB 映像并安装它(并非所有这些模块都将根据您的文件系统需要)
# grub-mkimage -p /boot/grub -O x86_64-efi -c /boot/grub/grub-pre.cfg -o /tmp/grubx64.efi part_gpt part_msdos cryptodisk luks gcry_rijndael gcry_sha512 lvm ext2 ntfs fat exfat # install -v /tmp/grubx64.efi /efi/EFI/GRUB/grubx64.efi
Root on ZFS
要将 dm-crypt 与 ZFS 结合使用,请参见 ZFS#在 ZFS 中使用 dm-crypt 加密。
此外,ZFS 具有 原生加密 功能,该功能也可用于加密系统根目录,但不包括启动加载程序和文件系统元数据。请参见
安装后,可以在基于 UEFI 的系统上使用 安全启动 验证启动加载程序。