Yubikey 是一個硬體鎖
可以產生金鑰並把私鑰儲存在上面
這次就是要利用這個特性
來登入遠端主機的SSH服務
這樣除非拿到這個硬體裝置
不然沒有人可以登入你的伺服器
首先我是照著這篇文章來做
但因為在Mac上有一些變化需要更新
所以我就整理我的步驟讓整個流程更順利些
我的操作環境:
Macbook air 2012
MacOSX 10.12.6
Zsh shell
在第一次插上yubikey有按照官方教學設定過
並且用PIV manager設定yubikey跟MacOSX的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 xxx@xxx.xxx.xxx.xxx
測試是否可以登入
直接 ssh 登入看看
ssh xxx@xxx.xxx.xxx.xxx
順利的話會跳出gpg詢問PIN碼視窗
之後就會登入了