ssh-agent 转发和 sudo 给另一个用户

ssh-agent 转发和 sudo 给另一个用户

如果我有一台服务器 A,我可以使用我的 ssh 密钥登录,并且我有能力“sudo su - otheruser”,那么我将失去密钥转发,因为环境变量已被删除该套接字仅可由我的原始用户读取。有没有办法通过“sudo su - otheruser”桥接密钥转发,以便我可以使用转发的密钥在服务器 B 上执行操作(在我的情况下是 git clone 和 rsync)?

我能想到的唯一方法是将我的密钥添加到 otheruser 的 authorized_keys 和“ssh otheruser@localhost”中,但对于我可能拥有的每个用户和服务器组合来说,这样做很麻烦。

简而言之:

$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey). 

答案1

正如您所说,出于安全原因,环境变量已被删除sudo

但幸运的是,它是相当可配置的:您可以通过配置选项sudo准确地告诉它您想要保留哪些环境变量。env_keep/etc/sudoers

对于代理转发,您需要保留SSH_AUTH_SOCK环境变量。为此,只需编辑/etc/sudoers配置文件(始终使用visudo)并将env_keep选项设置为适当的用户。如果您希望为所有用户设置此选项,请使用Defaults如下行:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers更多细节。

现在您应该能够做类似这样的事情(假设user1的公钥存在于和~/.ssh/authorized_keys中,并且的文件设置如上所示):user1@serverAuser2@serverBserverA/etc/sudoers

user1@mymachine> eval `ssh-agent`  # starts ssh-agent
user1@mymachine> ssh-add           # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA    # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2     # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB         # goto user2@serverB w/o typing pwd again...
user2@serverB>                     # ...because forwarding still works

答案2

sudo -E -s
  • -E 将保护环境
  • -s 运行命令,默认为 shell

这将为你提供一个仍加载有原始密钥的 root shell。

答案3

允许其他用户$SSH_AUTH_SOCK在切换到文件及其目录之前,例如通过正确的 ACL 来访问它们。

该示例假设Defaults:user env_keep += SSH_AUTH_SOCK/etc/sudoers“主机”机器上:

$ ssh -A user@host
user@host$ setfacl -m otheruser:x   $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$

更安全,非 root 用户也可以使用

答案4

你可以通过代理转发来 ssh 到本地主机,而不必使用 sudo:

ssh -A otheruser@localhost

缺点是您需要再次登录,但如果您在 screen/tmux 选项卡中使用它,则只需一次操作,但是,如果您断开与服务器的连接,套接字(当然)将再次断开。因此,如果您不能始终保持 screen/tmux 会话打开,这不是理想的选择(但是,如果您SSH_AUTH_SOCK很酷,您可以手动更新您的环境变量)。

还请注意,使用 ssh 转发时,root 始终可以访问您的套接字并使用您的 ssh 身份验证(只要您使用 ssh 转发登录)。因此请确保您可以信任 root。

相关内容