使用 YubiKey u2f 认证方式登录OpenSSH Server

使用 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

参考文档

  1. How to configure OpenSSH with YubiKey Security Keys U2F Authentication on Ubuntu 18.04

  2. U2F support in OpenSSH HEAD

  3. U2F Support in OpenSSH Head (marc.info)

  4. Yubico libfido2

  5. FIDO U2F应用与开发(一)-原理与协议