177 ssh sudo agent forwarding ssh-agent
如果我有一个服务器 A,我可以使用我的 ssh 密钥登录,并且我有能力“sudo su - otheruser”,我会丢失密钥转发,因为 env 变量被删除并且套接字只能由我的原始用户读取。有没有一种方法可以通过“sudo su - otheruser”桥接密钥转发,这样我就可以使用转发的密钥(在我的情况下为 git clone 和 rsync )在服务器 B 上做一些事情?
我能想到的唯一方法是将我的密钥添加到其他用户的授权密钥和“ssh otheruser@localhost”,但对于我可能拥有的每个用户和服务器组合来说,这很麻烦。
简而言之:
$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey).
Run Code Online (Sandbox Code Playgroud)
Min*_*ark 203
正如您所提到的sudo,出于安全原因,环境变量由 删除。
但幸运的sudo是相当配置:您可以准确地告诉它你想保留多亏了哪些环境变量env_keep在配置选项/etc/sudoers。
对于代理转发,您需要保留SSH_AUTH_SOCK环境变量。为此,只需编辑您的/etc/sudoers配置文件(始终使用visudo)并将env_keep选项设置为适当的用户。如果要为所有用户设置此选项,请使用如下Defaults行:
Defaults env_keep+=SSH_AUTH_SOCK
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
Joa*_*sta 87
sudo -E -s
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个仍然加载原始密钥的 root shell。
小智 40
在切换到其他用户之前,允许其他用户访问$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$
Run Code Online (Sandbox Code Playgroud)
更安全,也适用于非 root 用户
phy*_*lae 14
我发现这也有效。
sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"
Run Code Online (Sandbox Code Playgroud)
正如其他人所指出的那样,如果您要切换到的用户没有对 $SSH_AUTH_SOCK 的读取权限(除了 root 用户,它几乎是任何用户),这将不起作用。您可以通过设置 $SSH_AUTH_SOCK 和它所在的目录来解决这个问题,以获得 777 的权限。
chmod 777 -R `dirname $SSH_AUTH_SOCK`
sudo su otheruser -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"
Run Code Online (Sandbox Code Playgroud)
不过这是相当冒险的。您基本上是在授予系统上的所有其他用户使用您的 SSH 代理的权限(直到您注销)。您也可以设置组并将权限更改为 770,这样会更安全。但是,当我尝试更改组时,出现“不允许操作”。
如果您被授权sudo su - $USER,那么您可能有一个很好的理由被允许ssh -AY $USER@localhost使用 $USER 主目录中的有效公钥来代替。然后您的身份验证转发将与您一起完成。
您始终可以使用代理转发 ssh 到本地主机,而不是使用 sudo:
ssh -A otheruser@localhost
Run Code Online (Sandbox Code Playgroud)
缺点是你需要重新登录,但是如果你在 screen/tmux 选项卡中使用它,那只是一次努力,但是,如果你与服务器断开连接,套接字(当然)会再次断开. 因此,如果您不能始终保持屏幕/tmux 会话处于打开状态,这并不理想(但是,SSH_AUTH_SOCK如果您很酷,可以手动更新您的环境变量)。
另请注意,使用 ssh 转发时,root 始终可以访问您的套接字并使用您的 ssh 身份验证(只要您使用 ssh 转发登录)。因此,请确保您可以信任 root。
结合其他答案的信息我想出了这个:
user=app
setfacl -m $user:x $(dirname "$SSH_AUTH_SOCK")
setfacl -m $user:rwx "$SSH_AUTH_SOCK"
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -u $user -i
Run Code Online (Sandbox Code Playgroud)
我喜欢这个,因为我不需要编辑sudoers文件。
在 Ubuntu 14.04 上测试(必须安装acl软件包)。
| 归档时间: |
|
| 查看次数: |
90457 次 |
| 最近记录: |