自加密硬盘

来自 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:Self-encrypting drives中讨论)

符合 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:Self-encrypting drives中讨论)

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

sedutilDrive Trust Alliance (DTA) 的保护下,是“一项开源 (GPLv3) 工作,旨在使核心自加密硬盘技术可免费供开发人员使用。”[6]

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

使用 sedutil

安装 sedutilAUR 软件包,其中包含 sedutil-cli 工具和辅助脚本,用于基于当前使用的操作系统创建自定义预启动授权 (PBA) 镜像(例如,用于设置自定义控制台键盘映射)。或者,您可以仅为了获取 sedutil-cli 工具集而安装 sedutil,但下载并使用 Drive Trust Alliance 提供的 预编译 PBA 镜像(用于 BIOS 或 UEFI)

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

对于通过 SATA 连接的设备,必须libata.allow_tpm 设置为 1 (true) 才能使用 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-Image 在较新的 AMD 笔记本电脑上会导致内部键盘输入失败 - 因此需要外部键盘才能输入磁盘密码。您可能想要构建自己的 PBA。

下载 Drive Trust Alliance 提供的机器的 救援系统,例如 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 钩子

除了使用 PBA,还可以将驱动器设置为仅加密根分区,同时保持 /boot 分区可访问。这样,系统可以启动,并且可以使用 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. 交换分区

重要的是 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,以仅覆盖根分区(以及可选的交换分区)

# 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:Self-encrypting drives中讨论)
自定义 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 驱动器的单独驱动器。

本文或章节需要扩充。

原因: 您如何在启动期间(在后期用户空间中)解锁驱动器,即 sedutil 的等效 /etc/crypttab 是什么?(在Talk:Self-encrypting drives中讨论)

非根驱动器不需要加载 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:Self-encrypting drives#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 管理员密码。按照 #安全磁盘擦除 中的说明执行擦除。


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

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


例如,使用 /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.

安全磁盘擦除

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

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

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

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

以下显示了使用 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 对传统密码机制的支持在可用性方面正在下降,特别是对于消费级硬件。

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

另请参阅