用 TPM 晶片登入 SSH
從很久以前就知道我的筆電裡有個 TPM 2.0 的晶片,因為以前從沒接觸過這類的硬體加密裝置,所以就一直想來玩玩看。
不過因為 Linux 這邊的驅動及軟體支援有點問題,更個 BIOS 就爛掉之類的,所以就一直沒去動它…
直到最近 SSH Agent 裡的金鑰有點越來越多了,剛好想起來就來測試一下,發現相關的 Software Stack 已經可以正常存取我的 TPM 晶片啦~所以就來實際應用一下吧。
為什麼用 TPM 進行驗證會比較安全?
TPM通常是一塊焊在主機板上的晶片,電腦要使用時會透過 TCG(Trusted Computing Group) 所定義的界面(TCTI)進行通訊,不論是金鑰的產生、儲存、加解密運算等操作都是在晶片內部完成的。
要讀取出私鑰或是強行拆解都是無法的,相較於存儲在硬碟等媒介還要安全。私鑰也不會在運算時被讀取到記憶體中,能降低其他漏洞帶來的影響。
安裝必要套件 (以 Arch Linux為例)
$ sudo pacman -S tpm2-tools tpm2-abrmd tpm2-pkcs11
安裝完成後,可以使用
$ tpm2_selftest
來測試一下
PKCS #11
PKCS #11 是一個與硬體密碼裝置溝通的 API,目前包含智慧卡、Yubikey、TPM 等都可以透過這個 API 進行存取。也就是說,只要應用程式有支援 PKCS #11,就可以透過這類裝置進行驗證。
建立金鑰
Github: https://github.com/tpm2-software/tpm2-pkcs11
這是目前 TPM2 的 PKCS#11 函式庫,在剛剛安裝套件的部份我們已經順手裝好了。接下來就是建立資料庫以及金鑰的步驟了
初始化
一開始需要初始化資料庫及建立一個 slot 來存放金鑰
tpm2_ptool init
建立密碼
再來需要建立 token
tpm2_ptool addtoken --pid=1 --sopin=mysopin --userpin=myuserpin --label=label
- pid: 剛剛 init 之後得到的 ID,應該會是1
- sopin: Security Officer PIN 可以理解為管理員密碼
- userpin: 每次存取時需要輸入的密碼
- label: 自己取的名稱
建立金鑰
接著就是建立金鑰啦
tpm2_ptool addkey --label=default --algorithm=ecc256 --userpin=myuserpin --key-label=tpm_sshkey
- label: 這裡是指要建在哪個token下
- algorithm: 使用的金鑰演算法 ※注意:你的晶片可能不支援某些演算法
- userpin: 剛剛設定的pin
- key-label: 自己取個名字吧
取得公鑰
ssh-keygen -D /usr/lib/pkcs11/libtpm2_pkcs11.so
使用 TPM 進行驗證
- 直接 ssh
ssh -I /usr/lib/pkcs11/libtpm2_pkcs11.so user@example.com
- 使用 ssh agent
ssh-add -e /usr/lib/pkcs11/libtpm2_pkcs11.so
ssh user@example.com
使用TPM進行驗證可以使安全性增加許多,當然TPM不只能做這件事。包含檔案加解密、登入資訊等各種資料都可以用TPM加以保護。
除了TPM之外,網路上也有很多所謂的硬體金鑰,也可以用來驗證。若你的電腦上真的沒有TPM的話,也可以用這類的硬體金鑰喔!