在这篇文章中,我们将开发一个使用硬件安全密钥离线紧急访问 SSH 主机的程序。 这只是一种方法,您可以根据自己的需要进行调整。 我们将把主机的 SSH 证书颁发机构存储在硬件安全密钥上。 该方案几乎适用于任何 OpenSSH,包括单点登录的 SSH。
这一切到底是为了什么? 嗯,这是最后的选择。 这是一个后门,当由于某种原因其他方法不起作用时,它可以让您访问您的服务器。
为什么使用证书而不是公钥/私钥进行紧急访问?
- 与公钥不同,证书的生命周期非常短。 您可以生成有效期为 1 分钟甚至 5 秒的证书。 在此期限之后,证书将无法用于新连接。 这是紧急访问的理想选择。
- 您可以为主机上的任何帐户创建证书,并在必要时将此类“一次性”证书发送给同事。
你需要什么
- 支持驻留密钥的硬件安全密钥。
驻留密钥是完全存储在安全密钥内的加密密钥。 有时它们受到字母数字 PIN 的保护。 驻留密钥的公共部分可以从安全密钥中导出,也可以选择与私钥句柄一起导出。 例如,Yubikey 5系列USB密钥支持常驻密钥,建议仅用于紧急访问主机。 在这篇文章中,我将只使用一把钥匙,但您应该有一个额外的钥匙用于备份。 - 存放这些钥匙的安全地方。
- 您的本地计算机以及您想要紧急访问的服务器上的 OpenSSH 版本 8.2 或更高版本。 Ubuntu 20.04 附带 OpenSSH 8.2。
- (可选,但推荐)用于检查证书的 CLI 工具。
训练
首先,您需要创建一个位于硬件安全密钥上的证书颁发机构。 插入密钥并运行:
$ ssh-keygen -t ecdsa-sk -f sk-user-ca -O resident -C [security key ID]
作为评论(-C)我指出 [电子邮件保护]这样您就不会忘记该证书颁发机构属于哪个安全密钥。
除了将密钥添加到 Yubikey 之外,还会在本地生成两个文件:
- sk-user-ca,密钥句柄,指存储在安全密钥中的私钥,
- sk-user-ca.pub,这将是您的证书颁发机构的公钥。
但不用担心,Yubikey 存储了另一个无法检索的私钥。 因此,这里的一切都是可靠的。
在主机上,以 root 身份将以下内容添加(如果尚未)到 SSHD 配置 (/etc/ssh/sshd_config):
TrustedUserCAKeys /etc/ssh/ca.pub
然后在主机上,将公钥(sk-user-ca.pub)添加到/etc/ssh/ca.pub
重新启动守护进程:
# /etc/init.d/ssh restart
现在我们可以尝试访问主机了。 但首先我们需要一个证书。 创建将与证书关联的密钥对:
$ ssh-keygen -t ecdsa -f emergency
证书和 SSH 对
有时,人们很想使用证书来替代公钥/私钥对。 但仅凭证书不足以对用户进行身份验证。 每个证书还有一个与其关联的私钥。 这就是为什么我们需要在为自己颁发证书之前生成这个“紧急”密钥对。 重要的是我们向服务器显示签名的证书,表明我们拥有私钥的密钥对。所以公钥交换仍然存在并且运行良好。 即使有证书,这也适用。 证书只是消除了服务器存储公钥的需要。
接下来,创建证书本身。 我需要以 10 分钟为间隔进行 ubuntu 用户授权。 你可以按照你的方式去做。
$ ssh-keygen -s sk-user-ca -I test-key -n ubuntu -V -5m:+5m emergency
系统会要求您使用指纹签署证书。 您可以添加以逗号分隔的其他用户名,例如 -n ubuntu,carl,ec2-user
就是这样,现在您已经获得了证书! 接下来您需要指定正确的权限:
$ chmod 600 emergency-cert.pub
之后,您可以查看您的证书的内容:
$ step ssh inspect emergency-cert.pub
这就是我的样子:
emergency-cert.pub
Type: [email protected] user certificate
Public key: ECDSA-CERT SHA256:EJSfzfQv1UK44/LOKhBbuh5oRMqxXGBSr+UAzA7cork
Signing CA: SK-ECDSA SHA256:kLJ7xfTTPQN0G/IF2cq5TB3EitaV4k3XczcBZcLPQ0E
Key ID: "test-key"
Serial: 0
Valid: from 2020-06-24T16:53:03 to 2020-06-24T17:03:03
Principals:
ubuntu
Critical Options: (none)
Extensions:
permit-X11-forwarding
permit-agent-forwarding
permit-port-forwarding
permit-pty
permit-user-rc
这里的公钥就是我们创建的应急密钥,sk-user-ca与证书颁发机构关联。
最后我们准备运行 SSH 命令:
$ ssh -i emergency ubuntu@my-hostname
ubuntu@my-hostname:~$
- 您现在可以为信任您的证书颁发机构的主机上的任何用户创建证书。
- 您可以删除紧急情况。 您可以保存 sk-user-ca,但不需要这样做,因为它也在安全密钥上。 如果您将原始 PEM 公钥用于紧急访问,您可能还需要从主机中删除它(例如 ubuntu 用户的 ~/.ssh/authorized_keys 中)。
紧急通道:行动计划
粘贴安全密钥并运行命令:
$ ssh-add -K
这会将证书颁发机构的公钥和密钥描述符添加到 SSH 代理。
现在导出公钥来制作证书:
$ ssh-add -L | tail -1 > sk-user-ca.pub
创建一个到期日期不超过一小时的证书:
$ ssh-keygen -t ecdsa -f emergency
$ ssh-keygen -Us sk-user-ca.pub -I test-key -n [username] -V -5m:+60m emergency
$ chmod 600 emergency-cert.pub
现在再次使用 SSH:
$ ssh -i emergency username@host
如果您的 .ssh/config 文件在连接时引起一些问题,您可以使用 -F none 选项运行 ssh 来绕过它。 如果您需要向同事发送证书,最简单、最安全的选择是
我喜欢这种方法的是硬件支持。 您可以将安全钥匙放在保险箱中,它们不会去任何地方。
由于宣传
史诗级服务器 -
来源: habr.com