跳转至内容

自加密驱动器

来自 ArchWiki
(重定向自 OPAL)

基于硬件的全盘加密 (FDE) 现在已由许多硬盘 (HDD) 厂商提供,尤其在固态驱动器上越来越普遍。当指代具有内置全盘加密功能的HDD或SSD时,“自加密驱动器” (SED) 这个术语现在很常见。 OPAL 是由Trusted Computing Group开发的用于自加密驱动器的一组规范。

概述

当今市面上许多自加密硬盘都实现了 OPALRubyEnterprise 标准,这些标准由 Trusted Computing Group (TCG) 制定。Opalite 和 Pyrite 等其他标准仅提供 OPAL 功能的子集,甚至可能不提供任何实际的静态数据加密 [1]。根据这些标准制造的硬件会 贴有 相应的标签。

驱动器的解锁可以通过操作系统运行时使用软件工具、在预引导授权环境中,或在开机时使用#基于BIOS的ATA密码来完成。

提示 本页面中的“加密”指的是基于硬件的加密。有关基于软件加密的信息,请参阅 Data-at-rest encryption#Block device encryptionData-at-rest encryption#Stacked filesystem encryption

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

密钥管理技术实现

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

密钥管理在磁盘控制器内部进行,加密密钥通常是128位或256位的AES (Advanced Encryption Standard)。

本文章或章节需要扩充。

原因: Opal标准充满了缩写。sedutil在FAQ命令语法中引用了它们。在本节中命名重要的缩写(例如SID、MSID、locking SP、admin SP、MEK、DEK)将会很有用,因为它们是标准定义的密钥管理的核心。(另请参见w:Key escrow)。(在Talk:Self-encrypting drives中讨论)

符合TCG OPAL 2.0标准规范的自加密驱动器(几乎所有现代自加密驱动器)通过一个认证密钥和一个二级数据加密密钥来实现密钥管理。数据加密密钥是驱动器上数据的实际加密密钥。认证密钥是面向用户的第一级口令,它解密数据加密密钥(进而解密数据)。这种方法具有特定的优点:

  • 允许用户在不丢失磁盘上现有加密数据的情况下更改口令。
    • 这提高了安全性,因为可以快速轻松地响应安全威胁并撤销受损的口令。
  • 实现了近乎即时且加密安全的整盘擦除。

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

事实上,在具有全盘加密功能的驱动器上,数据在写入磁盘时总是使用数据加密密钥进行加密,即使没有设置密码(例如新驱动器)。制造商这样做是为了方便那些不想启用自加密驱动器安全功能的用户。这些自加密驱动器可以被视为默认具有一个零长度的密码,它总是透明地加密数据(类似于无密码SSH密钥如何在无需用户干预的情况下提供一定程度的安全访问)。

如果用户希望稍后“启用”加密,他们可以配置一个认证密钥(例如口令),该密钥会加密现有的数据加密密钥。之后,用户在将来解密数据加密密钥时会被提示输入口令。关键在于,由于现有的数据加密密钥不会被重新生成,设置口令可以允许在锁定驱动器时保留磁盘上现有的加密数据,避免了驱动器需要重新加密的麻烦。另一方面,除了安全的全盘擦除之外,没有其他方法可以重新加密数据本身。

优点

  • 设置更简单(与基于软件的加密相比)
  • 对用户来说几乎透明,除了初始启动时的身份验证。
  • 数据静态保护
  • 性能提高(CPU无需进行加密和解密计算)。
  • 消除了主CPU和RAM作为可能的攻击目标。
  • 最佳的速度和#安全磁盘擦除(数据净化)(无论磁盘大小)。
  • 由于可以加密MBR,从而在预引导授权之前使驱动器无法访问,因此可以防止替代启动方法。

缺点

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

Linux支持

本文章或章节需要扩充。

原因: 列出sedutil支持哪些TCG标准。(在Talk:Self-encrypting drives中讨论)

内核通过CONFIG_BLK_SED_OPAL选项支持OPAL自加密驱动器。[5] 所有官方支持的内核都启用了此选项。

sedutil,隶属于The Drive Trust Alliance (DTA),是“一个开源(GPLv3)项目,旨在使核心自加密驱动器技术对开发人员免费可用”。[6]

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

使用sedutil

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

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

对于通过SATA连接的设备,为了使用sedutil,libata.allow_tpm **必须**设置为1(true)。要么将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

sedutils的Windows版本输出

\\.\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 hook

代替使用PBA,可以将驱动器设置为仅加密根分区,而将/boot分区保持可访问。这样,系统可以启动,并且可以使用mkinitcpio hook在引导序列完成之前解锁驱动器。这样做的优点是不需要安装PBA和重启,并且也允许更轻松地支持从S3睡眠状态恢复。

加密您的驱动器

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

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

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

# 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 = 根分区的“开始”
  • 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以仅覆盖根分区(以及可选的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:Self-encrypting drives中讨论)
自定义mkinitcpio hook

创建一个自定义mkinitcpio hook,在启动时要求输入驱动器密码。

/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配置中的自定义hook

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

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

最后,重新生成initramfs

您现在可以重新启动您的系统。如果一切顺利,hook将提示您输入密码来解锁您的驱动器,然后继续执行其余的引导过程。如果出了问题,您可以启动到救援系统,手动解锁驱动器,然后使用默认的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 support部分中“注意”之后的说明。

禁用锁定

如果您想关闭锁定和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#cryptsetup support for OPAL中讨论)

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

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

如果它是一个便携式驱动器和/或您想手动解锁驱动器,您应该按照#从Live发行版访问驱动器中的操作,但您只需要第一个命令,因为MBR shadowing没有被启用。

# 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 hook

如果您已经在将mkinitcpio hook用于在启动时解锁驱动器,那么您可以简单地将下面的代码添加到hook中,以准备驱动器进入睡眠状态。确保这段代码放在解锁范围的命令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 support for OPAL中讨论)

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

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

请参阅 cryptsetup 2.7.0发布说明,了解带有OPAL相关LUKS头输出的命令示例。

注意 其他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.

安全磁盘擦除

整盘擦除非常快,并且对于自加密驱动器来说异常简单。只需在提供正确的身份验证凭据后,发送一个加密磁盘擦除(或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 必须在不带任何连字符、空格或下划线的情况下写入。
提示 在执行擦除之前,请检查您的驱动器是否使用 最佳逻辑扇区大小。Cryptsetup 强烈建议将驱动器的逻辑扇区大小更改为 4096 字节以获得加密性能。

挂起/休眠支持

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

请参阅 dm-crypt/Swap 加密

基于 BIOS 的 ATA 密码

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

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

参见