本篇介紹如何在 Windows 中建立 TPM 虛擬智慧卡,並於智慧卡中建立 SSH 金鑰,設定 PuTTY CAC 使用實體 TPM 保護的金鑰登入遠端 Linux 系統。
TPM 虛擬智慧卡(virtual smart card)雖然不是實體的智慧卡,但是它運用信賴平台模組(TPM)來保護金鑰,安全性也非常高,而且不需要而外安裝實體的讀卡機與智慧卡,在使用上既安全又方便。
一般 SSH 遠端登入所使用的金鑰,除了可以使用 Yubico Security Key 這類的實體金鑰來保護之外,也可以運用 TPM 這類的實體設備達到類似等級的安全防護,而使用 TPM 的優點就是不需要另外添購任何設備,TPM 已經是目前電腦的基本配備,只需要經過設定,就可以直接使用。
以下是在 Windows 中建立 TPM 虛擬智慧卡與金鑰,並使用 PuTTY 搭配 TPM 保護的金鑰登入遠端 Linux 系統的操作步驟。
開啟 PowerShell 或命令提示字元,執行 tpm.msc
指令,開啟信賴平台模組(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 虛擬智慧卡中建立金鑰,但一般的 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 碼:
Step 3
金鑰建立成功後,會詢問是否將產生的金鑰指定至目前的 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 虛擬智慧卡,可以使用 tpmvscmgr
的 destroy
指令,並指定 TPM 虛擬智慧卡的 Device ID:
# 移除指定 TPM 虛擬智慧卡 tpmvscmgr destroy /instance root\smartcardreader\0000