dm-crypt/加密整个系统
以下是使用 dm-crypt 进行全系统加密的常见场景示例。它们解释了对正常 安装步骤 需要进行的所有调整。所有必要的工具都位于 安装镜像 中。
如果您想加密现有的未加密文件系统,请参阅 dm-crypt/设备加密#加密现有的未加密文件系统。
概览
保护根文件系统是 dm-crypt 的优势所在,无论在功能还是性能方面。与选择性加密非根文件系统不同,加密的根文件系统可以隐藏诸如已安装的程序、所有用户帐户的用户名以及常见的数据泄漏途径(如 locate 和 /var/log/
)等信息。此外,加密的根文件系统使篡改系统变得更加困难,因为除了 引导加载器 和(通常)内核之外的所有内容都已加密。
以下说明的所有场景都具有这些优点,其他区分它们的优点和缺点总结如下
场景 | 优点 | 缺点 |
---|---|---|
#分区上的 LUKS
展示了完全 LUKS 加密根目录的基本且直接的设置。 |
|
|
#带有 TPM2 和安全启动的分区上的 LUKS
与上面的示例类似,安全启动和 TPM2 提供了额外的安全层。 |
与上述相同的优点,以及
|
|
#LUKS 上的 LVM
通过在单个 LUKS 加密分区内使用 LVM 来实现分区灵活性。 |
|
|
#LVM 上的 LUKS
仅在 LVM 设置完成后使用 dm-crypt。 |
|
|
#软件 RAID 上的 LUKS
仅在 RAID 设置完成后使用 dm-crypt。 |
|
|
#纯 dm-crypt
使用 dm-crypt 纯模式,即没有 LUKS 标头及其用于多密钥的选项。 |
| |
#加密的启动分区 (GRUB)
展示了如何使用 GRUB 引导加载器加密启动分区。 |
|
|
#ZFS 上的根目录 |
虽然以上所有方案都比加密的辅助文件系统提供更大的外部威胁防护,但它们也存在一个共同的缺点:任何拥有加密密钥的用户都能够解密整个驱动器,因此可以访问其他用户的数据。如果这是您担心的问题,则可以使用块设备和堆叠文件系统加密的组合,并获得两者的优势。请参阅 静态数据加密 以提前规划。
有关方案中使用的分区策略的总体概述,请参阅 dm-crypt/驱动器准备#分区。
另一个需要考虑的领域是是否设置加密交换分区以及哪种类型。有关替代方案,请参阅 dm-crypt/交换加密。
如果您预计不仅要保护系统数据免受物理盗窃,还需要防范逻辑篡改的预防措施,请在遵循其中一个方案后,参阅 dm-crypt/特殊功能#保护未加密的启动分区 以了解更多可能性。
对于 固态硬盘,您可能需要考虑启用 TRIM 支持,但请注意,这存在潜在的安全隐患。有关更多信息,请参阅 dm-crypt/特殊功能#固态硬盘 (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
钩子添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别另外添加 keymap
和 consolefont
钩子。
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt filesystems fsck)
如果使用基于 systemd 的 initramfs,则改为添加 keyboard
和 sd-encrypt
钩子。如果您使用非美国控制台键盘布局或非默认控制台字体,请另外添加 sd-vconsole
钩子。
HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt filesystems fsck)
保存更改后,重新生成 initramfs。有关详细信息以及您可能需要的其他钩子,请参阅dm-crypt/系统配置#mkinitcpio。
配置引导加载程序
为了在启动时解锁加密的根分区,引导加载程序需要设置以下内核参数
cryptdevice=UUID=device-UUID:root root=/dev/mapper/root
如果使用 sd-encrypt 钩子,则需要设置以下参数
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 镜像,而无需任何引导加载程序,请参阅统一内核镜像#直接从 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 | +-----------------------------------------------------------------------+ +----------------+
- dm-crypt/Specialties#使用分离的 LUKS 标头的加密系统中的说明使用此设置,并将分离的 LUKS 标头放在 USB 设备上,以实现双因素身份验证。
- dm-crypt/Specialties#加密 /boot 和 USB 设备上分离的 LUKS 标头中的说明使用此设置,并将分离的 LUKS 标头、加密的
/boot
分区和加密的密钥文件都放在 USB 设备上。
准备磁盘
在创建任何分区之前,您应该了解安全擦除磁盘的重要性和方法,这在 dm-crypt/驱动器准备 中进行了描述。
创建一个分区,以挂载到 /boot
,大小为 1 GiB 或更大。
/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 和 Boot loader 步骤。
配置 mkinitcpio
如果使用基于 busybox 的默认 initramfs,请将 keyboard
、encrypt
和 lvm2
钩子添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别另外添加 keymap
和 consolefont
钩子。
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。有关详细信息以及您可能需要的其他钩子,请参阅dm-crypt/系统配置#mkinitcpio。
注意:当使用 dracut 时,不需要额外的设置,因为所需的模块已包含在内。
配置引导加载程序
为了在启动时解锁加密的根分区,引导加载程序需要设置以下内核参数
cryptdevice=UUID=device-UUID:cryptlvm root=/dev/MyVolGroup/root
如果使用 sd-encrypt 钩子,则需要设置以下参数
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/特殊技巧#在多个磁盘上扩展 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/驱动器准备#在空设备或分区上 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/设备加密#LUKS 模式的加密选项。 请注意,/home
将在 #加密逻辑卷 /home 中加密。
open
操作将在 LVM 显示 后允许您这样做。准备启动分区
在用于 /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
钩子添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别另外添加 keymap
和 consolefont
钩子。
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。有关详细信息以及您可能需要的其他钩子,请参阅dm-crypt/系统配置#mkinitcpio。
配置引导加载程序
为了在启动时解锁加密的根分区,引导加载程序需要设置以下内核参数
cryptdevice=UUID=device-UUID:root root=/dev/mapper/root
如果使用 sd-encrypt 钩子,则需要设置以下参数
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
。
在驱动器上的剩余空间中创建一个分区(本例中为 /dev/sda3
),用于 “Linux RAID”。 为 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/驱动器准备 中所述,设备使用随机数据和带有随机密钥的加密设备进行擦除,利用 /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/系统配置#内核参数 和 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/设备加密#使用嵌入在 initramfs 中的密钥文件。
- 创建 密钥文件 并将密钥添加到
/dev/md/root
。 - 为 HDD (
/dev/sdc1
) 创建另一个密钥文件,以便它也可以在启动时解锁。 为了方便起见,保留上面创建的密码,因为如果您需要,这可以使恢复更容易。 编辑/etc/crypttab
以在启动时解密 HDD。 请参阅 dm-crypt/系统配置#使用密钥文件解锁。
配置系统
编辑 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/系统配置#mkinitcpio。
Plain dm-crypt
与 LUKS 相反,dm-crypt plain 模式不需要加密设备上的标头:此场景利用此功能在未分区、加密的磁盘上设置系统,该系统将与填充随机数据的磁盘无法区分,这可能允许 可否认加密。 另请参阅 wikipedia:Disk encryption#全磁盘加密。
请注意,如果不需要全磁盘加密,则上面各节中描述的使用 LUKS 的方法对于系统加密和加密分区来说都是更好的选择。 LUKS 功能,如使用多个密码/密钥文件的密钥管理、主密钥备份或就地重新加密设备,在 plain 模式下不可用。
Plain dm-crypt 加密可能比 LUKS 更能抵抗损坏,因为它不依赖于加密主密钥,如果主密钥损坏或被强行销毁,则可能成为单点故障。 然而,使用 plain 模式还需要更多手动配置加密选项才能达到相同的密码强度。 另请参阅 静态数据加密#密码元数据。 如果担心 dm-crypt/特殊技巧#固态硬盘 (SSD) 的 Discard/TRIM 支持 中解释的问题,也可以考虑使用 plain 模式。
- 带有分离 LUKS 标头的 dm-crypt LUKS 模式,通过使用 cryptsetup
--header
选项。 它不能与标准 encrypt 钩子一起使用,但可以修改钩子。 - tcplay,它提供无标头加密,但具有 PBKDF2 功能。
该场景使用两个 USB 闪存盘
- 一个用于启动设备,这也允许存储在启动加载程序配置中打开/解锁 plain 加密设备所需的选项,因为每次启动都输入它们容易出错;
- 另一个用于加密密钥文件,假设它存储为原始位,这样对于可能获得 usbkey 的不知情的攻击者来说,加密密钥将显示为随机数据,而不是显示为普通文件。 另请参阅 Wikipedia:Security through obscurity,按照 dm-crypt/设备加密#密钥文件 准备密钥文件。
磁盘布局是
+----------------------+----------------------+----------------------+ +----------------+ +----------------+ | 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/驱动器准备 和 dm-crypt/驱动器准备#dm-crypt 特定方法
准备非启动分区
有关详细信息,请参阅 dm-crypt/设备加密#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
- 对于不需要 LVM 的情况,cryptsetup FAQ 中提倡的更简单的替代方案是在整个映射的 dm-crypt 设备上直接创建一个文件系统。
- 如果逻辑卷将使用 ext4 格式化,请在卷组中至少保留 256 MiB 的可用空间,以便使用 e2scrub(8)。在创建最后一个卷时使用
-l 100%FREE
后,可以通过使用lvreduce -L -256M MyVolGroup/home
减小其大小来实现。
接下来,我们在映射的设备上设置 LVM 逻辑卷。更多细节请参阅 Install Arch Linux on LVM
# 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
钩子添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别另外添加 keymap
和 consolefont
钩子。
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck)
保存更改后,重新生成 initramfs。有关详细信息以及您可能需要的其他钩子,请参阅dm-crypt/系统配置#mkinitcpio。
配置引导加载程序
为了启动加密的根分区,需要由引导加载程序设置以下内核参数(请注意,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/系统配置#内核参数。
/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 中使用的任何内容、内核或引导加载程序时;/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 系统,为了与 grub-install
兼容,请在 /efi
创建 EFI 系统分区的挂载点并挂载它
# 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 和 引导加载程序 步骤。
配置 mkinitcpio
如果使用基于 busybox 的默认 initramfs,请将 keyboard
、encrypt
和 lvm2
钩子添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别另外添加 keymap
和 consolefont
钩子。
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。有关详细信息以及您可能需要的其他钩子,请参阅dm-crypt/系统配置#mkinitcpio。
配置 GRUB
配置 GRUB 以允许从 LUKS 加密分区上的 /boot
启动
/etc/default/grub
GRUB_ENABLE_CRYPTODISK=y
设置内核参数,以便 initramfs 可以解锁加密的根分区。使用 encrypt
hook
/etc/default/grub
GRUB_CMDLINE_LINUX="... cryptdevice=UUID=device-UUID:cryptlvm ..."
如果使用 sd-encrypt 钩子,则需要设置以下参数
/etc/default/grub
GRUB_CMDLINE_LINUX="... rd.luks.name=device-UUID=cryptlvm ..."
有关详细信息,请参阅 dm-crypt/系统配置#内核参数 和 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
hook
GRUB_CMDLINE_LINUX="... cryptkey=rootfs:/etc/cryptsetup-keys.d/cryptlvm.key"
当使用 sd-encrypt hook 时,默认将使用 /etc/cryptsetup-keys.d/name.key
,因此无需设置额外的内核参数。
如果由于某种原因密钥文件无法解锁引导分区,systemd 将回退到要求输入密码以进行解锁,如果密码正确,则继续启动。
/boot
分区以防止离线篡改威胁,mkinitcpio-chkcryptoboot hook 已被贡献出来以提供帮助。使用 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 的系统上使用 安全启动 验证引导加载程序。