可信平台模塊 (Trusted Platform Module,TPM) 是一種用於安全加密處理器的國際標準,作為一種集成的微處理器,它可以通過將加密密鑰集成到設備中來保護硬體安全。
TPM 可以被用於在各種安全應用場景,例如安全啟動,密鑰存儲與隨機數生成。
TPM 僅在具有 TPM 硬體支持的設備上可用。如果設備具有 TPM 支持但並不可用,可能需要在 BIOS 設置中啟用。
查看 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。當硬碟從原設備上被拆下時,這能有效地保護其中的數據,但當整個設備都被盜,數據保護仍然只能依賴於最原始的方法,如密碼和系統設置。要緩解這個問題,可以嘗試:
- 使用不同的機制加密用戶數據(用戶的 home 目錄等),例如 fscrypt 或 systemd-homed。
- 使用 TPM PIN 以避免無人監管的自動解鎖,這是一個 TPM 安全屬性。
systemd-cryptenroll 和 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 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
- 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)將密鑰加密與特定的軟體版本和硬體狀態的哈希值一一對應,使得註冊的密鑰僅在使用特定的受信軟體和/或配置時才能被訪問。
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 | 內核參數哈希值 | 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[4]。 | shim |
PCR151 | 未使用 | |
PCR161 | 調試用,可能會在任何時候被使用或是重置。可能在官方固件發布中不可用。 | |
PCR23 | 應用支持,作業系統可以設定或清除此 PCR。 |
- 使用方式由作業系統決定,在不同的 Linux 發行版和 Windows 設備間的使用方式可能有所不同。
在 Windows 上,BitLocker 使用 PCR8-11 (Legacy) 或 PCR11-14 (UEFI) 用於其自身用途。 文檔來自 tianocore[5]。
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 測試工具:源碼 - 網頁版.