dm-crypt/驱动器准备

出自 ArchWiki

在加密驱动器之前,建议执行安全擦除,方法是用随机数据覆盖整个设备。为了防止密码学攻击或不必要的文件恢复,理想情况下,这些数据应与稍后由 dm-crypt 写入的数据无法区分。有关更全面的讨论,请参阅静态数据加密#准备磁盘

安全擦除驱动器

在决定使用哪种方法来安全擦除驱动器时,请记住,只要驱动器持续用作加密设备,就只需要执行一次此操作。

警告
  • 在开始之前,请对重要数据进行适当的备份!
  • 如果您计划使用 TRIM,请勿使用随机数据覆盖 SSD。未使用的块将在第一次 TRIM 后被标记为空,并最终被擦除,从而撤消您执行的操作。
注意: 当擦除大量数据时,该过程将需要数小时到数天才能完成。
提示
  • 在继续操作之前,请检查您的高级格式驱动器是否正在使用最佳逻辑扇区大小
  • 在多 TB 设备上,填充加密驱动器的过程可能需要一天以上才能完成。为了在操作期间不使机器无法使用,可能值得从已安装在另一个驱动器上的系统而不是从 Arch Live 安装系统执行此操作。
  • 对于 SSD,为了尽最大努力减少闪存缓存伪像,请考虑在以下说明之前执行 SSD 内存单元清除

通用方法

有关如何擦除和准备驱动器的详细说明,请查阅安全擦除磁盘

dm-crypt 特定方法

以下两种方法是 dm-crypt 特有的,之所以提及它们是因为它们非常快速,并且也可以在分区设置后执行。

cryptsetup FAQ(项目 2.19 “如何使用加密级随机性擦除设备?”)提到了一个非常简单的程序,可以使用现有的 dm-crypt 卷来擦除底层块设备上所有可访问的可用空间,方法是充当简单的伪随机数生成器。据称它还可以防止泄露使用模式。这是因为加密数据实际上与随机数据无法区分。

在空的设备或分区上 dm-crypt 擦除

首先,在要加密的分区(使用 sdXY 形式)或完整设备(使用 sdX 形式)上创建一个临时加密容器

# cryptsetup open --type plain --key-file /dev/urandom --sector-size 4096 /dev/block-device to_be_wiped

您可以验证它是否存在

# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda             8:0    0  1.8T  0 disk
└─to_be_wiped 252:0    0  1.8T  0 crypt

用零擦除容器。不需要使用 if=/dev/urandom,因为加密密码用于随机性。

# dd if=/dev/zero of=/dev/mapper/to_be_wiped status=progress bs=1M
dd: writing to ‘/dev/mapper/to_be_wiped’: No space left on device
提示: 要执行操作检查,请在创建擦除容器之前将分区清零。在擦除命令之后,可以使用 blockdev --getsize64 /dev/mapper/container 以 root 身份获取精确的容器大小。容器关闭后,可以使用 od 来抽查擦除是否覆盖了清零的扇区。例如,# od -j $((containersize - blocksize)) /dev/nvme0n1 以查看擦除是否已完成到末尾。

最后,关闭临时容器

# cryptsetup close to_be_wiped

当加密整个系统时,下一步是#分区。如果只是加密分区,请继续dm-crypt/加密非根文件系统#分区

安装后 dm-crypt 擦除可用空间

安装之前没有时间进行擦除过程的用户,可以在加密系统启动并且文件系统已挂载后,实现类似的效果。但是,请考虑相关的文件系统是否可能设置了保留空间,例如,为 root 用户或其他 磁盘配额 机制,这可能会限制擦除,即使是由 root 用户执行的:底层块设备的某些部分可能根本不会被写入。

要执行擦除,请通过写入加密容器内的文件来临时填充分区剩余的可用空间

# dd if=/dev/zero of=/file/in/container status=progress
dd: writing to ‘/file/in/container’: No space left on device

将缓存同步到磁盘,然后删除文件以回收可用空间。

# sync
# rm /file/in/container

上述过程必须对创建的每个分区块设备及其中的文件系统重复执行。例如,设置LVM on LUKS,该过程必须对每个逻辑卷执行。

安装后 dm-crypt 擦除可用空间 (通过重新加密)

或者,对于想要完全擦除可用空间而无需重新安装的用户,可以通过重新加密 LUKS 设备来实现。每个 LUKS 设备需要执行一次。但请注意,此过程可能较慢(例如,在台式 HDD 上约为 50MB/s)。

擦除 LUKS 标头

使用 LUKS 的分区由两个部分组成:标头和加密数据。标头包含密钥和加密参数,没有这些密钥和加密参数,实际上不可能恢复数据。如果创建新分区或停用驱动器,可能只需删除该部分即可,而无需擦除整个设备。有关注意事项,请参阅本小节末尾的段落。

警告: 此操作是不可逆的,因此请务必小心。

要擦除所有密钥,请使用以下命令

# cryptsetup erase device

通过调用来确保没有剩余的活动插槽

# cryptsetup luksDump device

此外,LUKS 标头本身也可以删除,以防止 cryptsetup 将来检测到它,方法是在密钥擦除后调用 wipefs

# wipefs -a device

加密数据仍然存在。截至 2020 年,尚无已知的实用方法可以解密数据,但这在未来可能会改变。权衡安全性和隐私性与执行整个驱动器的适当擦除所需的时间由用户自行决定。

在某些存储介质上,特别是基于闪存的存储介质,可能无法可靠地覆盖数据。包含密钥的 LUKS 标头可能仍然存储在操作系统无法访问的位置(例如,驱动器缓存)。如果这是一个问题,则必须使用 ATA 安全擦除。该操作应该擦除设备上的所有块,包括软件不可见的块。有关详细信息,请参阅 cryptsetup FAQ 5.19

分区

注意: 如果您计划使用 OPAL 硬件加密 并且之前没有为驱动器设置 OPAL 管理员密码,您将需要使用 cryptsetup-erase(8) 擦除驱动器上的所有数据,以便能够创建新的 OPAL 管理员密码。按照 自加密驱动器#安全磁盘擦除 中的说明在分区之前执行擦除。

本节仅在加密整个系统时适用。在驱动器已被安全覆盖后,必须准确选择适当的分区方案,同时考虑到 dm-crypt 的要求,以及各种选择对生成的系统管理的影响。

现在需要注意的是,在几乎所有情况下,都必须为 /boot 设置单独的分区,该分区必须保持未加密状态,因为引导加载程序需要访问 /boot 目录,在其中加载引导系统其余部分所需的 initramfs/加密模块(有关详细信息,请参阅mkinitcpio)。如果这引起安全问题,请参阅 dm-crypt/Specialties#保护未加密的引导分区

另一个需要考虑的重要因素是如何处理交换空间和系统挂起,请参阅 dm-crypt/Swap 加密

物理分区

在最简单的情况下,加密层可以直接基于物理分区;有关创建它们的方法,请参阅分区。就像在未加密的系统中一样,除了上面提到的 /boot 分区之外,根分区就足够了。此方法允许决定要加密哪些分区以及要保留哪些分区不加密,并且无论涉及多少个磁盘,其工作方式都相同。将来也可以添加或删除分区,但是调整分区大小将受到托管它的磁盘大小的限制。最后请注意,需要单独的密码或密钥才能打开每个加密分区,即使这可以在启动期间使用 crypttab 文件自动完成,请参阅 Dm-crypt/System configuration#crypttab

堆叠块设备

但是,如果需要更大的灵活性,dm-crypt 可以与其他堆叠块设备(如 LVMRAID)共存。加密容器可以位于其他堆叠块设备的下方或上方

  • 如果在加密层之上创建 LVM/RAID 设备,则可以自由地添加、删除和调整同一加密分区的文件系统大小,并且所有这些文件系统只需要一个密钥或密码。但是,由于加密层位于物理分区上,因此将无法利用 LVM 和 RAID 跨越多个磁盘的能力。
  • 如果在 LVM/RAID 设备之上创建加密层,将来仍然可以重新组织文件系统,但会增加复杂性,因为必须相应地调整加密层。此外,需要单独的密码或密钥才能打开每个加密设备。但是,对于需要加密文件系统跨越多个磁盘的系统来说,这是唯一的选择。

Btrfs 子卷

Btrfs 的内置子卷功能可以与 dm-crypt 一起使用,如果不需要其他文件系统,则可以完全替代 LVM 的需求。

启动分区 (GRUB)

请参阅 dm-crypt/加密整个系统#加密启动分区 (GRUB)