从另一个非 root 用户访问 SSH_AUTH_SOCK

Dan*_*y F 12 ssh sudo ssh-agent

场景:

我在本地 PC 上运行 ssh-agent,并且我的所有服务器/客户端都设置为转发 SSH 代理身份验证。我可以使用本地 PC 上的 ssh-agent 在所有机器之间跳转。那个有效。

我需要能够以我自己 (user1) 的身份通过SSH 连接到一台机器,更改为另一个名为 user2 的用户(sudo -i -u user2),然后使用我在本地 PC 上运行的 ssh-agent ssh 到另一个盒子。假设我想做一些类似 ssh user3@machine2 的事情(假设 user3 在其 authorized_keys 文件中有我的公共 SSH 密钥)。

我已将sudo配置为保留SSH_AUTH_SOCK环境变量。

所有涉及的用户(用户 [1-3])都是非特权用户(不是 root)。

问题:

当我更改为另一个用户时,即使 SSH_AUTH_SOCK 变量设置正确,(假设它设置为:/tmp/ssh-HbKVFL7799/agent.13799)user2 无权访问由 user1 创建的套接字 - 哪个当然是有道理的,否则用户 2 可能会劫持用户 1 的私钥并以该用户身份跳来跳去。

如果我不是通过 sudo 为 user2 获取 shell,而是通过 sudo 为 root 获取 shell,则此场景工作正常。因为 root 自然可以访问机器上的所有文件。

问题:

最好使用 sudo,如何从 user1 更改为 user2,但仍然可以访问 user1 的 SSH_AUTH_SOCK?

chu*_*utz 13

您需要做两件事:

  1. 设置SSH_AUTH_SOCK变量使其指向正确的文件
  2. 允许其他用户连接到套接字(使用文件系统权限)

因此,你可以做的是:

作为 user1,允许 user2 连接到套接字(完全访问套接字和进入目录的权限)。我希望您/tmp允许 ACL。

setfacl -m u:user2:rw $SSH_AUTH_SOCK
setfacl -m u:user2:x $(dirname $SSH_AUTH_SOCK)
Run Code Online (Sandbox Code Playgroud)

更改为其他用户,并正确导出变量。

sudo -u user2 env SSH_AUTH_SOCK=$SSH_AUTH_SOCK ssh user3@machine2
Run Code Online (Sandbox Code Playgroud)

如果要使用 来打开交互式 shell sudo,则必须SSH_AUTH_SOCK在获得 shell 后自己导出变量。