出自 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

如果不確定是哪個版本,可以執行以下命令查看:

$ cat /sys/class/tpm/tpm*/tpm_version_major

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 間切換(往往只能執行有限次)。

用法

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

原因: 本節內容僅僅提到了很小的一部分。您可以幫助擴展有關如何設置並使用 TPM 2.0 設備方面的內容。 (在 Talk:可信平台模塊 中討論)

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

校驗支持

從 2016 年 7 月 28 日起,所有運行 Windows 10 的電腦都必須帶有 TPM 2.0 支持(無論是硬體實現還是軟體實現[1]。從內核版本 3.2 起,Linux 也提供了對 TPM 2.0 的支持[2],並且在默認的 Arch install 後不需要額外步驟來啟用。

有兩個方法可以驗證 TPM 2.0 是否能免需特定軟體即可配置:

  • 檢查日誌,例如以 root 身份執行 journalctl -k --grep=tpm
  • 讀取 /sys/class/tpm/tpm0/device/description[3]/sys/class/tpm/tpm0/tpm_version_major 的值。

基於 LUKS 的靜態數據加密

要使用 TPM 解鎖 LUKS 卷,可以使用 Clevis英語Clevis#systemd-cryptenroll

無論使用哪種方法,加密卷都將使用存儲在 TPM 中的密鑰解鎖,既可在引導時自動解鎖,也可以在之後手動解鎖。使用 TPM 解鎖可以確保設備在滿足特定條件後才會解鎖,例如固件未被修改,安全啟動已經開啟(參見 #訪問 PCR 寄存器)。

警告: 如果在根文件系統上使用此方式,就意味著只要上述條件滿足,計算機就會在引導時自動解鎖而無需密碼。
  • 這意味著只有當加密硬碟丟失時,數據才會受到保護,而整台設備丟失時,數據無法得到保護。
  • 請注意,此方式會讓設備更容易受到冷啟動攻擊,因為就算設備已經關閉很長時間(確保內存完全清除)攻擊者也可以開機並等待 TPM 自動加載密鑰。這對高價值目標來說是一個潛在隱患。

systemd-cryptenroll

參見 systemd-cryptenroll#Trusted Platform Module英語systemd-cryptenroll#Trusted Platform Module

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 寄存器

平台配置寄存器(Platform Configuration Registers,PCR)包含可在隨機讀取,但僅能在尾部寫入的哈希值,寫入時依賴於前一項的哈希值,以此構成一系列區塊鏈。常用於在不同引導間檢驗設備硬體和軟體完整性(例如用於預防邪惡女傭攻擊),也可用於解鎖加密密鑰並確保正在引導正確的作業系統。

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

有以下寄存器:

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

使用 shim 時,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。 [5]
PCR151 未使用
PCR161 調試用 可能會在任何時候被使用或是重置。可能在官方固件發布中不可用。
PCR23 應用支持 作業系統可以設定或清除此 PCR。
  1. 使用方式由作業系統決定,在不同的 Linux 發行版和 Windows 設備間的使用方式可能有所不同。

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

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 獲取其名)。

參見