跳至內容
出自 Arch Linux 中文维基

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

原因:需要說明 TPM 1.2 與 TPM 2.0 之間的使用差異,邪惡女傭攻擊(Evil Maid Attack)防禦和可信引導,PCR 寄存器的封裝與和同 LUKS 的結合使用。 (在 Talk:可信平台模塊 中討論)

可信平台模塊 (Trusted Platform Module,TPM) 是一種用於安全加密處理器的國際標準,作為一種集成的微處理器,它可以通過將加密密鑰集成到設備中來保護硬體安全。

TPM 可以被用於在各種安全應用場景,例如安全啟動,密鑰存儲與隨機數生成英語random number generation

TPM 僅在具有 TPM 硬體支持的設備上可用。如果設備具有 TPM 支持但並不可用,可能需要在 BIOS 設置中啟用。

注意:有兩個使用不同軟體棧的 TPM 規範: 2.0 和 1.2。本文章僅討論 TPM 2.0,有關 TPM 1.2 的內容參見 /1.2英語Trusted Platform Module/1.2

查看 TPM 版本

絕大多數現代的計算機都支持 TPM 2.0,因為自 2016 年後,這是 Windows 10 的強制性認證的一部分[1]。要檢查設備是否支持,請使用如下方法:

  • 檢查日誌,例如以 root 身份運行 journalctl -k --grep=tpm
  • 讀取 /sys/class/tpm/tpm0/device/description[2]/sys/class/tpm/tpm0/tpm_version_major 的值:
 $ cat /sys/class/tpm/tpm0/device/description
TPM 2.0 Device
  • 使用 systemd-analyze(1) 檢查 TPM 2.0 和必要的軟體依賴:
    $ systemd-analyze has-tpm2

TPM 2.0 允許通過 /dev/tpm0 直接訪問(單次僅允許單個用戶),通過受內核監視的 /dev/tpmrm0 訪問,或通過 tpm2-abrmd 資源管理守護進程進行受監視的訪問。根據一個 systemd 項目成員的說法,不應再推薦使用 tpm2-abrmd。此外,還有兩個用戶空間工具可用,分別是 Intel 的 tpm2-tools 和 IBM 的 ibm-tssAUR

TPM 2.0 需要 UEFI 引導,BIOS 或傳統引導(Legacy boot)下的系統只能使用 TPM 1.2。

某些 TPM 晶片可以通過硬體升級在 2.0 和 1.2 間切換(往往只能執行有限次)。

用法

tpm2-software 社區提供了許多學習如何配置 TPM 2.0 並投入到實際生活使用的相關信息。

LUKS 數據加密

可以使用安全保存在 TPM 中的密鑰來加密卷。這可以確保僅在 TPM 生效,同時滿足一些特定條件的前提下,硬碟才會解密,例如硬體完整性或安全啟動的狀態(參見 #訪問 PCR 寄存器)。

此機制可以用於在引導時自動解密根文件系統,類似於 Windows 上的 BitLocker 和 macOS 上的 FileVault。當硬碟從原設備上被拆下時,這能有效地保護其中的數據,但當整個設備都被盜,數據保護仍然只能依賴於最原始的方法,如密碼和系統設置。要緩解這個問題,可以嘗試:

  • 使用 TPM PIN 以避免無人監管的自動解鎖,這是一個 TPM 安全屬性。
警告:此方式會讓設備更容易受到冷啟動攻擊

systemd-cryptenroll英語systemd-cryptenrollClevis英語Clevis 可以使用存儲在 TPM 中的密鑰加密 LUKS 卷。此外,systemd-cryptenroll 可以將加密綁定到簽名策略,而不是靜態 PCR 值上(參見 systemd-cryptenroll(1))。

SSH

要使用 TPM 保護 SSH 密鑰,有以下兩種方式:

  • ssh-tpm-agent — 使用 TPM 支持密鑰的,與 ssh-agent 兼容的代理服務。
https://github.com/Foxboron/ssh-tpm-agent || ssh-tpm-agent
參見 Store ssh keys inside the TPM: ssh-tpm-agent.
  • tpm2-pkcs11 — 適用於 TPM 2.0 硬體的 PKCS#11 接口。
https://github.com/tpm2-software/tpm2-pkcs11 || tpm2-pkcs11
參見 SSH configurationUsing a TPM for SSH authentication (2020-01)。

GnuPG

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

原因:需要添加查詢 TPM 所支持密鑰類型的方法。 (在 Talk:可信平台模塊 中討論)

自從 2.3 版本後,GnuPG 就支持將兼容的密鑰遷移到 TPM 中。參見 Using a TPM with GnuPG 2.3 以獲得方法。

其他 TPM 2.0 使用例

訪問 PCR 寄存器

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

原因:也許應該僅列出有用的 PCR,然後給出實際的使用案例,而不是把所有存在的 PCRs 都列出來。 (在 Talk:可信平台模塊 中討論)

平台配置寄存器(Platform Configuration Registers,PCR)將密鑰加密與特定的軟體版本和硬體狀態的哈希值一一對應,使得註冊的密鑰僅在使用特定的受信軟體和/或配置時才能被訪問。

PCR 常用於在不同引導間檢驗設備硬體和軟體完整性(例如用於預防邪惡女傭攻擊)。

TCG PC Client Specific Platform Firmware Profile Specification 定義了正在使用的寄存器,The Linux TPM PCR Registry 確定了使用它們的 Linux 系統組件。

有以下寄存器:

PCR 描述 受控於
PCR0 核心系統固件可執行碼 (又稱固件),可能會在升級 UEFI 後更改。 固件
PCR1 核心系統固件數據 (又稱 UEFI 設置) 固件
PCR2 擴展或可插入式可執行碼(又稱 OpROMs 固件
PCR3 擴展或可插入式固件數據,將在 UEFI 引導的選擇引導設備過程中設定。 固件
PCR4 引導管理器代碼和引導嘗試,檢測引導管理器和固件嘗試引導的設備。 固件
PCR5 引導管理器的配置與數據,可以檢測引導器配置,包括 GPT 分區表。 固件
PCR6 從 S4 和 S5 電源狀態事件恢復 固件
PCR7 安全啟動狀態,包含完整的 PK/KEK/db 內容,以及用於確認每個引導程序的特定證書。[3]

使用 shim 時,shim 會將自身的 MokList、 MokListX、和 MokSBState 添加到其後。

固件,shim(添加 MokList,MokListX,和 MokSBState)
PCR81 內核參數哈希值 GRUBsystemd-boot
PCR91 initrd 和 EFI Load Options 的哈希值 Linux(檢測 initrd 和 EFI Load Options,本質上是內核參數選項)
PCR101 保留以供未來使用
PCR111 統一內核映像哈希值 systemd-stub(7)
PCR121 覆蓋內核參數,證書 systemd-stub(7)
PCR131 系統拓展 systemd-stub(7)
PCR141 shim 的 MokList,MokListX,和 MokSBState[4] shim
PCR151 未使用
PCR161 調試用,可能會在任何時候被使用或是重置。可能在官方固件發布中不可用。
PCR23 應用支持,作業系統可以設定或清除此 PCR。
  1. 使用方式由作業系統決定,在不同的 Linux 發行版和 Windows 設備間的使用方式可能有所不同。

在 Windows 上,BitLocker 使用 PCR8-11 (Legacy) 或 PCR11-14 (UEFI) 用於其自身用途。 文檔來自 tianocore[5]

tpm2-totp 通過人工觀察和專用可信設備進行此檢查。

當前 PCR 的值可以通過 systemd-analyze(1) 查看:

$ systemd-analyze pcrs

也可以通過來自 tpm2-toolstpm2_pcrread(1) 查看:

# tpm2_pcrread

排錯

使用 TPM 2.0 後 LUKS2 在解鎖時仍然需要密碼

如果在遵循了上述指引後,在使用 TPM 2.0 硬體模塊內的密鑰解鎖 LUKS2 設備時,仍然在 initrams 引導階段被要求輸入密碼,可能需要在早啟動階段加載控制特定 TPM 2.0 硬體的內核模塊(可以通過 systemd-cryptenroll --tpm2-device=list 獲取其名)。

參見