windows 使用 yubikey 驗證 putty

為了安全性,towns 需要做到雙因子認,而 towns 選擇了使用 yubikey 4 來建立金鑰式驗證,下面來寫一下流程

目標:建立 windows 使用 yubikey 驗證 putty
要使用 putty 做 ssh tunnal,而且必需使用實體的 key 所以用 yubikey

建置流程
1. 安裝 GPG4Win 完整版
預設安裝路徑(完整版會出現這兩個路徑)
C:\Program Files (x86)\GnuPG\bin
C:\Program Files (x86)\Gpg4win <= kleopatra 助理程式

2. 於 yubikey 中建立 GPG keypair
 1. gpg --card-edit <= 進入 yubikey 進行編輯
 2. gpg/card> admin <= 開放 admin 權限
 3. gpg/card> passwd <= 進行 PIN 設定(選用)
 4. gpg/card> generate <= 產生金鑰對
  4.1. Make off-card backup of encryption key? 建立加密金鑰的卡外備份 Y
  4.2. 建立金鑰使用使時間(0,不到期)
  4.3. 打入資料
  4.4. 建立 passphrase(必需設定,否則不會過)
  4.5. 備份路徑 D:/Users/towns/AppData/Roaming/gnupg/openpgp-revocs.d/sk_[編號].gpg
  4.6. 撤銷證書存儲路徑 D:/Users/towns/AppData/Roaming/gnupg/openpgp-revocs.d/[編號].rev
註1:admin 預設密碼為 12345678、pin 預設密碼為 123456

3. 匯入公鑰並放入要登入的主機中
 gpg --export-ssh-key <SHORD ID> > [path/name] <= 匯出 ssh 公鑰
 將產生公鑰的內容放入遠端主機要登入的帳號中(~/.ssh/authorized_keys)
註1:SHORD ID 就是指 key 後面那一串

4. 設定 gpg-agent.conf
 編輯 c:\Users\towns\AppData\Roaming\gnupg\gpg-agent.conf,加入 enable-putty-support
註1:如果沒有該檔案,可以自行新增或使用 Kleopatra 幫忙新增
開啟 Kleopatra => 設定 => 設定 Kleopatra => GunPG系統 => Private Keys => 勾選 加入 enable-putty-support
註2:如果要同時支援 ssh 認證,請加入 enable-ssh-support
這裡的設定值,就是 gpg-agent.conf 的內容

5. 啟動 gpg-agent
 gpg-connect-agent /bye
註:如果在程序中已經出現了 GnuPG's private key daemon,需重新啟動
 gpg-connect-agent killagent /bye <= 停止程序
 gpg-connect-agent /bye <= 啟動程序
註:這裡也可以使用 gpg --card-status 方式同時開啟兩個程序 smartcard daemon 及 private key daemon

6. 使用 putty 登入遠端主機
 註1:putty 設定中必需勾選 Allow agent forwarding,並存檔
Connection > SSH > Auth > Authentication parameters > Allow agent forwarding
 註2:client 端的

這時,如果設定正確,在第一次登入時,系統會跳出打入 PIN 碼,第二次登入則不用,不過登入時,就不會再問 PIN 碼,應該在 putty 畫面看到 "cardno:************",這個資訊,而拔除重插後,會再要求打 PIN 碼

7. 將 gpg-agent 寫入開機啟動
towns 在 window 10 中是使用 工作排程器 建立自動啟動的

註1:GunPG smartcard deamon 要能啟動,windows 中的 Smart Card Service 也必需是啟動的
註2:yubikey 的 driver 不一定要裝,只要能抓到,而且有大大寫到,裝了 yubikey 的 driver 反而很不穩定
註3:建議使用實體機測試,使用 VirtualBox 常常會發生 yubikey 卸除後抓不到的情形
註4:當 yubikey 建置完成後,將 key 拿到其他主機可以進行驗證,但無法由 key 中匯出公鑰,在其他主機中看到的 General key info 是空值

8. 設定 remote 端的 ssh 使用金鑰登入
#PubkeyAuthentication yes <= 移除#

補充:記得重開機,否則會發生 putty 抓不到 yubikey 的情形(這個可能於 putty 設定 Allow agent forwarding 會寫入機碼有關,也可以使用 gpupdate /force 重新套用所有原則試試)

參考資料:
towns 不知道是那個大大寫的
https://suchsecurity.com/gpg-and-ssh-with-yubikey-on-windows.html

herb 大的 blog -- MAC 使用 yubikey
https://medium.com/@herb123456/%E5%88%A9%E7%94%A8yubikey%E7%99%BB%E5%85%A5%E9%81%A0%E7%AB%AFssh%E4%B8%BB%E6%A9%9F-2dedd3488206 

補充:匯出私鑰
在匯出公鑰時,有說到一個“SHORD ID”,這個是指在建完金鑰,退出 gpg 前所出現在 Key 後面那一串文字,不過,towns 測試結果,有三個值在匯出公私鑰時,都可以得到相同的結果,也就是說,這三個字串都可以說是這金鑰的唯一 ID
1. 撤銷證書檔的檔名(這個值與 gpg --list-keys,出現於 pub 這一串是相同的)
2. 私鑰檔 sk_ 後面這個字串
3. 出 gpg 前所出現在 Key 後面那一串文字


2. 清空 yubikey

一拿到 yubikey 時,除非是新買的,不然,第一件事就是清空(回復原廠預設值),官方已經有詳細說明,towns 簡單的點一下

清除 OTP 設定
1. 刪除憑證
開啟 YubiKey Personalization Tool => 選 Tools => 點 Delete Configuration => 點 Configuration Slot 1 及 2 後點 Delete
註:官方有說明,如果出現 YubiKey could not be configured. Perhaps protected with configuration protection access code? 就必需要 access code 才能刪除,如果不知道,就無法刪除了 = =

2. 重建 OTP 憑證
這個步驟 towns 沒實做過,有機會再來補充

註1:在官方文件中,在建置 windows 10 金錀憑證時,使用到 Challenge-Response 時,就會有關於 Access Code 的設定,如果設定了,但忘記了,上述的第一步驟可能就會出問題了
註2:在 Configuration Slot 2 看來預設就是有設的,而且也不知道他的 Access Code,這時可以勾選 Use Serial Number,就可以刪除了
註3:Serial Number 除了勾選外,還可以由 gpg --card-status 看到,不足位數請前面補 0
註4:Configuration Slot 2 不刪除 PUK 也會無法刪除

------------------------------------------------------------------------------------------------------------------------

清除 PIV(Smart Card)設定
方式1. 使用 YubiKey Manager GUI
開啟 YubiKey Manager GUI => 點 Applications => 點 Reset PIV
這個方式比較直覺

方式2. 使用 YubiKey Manager CLI
安裝 YubiKey Manager 後 => 到 C:Program FilesYubicoYubiKey Manager 目錄 => 下  ykman piv reset
註:重設後指令會說明 PIN、PUK、Management Key,回復原廠設定值 123456、12345678 及 010203040506070801020304050607080102030405060708

方式3. 使用 Yubico PIV Tool
這個方式比較麻煩,請直接參考官方說明,不過,towns 有用了另一方式,就是打三次錯誤的 PIN 被鎖住後,開啟該工具,點選 Manage device PINs,這時工具就會直接要你 Reset Device 了
註:如果有開啟 GunPG smartcard deamon,PIV Tool 會抓不到 yubikey,記得關掉

------------------------------------------------------------------------------------------------------------------------

清除由 OpenPGP 所產生的資料
方式1. 使用 YubiKey Manager
安裝 YubiKey Manager 後 => 到 C:\Program Files\YubicoYubiKey Manager 目錄 => 下  ykman openpgp reset
註:重設後指令會說明 PIN、Reset Code、Admin PIN,回復原廠設定值 123456、Not Set 及 12345678

方式2. 使用 GPG 指令手動刪除
gpg --card-edit => admin => factory-reset

以上三個動作完成後,yubikey 就回到預設值了

參考資料:yubikey 官方說明
https://support.yubico.com/support/solutions/articles/15000008845-resetting-your-yubikey-4-or-yubikey-neo-to-factory-defaults 


3. GunPG 相關

gpg4win
C:Program Files (x86)GnuPG
C:Program Files (x86)Gpg4win

gpg4win-light
C:Program Files (x86)GNUGnuPG
註:gpg4win 與 gpg4win-light 版本不同,gpg4win-light 沒有 --export-ssh-key 這個參數

指令:
gpg --version
gpg --edit-card
gpg --card-status
gpg --export-keys <SHORD ID> > [path/name]
gpg --export-ssh-key <SHORD ID> > [path/name] => 匯出 ssh key
gpg --export-secret-keys <SHORD ID> > [path/name] => 匯出私鑰
gpg --export-secret-keys --armor <SHORD ID> > [path/name]  => 匯出私鑰(ascii 方式,可以看到begin end)
gpg-connect-agent /bye
gpg-connect-agent killagent /bye
gpg-connect-agent --hex "scd apdu 00 f1 00 00" /bye
gpg --list-keys
gpg --list-secret-keys
gpg --delete-key <SHORD ID> 
gpg --delete-secret-key <SHORD ID>
gpg --import [path]/[private key file]
gpg --gen-key <== 建立金鑰(第一次使用時會出現完整功能,第二次使用時,會使用預設值)
gpg --full-generate-key <== 建立金鑰,出現完整功能設定

註1:gpg 的 command 有點奇怪,如 gpg --edit-card 也可以是 --card-edit,gpg --card-status 也可以是 gpg --card-stat
註2:SHORD,就是在列出金錀時,中出現40碼的字串

設定檔:
c:\Users\[user\]AppData\Roaming\gnupg\gpg-agent.conf
c:\Users\[user]\AppData\Roaming\gnupg\scdaemon.conf

參考資料:
GunPG 官網
https://www.gnupg.org/ 

GPG4WIN 官方網站
https://www.gpg4win.org/index.html 


MAC 使用 yubikey 驗證 ssh

0. 安裝 GPG

1. 於 yubikey 中建立 GPG keypair
 1. gpg --card-edit <= 進入 yubikey 進行編輯
 2. gpg/card> admin <= 開放 admin 權限
 3. gpg/card> passwd <= 進行 PIN 設定(選用)
 4. gpg/card> generate <= 產生金鑰對
 5. gpg --export-ssh-key <SHORD ID> > [path] <= 匯出 ssh 公鑰
註1:在使用了 gpg --card-edit 後,gpg 的個人相關檔就會出現,但 gpg-agent.conf 需自行新增、設定
註2:如果 yubikey 金錀,不是由 MAC 產生時,在安裝 gpg 套件後,需使用 gpg --card-stat 產生個人相關檔,並自行新增、設定 gpg-agent.conf 檔

2. 匯入公鑰並放入要登入的主機中
 將產生公鑰的內容放入遠端主機要登入的帳號中(~/.ssh/authorized_keys)

3. 設定 gpg-agent.conf
 編輯 ~/.gnupg/gpg-agent.conf,加入
pinentry-program /usr/local/MacGPG2/libexec/pinentry-mac.app/Contents/MacOS/pinentry-mac <= 開啟輸入 PIN 的畫面
enable-ssh-support <= 重點,支援 ssh
write-env-file
use-standard-socket
default-cache-ttl 600
max-cache-ttl 7200
debug-level advanced
log-file /var/log/gpg-agent.log

4. 啟動 gpg-agent
export SSH_AUTH_SOCK=~/.gnupg/S.gpg-agent.ssh
gpgconf --launch gpg-agent

5. 使用 iterm2 登入遠端主機
 ssh towns@a.b.c

這時,如果設定正確,在第一次登入時,系統會跳出打入 PIN 碼,第二次登入則不用,不過登入時,就不會再問 PIN 碼,而拔除重插後,會再要求打 PIN 碼

6. 將 gpg-agent 寫入開機啟動
於 bash_profile 中加入
# start gpg-agent
export SSH_AUTH_SOCK=~/.gnupg/S.gpg-agent.ssh
gpgconf --launch gpg-agent

註1:新版的 GPG 有新的設定方式
註2:如果使用者的 cmd 是使用 zsh,必需修改 .zshrc 檔才能生效,這個檔案預設是沒有的

gpg-agent --daemon &> /dev/null
export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"

註:新的方式有時在MAC上並不可行

補充:MAC 安裝 GPG 套件
1. 到 GPG 官網下載套件(推薦)
2. brew install caskroom/cask/gpg-suite
3. 到 GPG 官網下載 GunPG-2.2.20.dmg,這個方式在設定3,pinentry-program 的路徑會不同,也不會產生 .gunpg 資料匣,但可以使用 gpg 來產生,執行 gpg --card-stat(或 gpg --card-edit 後) 指令後,各項設定檔都會出現,但還需要手動新增 gpg-agent.conf,而且,執行 gpgconf 後,會告訴使用者所有相關路徑

參考資料:
Wilson Kao大的文章
https://medium.com/@SSWilsonKao/%E5%A6%82%E4%BD%95%E5%9C%A8-mac-%E4%B8%8A-%E6%8A%8A-yubikey-%E8%88%87-gpg-ssh-%E6%90%AD%E9%85%8D%E5%9C%A8%E4%B8%80%E8%B5%B7-5f842d20ad6a

herb 大的文章
https://medium.com/@herb123456/%E5%88%A9%E7%94%A8yubikey%E7%99%BB%E5%85%A5%E9%81%A0%E7%AB%AFssh%E4%B8%BB%E6%A9%9F-2dedd3488206

永恒住名大的文章
https://zhuanlan.zhihu.com/p/26712353

ITREAD01 --  mac 更新“.bash_profile”(配置全域性環境變數)沒生效問題
https://www.itread01.com/content/1549866803.html


刪除 MacOS 使用 yubikey 驗證

sc_auth list
sc_auth unpair -u towns
官方寫的很多,但這是 towns 最常使用的方式

參考資料:
yubikey 官方文件
https://support.yubico.com/support/solutions/articles/15000006468 


Mac 安裝 GPG-suite

可能是 towns 與 MAC 不熟,使用 brew 及 pip 安裝 GPG-suite 都不太順,後來 towns 直接到官網下載 dmg 檔進行安裝。使用官方套件的好處是,安裝及移除工具都放在這個套件中,很方便 ^^

參考資料:GPG Suite 官網
https://gpgtools.org/  


Yubikey 驗證出現錯誤

如果 yubikey 出現以下錯誤,可以先考慮一下,是否 PIN 碼異常(如被鎖定、PIN 碼小於 6 碼等……),應先處理 PIN 碼問題
SSH support:sign_and_send_pubkey signing failed agent refused operation
putty support:pageant failed to answer challenge


重要值說明

Remaining attempts 剩於嘗試次數,當次數為 0 時,表示這把的 PIN 碼打錯次數上限了,金鑰被鎖定,需要使用 AdminPIN 碼來解鎖
PIN retry counter : 3 0 3 第一個值為 PIN 碼嘗試次數上限,每錯一次減一次,打對了就回復,第三個值為 AdminPIN 碼嘗試次數

參考資料:
yubico討論
https://forum.yubico.com/viewtopic5f07.html?p=8116


在 MAC 及 windows 上發生讀不到 yubikey 的問題

常有同事發生 yubikey 讀不到的問題,在 MAC 及 windows 上都會發生,這個問題可能是因為沒有正常退出 USB 設備造成,不過 MAC 上可以正常退出嗎?? towns 就太清楚了

留言

這個網誌中的熱門文章

zimbra 安裝、管理、設定

Fortigate 100D -- 管理、設定

IT 隨手記6