配置YubiKey无密码登录远程VPS

YubiKey 是一种硬件身份验证设备,用于增强计算机和在线服务的安全性。它由Yubico公司生产,并且通常是一个小型的USB设备,类似于一个闪存驱动器或一个硬件令牌。

本文主要使用其中的FIDO加密功能来生成公钥和私钥来登录VPS,这样就可以实现无密码只要 YubiKey 插入计算机并且触摸一下即可登录远程SSH。

FIDO协议通过在客户端设备(例如智能手机、USB安全密钥等)上生成和存储安全密钥,并在用户进行身份验证时,通过与服务端进行的安全通信来验证用户的身份。

这种方式消除了传统用户名和密码中的大多数安全弱点,例如密码被泄露、密码重用和网络钓鱼攻击。

以下操作在用户名为 debian11 的普通用户下完成,如果在 root 用户下操作则无需在命令前加入 sudo 来执行。
 

1、更新Windows自带的OpenSSH组件:

由于通过 Windows 11 自带的程序和功能开启的OpenSSH版本过低无法支持 ed25519-sk密钥,所以要下载最新版本更新一下:

打开下面连接下载最新的release版本:
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公钥和私钥:

ssh-keygen -t ed25519-sk
此时Windows会弹出安全密钥设置对话框,点确定,然后继续安装点确定

如果之前YubiKey设置过PIN的话直接输入,如果没有的话可以设置一个新的,不要忘记这个PIN
然后确认PIN,接着触摸一下YubiKey即可返回PowerShell界面操作。

接下来会要求你输入一个目录来输出两个KEY文件,也可以直接回车会输出到当前用户的 .ssh 文件夹下
我的输出目录是 C:\Users\Administrator\.ssh

最后检查一下这个目录下是否有 id_ed25519_skid_ed25519_sk.pub 这两个文件。
 
3、更改私钥文件的权限:

Windows 上因为OpenSSH的安全性要求,所以必须先更改一下文件权限,只让你这一个用户有权限访问。

所以还需要比较繁琐的安全权限设置,不过如果是图形界面的 Windows 11 使用如下操作就很简单了:

右键打开 id_ed25519_sk 文件的属性,注意是不带pub结尾的那个无拓展名文件
选择 安全-高级,点击左下角 禁用继承 然后确认退出

回到安全选项卡,点击 编辑-添加,在输入对象处输入你的当前Windows登录用户名,然后点击检查名称确保正确
点击确定添加进来,最后需要把 除了你的用户 以外的所有用户点击 删除 ,然后在你的用户上点 允许-完全控制

确定保存后,再打开一遍 属性·安全 选项卡确认只有你一个用户,并且有 完全控制 权限

这样根据OpenSSH的标准,你的私钥文件已经可以使用并建立SSH连接了。
 
4、更新系统组件并安装PAM模组:

我这面使用的是 Debian 11 amd64 系统,首先SSH登录进来,

然后执行以下命令更新系统,并安装 YubiKey PAM模组:

sudo add-apt-repository ppa:yubico/stable

sudo apt update

sudo apt install libpam-yubico -y

此时系统就已经支持 Yubikey 的私钥认证了。
 
5、拷贝公钥文件到远程VPS:

在同样的SSH终端界面继续输入命令来创建密钥文件夹和更改文件权限:

mkdir .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 中需要酌情修改:

打开 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(管理员)输入以下命令:

ssh -i "C:\Users\Administrator\.ssh\id_ed25519_sk" [email protected]

双引号内的是私钥路径,@符号前面是远程VPS登录用户名,后面是服务器IP

连接后会让你触摸一下 YubiKey,之后即可免密钥登陆了,除了 PowerShell 还可以使用 WSL2 或者 MobaXterm 等支持 ed25519加密 的SSH工具来登录了。

手机端iOS或者Android都可以选择相应的SSH工具,例如 Termius(收费)SSH客户端插入 YubiKey 或者 NFC靠近扫描 一下来登录远程SSH,touch touch 很是方便~

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

− 2 = 6