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 就太清楚了
留言
張貼留言