场景:
我在本地电脑上运行 ssh-agent,并且所有服务器/客户端都设置为转发 SSH 代理身份验证。我可以使用本地 PC 上的 ssh-agent 在所有机器之间跳转。这样就行了。
我需要能够以我自己 (user1) 的身份通过 SSH 连接到一台机器,更改为名为 user2 的另一个用户(sudo -i -u 用户2),然后使用我在本地 PC 上运行的 ssh-agent ssh 到另一台机器。假设我想执行类似 ssh user3@machine2 的操作(假设 user3 在他们的 authorized_keys 文件中有我的公共 SSH 密钥)。
我有须藤配置为保持SSH_AUTH_SOCK环境变量。
所有涉及的用户(用户[1-3])非特权用户(不是 root)。
问题:
当我更改为另一个用户时,即使 SSH_AUTH_SOCK 变量设置正确(假设将其设置为:/tmp/ssh-HbKVFL7799/agent.13799),用户 2 也无法访问由用户 1 创建的套接字 - 这当然是有道理的,否则用户 2 可以劫持用户 1 的私钥并以该用户的身份跳转。
如果不是通过 sudo 为 user2 获取 shell,而是通过 sudo 为 root 获取 shell,那么这个场景就很好用。因为 root 自然可以访问机器上的所有文件。
问题:
最好使用 sudo,我怎样才能从用户 1 更改为用户 2,但仍然可以访问用户 1 的 SSH_AUTH_SOCK?
答案1
您需要做两件事:
- 设置
SSH_AUTH_SOCK
变量,使其指向正确的文件 - 允许其他用户连接到套接字(使用文件系统权限)
因此,您可以做的是:
作为用户 1,允许用户 2 连接到套接字(对套接字的完全访问权限和进入目录的权限)。我希望您/tmp
允许 ACL。
setfacl -m u:user2:rw $SSH_AUTH_SOCK
setfacl -m u:user2:x $(dirname $SSH_AUTH_SOCK)
更改为其他用户,并正确导出变量。
sudo -u user2 env SSH_AUTH_SOCK=$SSH_AUTH_SOCK ssh user3@machine2
如果您想使用 打开交互式 shell sudo
,则必须SSH_AUTH_SOCK
在获取 shell 后自行导出变量。