用 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的話,也可以用這類的硬體金鑰喔!