dm-crypt/全盘加密

出自 ArchWiki
(重定向自 Encrypted LVM)

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

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

概述

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

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

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

展示了全 LUKS 加密根目录的基本且直接的设置。

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

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

与上述相同的优点,以及

  • 安全启动允许防御 邪恶女仆攻击
  • 如果禁用或修改了安全启动,TPM2 会阻止系统解锁
  • 与上述相同的缺点。
#LVM on LUKS

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

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

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

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

仅在 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/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,请将 keyboardencrypt hooks 添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别添加 keymapconsolefont hooks。

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

如果使用基于 systemd 的 initramfs,则改为添加 keyboardsd-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-FBCAF984B709fdisk 中的 “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 码才能解锁。
警告
  • 绑定到 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 hook,但此方法不允许您将逻辑卷跨越多个磁盘;请使用 sd-encrypt 或参阅 dm-crypt/Specialties#修改 encrypt hook 以支持多个分区
提示: 此设置的两种变体

准备磁盘

在创建任何分区之前,您应该了解安全擦除磁盘的重要性和方法,这在 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 hooks 添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别添加 keymapconsolefont hooks。

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

如果使用基于 systemd 的 initramfs,则改为添加 keyboardsd-encryptlvm2 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 卷,然后将其用作加密分区的基础。这样,也可以混合使用加密和非加密卷/分区。

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

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

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

本文或章节需要扩充。

原因: 此场景的介绍需要进行一些调整,因为已将比较添加到 #概述 中。建议的结构是使其类似于 #在分区上使用 LUKS 的介绍。(在 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/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 中加密。

提示: 如果您必须从 Arch-ISO 访问加密的根目录,则在 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 hooks 添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别添加 keymapconsolefont hooks。

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。有关详细信息以及您可能需要的其他 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

需要 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

此示例对根目录使用 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/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/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 模式。

提示: 如果无头加密是您的目标,但不确定 plain 模式是否缺乏密钥派生,那么以下两种替代方案是

此方案使用两个 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 preparationdm-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

确保已 安装 lvm2 软件包。

如果使用默认的基于 busybox 的 initramfs,请将 keyboardencryptlvm2 hooks 添加到 mkinitcpio.conf。如果您使用非美国控制台键盘布局或非默认控制台字体,请分别添加 keymapconsolefont 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#内核参数

提示: 如果使用 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 中使用的任何内容、内核或 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 加密容器

警告: 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

现在,在此处继续通用的 安装指南#安装 步骤。返回此页面以自定义 InitramfsBoot loader 步骤。

配置 mkinitcpio

确保已 安装 lvm2 软件包。

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

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。有关详细信息以及您可能需要的其他 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#加密 /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/Device encryption#使用嵌入在 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

Root on ZFS

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

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

要将 dm-crypt 与 ZFS 结合使用,请参见 ZFS#在 ZFS 中使用 dm-crypt 加密

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

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