作者:Michael Brown E

自去年推出的数个版本开始,OpenSSH提供一个有趣的新特性,即支持证书授权。这是一个非常有用并且易于实施的选项,但它会带来一些小小的麻烦,因为它还非常新颖,难以找到任何验证文档。本文的目的是举例说明如何设置证书授权密钥,提供一些有帮助的说明。您可以从中看出该过程是多么的简单。

这是怎样的一种特性?

长期以来,传统的OpenSSH支持创建用于个人账户登陆的公共密钥和私有密钥对。其主要特点是:每个用户密钥的公共部分必须被拷贝到您所希望登入的服务器。这多少会成为管理或审计的负担。而全新的证书授权(Certificate Authority,CA)特性则能减轻该负担。它允许管理员将单一的CA密钥拷贝到每台服务器,然后,该服务器允许CA所签发的任何用户密钥登入自身,从而大大简化每台服务器的管理工作。

CA特性可用于用户认证和主机认证。本博文将举出一个用户认证的例子。主机认证的方式与之非常相似,您可从参考资料中看到具体例子。主机认证的有用之处在于:无需接受每台主机密钥,即可确保所有主机的真实有效性得到验证。每个ssh用户都熟悉这样的提升消息“无法确立主机‘ABC (10.0.0.2)’的真实有效性”(The authenticity of host 'ABC (10.0.0.2)' can't be established),它往往在您首次登入一台机器时弹出来。而CA主机密钥可让这条消息不再出现。

设置一个CA密钥

首先要做的就是设置您的CA密钥。其创建方法跟任何普通ssh密钥相同,使用ssh-keygen命令,以及使用您常用于普通密钥的任何选项。

创建您的CA密钥:

$ ssh-keygen -f user-ca-key

将您的服务器设置为信任该CA密钥。您可以逐个账户这样做,也可以对整台服务器这样做。

(个别账户):为了让您的CA所签发的任何密钥能够登陆某个特定账户,您可使用已有的~/.ssh/authorized_keys文件。您只需置入CA公共密钥,但要给它加上前缀“cert-authority”指令。以下指出了如何用一个命令实现这一点:

$ echo "cert-authority $(cat user-ca-key.pub)" >> ~/.ssh/authorized_keys

(整台服务器):为了让您的CA密钥所签发的用户密钥能够登入系统上的任何(*)账户,只需向您的/etc/ssh/sshd_config文件增加命令行“TrustedUserCAKeys /etc/ssh/user-ca-key.pub”,然后将user-ca-key.pub文件拷贝到服务器上的/etc/ssh/。(*)当您用CA密钥签发个别密钥时,您可以指定允许该密钥登入的账户的清单,这样,您就可以控制哪些用户能够登入哪些账户。

(可选):如果您还没有普通用户密钥,则创建一个吧。这步遵循创建密钥的正常过程,当然您也可以使用您所拥有的任何已存在的密钥。:既然我们使用CA登入,我们不再需要将公共密钥拷贝到服务器,这正是我们想要达到的目的。

$ ssh-keygen -f random-user-key

使用CA密钥签发用户密钥。

$ ssh-keygen -s user-ca-key -I "Bob User's key" -n bob_user,bob -V +52w /path/to/id_rsa.pub

  1. 签发用户密钥时,使用“-n”选项指定该密钥所能访问的账户,使用“-I”指定用户详细情况。
  2. 签发用户密钥时,例如id_rsa.pub,它会创建一个名为id_rsa-cert.pub的分离的证书文件,用于ssh客户端登入。

现在您可使用用户密钥登入服务器。ssh客户端程序将自动使用它所找到的-cert.pub文件,向服务器发送证书信息。

安全性

全新的CA密钥必须使用口令加以保护,并保存在安全的位置。如果任何第三方得到该密钥,他们可以使用CA无限制地访问任何机器。

当前OpenSSH CA的局限性

一直以来,CA被视为多级实体,其中,由顶级授权体签发个别证书,个别证书又可以反过来签发子实体证书。OpenSSH当前不支持多级CA结构,这可能限制其潜在用例。

此外,该特性采用已有的ssh密钥格式,这意味着它不是传统的SSL(安全套接层)、x509或其它格式的CA密钥。这也会带来益处,因为您不必担心创建其它格式密钥所需的复杂命令。

该特性的另一个主要局限在于:服务器和客户端ssh版本都必须为5.4或更高版本。据我所见,还没有一个企业级linux版本(Red Hat、SUSE等)具备该版本,因此您不得不手动升级系统。大多数客户端发布版,例如Fedora,在最新发布的产品中已经提供必需的版本了。

参考资料:

http://blog.habets.pp.se/2011/07/OpenSSH-certificates

http://www.gossamer-threads.com/lists/openssh/users/50165

http://serverfault.com/questions/264515/how-to-revoke-an-ssh-certificate-not-ssh-identity-file

更多精彩文章请关注:

戴尔技术社区