如何在 Ubuntu VPS 上使用 Monkeysphere 验证 SSH 服务器的用户身份

简介

随着企业规模的扩大,管理大量 SSH 密钥和服务器会变得非常困难。 在整个组织内正确识别有效密钥和删除无效密钥可能会出现很多错误,并对服务器安全造成巨大影响。

此外,当服务器发生变化时,用户有时会收到无法确定服务器真实性的警告。 大多数用户在连接前都不会仔细检查服务器的密钥指纹,这样就有可能被人欺骗服务器并实施中间人攻击。

一个名为monkeysphere 的项目就是为了解决这些问题而创建的。 它利用 GPG 密钥和信任网络模型来验证服务器的凭据,并提供简便的用户管理。

在上一篇指南中,我们讨论了 如何设置 monkeysphere 以验证服务器到用户。 在本指南中,我们将继续之前的讨论,学习如何仅根据用户的 GPG 密钥和服务器管理员对这些用户的信任,自动验证用户的服务器身份。 这样,我们就可以创建使用纯英文而非主要加密信息的身份验证文件。

本指南假定您已完成上一指南中的设置(server.example.com、admin.example.com、client.example.com 并建立了必要的信任关系)。 让我们开始吧。

在 SSH 服务器上创建身份认证器

让 SSH 服务器自动验证用户身份的第一步是建立身份验证人。 身份验证员就是我们在确定用户身份时指定的可信人员。

在大多数情况下,简单而合理的选择是让服务器管理员确定哪些用户可以登录。 我们将采用这种方法。 如果你的情况需要分配责任,你也可以创建不止一个身份认证者。

首先,让我们再次获取管理员用户的指纹。 在管理用户的电脑上,我们可以使用上次指南中使用过的 GPG 命令来获取完整指纹:

1gpg --with-colons --fingerprint [email protected]

同样,我们要寻找的是类似于这样的输出行:

fpr:::::::::A61256B85307B7ED9AD8D93E9E06881E49E95F19:

红色标注的部分正是我们需要的。

在 SSH 服务器(server.example.com)上,我们要将此密钥添加为身份认证符。 输入

monkeysphere-authentication add-identity-certifier A61256B85307B7ED9AD8D93E9E06881E49E95F19

然后,Monkeysphere 会从密钥服务器中提取匹配的 GPG 信息,并将其存储在自己的密钥环中。 它会将此密钥标记为可验证其他用户身份的密钥。

为 SSH 用户生成验证子密钥

既然我们已经确定服务器管理员可以识别哪些用户是合法的,那么我们就需要在客户端做一些工作。

每个客户端都必须生成一个 GPG 子密钥,用于实际身份验证。 公共 GPG 密钥用于识别用户,而子密钥则用于实际登录程序。

monkeysphere "命令包含一个子命令,可以让你轻松生成一个身份验证子密钥。 在客户端上键入

1monkeysphere gen-subkey

将生成一个子密钥,并添加到本地 GPG 密钥链中,置于主密钥之下。

我们需要再次将密钥更改上传到密钥服务器,这样 SSH 服务器才能使用该子密钥为相关用户生成内部身份验证文件。 我们需要发布的密钥是主密钥,其中包含子密钥变更。 要获取密钥信息,请键入

gpg --list-keys [email protected]
pub 2048R/87791BD0 2014-03-14
uid client <[email protected]>
sub 2048R/3294D31D 2014-03-14
sub 2048R/0FECF512 2014-03-14

突出显示的部分是我们用来发送到服务器的密钥 ID。 使用此 ID 将密钥发回服务器:

1gpg --keyserver pool.sks-keyservers.net --send-key 87791BD0

现在我们的子密钥已经可以在密钥服务器上使用(传播可能需要一些时间),我们可以配置 SSH 服务器,使用该密钥生成身份验证文件。

在 SSH 服务器上创建身份验证文件

现在,我们需要创建实际的身份验证文件。 Monkeysphere 验证文件分为两种不同的类别。

用户级文件是我们在制定身份验证策略时需要交互的文件。 这些文件简单明了、直接易懂,只需通过姓名和电子邮件(提交给 GPG)指定允许登录的用户。 这些文件位于每个用户主目录下的一个子目录中,就像普通的 SSH authorized_keys 文件一样。

然后,Monkeysphere 使用这些文件来生成 SSH 可以理解的身份验证文件,使用的是与我们上面创建的每个有效用户相关联的子密钥。 Monkeysphere 会在 /var/lib/monkeysphere/authorized_keys 目录中为每个用户生成验证文件。

在本节中,我们将在 SSH 服务器上创建目录和文件。

首先,进入要配置访问权限的用户的主目录。 由于我们需要以管理权限登录,因此先为根用户设置访问权限。 在主目录下创建一个名为 .monkeysphere的隐藏目录:

1cd /root
2mkdir .monkeysphere

Monkeysphere 要求用户级文件夹和文件具有某些权限,这样才能认为它们有效。 具体来说,它要求文件或目录所有者之外的任何人都没有写入权限。

让我们设置目录权限,使其与此方案相匹配,然后进入目录:

1chmod 755 .monkeysphere
2cd .monkeysphere

在该目录下,我们需要创建一个名为 authorized_user_ids 的文件。 这是用户级身份验证文件。 使用文本编辑器创建该文件:

1nano authorized_user_ids

在该文件中,我们只需按照 GPG 中的用户名和电子邮件列出用户。 因此,要查看我们需要使用的格式,我们可以在客户端机器上再次键入:

gpg --list-keys [email protected]
pub 2048R/87791BD0 2014-03-14
uid                  client <[email protected]>
sub 2048R/3294D31D 2014-03-14
sub 2048R/0FECF512 2014-03-14

这就是我们在这个文件中要输入的全部内容:

如果我们想添加其他人,只需每行添加一个:

这比庞大的 "authorized_keys "文件更容易读取和管理。 这些文件容易过时,而且很难判断旧密钥是否仍然有效。 有了这种方法,你就很容易问自己:"鲍勃是否应该访问这台机器? 如果不能,只需删除他的名字即可。

完成后保存并关闭文件。

现在,我们需要记住取消非所有者的写入权限:

1chmod 644 authorized_user_ids

对要配置远程访问的任何用户重复此步骤。

生成内部验证文件

现在我们有了用户级身份验证文件,就可以轻松生成内部身份验证文件了。

我们要做的就是发出这条命令:

1monkeysphere-authentication update-users

应在对用户级身份验证文件进行任何更改后运行此命令。

如果只想更新特定用户,可以将其姓名作为参数:

1monkeysphere-authentication update-users root

让我们看看这个程序生成了哪些文件。 我们需要进入存放这些文件的目录:

1cd /var/lib/monkeysphere/authorized_keys

在该文件中,你应该可以看到系统中每个用户的文件,你为其配置了访问权限。 需要注意的一点是,用户级身份验证文件中的每个用户都需要在公共 GPG 密钥服务器网络上有一个相关的子密钥。

1ls

1demouser root

如果我们查看这些文件,就会看到一个类似的密钥:

1ssh-rsa
2AAAAB3NzaC1yc2EAAAADAQABAAABAQD0CdVIlUptYdZBz/0pn+7XIa2jdzy/VnayAZDXhFdHDTZU0hB8MDGHC9yjUrn9RCMj2NWD3Ls7JjqVAzmRsUn56UwyCJt8/GVmHpeIhYzmUAUjMaaMnjBG3Nhdpm9rsnJt0XVUvOu9oxrvTWYH6ZCVNwsY1O7aX/kQWnaXQW6/B6oiQJ76feZyoLEBR8D/nbxGTtNlkEMcTMTylHN0jHLACJy483SFUkSjHneNK9gNFoxTlUyF/ZBo5+Bo8Uld4iAyhaW7Di4HzfUJzvebZYX1Z1O0yS/db8anSJoZX90MLt7eIFsixuDMS3m31dsX26RI71tJGihvzF0fUsUPDg17
3MonkeySphere2014-03-22T13:14:31 client <[email protected]>

如你所见,这基本上是一个普通的 authorized_keys 条目。 我们将其抽象化,以方便用户管理,并使用户能够通过 GPG 动态更新密钥。

你也可能会在这个文件中看到与你在 authorized_user_ids 文件中的任何条目无关的附加行。 这是因为,默认情况下, monkeysphere 会把它在现有的 authorized_keys 文件中找到的任何条目追加到生成文件的末尾。 这样做是为了帮助你在两个系统之间过渡,也是为了帮助那些由于某种原因无法切换的用户。

既然已经生成了这些新的授权文件,我们就需要更新 SSH 守护进程的配置,以便查看这些文件,而不是每个用户目录下的文件。

用编辑器打开配置文件(确保选择的是 sshd_config,而不是 ssh_config):

1nano /etc/ssh/sshd_config

在该文件中找到并修改 AuthorizedKeysFile 参数,如果不存在,则创建该参数。 将值设为

1AuthorizedKeysFile /var/lib/monkeysphere/authorized_keys/%u

完成后保存并关闭文件。

现在,我们只需重启 SSH 守护进程,就能完成更改:

1service ssh restart

配置客户端发送 GPG 密钥以进行身份验证

现在,我们的服务器已经完全配置好,可以接受我们为身份验证创建的 GPG 子密钥。

我们需要配置客户端使用这些信息进行连接,而不是通常的密码或 RSA 密钥。 Monkeysphere 通过使用 ssh-agent 工具来实现这一点,该工具用于长时间存储 SSH 连接的身份验证详细信息。

我们可以使用类似这样的一次性命令,在不启动代理的情况下进行尝试:

1ssh-agent sh -c 'monkeysphere subkey-to-ssh-agent && ssh server.example.com'

这样就可以了,在输入 GPG 密钥的密码后,就可以连接到服务器,而无需输入服务器账户的任何密码。

不过,还是值得启动一个代理会话。 您可以在当前 shell 中键入

1eval $(ssh-agent)

要在每次登录时自动启动,我们可以将其添加到客户端的 ~/.bash_profile 文件中:

1echo 'eval $(ssh-agent)' >> ~/.bash_profile

无论采用哪种方式,我们都需要将 GPG 子密钥添加到 SSH 代理中,以便使用它进行身份验证。 键入

1monkeysphere subkey-to-ssh-agent

您必须输入 GPG 密钥密码,但每次会话只需输入一次。

我们可以看到,输入已被接受:

1ssh-add -l

12048 2a:1a:1d:52:32:e5:f4:45:b2:a3:ff:d0:c0:6e:69:f6 client <[email protected]> (RSA)

现在,我们可以使用 GPG 子密钥登录我们可以访问的任何账户,无需任何提示:

1ssh server.example.com

结论

在您的基础架构上安装 Monkeysphere 后,您将拥有一种可持续的方式来管理您的组织的服务器和人际互动。 这种方法可以处理服务器管理员的加入和离开,因为所有用户级别的身份验证都是纯英文的。 此外,您还不必担心攻击者试图欺骗您的服务器访问权限。

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