我需要与我的队友共享对多台服务器的 SSH 访问权限,并正在寻找一种安全的方法。我想出了一个涉及 SSH 堡垒服务器的配置,但不确定如何(以及是否)可以做到这一点。
我希望每个服务器只允许一个 SSH 密钥,而不是每个用户一个,这样我就不必一直更新它们。每个用户都应该能够使用自己的 ssh 密钥访问堡垒服务器。所有服务器私钥都应放在堡垒服务器上。所有用户都应该能够以某种方式使用它们登录服务器,但不能读取或复制。
所以我的问题是这可以做到吗以及如何做到?
答案1
我同意这个评论,认为这是一个坏主意。
当您写“所有服务器私钥都应放在堡垒服务器上”时,我假设您不是指实际的服务器私钥,而是指允许在 allowed_keys 中为服务器使用的私钥。
无论如何,要回答您的问题,您可以以某个用户的身份在堡垒主机上运行 ssh 代理,并将所有密钥加载到代理中。通常,只有启动代理的用户才能使用访问代理的套接字,但稍后可以通过 chmod 或 chown 进行更改。您可以在服务器启动时自动执行此操作。稍后用户可以访问代理的套接字,代理将向服务器提供身份验证,但不允许复制密钥。一个问题是 SSH 服务器只允许使用密钥进行有限次数的尝试。如果您拥有的服务器多于允许的尝试次数,则每台服务器都需要一个代理(或为足够小的服务器组各一个代理)。
有人建议使用 Ansible。Ansible 是一款出色的配置管理工具,但您可能认为仅将其用于密钥有点过头了。无论如何,请查找它,如果您有大量服务器,您可能会发现它对其他任务也很有用。
由于每个用户都应该能够使用自己的 ssh 密钥访问堡垒服务器,这意味着您的堡垒服务器上有一个最新的 authorized_keys 文件。因此有一个简单的解决方案,创建一个这样的脚本,并在该文件发生更改时运行它。缺点是必须以 root 身份运行才能访问所有用户的文件,并且要删除用户的访问权限,您必须截断文件但不能删除它。
for host in $HOST_LIST; do
for user in $USER_LIST; do
eval scp -p ~$user/.ssh/authorized_keys $host:~$user/.ssh/authorized_keys
done
done
如果您可以将所有服务器连接到一个 LDAP 服务器(或主 LDAP 服务器的辅助服务器),则只需让每个用户将其公共 SSH 密钥放在 LDAP 目录中并从服务器查询。
如果这不可行,而且您不喜欢复制每个用户的 authorized_keys 文件的脚本,那么您可以创建一个列出用户名和 SSH 密钥的文件。设置将此文件自动分发到服务器。该文件不必由 root 拥有,因此为此设立一个专用用户帐户就足够了。在所有服务器上,在 sshd_config 中配置一个条目 AuthorizedKeysCommand,其名称为一个脚本,该脚本将读取此文件的所有密钥并返回尝试登录的用户的密钥。此脚本必须以具有包含 SSH 密钥的文件访问权限的用户身份运行。您可以让此文件对您的用户不可读,但这不是必需的,因为它只包含公钥,而公钥并不敏感。
如果你希望每个用户都有单独的 SSH 密钥,但只有一个帐户,只需为这个帐户设置 authorized_keys 的自动分发即可
for host in $HOST_LIST; do
scp -p authorized_keys account@$host:.ssh/authorized_keys
done
答案2
CLD 项目适合这些目的 https://github.com/classicdevops/cld
如果你有任何问题可以在评论中提出,我会更新帖子