自加密硬盘

来自 ArchWiki

基于硬件的全盘加密 (FDE) 现在已由许多硬盘 (HDD) 供应商提供,并且变得越来越普遍,尤其是对于固态硬盘。“自加密硬盘”(SED) 术语在指代具有内置全盘加密的 HDD 或 SSD 时很常见。OPAL 是一组由可信计算组织开发的自加密硬盘规范。

概述

如今,许多可用的自加密硬盘都实现了由可信计算组织 (TCG) 开发的 OPALRubyEnterprise 标准。诸如 Opalite 和 Pyrite 之类的其他标准仅提供 OPAL 提供的部分功能,甚至可能不提供任何实际的静态数据加密[1]。根据标准制造的硬件会相应地进行标记

驱动器的解锁可以在操作系统运行时使用软件实用程序完成,在预启动身份验证环境中完成,或者在启动时使用 #基于 BIOS 的 ATA 密码 完成。

提示: 本页面的上下文中,“加密”指的是基于硬件的加密。有关基于软件的加密,请参阅静态数据加密#块设备加密静态数据加密#堆叠文件系统加密

请参阅#优点#缺点部分,以更好地理解和决定基于硬件的全盘加密是否是您想要的。

密钥管理技术实现

提示: 本节对于理解有效密钥管理和安全擦除磁盘背后的核心概念非常重要。

密钥管理发生在磁盘控制器内部,加密密钥通常是 128 位或 256 位高级加密标准 (AES)。

本文或章节需要扩充。

原因: Opal 标准充满了首字母缩略词。 sedutil 在 FAQ命令语法 中提到了它们。在此部分中命名重要的首字母缩略词(例如 SID、MSID、locking SP、admin SP、MEK、DEK)将很有用,因为它们是标准定义的密钥管理所固有的。(另请参阅 w:密钥托管)。(在Talk:自加密硬盘中讨论)

符合 TCG OPAL 2.0 标准规范(几乎所有现代自加密硬盘)的自加密硬盘通过身份验证密钥和二级数据加密密钥实现密钥管理。数据加密密钥是驱动器上数据实际加密所使用的密钥。身份验证密钥是用户面向的一级密码,用于解密数据加密密钥(继而解密数据)。这种方法具有特定的优势

  • 允许用户更改密码,而无需丢失磁盘上现有的加密数据
    • 这提高了安全性,因为它快速且容易响应安全威胁并撤销泄露的密码
  • 有助于近乎即时且密码学上安全的完整磁盘擦除。

对于那些熟悉的人来说,这个概念类似于 dm-crypt 部署中常用的 LUKS 密钥管理层。使用 LUKS,用户可以拥有多个不同的密钥(密码或密钥文件)来解密主密钥,而主密钥又解密底层数据。这种方法允许用户根据需要更改或撤销这些密钥,而无需重新加密数据,因为主二级加密密钥未更改(本身由新密码重新加密)。

事实上,在具有全盘加密功能的驱动器中,数据在存储到磁盘时始终使用数据加密密钥加密,即使未设置密码(例如,新驱动器)。制造商这样做是为了方便不想启用自加密硬盘安全功能的用户。这些自加密硬盘可以被认为是默认情况下具有零长度密码,该密码始终透明地加密数据(类似于无密码 SSH 密钥如何在没有用户干预的情况下提供某种程度的安全访问)。

如果用户希望在稍后阶段“启用”加密,他们可以配置身份验证密钥(例如密码),该密钥加密现有的数据加密密钥。然后,将来在解密数据加密密钥时,将提示用户输入密码。至关重要的是,由于现有数据加密密钥未重新生成,因此设置密码允许在保留磁盘上现有加密数据的情况下锁定驱动器,从而避免了重新加密驱动器的需要。另一方面,除了安全的全盘擦除之外,没有其他方法可以重新加密数据本身。

优点

  • 更易于设置(与基于软件的加密相比)
  • 对用户来说非常透明,除了初始启动身份验证
  • 静态数据保护
  • 性能提升(CPU 从加密和解密计算中解放出来)
  • 主 CPU 和 RAM 作为可能的攻击目标被消除
  • 最佳速度和#安全磁盘擦除(清理)(无论磁盘大小)
  • 由于可以加密 MBR,从而在预启动身份验证之前使驱动器无法访问,因此可以防止备用启动方法

缺点

  • 挂起和休眠模式的配置很困难,并且可能不可能,具体取决于系统的 EFI 实现。
  • 不进行安全磁盘擦除就无法重新加密数据。
  • 漏洞利用
  • 持续供电漏洞
典型的自加密硬盘一旦解锁,只要供电就会保持解锁状态。可以通过在不切断电源的情况下更改驱动器外部环境来利用此漏洞,实际上使驱动器保持解锁状态。例如,(埃尔朗根-纽伦堡大学的研究人员)已经表明,可以在不切断驱动器电源的情况下将计算机重启到攻击者控制的操作系统中。研究人员还演示了在不切断电源的情况下将驱动器移动到另一台计算机。[2]
  • 内存密钥漏洞
当系统断电进入 S3 (“睡眠”) 模式时,驱动器断电,但驱动器在其内部存储器 (NVRAM) 中保留对加密密钥的访问权限,以便允许恢复 (“唤醒”)。这是必要的,因为对于使用任意操作系统启动的系统,没有标准机制来提示用户再次重新输入预启动解密密码。具有物理驱动器访问权限的攻击者可以利用这一点来访问驱动器。综合已知的漏洞,研究人员总结说“我们能够破解十二个系统中的十一个系统的基于硬件的全盘加密,前提是它们正在运行或处于待机模式”。[3] 但是请注意,sedutil(当前可用于通过 Linux 管理 TCG OPAL 2.0 自加密硬盘的工具集)当前支持 S3 (“睡眠”)。
  • 固件被破坏
驱动器的固件可能被破坏(后门),发送到它的数据也可能被破坏(可以由有问题的恶意第三方解密,前提是可以物理访问驱动器)。一项研究演示了破坏设备固件以及应用无效密码来访问 OPAL 设备上的数据的方法。[4] 如果数据由操作系统(例如 dm-crypt)加密,则加密密钥对于被破坏的驱动器是未知的,从而完全规避了这种攻击媒介。

Linux 支持

本文或章节需要扩充。

原因: 列出 sedutil 支持哪些 TCG 标准。(在Talk:自加密硬盘中讨论)

内核通过 BLK_SED_OPAL 选项支持 OPAL 自加密硬盘。[5] 所有官方支持的内核都是在启用此选项的情况下构建的。

sedutil,在 驱动器信任联盟 (DTA) 的保护伞下,是“一项开源 (GPLv3) 工作,旨在使核心自加密硬盘技术免费提供给开发人员”。[6]

cryptsetup,用于 dm-crypt 的命令行实用程序,获得了有限的 OPAL 支持。请参阅 cryptsetup 2.7.0 发行说明,以检查其功能是否足以满足您的目的。

使用 sedutil

安装 sedutilAUR 软件包,其中包含 sedutil-cli 工具,以及用于创建自定义预启动授权 (PBA) 镜像的辅助脚本,该镜像基于当前正在使用的操作系统(例如,用于设置自定义控制台键盘布局)。或者,您可以仅安装 sedutil 以获取 sedutil-cli 工具集,但下载并使用驱动器信任联盟提供的 预编译 PBA 镜像(适用于 BIOS 或 UEFI)

注意: UEFI 支持当前要求关闭安全启动。

对于通过 SATA 连接的设备,必须libata.allow_tpm 设置为 1(真)才能使用 sedutil。将 libata.allow_tpm=1 添加到内核参数,或者在运行的系统上将 /sys/module/libata/parameters/allow_tpm 设置为 1

警告: 据报告,将 sedutil 与外部驱动器一起使用,即使 sedutil 声称驱动器支持 OPAL,也会使其变砖。例如,WD My Book 外部硬盘所有者应在 Windows 中使用 WD Security 实用程序设置加密,然后 使用 sg_raw 来解锁它。还有一个实用程序支持设置和解锁此类驱动器:wdpassport-utils

加密根(启动)驱动器

以下说明假定您已安装 sedutil-cli 工具(通过 AUR 或其他方式)

检查您的磁盘是否支持 OPAL

# sedutil-cli --scan

如果您得到类似以下内容

Scanning for Opal compliant disks
/dev/sda No  LITEONIT LMT-256L9M-11 MSATA 256GB       HM8110B

那么您的磁盘不支持 OPAL。相反,以下输出表示支持 OPAL 标准 1.0 和 2.0,因为驱动器的第二列中有一个 2(或 12)表示支持 OPAL 2

/dev/sda 12  Samsung SSD 850 EVO 500GB                EMT02B6Q

Windows 版本的 sedutils 输出

\\.\PhysicalDrive0 12  Samsung SSD 850 PRO 512GB                EXM02B6Q

下载救援镜像(可选)

请注意,此救援镜像是在 2017 年构建的,其 PBA 镜像在新 AMD 笔记本电脑上会导致内部键盘输入失败 - 因此需要外部键盘才能输入磁盘密码。您可能想要构建自己的 PBA。

下载驱动器信任联盟提供的机器的 救援系统,例如 RESCUE64.img.gz

注意: UEFI 支持当前要求关闭安全启动。
创建可启动驱动器

解压缩救援镜像(如果需要)

$ gunzip RESCUE64.img.gz

使用下载的救援镜像创建可启动驱动器,例如使用 dd

# dd bs=4M if=path/to/RESCUE64.img of=/dev/sdx status=progress conv=fsync oflag=direct

使用预启动授权 (PBA)

以下步骤将在您的 EFI/BIOS 中安装 PBA 镜像,该镜像将在您的系统之前启动并提示您输入密码。如果密码正确,它将解锁驱动器并重新启动到正常的操作系统引导加载程序。

加密您的驱动器
警告
  • 这些步骤必须从救援系统执行。
  • 这些步骤将为整个驱动器启用加密(锁定范围 0)。虽然这通常不会删除数据,但始终确保进行备份。
启用锁定

启动到救援系统并使用 blkid 的输出来帮助识别正确的驱动器,例如 /dev/sdx

初始设置驱动器,这将把 SID 和 Admin1 密码都设置为您选择的相同密码

# sedutil-cli --initialsetup PASSWORD DRIVE

然后启用全局锁定范围 0(即整个驱动器)

# sedutil-cli --enablelockingrange 0 PASSWORD DRIVE
# sedutil-cli --setmbrdone off PASSWORD DRIVE
设置密码

要选择性地更改密码,从初始设置开始,继续设置之前

# sedutil-cli --setsidpassword PASSWORD NEW_SID_PASSWORD DRIVE

将把 SID 和 Admin1 都更改为 NEW_SID_PASSWORD。仅更改 Admin1 密码

# sedutil-cli --setadmin1pwd PASSWORD NEW_ADMIN1_PASSWORD DRIVE
安装预启动授权

安装预启动授权 (PBA) 镜像

# gunzip /usr/sedutil/UEFI64-*.img.gz
# sedutil-cli --loadPBAimage PASSWORD /usr/sedutil/UEFI64-*.img DRIVE

关闭计算机以锁定驱动器。

下次打开计算机电源时,PBA 应该会要求您输入密码;然后解锁驱动器并链式加载解密的操作系统。

故障排除:PBA 冷重启再次锁定驱动器

某些情况下,PBA 将加载,接受密码,并解锁驱动器,但是当链式加载到解密的操作系统时,它将执行“冷”重启,这会暂时关闭磁盘电源,并导致驱动器再次锁定。因此,您会陷入始终解锁驱动器但永远无法从中启动的循环中。

如果是这种情况,您将需要编辑 UEFI-*.img 以保证它执行“热”重启

# losetup --find --show ./UEFI64-*.img 
# partprobe /dev/loop0
# mount /dev/loop0p1 /mnt
# cd /mnt/EFI/boot
# $EDITOR syslinux.cfg # add " reboot=warm" (no quotes) to the end of the line starting with  "append"
# cd -
# sync
# umount /mnt
# losetup -D

现在,您可以使用以下命令再次将镜像复制到驱动器

# sedutil-cli --loadPBAimage PASSWORD ./UEFI64-*.img DRIVE

如果您使用的是恢复镜像,则上述方法可能不起作用 (losetup -f ./UIEFI64-*.img 失败,并显示 no such file),您可以在计算机上编辑该文件并将其复制到恢复 USB 驱动器上(但在恢复镜像结束后)

# dd bs=4M if=UEFI64.img of=DRIVE seek=100

seek=100 将从驱动器开头跳过 400 MiB,以避免覆盖恢复镜像本身。

然后,一旦恢复启动,您就可以获取您的镜像

# dd bs=4M if=DRIVE of=UEFI64.img skip=100 count=10

count×bs 应该大于文件大小。

将文件截断为实际大小

# truncate -s IMGSIZE UEFI64.img
故障排除:UEFI 丢失其启动配置

如果您使用 EFI 启动存根 并配置 UEFI 直接启动您的内核,则在磁盘解锁后,固件可能会忘记其所有配置(并且每次解锁都会丢失)。在这种情况下,您可以将 UEFI 引导加载程序 安装到默认/回退启动路径 esp/EFI/BOOT/BOOTx64.EFI,然后固件将能够使用其默认配置启动它。

拥有 USB 闪存安装介质 会很有帮助:如果您在解锁磁盘后插入它,它将自动启动并让您配置现在已解锁的启动磁盘。

使用 mkinitcpio 钩子

驱动器可以设置为仅加密根分区,同时保持 /boot 分区可访问,而不是使用 PBA。这样,系统可以启动,并且可以使用 mkinitcpio 钩子在完成启动序列的其余部分之前解锁驱动器。这具有无需安装 PBA 和重新启动的优点,并且还允许更轻松地支持从 S3 睡眠恢复。

加密您的驱动器

按照上面概述的步骤创建救援系统,然后启动到其中。

警告
  • 这些步骤必须从救援系统或安装了 sedutil-cli 的 Live 系统执行。
  • 这些步骤将销毁驱动器上的所有数据。在开始之前,请务必进行备份!

第一个命令将删除驱动器上的所有内容。省略它不会保存您的数据,因为设置新的锁定范围无论如何都会销毁它。

# sedutil-cli --yesIreallywanttoERASEALLmydatausingthePSID PSID DRIVE
# sedutil-cli --initialsetup PASSWORD DRIVE
# sedutil-cli --setMBREnable off PASSWORD DRIVE

PSID(物理安全标识符)只能在物理驱动器标签(驱动器顶部的贴纸)上找到。

注意: PSID 必须在没有破折号、空格或下划线的情况下书写。
分区驱动器

分区驱动器,使其如您所愿,确保 EFI 和/或 /boot 分区位于磁盘的开头,紧随其后的是根分区。例如

  1. 1G, FAT32, /boot
  2. ext4, /

或者稍微复杂的设置

  1. 100M, FAT32, EFI
  2. 2G, ext4, /boot
  3. ext4, /
  4. Swap

重要的是,EFI 和/或 /boot 分区具有足够的空间来容纳您可能想要安装的所有内核镜像。如果不销毁根分区中的所有数据,以后将无法扩展这些分区,因为加密标头将被覆盖。

启用锁定

使用 lsblk --fs 来帮助识别正确的驱动器,例如 /dev/sdx,然后使用 lsblk --f DRIVE 来查找

  • RANGE_START = 根分区的 “Start”(起始扇区)
  • RANGE_LENGTH = 根分区的 “Sectors”(扇区数)

在下面的示例中,RANGE_START 将为 2097152,RANGE_LENGTH 为 974675968。重要的是,这些数字可以被 8 整除,以便与 sedutil-cli 一起使用,可能需要四舍五入。

Device       Start       End   Sectors   Size Type
/dev/sda1     2048   2097151   2095104  1023M EFI System
/dev/sda2  2097152 976773119 974675968 464.8G Linux filesystem

创建锁定范围 1 以仅覆盖根分区(和可选的 swap 分区)

# sedutil-cli --setupLockingRange 1 RANGE_START RANGE_LENGTH PASSWORD DRIVE
# sedutil-cli --enablelockingrange 1 PASSWORD DRIVE
将启动分区锁定为只读(可选)

为了提高安全性,EFI 和/或 /boot 分区可以锁定为只读。以与根分区相同的方式识别 RANGE_START 和 RANGE_LENGTH,然后发出以下命令

# sedutil-cli --setupLockingRange 2 RANGE_START RANGE_LENGTH PASSWORD DRIVE
# sedutil-cli --readonlyLockingRange 2 PASSWORD DRIVE
安装操作系统
警告: 现在关闭系统电源将导致驱动器被锁定。如果发生这种情况,请启动到救援系统并使用以下命令解锁范围
# sedutil-cli --setlockingrange 1 rw PASSWORD DRIVE

然后继续重新启动系统,而不要先关闭电源。

您现在可以安装操作系统,注意使用现有分区,不要以任何方式更改它们。完成后,重新启动到新系统,而不要先关闭电源。

设置 mkinitcpio

本文或章节需要语言、wiki 语法或风格改进。有关参考,请参阅Help:Style

原因: Wiki 不是代码开发平台,因此应将其移至其他位置(例如 AUR)。(在Talk:自加密硬盘中讨论)
自定义 mkinitcpio 钩子

创建一个自定义 mkinitcpio 钩子,以便在启动时询问驱动器密码

/etc/initcpio/install/sedutil
#!/bin/bash

help() {
    cat <<HELPEOF
Unlock OPAL drives by prompting for password
HELPEOF
}

build() {
    add_binary sedutil-cli
    add_binary clear
    add_binary find
    add_binary gawk
    add_binary grep
    add_binary readlink
    add_binary stty
    add_binary xargs
    add_binary partprobe

    add_runscript
}

以下脚本还包含用于解锁启动范围的代码,如果需要,可以取消注释。此外,如果您需要能够从睡眠状态恢复,则可能需要稍微修改以下脚本。有关 S3 睡眠的更多信息和注意事项,请参阅#准备驱动器以休眠

/etc/initcpio/hooks/sedutil
#!/usr/bin/ash

run_hook() {
	msg  "OPAL Drives Unlock"

	for block_device in $(list_block_devices) ; do
		if ! is_opal_drive "$block_device" ; then
			continue
		fi
		opal_unlock "$block_device" "$(get_block_device_info $block_device)"
	done
	
	partprobe
}

list_block_devices() {
	for glob in 'sd[a-z]' 'nvme[0-9]n[0-9]' 'nvme[0-9][0-9]n[0-9][0-9]' ; do
		find /dev/ -name "$glob"
	done
	if [ $? != 0 ] ; then
		msg "Unable to list block devices"
	fi
}

is_opal_drive() {
	sedutil-cli --query "$1" > /dev/null 2> /dev/null
	return $?
}

get_block_device_info() {
	sedutil-cli --query "$1" | gawk '/^\//{print;exit}'
	if [ $? != 0 ] ; then
		msg "Unable to query $1"
	fi
}

opal_unlock() {
	while true ; do
		stty -echo
		echo "Password for"
		echo -n "$2 ($1): "
		read pass
		stty echo

		# Unlock root range for read/write
		sedutil-cli --setlockingrange 1 rw "$pass" "$1"
        # Uncomment to also unlock boot range
		# sedutil-cli --setlockingrange 2 rw "$pass" "$1"
		if [ $? != 0 ] ; then
			echo "Failed to unlock!"
			continue
		fi
        
		echo  "Unlocked!"
		break
	done
}
mkinitcpio 配置中的自定义钩子

编辑您的 mkinitcpio 配置,以在 udev 之前添加 sedutil 钩子。重要的是钩子在 udev 之前运行,否则 udev 将卡在尝试访问加密驱动器并导致 I/O 错误。

注意: 可能需要添加 keyboard 和 keymap 钩子才能在启动时拥有可用的键盘,以及键盘所需的内核模块。有关更多详细信息,请参阅mkinitcpio/Minimal initramfs#键盘模块
警告: 最好创建一个单独的 mkinitcpio 配置和镜像,如 Mkinitcpio#自定义生成 中所述,因为如果例如键盘无法工作,您的系统可能无法启动。
/etc/mkinitcpio.conf
HOOKS=(base keymap consolefont sedutil udev autodetect microcode modconf kms keyboard block filesystems fsck)
重新生成 mkinitcpio 镜像

最后,重新生成 initramfs

您现在可以重新启动系统。如果一切顺利,钩子将提示输入密码以解锁您的驱动器,然后继续执行启动过程的其余部分。如果出现问题,您可以启动到救援系统,手动解锁驱动器,然后使用默认 initcpio 镜像重新启动到您的正常系统,并继续调试您的系统。

从 Live 发行版访问驱动器

最简单的方法是首先启动加密的 SSD,以便运行影子 MBR。然后按提示启动菜单的键并启动您喜欢的任何设备。这样,SED 将完全透明。

另一种方法是直接启动到 Live 发行版并使用 sedutil 解锁 SSD

# sedutil-cli --setlockingrange 0 rw password drive
# sedutil-cli --setmbrdone on password drive
# partprobe drive

验证您是否遵循了#Linux 支持中的注释后的说明。

禁用锁定

如果您想关闭锁定和 PBA

# sedutil-cli --disableLockingRange 0 password drive
# sedutil-cli --setMBREnable off password drive

重新启用锁定和 PBA

您稍后可以使用以下命令序列重新启用锁定和 PBA

# sedutil-cli --enableLockingRange 0 password drive
# sedutil-cli --setMBREnable on password drive

加密非根驱动器

可以设置不用作系统根的辅助驱动器,例如托管永久 /data 分区或便携式 USB 驱动器的单独驱动器。

本文或章节需要扩充。

原因: 如何在启动期间(在后期用户空间中)解锁驱动器,即 /etc/crypttab 对于 sedutil 的等效项是什么?(在Talk:自加密硬盘中讨论)

非根驱动器不需要加载 PBA。因此,激活加密就像运行一样简单

# sedutil-cli --initialsetup password drive
# sedutil-cli --enableLockingRange 0 password drive
# sedutil-cli --setMBREnable off password drive

如果是便携式驱动器和/或您想手动解锁驱动器,您应该像 #从 Live 发行版访问驱动器 中那样做,但您只需要第一个命令,因为尚未启用 MBR 影子。

# sedutil-cli --setlockingrange 0 rw password drive

这将解锁驱动器,直到它断开连接或您的机器进入挂起状态,请注意这可能会导致数据丢失。

更改密码

更改密码不会丢失驱动器上的现有数据,也不需要重新加密数据。

# sedutil-cli --setSIDPassword password newpassword device
# sedutil-cli --setAdmin1Pwd password newpassword device

阅读上面的 #密钥管理技术实现 部分,了解这是如何在驱动器内部安全地实现的,以及为什么可以在丢失驱动器上现有加密数据的情况下更改密码。

从挂起唤醒

警告: 将解锁密码或哈希值保留在磁盘和内核内存中是一项要求。

默认情况下,挂起系统会导致崩溃,因为电源已从驱动器切断,这会导致驱动器自行锁定。为了从挂起状态唤醒,内核应该知道磁盘的哈希密码。自 4.11 起,此功能已在内核中,但仅通过 sedutil 的一个分支可用,即 sedutil-sleep-gitAURsedutil-ladarAUR。请注意,后者具有其他功能,但命令语法略有不同 [7]

为指定为 /dev/device块设备生成哈希密码

# sedutil-sleep --printPasswordHash password /dev/device

准备驱动器以休眠

使用 mkinitcpio 钩子

如果已经使用 mkinitcpio 钩子在启动时解锁驱动器,那么您可以简单地将以下代码添加到钩子中,以便也为休眠准备驱动器。确保此代码放置在解锁范围的命令 sedutil-cli --setlockingrange 之后,否则它将失败。在此示例中,$pass 是包含解锁密码的变量,而 $1 是包含要准备休眠的设备的变量,通常是根分区(例如 /dev/sda1)。

/etc/initcpio/hooks/sedutil
sedutil-cli --prepareForS3Sleep 1 "$pass" "$1"
if [ $? != 0 ] ; then
	msg "Prepare for S3 failed for $1"
fi
使用 systemd 服务

创建一个 systemd 服务,为每个设备插入哈希值

/etc/systemd/system/sedutil-sleep.service
[Unit]
Description=sedutil-sleep

[Service]
Type=oneshot
#Add as many ExecStart lines as needed here
ExecStart=-+/usr/bin/sedutil-sleep -n -x --prepareForS3Sleep 0 hash /dev/device
#ExecStart=-+/usr/bin/sedutil-sleep -n -x --prepareForS3Sleep 0 hash2 /dev/device
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

使用 cryptsetup

本文或章节需要扩充。

原因: 提及/交叉链接 crypttab 支持(在Talk:自加密硬盘#cryptsetup 对 OPAL 的支持中讨论)

cryptsetup 可用于执行 OPAL 的初始设置,相当于 sedutil 的示例,尽管不适用于 USB 驱动器。 cryptsetup 始终在块设备(即单个分区)上使用,并向其添加 LUKS 标头,其中包含 LUKS 加密的 OPAL 密钥以解锁它。 有关详细信息,请参阅 cryptsetup(8) § SED (自加密驱动器) OPAL 扩展

cryptsetup 相较于 sedutil 的优势在于,除了初始的 luksFormat 命令之外,不需要任何特殊的设置。它就像任何其他的 LUKS 设备一样,可以使用 LUKS 提供的所有 功能,并可以选择使用 systemd-cryptenroll

请参阅 cryptsetup 2.7.0 发行说明,其中包含带有 LUKS 标头 OPAL 相关输出的命令示例。

注意: 其他 TCG 安全子系统类标准(例如 TCG Ruby 和 TCG Enterprise)不被支持,因为 cryptsetup 依赖内核来支持 SED,而内核仅支持 OPAL。

加密分区

使用 OPAL 加密分区需要 OPAL 管理员密码。如果您之前没有设置过,您需要使用 cryptsetup-erase(8) 擦除驱动器上的所有数据,才能创建新的 OPAL 管理员密码。按照 #安全磁盘擦除 中的说明执行擦除。


可以使用 cryptsetup-luksFormat(8)--hw-opal-only 选项在分区上设置 OPAL 硬件加密。这将避免软件加密给加密分区和 CPU 带来的性能损失。

或者,可以使用 --hw-opal 选项同时设置 OPAL 硬件加密和 dm-crypt 软件加密。默认的 LUKS2 dm-crypt 加密选项 适用并且可以配置。


例如,以 /dev/sdXY 作为具有 OPAL 支持的驱动器上的分区

# cryptsetup luksFormat --hw-opal-only /dev/sdXY
WARNING!
========
This will overwrite data on /dev/sdXY irrevocably.

Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/sdXY: 
Verify passphrase: 
Enter OPAL Admin password: 
Verify passphrase:

设置完成后,可以打开块设备并使用文件系统进行格式化,请参阅 dm-crypt/Device encryption#使用设备映射器解锁/映射 LUKS 分区。从现在开始,只需要 LUKS 密码,因为标头会自动解锁 OPAL 加密。

注意: 如果系统的 EFI/BIOS 本身支持并配置了 #使用预启动授权 (PBA),则后续还会额外提示输入 /dev/sdXY Admin1 密码。

移除锁定范围

由于 OPAL 锁定范围在锁定状态下既不可读也不可写,因此在移除跨越它的 OPAL 锁定范围之前,无法重新利用加密分区。

要从分区中移除 OPAL 加密,请使用 cryptsetup-erase(8)

警告: 这将擦除 LUKS 标头(与使用软件加密时不同),并不可逆地移除 OPAL 锁定范围,从而无法访问加密数据。LUKS 标头的备份不能用于从此操作中恢复,因为 OPAL 锁定范围无法恢复到之前的状态。
# cryptsetup erase -v /dev/sdXY
Enter OPAL Admin password:
Command successful.

安全磁盘擦除

对于自加密驱动器,全盘擦除非常快速且非常简单。只需传递一个加密磁盘擦除(或加密擦除)命令(在提供正确的身份验证凭据后),驱动器将在内部自生成一个新的随机数据加密密钥。这将永久丢弃旧密钥,从而使加密数据不可撤销地无法解密。驱动器现在将处于“新驱动器”状态。

阅读上面的 #密钥管理技术实现 部分,以了解更多关于如何在驱动器内部安全地实现此操作的信息。

固态硬盘/内存单元清除 文章涵盖了安全执行擦除的全面指南。

警告: 以下命令将擦除驱动器上的所有数据,即使它仅针对分区运行。

以下显示了使用 cryptsetup-erase(8) 执行擦除的示例输出

# cryptsetup erase -v --hw-opal-factory-reset /dev/sdX
Enter OPAL PSID: 

WARNING!
========
WARNING: WHOLE disk will be factory reset and all data will be lost! Continue?

Are you sure? (Type 'yes' in capital letters): YES
Command successful.

-v 选项返回 Command successful 输出。

PSID(物理安全标识符)只能在物理驱动器标签(驱动器顶部的贴纸)上找到。

注意
  • 对于 NVMe 驱动器,请使用设备名称的命名空间形式,即使用 /dev/nvmeXnY 而不是 /dev/nvmeX
  • PSID 必须在书写时没有任何破折号、空格或下划线。
提示: 在执行擦除之前,请检查您的驱动器是否正在使用 最佳逻辑扇区大小

挂起/休眠支持

不需要任何特殊操作,它们的工作方式与常规 LUKS 完全相同,因为 OPAL 重用了现有的 LUKS 框架。

请参阅 dm-crypt/Swap 加密

基于 BIOS 的 ATA 密码

在行业 TCG OPAL 2.0 标准倡议之前,相关的 ATA 标准定义了一个“ATA 安全功能集”,用于使用自加密驱动器进行全盘加密。这依赖于 PC BIOS 而不是驱动器,以提供一个解锁机制,利用 BIOS 来设置用户的加密密码。这种传统的基于 BIOS 的 (ATA) 方法被认为在设置上更不可靠,并且在 PC 供应商之间的互操作性方面更容易出错。[8] 典型的错误包括,例如,一旦设备从不同的硬件供应商的系统插入到系统中,就无法解锁设备。因此,BIOS 对传统密码机制的支持的可用性正在降低,特别是对于消费级硬件。

有关更多信息,请参阅 固态硬盘#安全性

另请参阅