跳至內容

systemd-cryptenroll

出自 Arch Linux 中文维基

systemd-cryptenroll(1):

systemd-cryptenroll 是一個用於將硬體安全令牌和設備註冊到 LUKS2 加密卷中的工具,之後便可在啟動過程中使用它們解鎖該卷。

systemd-cryptenroll 允許將smartcards、通用第二因素 令牌、可信平台模塊安全晶片以及普通密碼註冊到 LUKS 設備中。之後,systemd-cryptsetup@.service(8) 可以使用已註冊的令牌解鎖這些設備。

安裝

systemd-cryptenroll 是 systemd包 的組成部分,並隨該軟體包提供。不過,要將硬體設備用作密鑰,還需要安裝額外的軟體包:

列出密鑰槽

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(1):

恢復密鑰與密碼基本相同,但它由計算機生成,而不是由用戶自行選擇,因此能夠保證較高的熵。恢復密鑰使用易於輸入的字符集,也可以通過掃描屏幕上的二維碼獲取。

恢復密鑰用於在硬體令牌不可用時作為備用解鎖方式,並且可以在任何需要普通密碼的場合代替普通密碼使用。

# systemd-cryptenroll /dev/disk --recovery-key

註冊硬體設備

--type-device 選項必須指向對應設備類型的有效設備路徑。可以向該選項傳入 list 參數,獲取可用設備列表。或者,如果只連接了一台所需類型的設備,可以使用 auto 選項自動選擇。

注意:將硬體令牌註冊到 LUKS2 卷後,還必須配置系統,以便在適當的時候使用它們。對於根文件系統等需要在早期用戶空間解鎖的卷,請參閱 Dm-crypt/系統配置#可信平台模塊與FIDO2密鑰;對於其他分區,請參閱 Dm-crypt/系統配置#在後期用戶空間中解密。

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 令牌支持,也可以在註冊時指定其他加密算法。

注意:對於擔憂 ECDSA 的用戶,這樣做也可能更合適。詳情參閱 SSH 密鑰#ECDSA。

假設此前已經註冊過一個 FIDO2 令牌,而用戶希望再註冊一個令牌,則可以使用以下命令生成採用 Curve25519 和 SHA-512 的 EdDSA 憑據(eddsa),並使用此前註冊的令牌而非密碼來認證設備:

# systemd-cryptenroll /dev/disk --fido2-device=device --fido2-credential-algorithm=eddsa --unlock-fido2-device=auto
注意:必須將兩個令牌都連接到系統,才能成功完成註冊。

可信平台模塊

這篇文章的某些內容需要擴充。

原因:補充 --tpm2-seal-key-handle、--tpm2-device-key 和 --tpm2-pcrlock 的文檔。 (在 Talk:Systemd-cryptenroll 中討論)

systemd-cryptenroll 原生支持將 LUKS 密鑰註冊到 TPM。使用此功能需要滿足以下條件:

首先,運行以下命令列出已安裝的 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)。

參見