Categories: Windows

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 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)管理

新增 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」產生金鑰。

在 TPM 虛擬智慧卡中建立金鑰

Step 2
在存取 TPM 虛擬智慧卡時,要輸入 TPM 虛擬智慧卡的 PIN 碼:

輸入 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 虛擬智慧卡

若要移除 TPM 虛擬智慧卡,可以使用 tpmvscmgrdestroy 指令,並指定 TPM 虛擬智慧卡的 Device ID:

# 移除指定 TPM 虛擬智慧卡
tpmvscmgr destroy /instance root\smartcardreader\0000

參考資料

Share
Published by
Office Guide
Tags: 資訊安全

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago

Linux 以 Cryptsetup 與 LUKS 加密磁碟教學與範例

介紹如何使用 Cryptset...

11 個月 ago