如何设置 OpenSSH 以使用 x509 PKI 进行身份验证?

信息安全 验证 公钥基础设施 SSH x.509
2021-09-06 17:02:18

我并不是说简单地将 x.509 证书的公共 RSA 密钥放入~/.ssh/authorized_keys- 我正在寻找一种设置 ssh 的方法,以便自动授予由预定义 CA 签名的 x.509 证书访问关联的用户帐户。RFC 6187似乎建议了这样的功能,但我找不到任何关于此的文档,或者它是否在 OpenSSH 中实现。

这是我想要做的更详细的描述:

  • 设置了 CA(“SSH-CA”)
  • 此 CA 用于签署用户证书keyUsage=digitalSignature(可能还有id-kp-secureShellClientextendedKeyUsage 字段)
  • 此证书现在可用于登录服务器。服务器不需要公钥存在于authorized_keys. 相反,它被设置为信任 SSH-CAsubjectAltName在进行通常的 RSA 身份验证

那么,(如何)使用 OpenSSH 可以实现这一点,如果需要补丁,如何将客户端修改保持在最低限度?


作为替代方案,我猜也可以使用任何 S/MIME 证书加上用户名到电子邮件地址的映射,而不需要自己的 CA。客户端也可以只使用私有 RSA 密钥,并且使用证书服务器从公钥获取证书,另外还提供了使用 PGP 证书的可能性(例如通过monkeysphere),而用户不需要任何关于这一切的知识只要他们只是提供一个公钥。

如果它本身不可能,我想我可以通过让服务器上的脚本自动检查通过openssl(or gnupg) 以其他方式提交的证书并将公钥放入相应的用户的authorized_keys文件 - 虽然那时我可能或多或少地重新做monkeyshere项目......

4个回答

OpenSSH 不正式支持基于 x.509 证书的身份验证:

开发人员坚持认为 X.509 证书的复杂性为 sshd 引入了不可接受的攻击面。相反,他们 [最近] 实施了一种替代证书格式,该格式更易于解析,因此引入的风险更小。

...

OpenSSH 仅使用来自 OpenSSL 的低级加密算法。

但是Roumen Petrov 发布了包含 X.509 支持的 OpenSSH 构建,您可以尝试使用这些构建。

X.509 证书可以在 SSH“公钥”和“基于主机”的身份验证中用作“用户身份”和/或“主机密钥”。

Roumen Petrov 的构建可以通过这个页面下载。

这是使用身份验证密钥而不是密码的 SSH 的 Debian 操作方法,这在设置 OpenSSH 以接受 x509 PKI 进行用户身份验证时可能也很有用。

基于原生证书的身份验证在未经修改的上游 OpenSSH 中可用。但是,它不是基于 x.509。

首先,生成您的 CA:

ssh-keygen -f ssh-ca

接下来,.authorized_keys使用cert-authority前缀安装您的 CA 密钥

echo "cert-authority $(<ssh-ca.pub)" >>.ssh/authorized_keys

从那时起,每当用户生成密钥时:

ssh-keygen -f real-key

...公共部分可以由您的 SSH CA 签名,之后它将被服务器信任,而无需将该密钥本身添加到authorized_keys

ssh-keygen -s ssh-ca -I identifier_for_your_real_key_goes_here real-key.pub

使用 OpenSSH 是不可能的。正如@TildalWave 所说,您需要使用 Roumen Petrov PKIXSSH的分叉。

获得 X509 证书后,您无需authorized_keys文件中添加公钥。

您需要在服务器端配置两件事:

  • CACertificatePath在文件中的指令设置的目录中添加 CA 的证书sshd_config(通常/etc/ssh/ca/crt,我认为),并带有证书哈希的链接。

    要创建链接,请使用 openssl。假设 CA 证书已在/ect/ssh/ca/crt/ca.crt命令下复制,将是:

cd /etc/ssh/ca/crt/
ln -s ca.crt `openssl x509 -in ca.crt -noout -hash`.0
  • 将x509 证书的“主题”信息authorized_keys添加到用户的文件中(在目标服务器中)

    假设用户的私钥和 X509 证书ssh/id_rsa在客户端中运行主题:

openssl x509 -noout -subject -in .ssh/id_rsa

而他们在服务器上,将这一行加上前缀添加x509v3-sign-rsa subject=authorized_keys.

此行将具有与此类似的内容:

x509v3-sign-rsa subject= /C=ES/ST=Pontevedra/L=Vigo/CN=testssh/emailAddress=josemanuel@ciges.net

正如我们所看到的,身份验证实际上是信任 CA 以获取来自用户的任何有效 x509 证书我们可以生成一个新证书,它将被接受而无需服务器端干预。


经过几天的努力,我在刚刚部署的博客上写了一篇解释整个过程的帖子。您可以在“使用 X509 证书的 OpenSSH 如何”中阅读它。

CA 签名的 SSH 密钥

当您想管理用户的越界访问时,您不想将他们的公钥安装在他们需要访问的服务器上的 authorized_keys 文件中。您也不想管理个人帐户,而是使用委托人(功能帐户,即管理员)并对其授予租约。

您只需创建 ssh 密钥对即可为 Secure Shell(不同于 X509 TLS/SSL)创建证书签名机构。CA 的公钥安装在所有服务器上,这是唯一需要存在的文件。(如果需要,您可以在文件中拥有 2 个或更多 CA 密钥。)

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/ca_ssh
cat ~/.ssh/ca_ssh.pub

将此文件复制到服务器并将其添加到/etc/ssh/sshd_config

TrustedUserCAKeys /etc/ssh/trusted-user-ca-keys.pub

授予访问权限

要签署 Fred 的公钥 (fred.pub) 以授予以管理员身份访问服务器一周的权限并以员工身份登录 /var/log/secure,请运行此命令并将 fred.pub-cert 文件发送回 Fred。

ssh-keygen -s ~/.ssh/ca_ssh -I staff -n admin -V +1w fred.pub

撤销密钥

将在租赁期间不应再登录的人员的公钥添加到 playbook_dir/files/ssh/revoked_keys