dm-crypt/全盘加密

出自 ArchWiki

以下是使用 dm-crypt 进行全系统加密的常见场景示例。它们解释了对正常 安装步骤 所需做的所有调整。所有必要的工具都在 安装镜像 中。

如果您想加密现有的未加密文件系统,请参阅 dm-crypt/设备加密#加密现有的未加密文件系统

概览

就功能和性能而言,保护根文件系统是 dm-crypt 的优势所在。与选择性地加密非根文件系统不同,加密的根文件系统可以隐藏诸如已安装的程序、所有用户帐户的用户名以及常见的数据泄漏途径(如 locate/var/log/)等信息。此外,加密的根文件系统使得篡改系统变得更加困难,因为除了 引导加载程序 和(通常)内核之外的所有内容都已加密。

以下说明的所有场景都具有这些优点,其他区分它们的优点和缺点总结如下

场景 优点 缺点
#分区上的 LUKS

展示了为完全 LUKS 加密的根目录进行基本而直接的设置。

  • 不灵活;要加密的磁盘空间必须预先分配
#带有 TPM2 和安全启动的分区上的 LUKS

与上面的示例类似,安全启动和 TPM2 提供了额外的安全层。

与上述相同的优点,以及

  • 安全启动允许防止 Evil maid 攻击
  • 如果安全启动被禁用或修改,TPM2 可以防止系统被解锁
  • 与上述相同的缺点。
#LVM on LUKS

通过在单个 LUKS 加密分区内使用 LVM 来实现分区灵活性。

  • 简单的分区,需要 LVM 知识
  • 只需一个密钥即可解锁所有卷(例如,轻松的从磁盘恢复设置)
  • 卷布局在锁定时不可见
  • 允许 挂起到磁盘 的最简单方法
  • LVM 添加了额外的映射层和钩子
  • 如果单个卷应接收单独的密钥,则不太有用
#LUKS on LVM

仅在 LVM 设置完成后使用 dm-crypt。

  • LVM 可用于使加密卷跨越多个磁盘
  • 易于混合未加密/加密卷组
  • 复杂;更改卷也需要更改加密映射器
  • 卷需要单独的密钥
  • LVM 布局在锁定时可见
  • 启动时间较慢;每个加密的 LV 必须单独解锁
#LUKS on software RAID

仅在 RAID 设置完成后使用 dm-crypt。

  • 类似于 LUKS on LVM
  • 类似于 LUKS on LVM 和加密的启动分区 (GRUB)
#Plain dm-crypt

使用 dm-crypt plain 模式,即没有 LUKS 标头及其多密钥选项。
此场景还使用 USB 设备用于 /boot 和密钥存储,这可以应用于其他场景。

  • 在 LUKS 标头可能损坏的情况下具有数据弹性
  • 允许 可否认加密
  • 有助于解决 SSD 的 问题
  • 需要高度注意所有加密参数
  • 单个加密密钥且无法更改
  • 对于常规使用的系统来说,设置非常复杂
#加密的启动分区 (GRUB)

展示了如何使用 GRUB 引导加载程序加密启动分区。
此场景还使用了 EFI 系统分区,这可以应用于其他场景。

  • 与安装所基于的场景(本例中为 LVM on LUKS)相同的优点
  • 更少的数据保持未加密状态,即引导加载程序和 EFI 系统分区(如果存在)
  • 与安装所基于的场景(本例中为 LVM on LUKS)相同的缺点
  • 更复杂的配置
  • 其他引导加载程序不支持
  • GRUB 解锁 LUKS 需要很长时间,因此会减慢启动速度
#Root on 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,请将 keyboardencrypt 钩子添加到 mkinitcpio.conf。如果您使用非美式键盘布局或非默认控制台字体,请分别额外添加 keymapconsolefont 钩子。

HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt filesystems fsck)

如果使用基于 systemd 的 initramfs,则改为添加 keyboardsd-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

设备-UUID 指的是 LUKS 超级块的 UUID,在本例中是 /dev/sda2 的 UUID。有关详细信息,请参阅 持久块设备命名

另请参阅 dm-crypt/系统配置#内核参数 以获取更多详细信息。

提示: 如果根分区与 /boot 分区在同一磁盘上,并且您的 UEFI 引导加载程序支持 GPT 分区自动挂载,您可以配置 分区类型 GUID(类型应为 “Root partition”,而不是 “LUKS partition”),并依赖 systemd-gpt-auto-generator(8) 而不是使用内核参数。

在使用 TPM2 和安全启动的分区上使用 LUKS

此示例类似于 #LUKS on a partition,但集成了 安全启动可信平台模块 (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 码才能解锁。
警告
  • 确保在绑定到 PCR 7 时 安全启动 处于活动状态和用户模式,否则,未经授权的启动设备可能会解锁加密卷。
  • 如果固件证书发生更改,PCR 7 的状态可能会更改,这可能会导致用户被锁定。这可以通过 fwupd[2] 隐式完成,也可以通过轮换安全启动密钥显式完成。

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 钩子时,此方法不允许您跨多个磁盘扩展逻辑卷;请使用 sd-encrypt 或参阅 dm-crypt/特性#修改 encrypt 钩子以支持多个分区
提示: 此设置的两种变体

准备磁盘

在创建任何分区之前,您应该了解安全擦除磁盘的重要性和方法,这在 dm-crypt/驱动器准备 中进行了描述。

提示: 当使用 GRUB 引导加载程序从 GPT 磁盘进行 BIOS 启动时,请创建一个 BIOS 启动分区

创建一个分区,大小为 1 GiB 或更大,用于挂载到 /boot

提示: UEFI 系统可以使用 EFI 系统分区 作为 /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

在卷组上创建所有逻辑卷

提示: 如果逻辑卷将使用 ext4 格式化,请在卷组中保留至少 256 MiB 的可用空间,以便使用 e2scrub(8)。在创建最后一个卷时使用 -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

确保已安装 lvm2 软件包。

如果使用默认的基于 busybox 的 initramfs,请将 keyboardencryptlvm2 钩子添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别额外添加 keymapconsolefont 钩子。

HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck)

如果使用基于 systemd 的 initramfs,请改为添加 keyboardsd-encryptlvm2 钩子。如果您使用非美国控制台键盘布局或非默认控制台字体,请额外添加 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 卷,然后将其用作加密分区的基础。 这样,也可以混合使用加密和非加密卷/分区。

提示:#LVM on LUKS 不同,此方法允许正常地跨多个磁盘扩展逻辑卷。

以下简短示例创建了一个 LUKS on LVM 设置,并混合使用了用于 /home 分区的密钥文件和用于交换的临时加密卷。 从安全角度来看,这被认为是理想的,因为在重新启动时,当重新初始化加密时,没有潜在的敏感临时数据会残留。 如果您有 LVM 经验,您将能够根据您的计划忽略/替换 LVM 和其他细节。

如果您想跨已设置的多个磁盘扩展逻辑卷,或扩展 /home(或任何其他卷)的逻辑卷,请参阅dm-crypt/特性#在多个磁盘上扩展 LVM中描述的步骤。 重要的是要注意,LUKS 加密容器也必须调整大小。

本文或章节需要扩充。

原因: 现在 #概述 中添加了比较,本场景的介绍需要进行一些调整。 建议的结构是使其类似于 #LUKS on a partition 的介绍。(在 Talk:Dm-crypt/Encrypting an entire system 中讨论)

准备磁盘

分区方案

+----------------+-------------------------------------------------------------------------------------------------+
| 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 中加密。

提示: 如果您必须从 Arch-ISO 访问加密的 root 分区,则在 LVM 显示后,上述 open 操作将允许您进行访问。

准备启动分区

在用于 /boot 的分区上创建一个 文件系统。对于 UEFI 系统上的 EFI 系统分区,请执行

# mkfs.fat -F32 /dev/sda1

或者对于 BIOS 系统上的普通启动分区

# mkfs.ext4 /dev/sda1

之后创建挂载点目录并挂载分区

# mount --mkdir /dev/sda1 /mnt/boot

配置 mkinitcpio

确保已安装 lvm2 软件包。

如果使用默认的基于 busybox 的 initramfs,请将 keyboardencryptlvm2 钩子添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别额外添加 keymapconsolefont 钩子。

HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block lvm2 encrypt filesystems fsck)

如果使用基于 systemd 的 initramfs,请改为添加 keyboardsd-encryptlvm2 钩子。如果您使用非美国控制台键盘布局或非默认控制台字体,请额外添加 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

需要 crypttabfstab 条目来解锁设备并分别挂载文件系统。 以下行将在每次重启时重新加密交换卷

/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

加密挂载在 crypttabfstab 中配置

/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

此示例对 root 分区使用 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/urandomdd,但这会慢得多。

# 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 设置加密

警告: GRUB 对 LUKS2 的支持有限; 请参阅 GRUB#加密的 /boot 了解详情。 对于 GRUB 需要解锁的分区,请使用带有 PBKDF2 的 LUKS2 (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 映像中来完成的,以允许 encrypt 钩子解锁 root 设备。 有关详细信息,请参阅dm-crypt/设备加密#使用嵌入在 initramfs 中的密钥文件

  • 创建密钥文件并将密钥添加到 /dev/md/root
  • 为 HDD (/dev/sdc1) 创建另一个密钥文件,以便也可以在启动时解锁它。 为了方便起见,保留上面创建的密码,因为如果您需要它,这可以使恢复更容易。 编辑 /etc/crypttab 以在启动时解密 HDD。 请参阅dm-crypt/系统配置#使用密钥文件解锁

配置系统

编辑 fstab 以挂载 root 和数据块设备以及 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:磁盘加密#全磁盘加密

请注意,如果不需要全磁盘加密,则上述部分中描述的使用 LUKS 的方法是系统加密和加密分区的更好选择。 LUKS 功能,例如使用多个密码/密钥文件进行密钥管理、主密钥备份或就地重新加密设备,在 plain 模式下不可用。

Plain dm-crypt 加密可能比 LUKS 更能抵抗损坏,因为它不依赖于加密主密钥,如果损坏或强行销毁,加密主密钥可能成为单点故障。 但是,使用 plain 模式还需要更多手动配置加密选项才能实现相同的密码强度。 另请参阅静态数据加密#加密元数据。 如果担心 dm-crypt/特性#固态硬盘 (SSD) 的 Discard/TRIM 支持 中解释的问题,也可以考虑使用 plain 模式。

提示: 如果无标头加密是您的目标,但不确定 plain 模式中缺少密钥派生,则有两种替代方案

该方案使用两个 USB 闪存盘

  • 一个用于启动设备,这也允许存储在引导加载器配置中打开/解锁 plain 加密设备所需的选项,因为每次启动时都输入它们容易出错;
  • 另一个用于加密密钥文件,假设它存储为原始位,这样对于可能获得 usbkey 的不知情的攻击者来说,加密密钥将显示为随机数据,而不是显示为普通文件。 另请参阅Wikipedia:隐蔽式安全,请按照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/设备加密#纯文本模式的加密选项

使用设备 /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 中提倡的一种比使用 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

确保已安装 lvm2 软件包。

如果使用默认的基于 busybox 的 initramfs,请将 keyboardencryptlvm2 钩子添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别额外添加 keymapconsolefont 钩子。

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/系统配置#内核参数

提示: 如果使用 GRUB,您可以将其安装在与 /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 加密容器

警告: GRUB 对 LUKS2 的支持有限; 请参阅 GRUB#加密的 /boot 了解详情。 对于 GRUB 需要解锁的分区,请使用带有 PBKDF2 的 LUKS2 (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启动加载程序 步骤。

配置 mkinitcpio

确保已安装 lvm2 软件包。

如果使用默认的基于 busybox 的 initramfs,请将 keyboardencryptlvm2 钩子添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别额外添加 keymapconsolefont 钩子。

HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck)

如果使用基于 systemd 的 initramfs,请改为添加 keyboardsd-encryptlvm2 钩子。如果您使用非美国控制台键盘布局或非默认控制台字体,请额外添加 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 钩子

/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#加密的 /bootdevice-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 分区。

避免需要输入两次密码短语

本文或本节是与 Dm-crypt/设备加密#使用嵌入在 initramfs 中的密钥文件 合并的候选对象。

注意: 内容重复过多,对于此概述页面而言,此处细节过多。(在 Talk:Dm-crypt/Encrypting an entire system#Grub 密钥文件的安全问题 中讨论)

虽然 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)

重新生成 initramfs.

设置以下内核参数以使用密钥文件解锁 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

ZFS 根目录

本文或本节正在考虑删除。

原因: 与 LUKS 或纯 dm-crypt 上的任何其他文件系统相比,ZFS on LUKS 或纯 dm-crypt 之间的加密设置本质上没有区别。ZFS 原生加密不在本文的讨论范围之内。(在 Talk:Dm-crypt/Encrypting_an_entire_system 中讨论)

要将 dm-crypt 与 ZFS 一起使用,请参阅 ZFS#在 ZFS 中使用 dm-crypt 加密

此外,ZFS 具有 原生加密 功能,该功能也可用于加密系统根目录,但不包括启动加载程序和文件系统元数据。请参阅

安装完成后,可以在基于 UEFI 的系统上使用 安全启动来验证启动加载程序。