我必须管理多台服务器,其中的服务可以是 cron、集成作业、部署、备份。所有这些的共同点是它们有时需要访问其他服务器。
问题:出于显而易见的原因,我不想将我的私钥传播到所有这些服务器。
我喜欢代理转发和 keychain.sh,但这要求我始终保持与这些服务器的连接。
解决此问题的方法可以是仅在一台服务器上放置私钥,然后保持对所有远程服务器的连接开放(使用 tmux/screen)。但这并不理想。
另一种解决方案可能是在私钥上放置一个非常强的密码短语,并将其实际分布在这些服务器上,但这也并不理想。
还有其他我忽略的选择吗?
答案1
我可以想到两种真正的无密钥和无密码的方法来做到这一点,尽管这两种方法都不是最佳的。在分节之后,我将向您展示使用 SSH 密钥来完成此操作是多么容易。
方法一:NFS 或者类似的东西。通用文件系统允许您将文件转储到专用区域,然后在 cron 作业中从相关系统中获取它们。然而,这仅与网络文件系统一样安全。
方法二:登录。 SSH 继承了 RSH 的很多内容,它允许在不同系统上具有相同用户名和密码(和盐?)的用户直接在它们之间进行连接,不需要密码(或密钥)(基本上,/etc/shadow
使用来自的哈希值作为证明) 。我不确定 SSH 是否可以轻松做到这一点,而且不幸的是我不知道任何关于如何设置它的指南。
为了获得适当的安全性,您需要在每台服务器上都有一个私钥。我在评论中看到您不想保留所有这些,但这在很大程度上是不可避免的。生成和丢弃私钥应该很容易做到,将它们添加到authorized_keys
需要授予访问权限的系统上也应该很容易。
即使我们谈论的是一百个系统,密钥生成也可以从您的个人系统以这种方式编写脚本(这假设您已经从您的个人系统获得了 root 访问权限):
cd /tmp
mkdir .ssh
chmod 700 .ssh
for server in node{1..100}; do
echo "Generating key for $server..."
ssh-keygen -t rsa -b 4096 -C "root@$server" -k .ssh/id_rsa
cat .ssh/id_rsa.pub >> authorized_keys
scp -pr .ssh root@$server:
rm .ssh/id_rsa*
sleep 1
done
for server in node{1..100}; do
cat authorized_keys |ssh root@$server "cat >> .ssh/authorized_keys"
done
我使用它是sleep 1
因为所有这些密钥都是在同一系统上生成的;这是一项健全性检查,以确保您获得更多随机性。需要两个循环,因为我们需要每个公钥才能共享授权密钥列表。
现在,您有 100 台服务器,分别名为 node1 到 node100,每台服务器都有一个密钥,授予每台其他服务器上的 root 访问权限。
(请注意,我不提倡允许用户以 root 身份登录。该sudo
工具可以提供更好的控制和责任。要使上述脚本正常工作,您必须将 pubkey 添加到每个节点上的 root 的authorized_keys 中,否则您需要 sudoNOPASSWD
访问权限并对我的代码进行一些修改(例如scp -pr .ssh $server:/tmp && ssh $server "sudo chown root:root /tmp/.ssh && sudo mv /tmp/.ssh /root/"
)。