如果我有一台服务器 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@serverA
user2@serverB
serverA
/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。