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>
dm-crypt 目標在載入 <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)從加密執行緒解除安裝到單個執行緒會顯著降低效能。預設是將寫入生物解除安裝到同一個執行緒,因為這有助於 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)。
- integrity_key_size:<bytes>
如果完整性金鑰大小與摘要大小不同,則可選設定完整性金鑰大小。它允許使用金鑰大小獨立於加密金鑰大小的封裝金鑰演算法。
- sector_size:<bytes>
使用 <bytes> 作為加密單元,而不是 512 位元組扇區。此選項的範圍可以在 512 - 4096 位元組之間,並且必須是 2 的冪。虛擬裝置將宣佈此大小為最小 I/O 和邏輯扇區。
- 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