本篇介紹如何在 Windows 中建立 TPM 虛擬智慧卡,並於智慧卡中建立 SSH 金鑰,設定 PuTTY CAC 使用實體 TPM 保護的金鑰登入遠端 Linux 系統。
TPM 虛擬智慧卡(virtual smart card)雖然不是實體的智慧卡,但是它運用信賴平台模組(TPM)來保護金鑰,安全性也非常高,而且不需要而外安裝實體的讀卡機與智慧卡,在使用上既安全又方便。
一般 SSH 遠端登入所使用的金鑰,除了可以使用 Yubico Security Key 這類的實體金鑰來保護之外,也可以運用 TPM 這類的實體設備達到類似等級的安全防護,而使用 TPM 的優點就是不需要另外添購任何設備,TPM 已經是目前電腦的基本配備,只需要經過設定,就可以直接使用。
以下是在 Windows 中建立 TPM 虛擬智慧卡與金鑰,並使用 PuTTY 搭配 TPM 保護的金鑰登入遠端 Linux 系統的操作步驟。
確認 TPM 狀態
開啟 PowerShell 或命令提示字元,執行 tpm.msc
指令,開啟信賴平台模組(TPM)管理程式,確認自己的系統上有啟用 TPM:
新增 TPM 虛擬智慧卡
開啟 PowerShell,使用 tpmvscmgr
工具建立一張 TPM 虛擬智慧卡:
# 以指定的 PIN 碼與隨機系統管理金鑰來建立 TPM 虛擬智慧卡 tpmvscmgr create /name MyVSC1 /pin prompt /adminkey random /generate /pinpolicy minlen 6
輸入 PIN: ****** 確認 PIN: ****** 正在建立 TPM 智慧卡... 正在初始化虛擬智慧卡元件... 正在建立虛擬智慧卡元件... 正在初始化虛擬智慧卡模擬器... 正在建立虛擬智慧卡模擬器... 正在初始化虛擬智慧卡讀卡機... 正在建立虛擬智慧卡讀卡機... 正在等待 TPM 智慧卡裝置... 正在向 TPM 智慧卡驗證... 正在產生 TPM 智慧卡上的檔案系統... 已建立 TPM 智慧卡。 智慧卡讀卡機裝置執行個體識別碼 = ROOT\SMARTCARDREADER\0000
在 tpmvscmgr
預設的設定中,PIN 碼的最短長度為 8,而我個人覺得在實體的 TPM 保護之下的金鑰,PIN 碼長度可以不需要那麼長(但這也需要考慮我們自己系統本身的特性),所以這裡我們使用 /pinpolicy minlen 6
參數,將 PIN 碼最短長度設定為 6
,這樣平常個人在使用上會比較方便。
建立了 TPM 虛擬智慧卡之後,若要查詢目前 Windows 系統上所有的智慧卡,可以使用以下指令:
# 列出 Windows 中所有智慧卡 wmic path win32_PnPEntity where "DeviceID like '%smartcardreader%'" get DeviceID,Name,Status
DeviceID Name Status ROOT\SMARTCARDREADER\0000 MyVSC1 OK
在 TPM 虛擬智慧卡中建立金鑰
建立好 TPM 虛擬智慧卡之後,就可以在 TPM 虛擬智慧卡中建立金鑰,但一般的 PuTTY 沒有支援智慧卡的功能,需要改用 PuTTY CAC,請先從 PuTTY CAC 的網站上下載安裝檔案進行安裝,在按照以下步驟操作。
Step 1
開啟 PuTTY CAC,選擇「Connection」→「SSH」→「Certificate」→「CAPI Tools」,產生登入 SSH 用的金鑰,金鑰的演算法可以自由調整,可以選擇傳統的 RSA 或橢圓曲線(ECDSA),Subject Name 可以填入自己的名字或容易識別的名稱,Provider type 要選擇「Smart Card/Token」,設定好之後按下「Create Key」產生金鑰。
Step 2
在存取 TPM 虛擬智慧卡時,要輸入 TPM 虛擬智慧卡的 PIN 碼:
金鑰建立成功後,會詢問是否將產生的金鑰指定至目前的 PuTTY 設定中,點選「是」。
Step 4
點選左側選單的「Certificate」,按下「Copy To Clipboard」將對應的公鑰複製到剪貼簿。
複製到剪貼簿的公鑰內容會類似這樣:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/S+NEzeJazWDAAH+VTAyS+c8T7hRneCFYcUybP4gpdW26C2f9/sJI591iyEu7Oa9lvSuhI947rS3ljVPd7daIXWAksh5X81HYHFGXOV7aNakZnz6trUl0Mj3igU7+9ZjBhA9PAj09+KtEzkzDYyQjdQpRcWd05rVK4PnR6VxJOGGhi1Xh0ybRy1We9zcvci0/ZlG5FiVmbklfU9sLjo5WLCsd2G2GPB73PyAnagV14dt7KewQ/4ZZSDBJVovMrROYaiHEzaAyjkkXNoWqX+rYf2+SAaXnsjkUwojnnCyFd6wyMTeQovNTScZMVsSysOleCRYWTu+Cab40AAd3YhUd CAPI:50979022c3767e2f2cf83f48a735f923528f0291 CN=OfficeGuide.cc
Step 5
將複製到剪貼簿的公鑰內容,寫入遠端 Linux 伺服器中對應帳號下的 ~/.ssh/authorized_keys
檔案中,這部分就跟一般軟體金鑰的做法相同。
這樣設定完成之後,就可以使用 TPM 保護的金鑰來登入遠端 Linux 系統,登入時只要輸入簡單的 TPM 虛擬智慧卡 PIN 碼,因為金鑰無法匯出,所以安全性比一般的軟體金鑰還要高,使用上也很方便。
移除 TPM 虛擬智慧卡
若要移除 TPM 虛擬智慧卡,可以使用 tpmvscmgr
的 destroy
指令,並指定 TPM 虛擬智慧卡的 Device ID:
# 移除指定 TPM 虛擬智慧卡 tpmvscmgr destroy /instance root\smartcardreader\0000