如何使用 Ubuntu 创建 SSH CA 以验证主机和客户端

金钱(警告)

状态: 被贬值

如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:

原因: Ubuntu 12.04 已於 2017 年 4 月 28 日到達終止期 (EOL) 並不再收到安全性修補或更新。

相反,请参阅: 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本编写的指南。

介绍

当配置大量用户的服务器时,为您的基础设施保持 SSH 访问可以变得复杂. 实现集中身份验证权限的几种方法,如 LDAP,但这些有时是过度的。

SSH实际上具有使用证书权限来验证服务器和客户端的功能。这两种方式都起作用。使用此系统,您可以将主机验证给客户端,避免混淆消息,即无法验证主机的真实性。

我们将讨论如何以上述两种方式利用这些证书. 我们将在三个Ubuntu 12.04 VPS实例上演示此功能. 一个将作为主机,另一个作为客户端,第三个将作为证书权威。

如何配置主机证书

我们将首先配置证书,以便将我们的服务器认证给我们的客户端,这将允许我们的客户端连接到我们的服务器,而无需质疑服务器的真实性。

我们将从我们将用作证书授权机构的机器开始,在本示例中,我们将称之为auth.example.com

创建签名密钥

首先,我们需要生成一些RSA密钥,这些密钥将作为签名密钥。 使用您想要的任何用户,但根用户可能是一个好主意。 我们将创建名为server_caserver_ca.pub的密钥,因为这些密钥将用于验证我们的服务器。

让我们在我们的家庭目录中创建这些密钥:

1cd ~
2ssh-keygen -f server_ca

您将被问到是否想要创建一个密码句,这将为您的密钥添加额外的保护层,如果它落入错误的手中。

1ls

1server_ca server_ca.pub

签署主机密钥

现在我们有我们的密钥,我们可以开始签署我们的主机密钥。

我们应该首先签署证书授权机构本身的主机密钥,我们可以使用以下语法来做到这一点:

ssh-keygen -s signing_key -I key_identifier -h -n host_name -V +52w host_rsa_key

让我们来看看这一切意味着什么。

  • 联合国 ** -s : 这是我们刚创建的私人钥匙, 我们将用来签署所有其他钥匙。
  • 联合国 ** - 我 : 这是一个用于识别证书的名称 。 证书用于认证时用于记录目的。
  • 联合国 ** -h : 这标志着由此产生的证书是主机密钥,而不是客户端密钥.
  • 联合国 页:1 用于识别与此证书相关的名称( 用户或主机) 。
  • 联合国 ** -V : 这可以指定证书的有效时间 。 在这种情况下,我们规定证书将在一年后(52周)到期。 .

然后我们指定我们要签名的密钥。

在我们的情况下,为了签署我们自己的主机RSA密钥,我们将使用一个看起来像这样的行。我们将将这个服务器识别为host_auth_server

1ssh-keygen -s server_ca -I host_auth_server -h -n auth.example.com -V +52w /etc/ssh/ssh_host_rsa_key.pub

1Signed 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

1cd ~
2scp [email protected]:/etc/ssh/ssh_host_rsa_key.pub .

现在,我们可以使用我们上面的相同方法从这个文件中创建证书,我们需要更改一些值以参考我们正在签名的新主机:

1ssh-keygen -s server_ca -I host_sshserver -h -n sshserver.example.com -V +52w ssh_host_rsa_key.pub

1Signed 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

现在,我们需要将生成的证书文件复制到主机上。

1scp ssh_host_rsa_key-cert.pub [email protected]:/etc/ssh/

之后,我们可以从我们的身份验证服务器中删除 SSH 服务器的公共密钥和证书:

1rm ssh_host_rsa_key.pub ssh_host_rsa_key-cert.pub

我们现在有签名的证书,我们只需要配置我们的组件来使用它们。

配置组件以使用主机证书

首先,我们需要继续使用我们的两个服务器(auth.example.com 和 sshserver.example.com)来让他们知道我们创建的证书文件。

在这两台机器上,我们必须编辑主SSH DAEMON配置文件,确保您正在编辑sshd_config文件,而不是ssh_config文件:

1sudo nano /etc/ssh/sshd_config

如果你能找到一个HostCertificate行,修改它,否则,添加到文件的底部,我们需要建立到我们的主机证书文件的路径:

1HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

保存并关闭文件,当你完成。

现在,重新启动 SSH 示范器以使这些更改发生:

1sudo service ssh restart

在您配置主机证书的所有服务器上执行此操作。

现在,我们的服务器已配置为使用证书,但我们的客户端不知道如何检查服务器将提供的证书。

在我们的客户端机器上,我们将称之为client.example.com,打开或创建~/.ssh/known_hosts文件:

1nano ~/.ssh/known_hosts

我们需要删除与我们为证书输入配置的服务器相关的任何条目。

之后,我们需要添加一个特殊的条目,指定我们应该使用的公共密钥来检查我们的主机在登录时会给我们的证书。 开始用@cert-authority。 之后,它可以包含一个域限制,该密钥将被应用,然后是我们已经签署了一切的公共证书权限密钥。

在您的证书权威机器上,您可以通过键入以下方式获取公共证书签名密钥:

1cat ~/server_ca.pub

1ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxC+gikReZlWEnZhKkGzhcNeRD3dKh0L1opw4/LQJcUPfRj07E3ambJfKhX/+G4gfrKZ/ju0nanbq+XViNA4cpTIJq6xVk1uVvnQVOi09p4SIyqffahO9S+GxGj8apv7GkailNyYvoMYordMbIx8UVxtcTR5AeWZMAXJM6GdIyRkKxH0/Zm1r9tsVPraaMOsKc++8isjJilwiQAhxdWVqvojPmXWE6V1R4E0wNgiHOZ+Wc72nfHh0oivZC4/i3JuZVH7kIDb+ugbsL8zFfauDevuxWeJVWn8r8SduMUVTMCzlqZKlhWb4SNCfv4j7DolKZ+KcQLbAfwybVr3Jy5dSl root@auth

使用此信息,您的 ~/.ssh/known_hosts 文件中的行应该看起来像:

1@cert-authority *.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxC+gikReZlWEnZhKkGzhcNeRD3dKh0L1opw4/LQJcUPfRj07E3ambJfKhX/+G4gfrKZ/ju0nanbq+XViNA4cpTIJq6xVk1uVvnQVOi09p4SIyqffahO9S+GxGj8apv7GkailNyYvoMYordMbIx8UVxtcTR5AeWZMAXJM6GdIyRkKxH0/Zm1r9tsVPraaMOsKc++8isjJilwiQAhxdWVqvojPmXWE6V1R4E0wNgiHOZ+Wc72nfHh0oivZC4/i3JuZVH7kIDb+ugbsL8zFfauDevuxWeJVWn8r8SduMUVTMCzlqZKlhWb4SNCfv4j7DolKZ+KcQLbAfwybVr3Jy5dSl root@auth

保存并关闭文件,当你完成。

现在,当您第一次从客户端访问 SSH 服务器时(使用完整的主机名称),您不应该被问及您是否信任远程主机。

如何配置用户密钥

现在我们已经学会了如何向用户验证服务器,我们还可以配置我们的证书权限来验证我们的用户到我们的服务器。

与之前一样,这个过程将在我们的证书权威服务器上开始,我们需要生成一组新的密钥,这一次,以签署用户证书:

1ssh-keygen -f users_ca

再次,选择一个密码,以便如果有人获得访问,您的密钥将受到保护。

配置服务器以接受用户认证的登录

完成后,您将需要将公共密钥复制到每个需要验证用户身份的 SSH 服务器上。

1scp users_ca.pub [email protected]:/etc/ssh/

我们需要在我们的 SSH 服务器上修改我们的 SSH daemon 配置以寻找这个密钥。

在我们的sshserver.example.com主机上,打开配置文件:

1sudo nano /etc/ssh/sshd_config

在底部,在我们的HostCertificate行下方,我们需要添加另一个链接到我们刚刚复制的文件的行:

1TrustedUserCAKeys /etc/ssh/users_ca.pub

再次,我们需要重新启动 SSH 示范器,以便发生这些更改:

1sudo service ssh restart

签署用户登录密钥

现在,服务器已配置为信任用users_ca密钥签名的密钥,我们需要实际上签署用户的身份验证密钥,以便这个方案工作。

首先,我们需要将我们的客户端密钥带到证书权威服务器上,用scp

cd ~
scp username@client.example.com:/home/username/.ssh/id_rsa.pub .

现在我们有密钥在 cert 机器上,我们可以使用我们的 users_ca 密钥签署它. 这将非常类似于上次我们使用 server_ca 密钥签署密钥,只有现在,我们不包括 -h 参数,因为这些是用户密钥。

更改用户名值以反映您正在注册的用户名,以便更容易管理:

ssh-keygen -s users_ca -I user_username -n username -V +52w id_rsa.pub
Signed user key id_rsa-cert.pub: id "user_username" serial 0 for username valid from 2014-03-20T14:45:00 to 2015-03-19T14:46:52

您将被要求在创建密钥时设置的 users_ca 密码句子. 现在,我们在我们的目录中有 id_rsa-cert.pub 文件,我们需要将其转移回我们的客户端机器:

scp id_rsa-cert.pub username@client.example.com:/home/username/.ssh/

现在,当您从您的客户端计算机上登录sshserver.example.com,您不应该被要求提供您的身份验证详细信息,即使您之前从未作为该用户登录过该服务器。

结论

通过签署您的主机和用户密钥,您可以创建一个更灵活的用户和服务器验证系统,这允许您为整个基础设施设置一个集中权限,以验证您的服务器为您的用户,您的用户为您的服务器。

虽然它可能不是创建集中身份验证的最强大方法,但它很容易设置并利用现有工具,而不需要大量的时间和配置。

By Justin Ellingwood
Published At
Categories with 技术
Tagged with
comments powered by Disqus