自加密硬盘

来自 ArchWiki
(重定向自 OPAL)

基于硬件的全盘加密 (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] 所有官方支持的内核都构建时启用了此选项。

sedutil,在 Drive 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 镜像在新 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 = 根分区的“起始扇区”
  • RANGE_LENGTH = 根分区的“扇区数”

在下面的示例中,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,以便运行 shadow 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 distribution访问驱动器中的说明进行操作,但您只需要第一个命令,因为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 (SELF ENCRYPTING DRIVE) OPAL EXTENSION

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

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

注意: 其他 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 软件加密。默认的 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.

安全磁盘擦除

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

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

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

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

以下显示了使用 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/交换分区加密

基于 BIOS 的 ATA 密码

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

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

另请参阅