如何创建 SSH CA 以使用 Ubuntu 验证主机和客户端
状态:已弃用
本文涵盖不再受支持的 Ubuntu 版本。如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
- 升级到 Ubuntu 14.04。
- 从 Ubuntu 14.04 升级到 Ubuntu 16.04
- 将服务器数据迁移到支持的版本
原因:
请参阅:
介绍
在配置拥有许多用户的大量服务器时,保持 SSH 访问符合您的基础架构可能会变得很复杂。有很多方法可以实现集中式身份验证机构,例如 LDAP,但这些方法有时有些矫枉过正。
SSH 实际上具有使用证书颁发机构对服务器和客户端进行身份验证的功能。这是双向的。使用此系统,您可以向客户端验证主机,避免有关无法验证主机真实性的混淆消息。您还可以验证主机的客户端,允许您在一个地方注册一个新的 SSH 密钥并允许整个组织的访问。
我们将讨论如何以上述两种方式利用这些证书。我们将在三个 Ubuntu 12.04 VPS 实例上进行演示。一个将作为主机,另一个作为客户端,第三个将作为证书颁发机构。
如何配置主机证书
我们将从配置证书开始,这些证书将向我们的客户端验证我们的服务器。这将允许我们的客户连接到我们的服务器,而无需质疑服务器的真实性。
我们从将用作证书颁发机构的机器开始。在此示例中,我们将其称为“auth.example.com
”。
生成签名密钥
首先,我们需要生成一些用作签名密钥的 RSA 密钥。使用您喜欢的任何用户,但根用户可能是个好主意。我们将创建名为 \server_ca
” 和 \server_ca.pub
” 的密钥,因为它们将用于验证我们的服务器。
让我们在我们的主目录中创建这些密钥:
cd ~
ssh-keygen -f server_ca
系统会询问您是否要创建密码。如果您的密钥落入坏人之手,这将为您的密钥增加一层额外的保护。完成后,您的主目录中将拥有私钥和公钥:
ls
server_ca server_ca.pub
签署主机密钥
现在我们有了我们的密钥,我们可以开始签署我们的主机密钥。
我们应该首先签署证书颁发机构本身的主机密钥。我们可以使用以下语法来做到这一点:
<前>
让我们回顾一下所有这些意味着什么。
- -s:这是我们刚刚创建的私钥,我们将使用它来签署所有其他密钥。
- -I:这是用于识别证书的名称。当证书用于身份验证时,它用于日志记录目的。
- -h:这会将生成的证书标记为主机密钥,而不是客户端密钥。
- -n:用于识别与此证书关联的名称(用户或主机)。
- -V:指定证书的有效期。在这种情况下,我们指定证书将在一年(52 周)后到期。
之后我们指定要签名的密钥。
在我们的例子中,要签署我们自己的主机 RSA 密钥,我们将使用如下所示的一行。我们将此服务器标识为 \host_auth_server
。系统将提示我们输入创建签名密钥时使用的密码:
ssh-keygen -s server_ca -I host_auth_server -h -n auth.example.com -V +52w /etc/ssh/ssh_host_rsa_key.pub
Signed host key /etc/ssh/ssh_host_rsa_key-cert.pub: id "host_auth_server" serial 0 for auth.example.com valid from 2014-03-20T12:25:00 to 2015-03-19T12:26:05
从输出中可以看出,我们的证书有效期为一年。它已在与我们的服务器主机密钥 (/etc/ssh/
) 相同的目录中创建,名为 \ssh_host_rsa_key-cert.pub
。
现在我们已经在证书颁发机构本身上签署了我们的主机密钥,我们可以为我们试图向客户端进行身份验证的单独 SSH 服务器签署主机密钥。
从我们的 SSH 服务器复制主机密钥。我们将这台机器称为“sshserver.example.com
”。您可以使用 scp
执行此操作:
cd ~
scp root@sshserver.example.com:/etc/ssh/ssh_host_rsa_key.pub .
现在,我们可以使用与上面相同的方法从该文件创建证书。我们需要更改一些值以引用我们正在签名的新主机:
ssh-keygen -s server_ca -I host_sshserver -h -n sshserver.example.com -V +52w ssh_host_rsa_key.pub
Signed host key ssh_host_rsa_key-cert.pub: id "host_sshserver" serial 0 for sshserver.example.com valid from 2014-03-20T12:40:00 to 2015-03-19T12:41:48
现在,我们需要将生成的证书文件复制回主机。同样,我们可以为此使用 scp
:
scp ssh_host_rsa_key-cert.pub root@sshserver.example.com:/etc/ssh/
之后,我们可以从我们的身份验证服务器中删除 SSH 服务器的公钥和证书:
rm ssh_host_rsa_key.pub ssh_host_rsa_key-cert.pub
我们现在已经有了签名证书,我们只需要配置我们的组件来使用它们。
配置组件以使用主机证书
首先,我们需要继续使用我们的两个服务器 (sshserver.example.com),让它们知道我们创建的证书文件。
在这两台机器上,我们都必须编辑主要的 SSH 守护进程配置文件。确保您正在编辑 sshd_config
文件,而不是 ssh_config
文件:
sudo nano /etc/ssh/sshd_config
如果您可以找到 HostCertificate
行,请对其进行修改。否则,将其添加到文件底部。我们需要建立到主机证书文件的路径:
HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub
完成后保存并关闭文件。
现在,重新启动 SSH 守护进程以使这些更改生效:
sudo service ssh restart
在您为其配置主机证书的所有服务器上执行此操作。
现在,我们的服务器配置为使用证书,但我们的客户端不知道如何检查服务器将提供的证书。
在我们称为“client.example.com
”的客户端机器上,打开或创建“~/.ssh/known_hosts
”文件:
nano ~/.ssh/known_hosts
我们需要删除与我们为证书条目配置的服务器有关的所有条目。最好删除所有内容。
之后,我们需要添加一个特殊的条目来指定我们应该用来检查我们的主机在登录期间给我们的证书的公钥。从 @cert-authority
开始。之后,它可以包括将应用密钥的域限制,然后是我们一直用来签署所有内容的公共证书颁发机构密钥。
在您的证书颁发机构机器上,您可以通过键入以下内容来获取公共证书签名密钥:
cat ~/server_ca.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxC+gikReZlWEnZhKkGzhcNeRD3dKh0L1opw4/LQJcUPfRj07E3ambJfKhX/+G4gfrKZ/ju0nanbq+XViNA4cpTIJq6xVk1uVvnQVOi09p4SIyqffahO9S+GxGj8apv7GkailNyYvoMYordMbIx8UVxtcTR5AeWZMAXJM6GdIyRkKxH0/Zm1r9tsVPraaMOsKc++8isjJilwiQAhxdWVqvojPmXWE6V1R4E0wNgiHOZ+Wc72nfHh0oivZC4/i3JuZVH7kIDb+ugbsL8zFfauDevuxWeJVWn8r8SduMUVTMCzlqZKlhWb4SNCfv4j7DolKZ+KcQLbAfwybVr3Jy5dSl root@auth
使用此信息,~/.ssh/known_hosts
文件中的行应如下所示:
@cert-authority *.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxC+gikReZlWEnZhKkGzhcNeRD3dKh0L1opw4/LQJcUPfRj07E3ambJfKhX/+G4gfrKZ/ju0nanbq+XViNA4cpTIJq6xVk1uVvnQVOi09p4SIyqffahO9S+GxGj8apv7GkailNyYvoMYordMbIx8UVxtcTR5AeWZMAXJM6GdIyRkKxH0/Zm1r9tsVPraaMOsKc++8isjJilwiQAhxdWVqvojPmXWE6V1R4E0wNgiHOZ+Wc72nfHh0oivZC4/i3JuZVH7kIDb+ugbsL8zFfauDevuxWeJVWn8r8SduMUVTMCzlqZKlhWb4SNCfv4j7DolKZ+KcQLbAfwybVr3Jy5dSl root@auth
完成后保存并关闭文件。
现在,当你第一次从你的客户端访问 SSH 服务器时(使用完整的主机名),你不应该被问到你是否信任远程主机。这是因为主机已向您出示了由证书颁发机构签名的主机证书。您已经检查了您的 known_hosts
文件并验证证书是合法的。
如何配置用户密钥
现在我们已经了解了如何向我们的用户验证服务器,我们还可以配置我们的证书颁发机构来向我们的服务器验证我们的用户。
和以前一样,此过程将在我们的证书颁发机构服务器上启动。这次我们需要生成一组新的密钥来签署用户证书:
ssh-keygen -f users_ca
同样,选择一个密码短语,以便在有人获得访问权限时保护您的密钥。
配置服务器以接受具有用户认证的登录
完成后,您需要将公钥复制到每个需要验证用户真实性的 SSH 服务器上。我们将像往常一样使用 scp
来做到这一点:
scp users_ca.pub root@sshserver.example.com:/etc/ssh/
我们需要修改 SSH 服务器上的 SSH 守护程序配置以查找此密钥。
在我们的“sshserver.example.com
”主机上,打开配置文件:
sudo nano /etc/ssh/sshd_config
在底部,在我们的 HostCertificate
行下方,我们需要添加另一行来引用我们刚刚复制的文件:
TrustedUserCAKeys /etc/ssh/users_ca.pub
同样,我们需要重新启动 SSH 守护进程才能使这些更改生效:
sudo service ssh restart
签署用户登录密钥
现在服务器已配置为信任由 users_ca
密钥签名的密钥,我们需要实际签署用户的身份验证密钥,以便该方案起作用。
首先,我们需要使用 scp
将我们的客户端密钥发送到证书颁发机构服务器上。从证书服务器,键入:
<前>
现在我们在证书机器上有了密钥,我们可以使用我们的 users_ca
密钥对其进行签名。这与我们上次使用 server_ca
密钥签署密钥非常相似,只是现在我们不包含 -h
参数,因为这些是用户密钥。
我们想要的命令是这样的。更改 \username 值以反映您要签名的用户的名称以便于管理:
<前>
系统将提示您输入在创建密钥期间设置的 users_ca
密码。现在,我们的目录中有一个 id_rsa-cert.pub
文件,我们需要将其传输回客户端计算机:
<前>
现在,当您从客户端计算机登录 sshserver.example.com
时,系统不会要求您提供身份验证详细信息,即使您以前从未以该用户身份登录过该服务器。
结论
通过签署您的主机和用户密钥,您可以为用户和服务器验证创建一个更灵活的系统。这允许您为整个基础架构设置一个集中式授权机构,以便向您的用户验证您的服务器,以及您的用户向您的服务器进行验证。
虽然这可能不是创建集中式身份验证的最强大方法,但它很容易设置和利用现有工具,无需大量时间和配置。它还具有不需要 CA 服务器在线检查证书的优点。