介绍
当配置大量的服务器有很多用户,保持SSH访问在线的基础设施可以变得复杂。 有很多方法可以实现集中式身份验证授权,例如LDAP,但这些方法有时候是过度的。
SSH实际上具有使用证书颁发机构来验证服务器和客户端的功能。 这两种方式。 使用此系统,您可以向客户端验证主机,避免混淆无法验证主机的真实性的消息。 您还可以验证客户端到主机,允许您在一个位置注册新的SSH密钥,并允许在组织中访问。
我们将讨论如何以上述两种方式利用这些证书。 我们将在三个Ubuntu 12.04 VPS实例上演示这个。 一个将作为主机,另一个作为客户端,第三个将作为证书颁发机构。
如何配置主机证书
我们将开始配置将向我们的客户端认证我们的服务器的证书。 这将允许我们的客户端连接到我们的服务器,而不需要质疑服务器的真实性。
我们开始在我们将用作证书颁发机构的机器上。 在这个例子中,我们称此为“ auth.example.com
”。
生成签名密钥
首先,我们需要生成一些RSA密钥,作为签名密钥。 使用任何你想要的用户,但root用户可能是一个好主意。 我们将创建密钥称为“ server_ca
”和“ server_ca.pub
因为它们将被用于验证我们的服务器”。
让我们在我们的主目录中创建这些键:
cd ~
ssh-keygen -f server_ca
系统会询问您是否要创建密码。 这将为你的钥匙添加一个额外的保护层,如果它落入错误的手。 一旦完成,您的主目录中将有一个私钥和公钥:
ls
server_ca server_ca.pub
签名主机密钥
现在我们有了我们的密钥,我们可以开始签署我们的主机密钥。
我们应该首先签署证书颁发机构本身的主机密钥。 我们可以使用以下语法:
ssh-keygen -s signing_key -I key_identifier -h -n host_name -V +52w host_rsa_key
让我们走过这一切的意思。
- -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
我们现在已经签署了证书,我们只需要配置我们的组件就可以使用它们。
配置组件以使用主机证书
首先,我们需要继续使用我们的两个服务器(auth.example.com和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
。 从cert服务器,键入:
cd ~ scp username@client.example.com:/home/username/.ssh/id_rsa.pub .
现在,我们有证书的机器上的键,我们可以用我们的签字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
从客户端计算机,你不应该问你的验证信息,即使你从来没有登录该服务器到用户之前。
结论
通过签署主机和用户密钥,您可以创建一个更灵活的系统用于用户和服务器验证。 这允许您为整个基础架构设置一个集中的权限,以便为您的用户验证服务器,并为您的用户验证您的服务器。
虽然也许不是创建集中式认证的最强大的方法,但是很容易设置和利用现有工具,而不需要大量的时间和配置。 它还具有不要求CA服务器在线以检查证书的优点。