如何在UbuntuVPS上使用Monkeysphere对SSH服务器的用户进行身份验证

来自菜鸟教程
跳转至:导航、​搜索

介绍

随着组织的发展,管理大量 SSH 密钥和服务器可能会非常困难。 在整个组织中正确识别有效密钥并删除无效密钥可能会充满错误,并对您的服务器安全产生巨大影响。

此外,当服务器发生变化时,有时您的用户会收到无法确定服务器真实性的警告。 大多数用户在连接之前不会仔细检查服务器的密钥指纹,从而允许有人可能欺骗服务器并执行中间人攻击。

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

在之前的指南中,我们讨论了 如何设置 monkeysphere 以向用户验证服务器 。 我们将继续本指南中我们离开的地方,在那里我们将学习如何仅根据他们的 GPG 密钥和我们的服务器管理员对这些用户的信任来自动验证用户到我们的服务器。 这将允许我们创建使用纯英语而不是主要加密信息的身份验证文件。

本指南将假定您具有我们在上一指南中留下的设置(server.example.comadmin.example.comclient.example。 com 建立了必要的信任关系)。 让我们开始吧。

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

允许我们的 SSH 服务器自动向服务器验证我们的用户的第一步是建立一个身份验证者。 身份验证者只是我们指定的在建立用户身份方面受信任的人。

在大多数情况下,简单而合乎逻辑的选择是让服务器管理员识别应该能够登录的用户。 我们要走这条路。 如果您的情况需要分配该责任,您还可以创建多个身份验证者。

让我们从再次获取管理用户的指纹开始。 在我们管理员的计算机上,我们可以使用我们在上一个指南中使用的相同 GPG 命令来获取完整的指纹:

gpg --with-colons --fingerprint admin@fakedomain.com

同样,我们正在寻找如下输出行:

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

以红色突出显示的部分是我们这里需要的。

在 SSH 服务器 (server.example.com) 上,我们将添加此密钥作为身份验证者。 您可以通过键入以下内容来执行此操作:

 monkeysphere-authentication add-identity-certifier A61256B85307B7ED9AD8D93E9E06881E49E95F19 

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

为 SSH 用户生成身份验证子密钥

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

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

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

monkeysphere gen-subkey

将生成一个子密钥并将其添加到您的主密钥下的本地 GPG 密钥环中。

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

 gpg --list-keys 客户端 @假域名 .com
  pub 2048R/ 87791BD0 2014-03-14 uid 客户端  @假域名 .com> sub 2048R/3294D31D 2014-03-14 sub 2048R/0FECF512 2014-03-14

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

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

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

在 SSH 服务器上创建认证文件

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

用户级文件是我们应该与之交互以建立身份验证策略的文件。 这些是简单、直接、简单的英文文件,仅通过姓名和电子邮件(承诺给 GPG)指定应允许登录的人员。 这些文件位于每个用户主目录的子目录中,就像常规的 SSH authorized_keys 文件一样。

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

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

首先转到您要为其配置访问权限的任何用户的主目录。 由于我们需要使用管理权限登录才能做到这一点,让我们为我们的 root 用户设置访问权限。 在主目录中,创建一个名为 .monkeysphere 的隐藏目录:

cd /root
mkdir .monkeysphere

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

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

chmod 755 .monkeysphere
cd .monkeysphere

在这个目录中,我们需要创建一个名为 authorized_user_ids 的文件。 这是用户级认证文件。 使用您的文本编辑器创建它:

nano authorized_user_ids

在这个文件中,我们简单地按姓名和电子邮件列出用户,就像他们在 GPG 中一样。 所以要查看我们需要使用的格式,我们可以在客户端机器上再次输入:

 gpg --list-keys 客户端 @假域名 .com
  pub 2048R/87791BD0 2014-03-14 uid客户端  @假域名 .com> sub 2048R/3294D31D 2014-03-14 sub 2048R/0FECF512 2014-03-14

所以这就是我们必须在这个文件中输入的所有内容:

client <client@fakedomain.com>

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

client <client@fakedomain.com>
admin <admin@fakedomain.com>

这比大型 authorized_keys 文件更易于阅读和管理 '。 这些文件往往会过时,很难判断旧密钥是否仍然有效。 使用这种方法,很容易问自己“Bob 应该可以访问这台机器吗?” 如果没有,只需删除他的名字。

完成后保存并关闭文件。

现在,我们需要记住从所有者以外的任何人那里取消写权限:

chmod 644 authorized_user_ids

对您希望为其配置远程访问的任何用户重复此过程。

生成内部认证文件

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

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

monkeysphere-authentication update-users

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

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

monkeysphere-authentication update-users root

让我们看看这个过程生成了哪些文件。 我们需要转到存储这些的目录:

cd /var/lib/monkeysphere/authorized_keys

在内部,您应该会看到您为其配置访问权限的系统上的每个用户的文件。 对此的一个小警告是,用户级身份验证文件中的每个用户都需要在公共 GPG 密钥服务器网络上具有可用的关联子密钥。

ls

demouser  root

如果我们查看文件,我们将看到一个如下所示的键:

ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQD0CdVIlUptYdZBz/0pn+7XIa2jdzy/VnayAZDXhFdHDTZU0hB8MDGHC9yjUrn9RCMj2NWD3Ls7JjqVAzmRsUn56UwyCJt8/GVmHpeIhYzmUAUjMaaMnjBG3Nhdpm9rsnJt0XVUvOu9oxrvTWYH6ZCVNwsY1O7aX/kQWnaXQW6/B6oiQJ76feZyoLEBR8D/nbxGTtNlkEMcTMTylHN0jHLACJy483SFUkSjHneNK9gNFoxTlUyF/ZBo5+Bo8Uld4iAyhaW7Di4HzfUJzvebZYX1Z1O0yS/db8anSJoZX90MLt7eIFsixuDMS3m31dsX26RI71tJGihvzF0fUsUPDg17
MonkeySphere2014-03-22T13:14:31 client <client@fakedomain.com>

如您所见,这基本上是一个普通的 authorized_keys 条目。 我们已经将其抽象出来,以便于用户管理和用户通过 GPG 动态更新其密钥的能力。

您可能还会在此文件中看到与您在 authorized_user_ids 文件中所做的任何条目无关的其他行。 这是因为,默认情况下,monkeysphere 会将它在现有 authorized_keys 文件中找到的任何条目附加到生成文件的末尾。 这是为了帮助您在两个系统之间进行转换,并帮助无论出于何种原因无法切换的用户。

现在我们已经生成了这些新的授权文件,我们需要更新 SSH 守护程序的配置以查看这些文件而不是每个用户目录中的文件。

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

nano /etc/ssh/sshd_config

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

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

完成后保存并关闭文件。

现在,我们只需要重新启动 SSH 守护程序即可进行更改:

service ssh restart

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

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

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

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

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

这将起作用,并且在您输入 GPG 密钥的密码后,您应该能够连接到服务器,而无需输入服务器帐户的任何密码。

但是,启动代理会话可能是值得的。 您可以通过键入以下内容在当前的 shell 中执行此操作:

eval $(ssh-agent)

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

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

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

monkeysphere subkey-to-ssh-agent

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

我们可以通过键入以下内容看到它已被接受:

ssh-add -l

2048 2a:1a:1d:52:32:e5:f4:45:b2:a3:ff:d0:c0:6e:69:f6 client <client@fakedomain.com> (RSA)

现在,我们可以使用 GPG 子密钥访问我们有权访问的任何帐户,而不会被提示输入任何内容:

ssh server.example.com

结论

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

贾斯汀·艾林伍德