使用Yubikey FIDO2 验证无密码登陆Linux SSH

使用Yubikey FIDO2 验证无密码登陆Linux SSH

· json · rss
Subscribe:

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版本太低了。