命令行手册

Man » cryptsetup 手册在线 - cryptsetup 手册页的详细在线文档

🌍
cryptsetup - 用于配置和管理加密存储设备的工具

概要

cryptsetup <操作> [<选项>] <操作参数>

描述

Cryptsetup 是一种用于在存储设备上配置和管理完整磁盘加密的工具。它可以加密块设备(如硬盘或分区)和容器(存储为文件的磁盘映像)。

当你解锁加密卷时,cryptsetup 会创建一个新的设备映射,应用程序可以像访问任何常规存储设备一样访问它。实际的加密和解密工作由内核的设备映射器 dm-crypt 驱动程序透明地执行。

Cryptsetup 处理两种主要的卷类型:纯加密卷和 LUKS(Linux 统一密钥设置)卷。纯卷提供基本的加密,而 LUKS 卷包括一个元数据标头,可启用高级功能,如多个密钥槽和密钥管理。此外,LUKS 还可以用于管理支持 OPAL 的存储驱动器上的硬件加密。

Cryptsetup 还对由其他加密系统创建的卷提供有限的支持,包括 loop-AES、TrueCrypt、VeraCrypt、BitLocker 和 FileVault2。

有关特定 cryptsetup 操作的更多信息,请参阅 cryptsetup-<操作>(8),其中 <操作> 是 cryptsetup 操作的名称。

Cryptsetup 设备可以在启动期间通过 crypttab(5) 激活,它是 systemd(1) 或其他系统启动脚本的一部分。

基本操作

以下是所有受支持的设备类型都支持的有效操作。

OPEN

open <设备> <名称> --type <设备类型>

打开(创建映射)<名称>,该映射由设备 <设备> 备份。请参阅 cryptsetup-open(8)。

CLOSE

close <名称>

删除现有的映射 <名称>,并从内核内存中擦除密钥。请参阅 cryptsetup-close(8)。

STATUS

status <名称>

报告映射 <名称> 的状态。请参阅 cryptsetup-status(8)。

RESIZE

resize <名称>

调整活动映射 <名称> 的大小。请参阅 cryptsetup-resize(8)。

REFRESH

refresh <名称>

刷新活动映射 <名称> 的参数。请参阅 cryptsetup-refresh(8)。

REENCRYPT

reencrypt <设备> 或 --active-name <名称> [<新名称>]

运行 LUKS 设备重新加密。请参阅 cryptsetup-reencrypt(8)。

纯模式

纯 dm-crypt 以逐扇区方式加密设备,并使用单个、未加盐的密码哈希。不执行任何检查,也不使用任何元数据。没有格式化操作。当原始设备被映射(打开)时,可以使用常规设备操作来操作映射的设备,包括创建文件系统。映射的设备通常位于 /dev/mapper/<名称> 中。


以下是有效的普通设备类型操作:

OPEN

open --type plain <设备> <名称>
create <名称> <设备> (已弃用的语法)

打开(创建与 <名称> 关联的映射),该映射由 <设备> 提供支持。请参阅 cryptsetup-open(8)。

LUKS 扩展

LUKS(Linux Unified Key Setup)是磁盘加密的标准。它在设备的开头添加一个标准化的标头,在标头后面添加一个密钥槽区域,然后在标头之后添加大量的存储区域。整个集合称为“LUKS 容器”。LUKS 容器所在的设备称为“LUKS 设备”。在大多数情况下,这两个术语可以互换使用。

LUKS 可以管理多个密码,可以单独撤销或更改每个密码。每个密码使用一个单独的密钥槽,该密钥槽包含用于数据加密的卷密钥。由于使用了反取证条纹,可以从持久性介质中安全地擦除密钥槽。密码受到基于密码的密钥派生函数 (PBKDF) 的保护,以防止暴力破解攻击。存储在文件中的密码称为密钥文件。密码和密钥文件之间的唯一区别在于,密钥文件可以包含二进制数据。两者都以相同的方式进行处理。

LUKS 版本 1(或 LUKS1)是原始元数据格式,而 LUKS2 是一个新版本,它允许使用不同的 PBKDF 算法或经过身份验证的加密等扩展。可以使用 luksFormat 命令中的 --type luks1 或 --type luks2 来使用特定 LUKS 版本格式化设备。通常,您不需要指定任何版本,因为系统会自动识别它。默认格式为 LUKS2。

<设备> 参数也可以通过 LUKS UUID 格式(UUID=)来指定。

LUKS 标头可以与数据分离(存储在单独的位置)。要指定分离的标头,可以使用 --header 参数,该参数可以在所有 LUKS 命令中使用,并且始终优先于位置 <设备> 参数。

以下是有效的 LUKS 操作:

FORMAT

luksFormat <设备> [<包含新密钥的密钥文件>]

初始化 LUKS 分区并设置初始密码(用于密钥槽 0)。请参阅 cryptsetup-luksFormat(8)。

OPEN

open --type luks <设备> <名称>
luksOpen <设备> <名称> (旧语法)

打开 LUKS 设备 <设备>,并在成功验证提供的密码后设置映射 <名称>。请参阅 cryptsetup-open(8)。

SUSPEND

luksSuspend <名称>

挂起活动设备(所有 I/O 操作都将阻塞,并且对设备的访问将无限期地等待),并从内核内存中擦除加密密钥。请参阅 cryptsetup-luksSuspend(8)。

RESUME

luksResume <名称>

恢复挂起的设备并重新加载加密密钥。请参阅 cryptsetup-luksResume(8)。

ADD KEY

luksAddKey <设备> [<包含新密钥的密钥文件>]

使用现有的密码短语添加新的密码短语。请参阅 cryptsetup-luksAddKey(8)。

删除密钥

luksRemoveKey <设备> [<包含要删除的密码短语的密钥文件>]

从 LUKS 设备中删除提供的密码短语。请参阅 cryptsetup-luksRemoveKey(8)。

更改密钥

luksChangeKey <设备> [<新的密钥文件>]

更改现有的密码短语。请参阅 cryptsetup-luksChangeKey(8)。

转换密钥

luksConvertKey <设备>

将现有的 LUKS2 密钥槽转换为新的 PBKDF 参数。请参阅 cryptsetup-luksConvertKey(8)。

擦除密钥槽

luksKillSlot <设备> <编号>

擦除 LUKS 设备中的 <编号> 密钥槽。请参阅 cryptsetup-luksKillSlot(8)。

擦除

erase <设备>
luksErase <设备> (旧语法)

擦除所有密钥槽,使 LUKS 容器永久无法访问。请参阅 cryptsetup-erase(8)。

UUID

luksUUID <设备>

打印或设置 LUKS 设备的 UUID。请参阅 cryptsetup-luksUUID(8)。

是否为 LUKS 设备

isLuks <设备>

如果 <设备> 是 LUKS 设备,则返回 true,否则返回 false。请参阅 cryptsetup-isLuks(8)。

转储

luksDump <设备>

转储 LUKS 设备的标头信息。请参阅 cryptsetup-luksDump(8)。

标头备份

luksHeaderBackup <设备> --header-backup-file <文件>

存储 LUKS 标头和密钥槽区域的二进制备份。请参阅 cryptsetup-luksHeaderBackup(8)。

标头恢复

luksHeaderRestore <设备> --header-backup-file <文件>

从指定的文件中恢复 LUKS 标头和密钥槽区域的二进制备份。请参阅 cryptsetup-luksHeaderRestore(8)。

令牌

token <添加|删除|导入|导出> <设备>

操作用于获取密码短语的令牌对象。请参阅 cryptsetup-token(8)。

转换

convert <设备> --type <格式>

在 LUKS1 和 LUKS2 格式之间转换设备(如果可能)。请参阅 cryptsetup-convert(8)。

配置

config <设备>

设置永久配置选项(存储到 LUKS 标头)。请参阅 cryptsetup-config(8)。

LOOP-AES 扩展

Cryptsetup 支持使用兼容模式映射循环-AES 加密的分区。

打开

open --type loopaes <设备> <名称> --key-file <密钥文件>
loopaesOpen <设备> <名称> --key-file <密钥文件> (旧语法)

打开循环-AES <设备> 并设置映射 <名称>。请参阅 cryptsetup-open(8)。

另请参阅 FAQ 的第 7 节和 loop-AES [http://loop-aes.sourceforge.net] 以获取更多关于 loop-AES 的信息。

TCRYPT(与 TrueCrypt 和 VeraCrypt 兼容)扩展

Cryptsetup 支持使用本机 Linux 内核 API 映射 TrueCrypt、tcplay 或 VeraCrypt 加密的​​分区。不支持标头格式和 TCRYPT 标头更改;cryptsetup 绝不会在设备上更改 TCRYPT 标头。

TCRYPT 扩展需要内核用户空间加密 API 才能使用。如果您正在配置内核,请在“加密 API”部分中启用“对称密钥密码算法的用户空间接口”(CRYPTO_USER_API_SKCIPHER .config 选项)。

由于 TCRYPT 标头是加密的,因此您始终必须提供有效的密码短语和密钥文件。


cryptsetup 应该能够识别所有头文件变体,除了使用 LRW 加密模式和 64 位加密块的旧版密码链(即,Blowfish 在 LRW 模式下不被识别;这是内核密码 API 的限制)。

VeraCrypt 是 TrueCrypt 的扩展,具有更高的迭代次数,因此解锁可能需要相当长的时间。

要使用自定义的个人迭代倍增器 (PIM) 值来打开 VeraCrypt 设备,请使用 --veracrypt-pim PIM 选项直接在命令行上指定 PIM,或使用 --veracrypt-query-pim 选项以提示输入 PIM。

PIM 值会影响在密钥派生期间应用的迭代次数。请参阅 PIM [https://veracrypt.io/en/Personal%20Iterations%20Multiplier%20(PIM).html] 以获取更详细的信息。

如果需要禁用 VeraCrypt 设备支持,请使用 --disable-veracrypt 选项。

仅支持使用 tcryptOpen 对使用 LRW 或 XTS 加密模式的密码链进行激活。

tcryptDump 命令应适用于所有已识别的 TCRYPT 设备,并且不需要超级用户权限。

要映射系统设备(包含引导加载程序的设备,整个加密系统都位于其中),请使用 --tcrypt-system 选项。请阅读 cryptsetup-tcryptOpen(8) 中 --tcrypt-system 选项部分中的具体信息,因为映射系统加密设备可能很复杂。

要使用隐藏头文件(如果可用,则映射隐藏设备),请使用 --tcrypt-hidden 选项。

要显式使用备份(辅助)头文件,请使用 --tcrypt-backup 选项。

如果外部卷已挂载,则不存在对隐藏卷的保护。原因是,如果存在任何保护,则需要一些描述在外部卷中要保护的内容的元数据,并且隐藏卷将变得可检测。

OPEN

open --type tcrypt <device> <name>
tcryptOpen_ <device> <name> (旧语法)

打开 TCRYPT(与 TrueCrypt 兼容) 并设置映射 。请参阅 cryptsetup-open(8)。

DUMP

tcryptDump <device>

转储 TCRYPT 设备的头信息。请参阅 cryptsetup-tcryptDump(8)。

请参阅 TrueCrypt [https://en.wikipedia.org/wiki/TrueCrypt] 和 VeraCrypt [https://en.wikipedia.org/wiki/VeraCrypt] 页面以获取更多信息。

请注意,cryptsetup 不使用 TrueCrypt 或 VeraCrypt 代码;请将所有与此兼容性扩展相关的问题报告给 cryptsetup 项目。

BITLK(WINDOWS BITLOCKER 兼容)扩展

cryptsetup 支持使用本机 Linux 内核 API 映射 BitLocker 和 BitLocker to Go 加密分区。不支持头文件格式和 BITLK 头文件的更改;cryptsetup 绝不会更改设备上的 BITLK 头文件。

BITLK 扩展需要内核用户空间密码 API 可用(有关详细信息,请参阅 TCRYPT 部分)。

cryptsetup 应该能够识别所有 BITLK 头文件变体,除了 Windows Vista 系统中使用的旧版头文件和部分解密的 BitLocker 设备。激活在 CBC 模式下加密的旧版设备至少需要 Linux 内核版本 5.3,对于使用 Elephant 扩散器的设备,则需要内核版本 5.6。


bitlkDump 命令应适用于所有已识别的 BITLK 设备,并且不需要超级用户权限。

要通过 open 命令解锁,必须提供密码、恢复密码或启动密钥。

此外,还支持使用音量键解锁。您必须使用 --volume-key-file 选项提供 BitLocker 全卷加密密钥 (FVEK)。该密钥必须解密并且不包含标题(仅包含 128/256/512 位的密钥数据,具体取决于所使用的密码和模式)。

不支持其他解锁方法(TPM、智能卡)。

OPEN

open --type bitlk <device> <name>
bitlkOpen <device> <name> (旧语法)

打开 BITLK(与 BitLocker 兼容) 并设置映射 。请参阅 cryptsetup-open(8)。

DUMP

bitlkDump <device>

转储 BITLK 设备的标题信息。请参阅 cryptsetup-bitlkDump(8)。

请注意,cryptsetup 不使用任何 Windows BitLocker 代码;请将与此兼容性扩展相关的所有问题报告给 cryptsetup 项目。

FVAULT2(APPLE MACOS FILEVAULT2 兼容)扩展

Cryptsetup 支持使用 Apple 为 macOS 操作系统提供的本机 Linux 内核 API 映射 FileVault2(FileVault2 全盘加密)。

Cryptsetup 仅支持基于 Core Storage 和 HFS+ 文件系统的 FileVault2(于 MacOS X 10.7 Lion 中推出)。它不支持最近的 macOS 版本中使用的基于 APFS 文件系统的 FileVault2 的新版本。

不支持标题格式和 FVAULT2 标题更改;cryptsetup 绝不会更改设备上的 FVAULT2 标题。

FVAULT2 扩展需要内核用户空间加密 API(有关详细信息,请参见 TCRYPT 部分)和用于 HFS+ (hfsplus) 文件系统的内核驱动程序。

Cryptsetup 应该能够识别可移植驱动器的基本配置。

fvault2Dump 命令应适用于所有已识别的 FVAULT2 设备,并且不需要超级用户权限。

要通过 open 命令解锁,必须提供密码。不支持其他解锁方法。

OPEN

open --type fvault2 <device> <name>
fvault2Open <device> <name> (旧语法)

打开 FVAULT2(与 FileVault2 兼容)(通常是设备上的第二个分区),并设置映射 。请参阅 cryptsetup-open(8)。

SED(自加密驱动器)OPAL 扩展

Cryptsetup 支持使用提供 OPAL 接口的驱动器上的本机硬件加密,无论是与 dm-crypt 嵌套使用,还是单独使用。密码、令牌和元数据都存储在 LUKS2 标头格式中,因此与任何使用 LUKS2 的软件或系统(例如,令牌)兼容。

OPAL 支持需要至少内核 v6.4。不支持调整设备大小。

可以使用 --hw-opal 指定 OPAL + dm-crypt,并可以使用 --hw-opal-only 指定仅使用 OPAL,而不使用 dm-crypt 层。


打开、关闭和注册令牌的方式与 LUKS2 和 dm-crypt 相同。 新参数仅在格式化时需要;LUKS2 元数据将确保在打开或关闭时执行正确的设置。

如果未指定子系统标签,则会自动将其设置为 HW-OPAL,以便立即清楚地表明设备是否使用 OPAL。

格式化

luksFormat --type luks2 --hw-opal <设备> [<密钥文件>]

此外,指定 --hw-opal-only 而不是 --hw-opal,以避免 dm-crypt 层。 除了通常的密码短语之外,在格式化驱动器上的第一个分区时,还需要指定一个管理员密码,并且在格式化任何其他分区时,需要重新提供该密码,直到执行恢复出厂设置。

擦除

erase <设备>

安全擦除分区或设备。 需要管理员密码。 此外,指定 --hw-opal-factory-reset 以执行驱动器的完整恢复出厂设置,使用驱动器的 PSID(通常印在标签上)而不是管理员密码。

PSID 必须输入时不带破折号、空格或下划线。

警告:恢复出厂设置将导致设备上的所有数据丢失,无论分区如何,也无论是否有 LUKS2 标头备份。

杂项操作

修复

repair <设备>

尝试在可能的情况下修复设备元数据。 目前仅支持 LUKS 设备类型。 请参阅 cryptsetup-repair(8)。

基准测试

benchmark <选项>

基准测试,密码和 KDF(密钥派生函数)。 请参阅 cryptsetup-benchmark(8)。

使用纯模式还是 LUKS?

除非您非常了解加密背景,否则请使用 LUKS。 在纯模式下,存在许多可能的用户错误,这些错误会大大降低安全性。 尽管 LUKS 无法解决所有这些问题,但它可以减轻其中许多问题的影响。

警告

关于使用加密存储的风险、处理问题以及安全方面的许多有用的信息都可以在 Cryptsetup FAQ 中找到。 请阅读它。 尽管如此,仍然有一些风险值得在此提及。

备份:存储介质会损坏。 加密不会对此产生任何影响。 对于加密数据,如果数据具有任何价值,则备份是强制性的。 有关如何备份加密卷的建议,请参阅 Cryptsetup FAQ。

字符编码:如果您输入带有特殊符号的密码,则密码可能会根据字符编码而发生变化。 键盘设置也可能会更改,这可能会使盲输入变得困难或不可能。 例如,从某些 ASCII 8 位变体切换到 UTF-8 可能会导致不同的二进制编码,因此 cryptsetup 看到的密码会不同,即使您在终端上看到的内容完全相同。 因此,强烈建议仅从 7 位 ASCII 中选择密码字符,因为 7 位 ASCII 的编码对于所有 ASCII 变体和 UTF-8 保持不变。

LUKS 标头:如果 LUKS 卷的标头损坏,则所有数据将永久丢失,除非您有标头备份。 如果某个密钥槽损坏,则只能从标头备份中恢复,或者如果另一个具有已知密码短语的活动密钥槽未损坏。 这种风险是安全性和安全之间的权衡,因为 LUKS 旨在通过仅覆盖标头和密钥槽区域来实现快速而安全的擦除。


先前使用的分区:如果某个分区先前已被使用,在创建 LUKS 或普通 dm-crypt 容器之前,最好清除文件系统签名、数据等。要快速删除文件系统签名,请使用 wipefs(8) 命令,并使用 --all 选项。请注意,该命令不会删除数据;它只会使已知的格式签名失效。要完全擦除数据,请在创建容器之前覆盖整个分区。如果您不知道如何操作,cryptsetup FAQ 描述了几个选项。

示例

示例 1:在块设备 /dev/sdX 上创建 LUKS 2 容器。 sudo cryptsetup --type luks2 luksFormat /dev/sdX

示例 2:向密钥槽 5 添加额外的密码。 sudo cryptsetup luksAddKey --key-slot 5 /dev/sdX

示例 3:创建 LUKS 标头备份并将其保存到文件中。 sudo cryptsetup luksHeaderBackup /dev/sdX --header-backup-file /var/tmp/NameOfBackupFile

示例 4:打开 /dev/sdX 上的 LUKS 容器,并将其映射到 sdX_crypt。 sudo cryptsetup open /dev/sdX sdX_crypt

警告:示例 5 中的命令将擦除所有密钥槽。

您之后将无法再使用 LUKS 容器,除非您有备份可以还原。

示例 5:擦除 /dev/sdX 上的所有密钥槽。 sudo cryptsetup erase /dev/sdX

示例 6:从备份文件还原 LUKS 标头。 sudo cryptsetup luksHeaderRestore /dev/sdX --header-backup-file /var/tmp/NameOfBackupFile

返回代码

cryptsetup 在成功时返回 0,在出错时返回非零值。

错误代码:1 参数错误,2 权限不足(密码错误),3 内存不足,4 指定了错误的设备,5 设备已存在或设备正在使用。

注意事项

PLAIN 模式下的密码处理

请注意,在纯模式下不会进行迭代哈希或加盐处理。如果进行哈希处理,则只进行一次直接哈希。这意味着在纯模式下,低熵密码很容易受到攻击。

从终端:密码将被读取,直到遇到第一个换行符,即 '\n'。不包含换行符的输入将被使用默认哈希或通过 --hash 选项指定的哈希进行处理。哈希结果将被截断为所用密码的密钥大小,或者通过 -s 选项指定的大小。

从标准输入:读取将继续,直到遇到换行符(或达到最大输入大小),并将删除尾部的换行符。最大输入大小由与编译时默认的最大密钥文件大小相同的默认值定义,并且可以使用 --keyfile-size 选项进行覆盖。

读取的数据将使用默认哈希或通过 --hash 选项指定的哈希进行哈希处理。哈希结果将被截断为所用密码的密钥大小,或者通过 -s 选项指定的大小。


请注意,如果使用 --key-file=- 从标准输入读取密钥,则不会删除输入中的尾随换行符。

如果将 "plain" 作为 --hash 的参数,则输入数据将不会被哈希处理。相反,如果数据长度小于密钥大小,则会进行零填充;如果数据长度大于密钥大小,则会进行截断,然后直接用作二进制密钥。这对于直接指定二进制密钥非常有用。如果从标准输入读取的数据量小于密钥大小,则不会发出警告。

从密钥文件读取:密钥文件将被截断到所用密码的密钥大小或由 -s 选项给定的大小,然后直接用作二进制密钥。

^ -hash 参数将被忽略。--hash 选项仅可用于标准输入,且必须在 "plain" 模式下使用。

如果密钥文件短于密钥,cryptsetup 将会报错退出。最大输入大小与编译时默认的最大密钥文件大小相同,并且可以使用 --keyfile-size 选项进行覆盖。

用于 LUKS 的密码短语处理

从终端:密码短语将读取到第一个换行符为止,然后由 PBKDF2 进行处理,且不包含换行符。

从标准输入:LUKS 将从标准输入读取密码短语,直到遇到第一个换行符或编译时设定的最大密钥文件长度。如果提供了 --keyfile-size,则会被忽略。

从密钥文件:将读取完整的密钥文件,直到达到编译时设定的最大大小。换行符不会终止输入。可以使用 --keyfile-size 选项来限制读取的内容。

LUKS 使用基于密码的密钥派生函数 (PBKDF) 来防御暴力破解攻击,并为低熵密码短语提供一定的保护(请参阅 cryptsetup FAQ)。LUKS1 仅支持 PBKDF2 算法,而 LUKS2 还支持内存密集型 Argon2。PBKDF 通过成本进行配置:迭代应运行多长时间(CPU 成本或迭代次数)、使用多少内存(内存成本)以及使用多少并行进程(并行成本)。PBKDF2 仅支持迭代次数。cryptsetup 使用 PBKDF 基准测试来计算最佳成本,该成本基于正在初始化新密码短语的计算机。如果需要,这些成本也可以被覆盖。请注意,存在一些硬编码的限制,有关详细信息,请参阅 --pbkdf 选项描述中的“最小和最大 PBKDF 成本”部分。

每当将密码短语添加到 LUKS 标头(luksAddKeyluksFormat)时,用户可以指定密码短语处理应消耗多长时间。该时间用于确定 PBKDF2 的迭代次数,并且更高的迭代次数将为低熵密码短语提供更好的保护,但 luksOpen 命令的执行时间也会更长。对于熵高于所用密钥长度的密码短语,更高的迭代时间不会提高安全性。

默认设置(一两秒)对于大多数实际情况而言已经足够。唯一的例外是,如果是在具有慢速 CPU 的设备上使用低熵密码短语,这将导致迭代次数减少。在这种情况下,建议使用 --iter-time 选项来增加迭代时间,以获得更高的迭代次数。这将相应地减慢所有后续的 luksOpen 操作。


对于无效密码/密钥的不一致行为

LUKS 在解密密钥槽时会检查密码是否有效。

纯 dm-crypt 的行为不同。它始终会使用给定的密码解锁设备。如果给定的密码错误,由纯 dm-crypt 映射的设备将使用错误的加密密钥,导致数据无法读取。

支持的密码、模式、哈希和密钥大小

可用的密码、模式、哈希和密钥大小的组合取决于内核的支持。请参阅 /proc/crypto 以获取可用选项的列表。您可能需要加载其他内核加密模块以获得更多选项。

Cryptsetup 在内核之外处理许多操作,因此配置的加密库也必须支持所选的算法。某些算法可能缺失,因为 cryptsetup 可以使用各种加密后端(库)进行编译。

关于密码的说明

数学无法被贿赂。请确保妥善保管您的密码。有一些很好的技巧可以用来构造一个备用方案,以防您的记忆突然出现问题。这些备用方案需要 LUKS,因为只有在 LUKS 中才能使用多个密码。但是,如果您的攻击模型不允许,将密码存储在密封的信封中可能是一个好主意。

关于随机数生成器的说明

cryptsetup 中使用的随机数生成器始终是内核 RNG,不会对生成的数据流进行任何修改或添加。

cryptsetup/LUKS 需要两种类型的随机性。一种用于 salt、AF 分割器和擦除已删除的密钥槽。另一种用于卷密钥。

使用最新版本的内核(Linux 内核 5.6),您无需担心选择 RNG(/dev/random 或 /dev/urandom)。在低熵情况下(嵌入式系统),内核 RNG 的初始化可能需要很长时间,但这发生在 cryptsetup 启动之前。使用 cryptsetup --help 来显示编译时默认的随机数生成器。请参阅 urandom(4) 以获取更多信息。

经过身份验证的磁盘加密(实验性)

正常的磁盘加密模式是长度保持的(明文扇区的大小与密文扇区的大小相同),并且只能提供机密性保护,而不能提供具有密码学意义的数据完整性保护。

经过身份验证的模式需要为每个扇区提供额外的空间用于身份验证标签,并使用经过身份验证的加密和附加数据 (AEAD) 算法。

如果您配置了带有数据完整性保护的 LUKS2 设备,则将存在一个底层的 dm-integrity 设备,该设备为每个扇区提供额外的元数据空间和数据日志保护,以确保数据和元数据的更新的原子性。由于必须为元数据和日志提供额外的空间,因此设备可用的空间将小于长度保持模式。


dm-crypt 设备随后位于这样的 dm-integrity 设备之上。此设备堆栈的所有激活和停用操作均由 cryptsetup 执行;对于完整性保护的设备,使用 luksOpen 命令没有区别。如果希望使用完整性保护格式化 LUKS2 设备,请使用 --integrity 选项(请参阅 cryptsetup-luksFormat(8))。

虽然 Linux 内核 5.7 为独立的 dm-integrity 设备添加了 TRIM 支持,但 cryptsetup(8) 无法为经过身份验证的加密模式提供对丢弃(TRIM)的支持,因为底层 dm-crypt 内核模块在将 dm-integrity 用作身份验证标签空间分配器时不支持此功能(请参阅 cryptsetup-open(8) 中的 --allow-discards)。

某些完整性模式需要两个独立的密钥(一个用于加密,一个用于身份验证)。这两个密钥都存储在一个 LUKS 密钥槽中。

对经过身份验证的模式的支持是实验性的,目前只有一些模式可用。请注意,只有很少的经过身份验证的加密算法适用于磁盘加密。此外,您还不能使用 CRC32 或其他非加密校验和(除了特殊的完整性模式“none”)。如果出于某种原因,您希望在不使用身份验证模式的情况下进行完整性控制,则应单独配置 dm-integrity,使其独立于 LUKS2。

关于环回设备的使用说明

Cryptsetup 通常直接在块设备(磁盘分区或 LVM 卷)上使用。但是,如果设备参数是文件,cryptsetup 会尝试分配一个环回设备并将其映射到此文件中。当然,您可以始终手动将文件映射到环回设备。请参阅 cryptsetup FAQ 以获取示例。

当设备映射处于活动状态时,您可以在状态命令的输出中查看环回备份文件。另请参阅 losetup(8)。

LUKS2 磁盘头锁定

LUKS2 磁盘上的元数据以多个步骤更新,为了实现适当的原子更新,使用了一种锁定机制。对于文件中的映像,该代码使用 flock(2) 系统调用。对于块设备,锁定是在存储在锁定目录中的特殊文件上执行的(默认情况下为 /run/cryptsetup)。在启动阶段,应使用适当的安全上下文由发行版创建锁定目录。只有 LUKS2 使用锁;其他格式不使用此机制。

LUKS 磁盘格式规范

有关 LUKS 磁盘元数据规范,请参阅 LUKS1 [https://gitlab.com/cryptsetup/cryptsetup/wikis/Specification] 和 LUKS2 [https://gitlab.com/cryptsetup/LUKS2-docs]。

作者

Cryptsetup 最初由 Jana Saout <_> 编写。LUKS 扩展和原始手册页由 Clemens Fruhwirth <_> 编写。手册页扩展由 Milan Broz <_> 编写。手册页重写和扩展由 Arno Wagner <_> 编写。


报告错误

请在 cryptsetup 邮件列表 <_> 或 Issues 项目部分 [https://gitlab.com/cryptsetup/cryptsetup/-/issues/new] 中报告错误。

请附加带有 --debug 选项的失败命令的输出。

参见

Cryptsetup FAQ [https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions]

cryptsetup(8), integritysetup(8) 和 veritysetup(8)

CRYPTSETUP

cryptsetup 项目的一部分 [https://gitlab.com/cryptsetup/cryptsetup/]。