可信平台模塊 (Trusted Platform Module,TPM) 是一種用於安全加密處理器的國際標準,作為一種集成的微處理器,它可以通過將加密密鑰集成到設備中來保護硬體安全。
TPM 可以被用於在各種安全應用場景,例如安全啟動,密鑰存儲與隨機數生成。
TPM 僅在具有 TPM 硬體支持的設備上可用。如果設備具有 TPM 支持但並不可用,可能需要在 BIOS 設置中啟用。
版本
有兩個使用不同軟體棧的 TPM 規範: 2.0 和 1.2。本文章僅討論 TPM 2.0,有關 TPM 1.2 的內容參見 /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 間切換(往往只能執行有限次)。
用法
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 或 #systemd-cryptenroll。
無論使用哪種方法,加密卷都將使用存儲在 TPM 中的密鑰解鎖,既可在引導時自動解鎖,也可以在之後手動解鎖。使用 TPM 解鎖可以確保設備在滿足特定條件後才會解鎖,例如固件未被修改,安全啟動已經開啟(參見 #訪問 PCR 寄存器)。
- 這意味著只有當加密硬碟丟失時,數據才會受到保護,而整台設備丟失時,數據無法得到保護。
- 請注意,此方式會讓設備更容易受到冷啟動攻擊,因為就算設備已經關閉很長時間(確保內存完全清除)攻擊者也可以開機並等待 TPM 自動加載密鑰。這對高價值目標來說是一個潛在隱患。
systemd-cryptenroll
參見 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 configuration 與 Using a TPM for SSH authentication (2020-01)。
GnuPG
自從 2.3 版本後,GnuPG 就支持將兼容的密鑰遷移到 TPM 中。參見 Using a TPM with GnuPG 2.3 以獲得方法。
其他 TPM 2.0 使用例
- Configuring Secure Boot + TPM 2 (2018-06, Debian)
- Using the TPM - It's Not Rocket Science (Anymore) - Johannes Holland & Peter Huewe (2020-11, Youtube): examples for OpenSSL with tpm2-tss-engine包
訪問 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 | 內核參數哈希值 | 受 grub 和 systemd-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。 |
- 使用方式由作業系統決定,在不同的 Linux 發行版和 Windows 設備間的使用方式可能有所不同。
在 Windows 上,BitLocker 使用 PCR8-11 (Legacy) 或 PCR11-14 (UEFI) 用於其自身用途。 文檔來自 tianocore[6]。
tpm2-totp包 通過人工觀察和專用可信設備進行此檢查。
當前 PCR 的值可以通過 systemd-analyze(1) 查看:
$ systemd-analyze pcrs
也可以通過來自 tpm2-tools包 的 tpm2_pcrread(1) 查看:
# tpm2_pcrread
排錯
使用 TPM 2.0 後 LUKS2 在解鎖時仍然需要密碼
如果在遵循了上述指引後,在使用 TPM 2.0 硬體模塊內的密鑰解鎖 LUKS2 設備時,仍然在 initrams 引導階段被要求輸入密碼,可能需要在早啟動階段加載控制特定 TPM 2.0 硬體的內核模塊(可以通過 systemd-cryptenroll --tpm2-device=list
獲取其名)。
參見
- Gentoo:Trusted Platform Module
- TPM-JS 測試工具:源碼 - 網頁版.