如果我有一个服务器 A,我可以使用我的 ssh 密钥登录并且我能够“sudo su - otheruser”,我会丢失密钥转发,因为 env 变量被删除并且套接字只能由我的原始用户读取。有没有办法可以通过“sudo su - otheruser”桥接密钥转发,所以我可以用我的转发密钥(在我的情况下为 git clone 和 rsync)在服务器 B 上做一些事情?
我能想到的唯一方法是将我的密钥添加到 otheruser 的 authorized_keys 和“ssh otheruser@localhost”,但这对于我可能拥有的每个用户和服务器组合来说都很麻烦。
简而言之:
$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey).
sudo
正如您所提到的,出于安全原因,环境变量被删除。但幸运
sudo
的是它是相当可配置的:env_keep
借助/etc/sudoers
.对于代理转发,您需要保留
SSH_AUTH_SOCK
环境变量。为此,只需编辑您的/etc/sudoers
配置文件(始终使用visudo
)并将env_keep
选项设置为适当的用户。如果您希望为所有用户设置此选项,请使用如下Defaults
行:man sudoers
更多细节。您现在应该能够执行以下操作(前提
user1
是 的公钥存在于~/.ssh/authorized_keys
and 中user1@serverA
,user2@serverB
并且serverA
的/etc/sudoers
文件如上所示设置):这将为您提供一个仍然加载原始密钥的 root shell。
允许其他用户访问
$SSH_AUTH_SOCK
文件及其目录,例如通过正确的 ACL,然后再切换到它们。该示例假设
Defaults:user env_keep += SSH_AUTH_SOCK
在/etc/sudoers
“主机”机器上:更安全,也适用于非 root 用户?
我发现这也有效。
正如其他人所指出的那样,如果您要切换到的用户没有 $SSH_AUTH_SOCK 的读取权限(这几乎是除 root 之外的任何用户),这将不起作用。你可以通过设置 $SSH_AUTH_SOCK 和它所在的目录来解决这个问题,使其具有权限 777。
不过这是相当冒险的。您基本上是授予系统上的每个其他用户使用 SSH 代理的权限(直到您注销)。您还可以设置组并将权限更改为 770,这可能更安全。但是,当我尝试更改组时,我得到“不允许操作”。
您始终可以通过代理转发 ssh 到 localhost,而不是使用 sudo:
缺点是您需要再次登录,但是如果您在 screen/tmux 选项卡中使用它,那只是一次工作,但是,如果您断开与服务器的连接,则套接字(当然)会再次损坏. 因此,如果您不能始终保持 screen/tmux 会话打开,这并不理想(但是,
SSH_AUTH_SOCK
如果您很酷,您可以手动更新您的 env var)。另请注意,使用 ssh 转发时,root 始终可以访问您的套接字并使用您的 ssh 身份验证(只要您使用 ssh 转发登录)。因此,请确保您可以信任 root。
如果您被授权
sudo su - $USER
,那么您可能有一个很好的理由来允许ssh -AY $USER@localhost
您使用 $USER 的主目录中的有效公钥来代替。然后您的身份验证转发将与您一起进行。结合来自其他答案的信息,我想出了这个:
我喜欢这个,因为我不需要编辑
sudoers
文件。在 Ubuntu 14.04 上测试(必须安装
acl
包)。不要使用
sudo su - USER
,而是sudo -i -u USER
。为我工作!-
我认为命令中的(dash) 选项有问题su
:如果您阅读su的手册页,您可能会发现该选项
-, -l, --login
将 shell 环境作为登录 shell 启动。otheruser
无论您运行的环境变量如何,这都会加载环境su
。简单地说,破折号会破坏你从
sudo
.相反,您应该尝试以下命令:
正如@joao-costa 指出的那样,
-E
将保留您运行的环境中的所有变量sudo
。然后没有破折号,su
将直接使用该环境。不幸的是,当您 su 到另一个用户(甚至使用 sudo)时,您将失去使用转发密钥的能力。这是一项安全功能:您不希望随机用户连接到您的 ssh-agent 并使用您的密钥 :)
“ssh -Ay ${USER}@localhost” 方法有点麻烦(正如我在对大卫回答容易损坏的评论中指出的那样),但这可能是你能做的最好的。