dm-crypt¶
Device-Mapper 的“crypt”目标使用内核加密 API 提供块设备的透明加密。
有关支持的参数的更详细描述,请参阅:https://gitlab.com/cryptsetup/cryptsetup/wikis/DMCrypt
参数
<cipher> <key> <iv_offset> <device path> \
<offset> [<#opt_params> <opt_params>]
- <cipher>
加密密码、加密模式和初始向量 (IV) 生成器。
密码规范格式为
cipher[:keycount]-chainmode-ivmode[:ivopts]
示例
aes-cbc-essiv:sha256 aes-xts-plain64 serpent-xts-plain64
密码格式还支持使用内核加密 API 格式直接指定(通过 capi: 前缀选择)。IV 规范与第一种格式类型相同。此格式主要用于指定已验证的模式。
加密 API 密码规范格式为
capi:cipher_api_spec-ivmode[:ivopts]
示例
capi:cbc(aes)-essiv:sha256 capi:xts(aes)-plain64
已验证模式的示例
capi:gcm(aes)-random capi:authenc(hmac(sha256),xts(aes))-random capi:rfc7539(chacha20,poly1305)-random
/proc/crypto 包含当前加载的加密模式的列表。
- <key>
用于加密的密钥。它被编码为十六进制数,或者可以作为以单冒号字符 (‘:’) 为前缀的 <key_string> 传递,用于驻留在内核密钥环服务中的密钥。您只能使用与所选 IV 模式结合使用的所选密码有效的密钥大小。请注意,对于某些 IV 模式,密钥字符串可以包含额外的密钥(例如 IV 种子),因此密钥包含连接成单个字符串的多个部分。
- <key_string>
内核密钥环密钥由以下格式的字符串标识:<key_size>:<key_type>:<key_description>。
- <key_size>
加密密钥大小(以字节为单位)。内核密钥有效负载大小必须与 <key_size> 中传递的值匹配。
- <key_type>
可以是 “logon”、“user”、“encrypted” 或 “trusted” 内核密钥类型。
- <key_description>
内核密钥环密钥描述,加密目标在加载 <key_type> 的密钥时应查找该描述。
- <keycount>
多密钥兼容模式。您可以定义 <keycount> 个密钥,然后根据它们的偏移量加密扇区(扇区 0 使用 key0;扇区 1 使用 key1 等)。<keycount> 必须是 2 的幂。
- <iv_offset>
IV 偏移量是在创建 IV 之前添加到扇区号的扇区计数。
- <device path>
这是将用作后端的设备,并且包含加密数据。您可以将其指定为 /dev/xxx 之类的路径或设备号 <major>:<minor>。
- <offset>
设备中加密数据开始的起始扇区。
- <#opt_params>
可选参数的数量。如果没有可选参数,则可以跳过可选参数部分,或者 #opt_params 可以为零。否则,#opt_params 是以下参数的数量。
- 可选参数部分的示例
3 allow_discards same_cpu_crypt submit_from_crypt_cpus
- allow_discards
块丢弃请求(又名 TRIM)将通过加密设备传递。默认设置为忽略丢弃请求。
警告:在启用此选项之前,请仔细评估具体的安全风险。例如,如果丢弃的块稍后可以在设备上轻松找到,则允许在加密设备上丢弃可能会导致泄露有关密文设备的信息(文件系统类型、已用空间等)。
- same_cpu_crypt
使用提交 IO 的同一个 CPU 执行加密。默认设置为使用无界工作队列,以便在可用的 CPU 之间自动平衡加密工作。
- high_priority
将 dm-crypt 工作队列和写入器线程设置为高优先级。这可以提高 dm-crypt 的吞吐量和延迟,同时降低系统的一般响应能力。
- submit_from_crypt_cpus
在加密后禁用将写入卸载到单独的线程。在某些情况下,将写入 bios 从加密线程卸载到单个线程会显着降低性能。默认设置为将写入 bios 卸载到同一个线程,因为它有利于 CFQ 使用相同的上下文提交写入。
- no_read_workqueue
绕过 dm-crypt 内部工作队列并同步处理读取请求。
- no_write_workqueue
绕过 dm-crypt 内部工作队列并同步处理写入请求。对于主机管理的区域块设备(例如,主机管理的 SMR 硬盘),此选项会自动启用。
- integrity:<bytes>:<type>
该设备需要在每个生物完整性结构中存储每个扇区的额外 <bytes> 元数据。此元数据必须由底层 dm-integrity 目标提供。
如果元数据仅用于持久 IV,则 <type> 可以为 “none”。
对于使用附加数据 (AEAD) 进行身份验证的加密,<type> 为 “aead”。AEAD 模式还会额外计算并验证加密设备的完整性。然后,额外的空间用于存储身份验证标签(如果需要,还用于存储持久 IV)。
- sector_size:<bytes>
使用 <bytes> 作为加密单元,而不是 512 字节扇区。此选项可以在 512 - 4096 字节范围内,并且必须是 2 的幂。虚拟设备会将此大小声明为最小 IO 和逻辑扇区。
- iv_large_sectors
IV 生成器将使用以 <sector_size> 单位计数的扇区号,而不是默认的 512 字节扇区。
例如,如果 <sector_size> 为 4096 字节,则第二个扇区的 plain64 IV 将为 8(没有标志),如果存在 iv_large_sectors,则为 1。如果指定此标志,则 <iv_offset> 必须是 <sector_size> 的倍数(以 512 字节为单位)。
- integrity_key_size:<bytes>
使用大小为 <bytes> 的完整性密钥,而不是使用所用 HMAC 算法的摘要大小的完整性密钥大小。
- 模块参数:
- max_read_size
读取请求的最大大小。当收到大于此大小的请求时,dm-crypt 将拆分该请求。拆分可以提高并发性(拆分后的请求可以由多个内核并行加密),但也会导致开销。用户应调整此参数以适合实际工作负载。
- max_write_size
写入请求的最大大小。当收到大于此大小的请求时,dm-crypt 将拆分该请求。拆分可以提高并发性(拆分后的请求可以由多个内核并行加密),但也会导致开销。用户应调整此参数以适合实际工作负载。
示例脚本¶
LUKS (Linux Unified Key Setup) 现在是使用 ‘cryptsetup’ 实用程序通过 dm-crypt 设置磁盘加密的首选方法,请参阅 https://gitlab.com/cryptsetup/cryptsetup
#!/bin/sh
# Create a crypt device using dmsetup
dmsetup create crypt1 --table "0 `blockdev --getsz $1` crypt aes-cbc-essiv:sha256 babebabebabebabebabebabebabebabe 0 $1 0"
#!/bin/sh
# Create a crypt device using dmsetup when encryption key is stored in keyring service
dmsetup create crypt2 --table "0 `blockdev --getsize $1` crypt aes-cbc-essiv:sha256 :32:logon:my_prefix:my_key 0 $1 0"
#!/bin/sh
# Create a crypt device using cryptsetup and LUKS header with default cipher
cryptsetup luksFormat $1
cryptsetup luksOpen $1 crypt1