使用 Yubikey 在 archlinux 下 login/sudo/ssh

处理登录事件

此处需要安装额外软体 yubico-pam

Yubikey 可用两种方式来进行登录的验证,一种是在线验证,另一种是Challenge-response认证1

这里考虑到网络的情况,即在登录前可能没有网络,那可能会陷入无限循环状态。所以我选择了后者进行认证,其实也只是配置参数的区别而已。

按照它的配置,我们需要在 Yubikey 的 OTP 选项中,选择一个栏位用于 Challenge-response 。

这里我选择了使用短暂触碰的栏位,这样的话可以降低误触的概率(比你想要过认证但是输出了一大串 OTP 的无用字符好)

配置完成后,我们按照官方的教程的操作步骤进行操作。

首先新建一个目录用来存放配置文件。再使用它的 ykpamcfg 来生成验证所需要的东西。

$ mkdir ~/.yubico
$ ykpamcfg -2 -v
...
Stored initial challenge and expected response in '/home/alice/.yubico/challenge-123456'.

此处的 -2 选项是选择哪个槽位来进行 Challenge-response ,如果配置的是短触的栏位,则使用 -1 (或者干脆直接删掉这个参数) 。

官方教程中有可选的增强安全性的选项,这里也把相应的步骤写一下

$ sudo mkdir /var/yubico
$ sudo chown root.root /var/yubico
$ sudo chmod 700 /var/yubico
$ ykpamcfg -2 -v
...
Stored initial challenge and expected response in '$HOME/.yubico/challenge-123456'.
$ sudo mv ~/.yubico/challenge-123456 /var/yubico/alice-123456
$ sudo chown root.root /var/yubico/alice-123456
$ sudo chmod 600 /var/yubico/alice-123456

请在更改 pam 文件前,仔细斟酌能否回滚文件更改,以防出现无法登录的情况

之后,在 pam 配置 /etc/pam.d/systemd-login 中添加一行

auth       sufficient   pam_yubico.so       mode=challenge-response chalresp_path=/var/yubico

或者把 sufficient 改为 required 如果强制需要 yubikey 进行登录的话。

重启系统后就可以体验到新的配置了,如果有需要按 yubikey 上的按钮的话别忘记按。

处理 sudo 事件

sudo 的话这里需要用到它的 u2f ,这里同样也许要安装额外软体 pam-u2f

首先生成 pam 的配置

pamu2fcfg -o pam://[YOUR HOSTNAME] -i pam://[YOUR HOSTNAME] > ~/.config/Yubico/u2f_keys

请在更改 pam 文件前,额外另开另一个 root shell 以防出现修改失败无法回滚的情况

而后在 /etc/pam.d/sudo 的第一行之前,添加这一行,并确认 [YOUR HOSTNAME] 已经替换成了您机器的 hostname

auth            sufficient      pam_u2f.so origin=pam://[YOUR HOSTNAME] appid=pam://[YOUR HOSTNAME]

保存后,执行 sudo ls ,你的 yubikey 应该会闪烁,触摸它一下即应该成功执行这个指令。

配置 ssh 远程登录

这里需要用到 GPG 的配置,具体就参考之前的部落格吧,因为使用的是 GPG 的 ssh key 来进行认证。

这里假设已经配置好了,我们首先拿一下它的公钥。

使用 gpg --export-ssh-key <YOUR KEY ID> 应该能输出如下栏位,把公钥先添加到你想要链接的伺服器上。

$ gpg --export-ssh-key [MASKED]
ssh-ed25519 [MASKED] openpgp:[MASKED]

这时的下一步,就是让 gpg-agent 接管 ssh-agent 来进行认证。

$ export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)

当然还要配置一下 gpg-agent 的配置文件: ~/.gnupg/gpg-agent.conf 加上一行

enable-ssh-support

然后把自己的 key id 添加到 ~/.gnupg/sshcontrol , key id 可以用 gpg -K --with-keygrip 找到。

再启动 gpg-agent

$ gpgconf --launch gpg-agent

如果 gpg-agent 已经启动了,那我们需要 reload 一下 agent ,使用下列命令来 reload

$ gpg-connect-agent reloadagent /bye

此时使用 ssh 的话,应该就是使用你的 yubikey 上的 GPG key 进行认证的了。


  1. https://developers.yubico.com/yubico-pam/Authentication_Using_Challenge-Response.html ↩︎