使用 YubiKey u2f 认证方式登录OpenSSH Server
前言
新版openSSH介绍
2020年2月14日,OpenBSD团队 发布了 OpenSSH 8.2,该版本现在支持 FIDO(快速在线身份验证)U2F 安全密钥。OpenSSH 8.2 增加了对通过 FIDO/U2F 协议进行身份验证的支持,FIDO(Fast IDentity Online联盟) 是一个基于标准、可互操作的身份认证生态系统。U2F(Universal 2nd Factor)是FIDO联盟提出的使用标准公钥密码学技术提供更强有力的身份认证协议。
U2F 在常用的用户名/密码的认证基础上又增加了一层第二因子(2nd Factor) 的保护,这重保护是通过物理硬件来支持的。这意味着从今天发布的 OpenSSH 8.2 开始,用户可以在通过 SSH 在远程服务器上进行身份验证时配置硬件安全密钥。
用户使用他们的用户名密码或 SSH 身份验证证书登录到服务器后,需要提供一个基于 FIDO/U2F 的USB、蓝牙或基于nfc的安全密钥作为第二个身份验证。
使用安全密钥是目前公认的最强大的多因素身份验证(MFA)方法之一。使用MFA(通常称为2FA(双因素身份验证))是防止黑客猜测或篡改您的SSH密码并控制您的服务器的最简单方法。
去年,微软表示,该公司为其各自的微软账户启用了MFA的客户阻止了99.9%的账户黑客企图,这表明绕过MFA解决方案是多么困难。微软将基于fido的硬件安全密钥列为最安全、最难破解的MFA解决方案。
yubikey
yubikey简单的说是一个硬件认证设备,MFA(Multi-factor authentication),包括2FA(Two-factor authentication),这是一种动态密码认证器,每隔一段时间更新一次验证码,破解理论上来说是不可能的,除非有非常强大的算力。其中这类的软件,包括Goolge身份认证器以及一些其他的(只用过google身份认证器),硬件的话包括我们常见的U盾等,而yubikey就是其中的比较优秀的一款,功能还是挺多的。相关的配置,这个地址有介绍,yubikey入门
OpenSSH 为 u2f 增加的新的秘钥类型
OpenSSH8.2 添加了的U2F/FIDO支持,U2F被添加为新的密钥类型`sk-ecdsa-sha2-nistp256@openssh.com或者
ecdsa-sk` (“sk” 意思是 “security key”)。由于可以通过多种方式与U2F设备进行通信,包括USB,
蓝牙和NFC。OpenSSH开发者不想给OpenSSH负担很多依赖性。相反,他们将与令牌进行通信的任务委托给了一个小型中间件库,该库以类似于现有PKCS#11支持的方式加载。他们已经为Yubico的libfido2编写了一个基本的中间件,现有的中间件非常基础:它将尝试查找并使用通过USB找到的第一个U2F令牌。因此,如果您恰巧在计算机上附加了多个令牌,则可能会出问题。该中间件能够与任何标准的USB HID U2F或FIDO2令牌对话。中间件源托管在 libfido2 的 GitHub 中。
配置过程
请注意,U2F密钥是新的OpenSSH密钥类型,因此服务器也必须支持它。为了支持 u2f 我们需要客户端和服务端都支持新的秘钥也就是说客户端和服务端OpenSSH版本至少为8.2以上,客户端我们选择macos
客户端(macOS 10.15.3)
客户端需要 libfido2
支持。需要 openSSH 8.2
以上版本
1 | brew install libfido2 |
2 | brew install openssh |
生成 u2f 专用的公私钥文件
1 | ssh-keygen -t ecdsa-sk -C "$(hostname)-$(date +'%d-%m-%Y')-physical_yubikey_number" |
我们将公钥复制备用
1 | sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBBpR/DT0N/jBjjaSg9ZTGA+9LO9rXe70lpobnn6zovU+QjBy/NV/UEZRwk3jm38C9ny+fBnTwz07Rz2VtXJDGWMAAAAEc3NoOg== dazhuangdeMacBook-Pro.local-23-03-2020-physical_yubikey_number |
服务器端(OpenBSD 6.6)
1 | # cd /usr/src/ |
2 | # wget https://cloudflare.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.2p1.tar.gz |
3 | # wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/openbsd66_8.2.patch |
编译安装OpenSSH8.2
1 | # cd /usr/src/ |
2 | # tar zxvf openssh-8.2.tar.gz |
3 | # patch -p1 < /path/to/openbsd66_8.2.patch # if on OpenBSD 6.6 or 6.5 |
4 | # cd ssh |
5 | # make obj |
6 | # make cleandir |
7 | # make depend |
8 | # make |
9 | # make install |
10 | # cp ssh_config sshd_config /etc/ssh |
restart sshd
1 | kill -HUP `cat /var/run/sshd.pid` |
配置认证证书
将id_ecdsa_sk.pub公钥添加到要使用U2F SSH连接到的主机上的authorized_keys文件中
1 | sshd -V |
2 | sshd: unknown option -- V |
3 | OpenSSH_8.2, LibreSSL 3.0.2 |
4 | |
5 | cat .ssh/authorized_keys |
6 | sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBBpR/DT0N/jBjjaSg9ZTGA+9LO9rXe70lpobnn6zovU+QjBy/NV/UEZRwk3jm38C9ny+fBnTwz07Rz2VtXJDGWMAAAAEc3NoOg== dazhuangdeMacBook-Pro.local-23-03-2020-physical_yubikey_number |
登录过程
1 | ssh 10.10.50.238 |
2 | Confirm user presence for key ECDSA-SK SHA256:ZuitYWD211v1nACCvnP2fJG49jNH7hrDV24ZN2CT748 |
3 | Last login: Mon Mar 23 22:48:38 2020 from 10.10.200.1 |
4 | OpenBSD 6.6 (GENERIC.MP) #372: Sat Oct 12 10:56:27 MDT 2019 |
5 | |
6 | Welcome to OpenBSD: The proactively secure Unix-like operating system. |
7 | |
8 | Please use the sendbug(1) utility to report bugs in the system. |
9 | Before reporting a bug, please try to reproduce it with the latest |
10 | version of the code. With bug reports, please try to ensure that |
11 | enough information to reproduce the problem is enclosed, and if a |
12 | known fix for it exists, include that as well. |
我们甚至可以只接受U2F会话来限制远程堡垒服务器上的SSH身份验证,远程服务器必须支持基于sk的SSH密钥对。需要禁止密码远程登录
1 | cat /etc/ssh/sshd_config |
2 | [...] |
3 | PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com |
4 | [...] |
其他客户端问题
注意客户端编译时不要忘记安装libfido2-dev并使用所需的–with-security-key-builtin标志编译OpenSSH
1 | $ sudo apt-get update && sudo apt-get upgrade -y |
2 | $ sudo apt-get install gcc libssl-dev libcbor-dev zlib* make |
3 | |
4 | $ sudo apt-add-repository ppa:yubico/stable |
5 | $ sudo apt-get update -y |
6 | $ sudo apt-get install libfido2-dev |
7 | |
8 | $ cd /usr/local/src |
9 | $ wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.2p1.tar.gz |
10 | $ tar -zxvf openssh-8.2p1.tar.gz |
11 | $ cd /usr/local/src/openssh-8.2p1 |
12 | $ ./configure --prefix=/usr --with-security-key-builtin |
13 | $ make && make install |