使用 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 进行认证的了。