使用Yubikey FIDO2 验证无密码登陆Linux SSH
About
之前CloudFlare打折梭哈了一个5C NFC和5NFC,一主一备用来二次验证Google,Meta,Twitter这些平台,绑了2FA后明显账号权重提升,随便用什么脏IP
都不会禁用账户,当然这是题外话了,现在Yubikey的价格已经高攀不起了 (笑。
言归正传,用yubikey登陆Linux SSH官方提供的主要有4中方法,比较常用的是FIDO2和OTP(One Time Password),后者兼容性比较好,毕竟是模拟键盘输入,缺点就是安全性一般,恶意程序会劫持键盘事件,所以一般我们选择前者,不过前者对SSH版本有要求,最低OpenSSH 8.3,Windows自带的版本比较低,解决办法也很简单去这https://github.com/PowerShell/Win32-OpenSSH下载更高版本更新一下就行了。
Yubico官方指引:https://developers.yubico.com/SSH/
使用FIDO2 在Linux和Windows验证登陆SSH
一、SSH客户端
Windows
1.Windows打开Powershell
ssh -V #查看目前ssh版本
2.生成ed25519密钥,-sk后缀就是securitykey的意思
ssh-keygen -t ed25519-sk -O resident -O verify-required -C “”
输入y
Overwrite key in token (y/n)? y
如果ssh版本正确会弹窗请求验证,确定后输入pin并触摸密钥
后面会提示你是否需要选择一个passphrase,以及保存位置,直接默认回车就可以。
默认会存储在用户目录下的.ssh目录,这里的id_ed25519-sk.pub就是公钥。
3.cat .\id_ed25519_sk.pub复制公钥备用
[email protected] AAAAG......o= ubuntu-cdit01
Linux
1.安装fido2模块
OpenSUSE
sudo zypper install libfido2-1 #其他发行版类似
这里以OpenSUSE Tumbleweed为例,其实生成密钥的方法和Windows一模一样,但是linux需要sudo才能使用调用fido,不过linux并不会弹窗,看到终端提示触摸密钥并且yubikey绿灯闪烁就可以触摸密钥生成。
sudo ssh-keygen -t ed25519-sk -O resident -O verify-required
二、Linux sshd服务器配置
1.编辑/etc/ssh/sshd_config
PubkeyAuthentication yes PubkeyAuthOptions verify-required #这一项需要自行添加 AuthorizedKeysFile .ssh/authorized_keys PermitRootLogin yes PasswordAuthentication no PermitEmptyPasswords no
2.编辑~/.ssh/authorized_keys,并粘贴之前复制的公钥。
3.重启sshd服务
sudo systemctl restart sshd
三、使用FIDO无密码认证连接SSH
ssh -i ~/.ssh/id_ed25519-sk [email protected] #指定私钥
四、重新生成私钥和公钥
和普通私钥不一样,使用ed25519-sk密钥,存储在本地只是一部分,另一部分在物理密钥上,就算有人获取了你的私钥,也没有办法认证ssh。
重新生成
ssh-kengen -K
以上是在Linux下生成已有的密钥,在Windows Powershell可能输入PIN后会报错
Enter PIN for authenticator: You may need to touch your authenticator to authorize key download. Unable to load resident keys: invalid format
解决办法是Powershell管理员权限就可以正常使用ssh-keygen -K了,还有一种可能是你的Openssh版本太低了。