systemd-cryptenroll
- systemd-cryptenroll 是一個用於將硬體安全令牌和設備註冊到 LUKS2 加密卷中的工具,之後便可在啟動過程中使用它們解鎖該卷。
systemd-cryptenroll 允許將smartcards、通用第二因素 令牌、可信平台模塊安全晶片以及普通密碼註冊到 LUKS 設備中。之後,systemd-cryptsetup@.service(8) 可以使用已註冊的令牌解鎖這些設備。
安裝
systemd-cryptenroll 是 systemd包 的組成部分,並隨該軟體包提供。不過,要將硬體設備用作密鑰,還需要安裝額外的軟體包:
- 要使用 PKCS#11 令牌,請安裝 libp11-kit包,可能還需要 opensc包。
- 要使用 FIDO2 令牌,請安裝 libfido2包。
- 要使用 TPM2 設備,請安裝 tpm2-tss包。
列出密鑰槽
systemd-cryptenroll 可以列出 LUKS 設備中的密鑰槽,功能類似於 cryptsetup 的 luksDump,但輸出格式更加易於閱讀。
# systemd-cryptenroll /dev/disk
SLOT TYPE 0 password 1 recovery 2 tpm2
擦除密鑰槽
# systemd-cryptenroll /dev/disk --wipe-slot=SLOT
其中,SLOT 可以是:
- 單個密鑰槽的索引,如#列出密鑰槽所示。
- 密鑰槽類型,這將擦除該類型的所有密鑰槽。有效類型包括
empty、password、recovery、pkcs11、fido2和tpm2。 - 以上各項的組合,以逗號分隔。
- 字符串
all,用於擦除設備上的所有密鑰槽。此選項只能在同時註冊另一個設備或密碼時使用。
--wipe-slot 操作可以與所有註冊選項組合使用,便於更新已有的設備註冊信息:
# systemd-cryptenroll /dev/disk --wipe-slot=fido2 --fido2-device=auto
註冊密碼
普通密碼
此操作等同於 cryptsetup luksAddKey。
# systemd-cryptenroll /dev/disk --password
恢復密鑰
- 恢復密鑰與密碼基本相同,但它由計算機生成,而不是由用戶自行選擇,因此能夠保證較高的熵。恢復密鑰使用易於輸入的字符集,也可以通過掃描屏幕上的二維碼獲取。
恢復密鑰用於在硬體令牌不可用時作為備用解鎖方式,並且可以在任何需要普通密碼的場合代替普通密碼使用。
# systemd-cryptenroll /dev/disk --recovery-key
註冊硬體設備
--type-device 選項必須指向對應設備類型的有效設備路徑。可以向該選項傳入 list 參數,獲取可用設備列表。或者,如果只連接了一台所需類型的設備,可以使用 auto 選項自動選擇。
PKCS#11 令牌或智慧卡
令牌或智慧卡必須包含一對 RSA 密鑰,用於加密所生成的卷解鎖密鑰。
# systemd-cryptenroll /dev/disk --pkcs11-token-uri=device
FIDO2 令牌
任何支持「hmac-secret」擴展的 FIDO2 令牌都可以與 systemd-cryptenroll 配合使用。以下示例將一個 FIDO2 令牌註冊到加密的 LUKS2 塊設備中,僅要求通過用戶在場驗證進行身份認證:
# systemd-cryptenroll /dev/disk --fido2-device=device --fido2-with-client-pin=no
此外,systemd-cryptenroll 還支持使用令牌內置的用戶驗證方式:
-
--fido2-with-user-presence指定解鎖前是否驗證用戶在場(例如觸摸令牌),默認為 yes。 -
--fido2-with-user-verification指定解鎖前是否要求用戶驗證,默認為 no。
- 如果令牌不支持這些功能,上述選項將不起作用。
- 有關兩者區別的更多信息,請參閱 用戶在場與用戶驗證。
默認情況下,生成 FIDO2 憑據時使用的加密算法為 es256,即採用 NIST P-256 曲線和 SHA-256 的橢圓曲線數字簽名算法(ECDSA)。如果需要,並且 FIDO2 令牌支持,也可以在註冊時指定其他加密算法。
假設此前已經註冊過一個 FIDO2 令牌,而用戶希望再註冊一個令牌,則可以使用以下命令生成採用 Curve25519 和 SHA-512 的 EdDSA 憑據(eddsa),並使用此前註冊的令牌而非密碼來認證設備:
# systemd-cryptenroll /dev/disk --fido2-device=device --fido2-credential-algorithm=eddsa --unlock-fido2-device=auto
可信平台模塊
systemd-cryptenroll 原生支持將 LUKS 密鑰註冊到 TPM。使用此功能需要滿足以下條件:
- 必須安裝 tpm2-tss包。
- 使用 LUKS2 設備(目前也是 cryptsetup 默認使用的類型)。
- 如果打算在根分區上使用此方法,需要對 initramfs 進行一些調整(高級配置參閱 Dm-crypt/系統配置#使用systemd-cryptsetup-generator):
-
mkinitcpio 用戶:啟用
systemd和sd-encryptMkinitcpio#鉤子(HOOKS)。注意:鉤子的排列順序非常重要。非標準順序可能導致系統無法啟動(此時需要在 arch-chroot 環境中重新生成 initramfs 才能恢復)。正確順序的示例參閱 Dm-crypt/系統配置#示例。 -
dracut 用戶:啟用
tpm2-tssDracut#dracut 模塊。
-
mkinitcpio 用戶:啟用
首先,運行以下命令列出已安裝的 TPM 及其使用的驅動程序:
$ systemd-cryptenroll --tpm2-device=list
- 如果計算機安裝了多個 TPM,請在後續步驟中使用
--tpm2-device=/path/to/tpm2_device指定要使用的設備。 - 考慮使用 Trusted Platform Module#PCR policies,而不是直接將機密綁定到原始 PCR 值。
只需一條命令,就可以同時將密鑰註冊到 TPM 和 LUKS 卷。以下示例會生成一個新的隨機密鑰,將其添加到卷中,使其能夠與現有密鑰一樣用於解鎖,並將這個新密鑰綁定到 PCR 7(安全啟動狀態):
# systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=7 /dev/sdX
其中,/dev/sdX 是加密 LUKS 卷的完整路徑。如果 LUKS 卷使用密鑰文件而非密碼解鎖,請使用 --unlock-key-file=/path/to/keyfile。
有關 Linux 中常見的 PCR 測量內容,請參閱 systemd-cryptenroll(1) 和 可信平台模塊#訪問_PCR_寄存器。根據需要調整 --tpm2-pcrs=7(多個參數之間使用 + 符號分隔)。
- 綁定到 PCR 7 時,請確保 安全啟動已啟用且處於用戶模式,否則未經授權的啟動設備可能解鎖加密卷。
- 如果固件證書發生變化,PCR 7 的狀態也可能改變,從而導致用戶無法解鎖設備。這種變化可能由 fwupd[1] 間接引起,也可能由輪換安全啟動密鑰直接引起。
- 僅綁定到啟動前測量的 PCR(PCR 0–7)會帶來惡意作業系統攻擊的風險。攻擊者可以創建一個惡意分區,並複製真實根文件系統的元數據(例如分區 UUID),使其偽裝成原始分區。隨後,initramfs 會嘗試將惡意分區掛載為根文件系統(解密失敗時將回退到密碼輸入),而啟動前 PCR 的值保持不變。由攻擊者控制文件內容的惡意根文件系統仍然可能獲取真實根分區的解密密鑰。詳情參閱 Brave New Trusted Boot World 和 BitLocker 文檔。
- 對於根卷,一種解決方案是使用
--tpm2-pcrs=other_pcrs+15:sha256=0000000000000000000000000000000000000000000000000000000000000000綁定到初始為空的 PCR 15。如果設置了任何rd.luks內核參數,或者在/etc/crypttab中使用了x-initrd.attach選項,還需要在rd.luks.options=或/etc/crypttab的第四個欄位中添加tpm2-measure-pcr=yes選項;如果依賴 GPT 分區自動掛載,則無需這樣做。在早期用戶空間解鎖根卷後,PCR 15 將發生變化,已註冊的密鑰也將無法再被取回。 - 另一種更簡潔的解決方案參閱 Dm-crypt/系統配置#固定 LUKS 卷。
綁定哪些 PCR,需要根據具體情況在易用性和安全限制之間取得平衡。例如,你可能希望更新 UEFI 固件時無需手動干預 安全啟動狀態,或者希望使用不同的啟動設備。另一個例子是,微軟的 BitLocker 傾向於使用 PCR 7+11,但也可能採用其他 PCR 組合。
- 除了要求 TPM 狀態正確外,還可以要求輸入 PIN。只需在上述命令中添加
--tpm2-with-pin=yes選項,並在提示時輸入 PIN。 - systemd-cryptenroll 不會在請求輸入 PIN 之前檢查 TPM 測量值,因此應考慮使用專用 PIN,因為當前環境可能並不可信。
要檢查新密鑰是否已成功註冊,可以轉儲 LUKS 配置,並查找 systemd-tpm2 令牌條目,以及 Keyslots 部分中新增的密鑰槽條目:
# cryptsetup luksDump /dev/sdX
要測試密鑰是否有效,請在 LUKS 卷處於關閉狀態時運行以下命令:
# systemd-cryptsetup attach mapping_name /dev/sdX none tpm2-device=auto
其中,mapping_name 是為卷解鎖後所創建的映射指定的名稱。
有關如何在啟動時解鎖卷,請參閱 Dm-crypt/系統配置#crypttab 和 Dm-crypt/系統配置#可信平台模塊與FIDO2密鑰。
/etc/crypttab 中使用 LUKS 卷的 UUID 代替設備路徑,但 systemd-cryptenroll 命令本身目前只支持路徑名。更多信息和示例請參閱 systemd-cryptenroll(1) 和 crypttab(5)。