本篇介紹如何在 Windows 中使用 PuTTY 搭配 Yubico Security Key 實體金鑰,以 SSH 遠端登入 Linux 伺服器,既安全又不需要密碼。
本篇是介紹 Windows 中以 PuTTY 搭配 Yubico Security Key 實體金鑰的做法,若是 macOS 的環境則可參考 macOS 設定 Yubico FIDO U2F Security Key 實體金鑰認證遠端登入 SSH 伺服器教學。
最近因為工作需要,買了幾支 Yubico Security Key NFC 與 YubiKey 5C NFC,這兩支實體金鑰的功能不同(可參考 Yubico 官方網站的比較),價格上也有差異。
Yubico Security Key NFC 開箱
這裡我們以 Yubico Security Key NFC 來示範如何設定 PyTTY 搭配實體金鑰進行 SSH 的登入,牽涉到的功能只有 FIDO U2F 與 FIDO2,而由於 Yubico Security Key NFC 有的功能在 YubiKey 5C NFC 中也都有,所以同樣的操作方式也同時適用於 YubiKey 5C NFC。
在 Yubico Security Key NFC 包裝的背面有 Yubico 的官方說明網址,如果是第一次使用的話,可以從中查閱使用說明。
打開 Yubico Security Key NFC 包裝。
這就是 Yubico Security Key NFC 實體金鑰。
這是 Yubico Security Key NFC 實體金鑰背面的樣子。
使用時要將 Yubico Security Key NFC 實體金鑰插入電腦的 USB 接孔中。
通常在需要讀取實體金鑰的重要資訊時,上面的鑰匙圖案就會發亮,這時候就要用手指觸碰一下這個鑰匙圖案,才能繼續。
安裝 YubiKey Manager
Step 1
從 Yubico 的官方網站下載 YubiKey Manager 的安裝檔,安裝 YubiKey Manager 後,以系統管理者身分執行 YubiKey Manager。
Step 2
選擇「Applications」中的「FIDO2」,設定 FIDO2 的 PIN 碼。
Step 3
FIDO2 的 PIN 碼就是用來保護金鑰的一組密碼,輸入兩次新密碼之後,按下「Set PIN」儲存。
下載 PyTTY CAC
PyTTY CAC 是 PyTTY 的分支版本,比標準版的 PyTTY 多增加了 Windows Certificate API(CAPI)、Public Key Cryptography Standards(PKCS)函式庫、Fast Identity Online(FIDO)金鑰功能,可以用硬體上的金鑰進行登入,例如 Yubikey 等。
我們可以從 PyTTY CAC 的 GitHub 網站上下載最新版的 PyTTY CAC,其使用方式跟標準版的 PyTTY 類似,以下是 PyTTY CAC 設定 Yubico Security Key NFC 實體金鑰的步驟。
Step 1
選擇「Connection」→「SSH」→「Certificate」→「FIDO Tools」,在這個頁面中我們可以建立連結 Yubico Security Key NFC 的公鑰與私鑰。
「Key Algorithm」選項可以調整金鑰的演算法類型,ssh-ed25519
是目前比較好的選擇;「Key type」選項則是可以設定是否要採用 FIDO2 的 Resident Key 金鑰,保存在 Yubico Security Key NFC 中;「User Verification」選項則是設定使用者驗證方式,除了手指觸碰之外,是否還要加上 PIN 碼驗證。
調整好金鑰選項之後,按下「Create Key」即可產生金鑰。
Step 2
在建立金鑰,Windows 會跳出一些確認訊息,請點選「確定」。
Step 3
若採用 FIDO2 的 Resident Key 金鑰,就會出現這樣的提示訊息,一樣點選「確定」即可。
Step 4
輸入剛剛上面設定的 FIDO2 PIN 碼。
Step 5
當出現觸碰安全性金鑰的提示訊息時,Yubico Security Key NFC 上面的鑰匙圖案會閃爍發亮。
這時候要用手指觸碰一下 Yubico Security Key NFC 上面的鑰匙圖案。
Step 6
完成 FIDO 金鑰建立之後,將新建立的金鑰加入目前的 PuTTY 連線設定,點選「是」 繼續。
複製公鑰內容
在 PuTTY 的左側選單中選擇「Connection」→「SSH」→「Certificate」,在此頁面中可以設定要採用的金鑰,剛剛我們已經在建立好 FIDO 金鑰時也同時設定採用 FIDO 金鑰,這裡就直接點選「Copy To Clipboard」,將對應的公鑰內容複製下來。
複製下來的公鑰內容會類似這樣:
sk-ssh-ed25519@openssh.com AAANrLXTAGnE5QG9wZW9NzaC1lZDI1NtAAAAICTI05zc2guY2jds/cBx6GimV/DzZ08y+dcbdkut5cwtUdUi+mS7ABHNzaDAAAo= FIDO:ssh: ssh:
將這串公鑰內容附加至遠端 Linux 伺服器對應帳號下的 ~/.ssh/authorized_keys
檔案中。
以實體金鑰透過 SSH 登入遠端伺服器
在 PuTTY 中設定好遠端 Linux 伺服器的主機位址之後,即可使用 Yubico Security Key NFC 實體金鑰來透過 SSH 登入遠端伺服器了。
在使用 Yubico Security Key NFC 實體金鑰進行認證時,同樣要用手指觸碰一下 Yubico Security Key NFC 上面的鑰匙圖案。
在其他電腦匯入金鑰
當我們產生了第一對 FIDO2 的 Resident Key 金鑰,並將其儲存在 Yubico Security Key NFC 之內,同時也將對應的公鑰放進遠端的 Linux 伺服器中,之後如果要在其他台電腦登入該遠端的 Linux 伺服器,就可以沿用這一組金鑰,不需要重新再產生新的金鑰,以下是在不同台電腦中匯入與設定金鑰的步驟。
Step 1
下載 PyTTY CAC,至少要包含 putty.exe
與 puttyimp.exe
。
Step 2
插入 Yubico Security Key NFC 之後,在 PuTTY 的「Connection」→「SSH」→「Certificate」→「FIDO Tools」中,使用「Import Keys」將 Yubico Security Key NFC 之中的金鑰匯入。
Step 3
在 PuTTY 的「Connection」→「SSH」→「Certificate」中,以「Set FIDO Key」設定採用 FIDO 金鑰。
這樣就可以立即使用 Yubico Security Key NFC 實體金鑰來登入遠端的 Linux 伺服器了。
在使用實體金鑰登入 Linux 伺服器時,要注意伺服器的 OpenSSH 至少要是 8.2 以後的版本(OpenSSH 從這個版本才開始支援 FIDO/U2F 與 ecdsa-sk
、ed25519-sk
兩種金鑰),若伺服器的 OpenSSH 版本太舊,就會出現類似以下的錯誤訊息:
No supported authentication methods available
參考資料
- Yubico PAM module
- Cryptsus:How to configure SSH with YubiKey Security Keys U2F Authentication on Ubuntu
- Bash Prompt:A Short Guide To Using A Yubikey For SSH Authentication
- GitHub:Win32-OpenSSH
- GitHub:libfido2
- dev.yubico:Securing SSH with the YubiKey
- YubiKey Manager (ykman) CLI and GUI Guide