利用Yubikey登入遠端SSH主機

Yubikey 是一個硬體鎖

可以產生金鑰並把私鑰儲存在上面

這次就是要利用這個特性

來登入遠端主機的SSH服務

這樣除非拿到這個硬體裝置

不然沒有人可以登入你的伺服器

首先我是照著這篇文章來做

但因為在Mac上有一些變化需要更新

所以我就整理我的步驟讓整個流程更順利些

我的操作環境:

Macbook air 2012

MacOSX 10.12.6

Zsh shell

在第一次插上yubikey有按照官方教學設定過

並且用PIV manager設定yubikey跟MacOSX的login結合

https://www.yubico.com/why-yubico/for-business/computer-login/mac-os-login/

第零步

在原文裡會建議清除 homebrew 的資料

以免發生不可預期的錯誤

但我並沒有做這步驟

也正常完成

所以大家可以按照自己環境來做

$ cd brew --prefix
$ sudo rm -rf Cellar
$ brew prune
$ sudo rm -rf Library .git .gitignore bin/brew README.md share/man/man1/brew
$ sudo rm -rf ~/Library/Caches/Homebrew
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安裝所需工具

$ brew update
$ brew install yubikey-personalization
$ brew cask install caskroom/drivers/yubico-yubikey-personalization-gui
$ brew cask install caskroom/drivers/yubico-yubikey-manager
$ brew install caskroom/cask/gpg-suite

將 Yubikey 設為 OpenPGP SmartCard 與 OTP 協同作業模式

$ ykpersonalize -m82

修改預設PIN密碼

$ gpg --card-edit
Reader ...........: Yubico Yubikey 4 OTP CCID
Application ID ...: XXXX
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: XXXXXXX
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 4
Signature key ....: XXXX
      created ....: XXXX
Encryption key....: XXXXX
      created ....: 2XXXX
Authentication key: XXXXX
      created ....: xxxxxx
General key info..: pub  xxxxx

gpg/card>

進入gpg指令畫面之後輸入admin

gpg/card> admin
Admin commands are allowed

gpg/card>

再輸入passwd

gpg/card> passwd
gpg: OpenPGP card no. xxxxx detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection?

這時需要修改PIN(出廠預設是 123456)跟Admin PIN(出廠預設是 12345678)

產生公私鑰

在修改完密碼之後先別急著退出

繼續輸入 generate

gpg/card> generate
Make off-card backup of encryption key? (Y/n)
# 是否要製作卡片以外的備份?我是選N
What keysize do you want for the Signature key? (2048) 4096
# key 長度,預設2048,我產生4096
Please specify how long the key should be valid. 
#金鑰的期限
         0 = key does not expire
         <n>  = key expires in n days
         <n>w = key expires in n weeks
         <n>m = key expires in n months
         <n>y = key expires in n years
Key is valid for? (0) 1y

GnuPG needs to construct a user ID to identify your key.

Real name: XXX
Email address: XXX
Comment:

# 需要一些資料來產生key

gpg: key <SHORT ID> marked as ultimately trusted
gpg: directory 'xxxx' created
gpg: revocation certificate stored as 'xxxxx'
public and secret key created and signed.

注意最後的 SHORT ID

先記錄下來之後會用到

產生GPG pub key

這步驟不知道可不可以忽略

但我有跟著做就是了

gpg --armor --export <SHORT ID> > ~/gpg_key.pub

開啟 GPG Keychain程式

並對自己的公鑰按右鍵

可以選擇產生出一組撤銷憑證(Generate Revoke Certificate…)

但我看之前產生公私鑰的時候就有產生了

所以這步驟我略過

我選了「將這公鑰上傳到 Keyserver」(Send public key to Keyserver)

設定並啟動 GPG Agent

$ vim ~/.gnupg/gpg-agent.conf

pinentry-program /usr/local/MacGPG2/libexec/pinentry-mac.app/Contents/MacOS/pinentry-mac
enable-ssh-support
write-env-file
use-standard-socket
default-cache-ttl 600
max-cache-ttl 7200
debug-level advanced
log-file /var/log/gpg-agent.log

log-file可以改為自己使用者可讀寫的位置

設定完之後修改zshrc

或bashrc

vim ~/.zshrc

# start gpg-agent
export SSH_AUTH_SOCK=~/.gnupg/S.gpg-agent.ssh
gpgconf --launch gpg-agent

產生SSH所需公鑰

原文內的 gpgkey2ssh 指令已經廢除

可以直接用gpg指令產生

gpg --export-ssh-key <SHORD ID> > ~/.ssh/gpg_ssh.pub

上傳public key

這步驟就跟以前上傳差不多

不一樣的地方是沒有私鑰所以要加上force選項

ssh-copy-id -f -i ~/.ssh/gpg_ssh.pub [email protected]

測試是否可以登入

直接 ssh 登入看看

ssh [email protected]

順利的話會跳出gpg詢問PIN碼視窗

之後就會登入了

看更多