YubiKey 是一种硬件身份验证设备,用于增强计算机和在线服务的安全性。它由Yubico公司生产,并且通常是一个小型的USB设备,类似于一个闪存驱动器或一个硬件令牌。
本文主要使用其中的FIDO加密功能来生成公钥和私钥来登录VPS,这样就可以实现无密码只要 YubiKey 插入计算机并且触摸一下即可登录远程SSH。
FIDO协议通过在客户端设备(例如智能手机、USB安全密钥等)上生成和存储安全密钥,并在用户进行身份验证时,通过与服务端进行的安全通信来验证用户的身份。
这种方式消除了传统用户名和密码中的大多数安全弱点,例如密码被泄露、密码重用和网络钓鱼攻击。
以下操作在用户名为 debian11 的普通用户下完成,如果在 root 用户下操作则无需在命令前加入 sudo 来执行。
1、更新Windows自带的OpenSSH组件:
由于通过 Windows 11 自带的程序和功能开启的OpenSSH版本过低无法支持 ed25519-sk密钥,所以要下载最新版本更新一下:
https://github.com/PowerShell/Win32-OpenSSH/releases
我的系统是Windows 11 amd64 所以下载连接为:
https://github.com/PowerShell/Win32-OpenSSH/releases/download/v9.2.0.0p1-Beta/OpenSSH-Win64-v9.2.0.0.msi
下载后双击安装msi安装包即可
安装后打开 PowerShell(管理员),输入 ssh -V 查看当前版本是否和安装的版本一样即可。
2、生成 ed25519-sk密钥:
此时插入 YubiKey 到计算机的USB接口,确保是直接插入USB接口或者延长线,尽量不要插入到USB HUB(集线器)上以防无法识别。
打开 PowerShell(管理员)输入以下命令生成 ed25519-sk公钥和私钥:
此时Windows会弹出安全密钥设置对话框,点确定,然后继续安装点确定
如果之前YubiKey设置过PIN的话直接输入,如果没有的话可以设置一个新的,不要忘记这个PIN
然后确认PIN,接着触摸一下YubiKey即可返回PowerShell界面操作。
接下来会要求你输入一个目录来输出两个KEY文件,也可以直接回车会输出到当前用户的 .ssh 文件夹下
我的输出目录是 C:\Users\Administrator\.ssh
最后检查一下这个目录下是否有 id_ed25519_sk 和 id_ed25519_sk.pub 这两个文件。
3、更改私钥文件的权限:
在 Windows 上因为OpenSSH的安全性要求,所以必须先更改一下文件权限,只让你这一个用户有权限访问。
所以还需要比较繁琐的安全权限设置,不过如果是图形界面的 Windows 11 使用如下操作就很简单了:
选择 安全-高级,点击左下角 禁用继承 然后确认退出
回到安全选项卡,点击 编辑-添加,在输入对象处输入你的当前Windows登录用户名,然后点击检查名称确保正确
点击确定添加进来,最后需要把 除了你的用户 以外的所有用户点击 删除 ,然后在你的用户上点 允许-完全控制
确定保存后,再打开一遍 属性·安全 选项卡确认只有你一个用户,并且有 完全控制 权限
这样根据OpenSSH的标准,你的私钥文件已经可以使用并建立SSH连接了。
4、更新系统组件并安装PAM模组:
我这面使用的是 Debian 11 amd64 系统,首先SSH登录进来,
然后执行以下命令更新系统,并安装 YubiKey PAM模组:
sudo apt update
sudo apt install libpam-yubico -y
此时系统就已经支持 Yubikey 的私钥认证了。
5、拷贝公钥文件到远程VPS:
在同样的SSH终端界面继续输入命令来创建密钥文件夹和更改文件权限:
然后使用FinalShell或者其他的SSH工具上传本机上的 id_ed25519_sk.pub 到 远程VPS的 .ssh 目录中
接下来更改文件夹和私钥文件的权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519_sk.pub
此时大部分的工作已经完成了,先不要断开SSH连接,更改 sshd_config 后即可启用登录。
6、修改 sshd_config 配置:
我这面使用的是纯净的 Debian 11 操作系统,所以 sshd_config 是默认配置,
如果有自定义端口或者其他配置在 sshd_config 中需要酌情修改:
sudo nano /etc/ssh/sshd_config
在文件末尾另起一行添加以下文本,一行一个:
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/id_ed25519_sk.pub
如果有多个YubiKey公钥要加入,直接在pub文件后面加上空格后输入路径即可:
AuthorizedKeysFile %h/.ssh/id_ed25519_sk-1.pub %h/.ssh/id_ed25519_sk-2.pub
Ctrl+O 写入文件 然后 Ctrl+X 退出 nano编辑器,
然后输入 sudo systemctl restart ssh 重启SSH服务。
最后就是使用 PowerShell 来尝试连接远程VPS了,打开 PowerShell(管理员)输入以下命令:
双引号内的是私钥路径,@符号前面是远程VPS登录用户名,后面是服务器IP。
连接后会让你触摸一下 YubiKey,之后即可免密钥登陆了,除了 PowerShell 还可以使用 WSL2 或者 MobaXterm 等支持 ed25519加密 的SSH工具来登录了。
手机端iOS或者Android都可以选择相应的SSH工具,例如 Termius(收费)SSH客户端插入 YubiKey 或者 NFC靠近扫描 一下来登录远程SSH,touch touch 很是方便~