AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 107187
In Process
Florian Schulze
Florian Schulze
Asked: 2010-01-29 05:52:40 +0800 CST2010-01-29 05:52:40 +0800 CST 2010-01-29 05:52:40 +0800 CST

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

  • 772

如果我有一个服务器 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). 
ssh sudo forwarding agent ssh-agent
  • 11 11 个回答
  • 98574 Views

11 个回答

  • Voted
  1. MiniQuark
    2010-03-04T13:24:15+08:002010-03-04T13:24:15+08:00

    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_keysand 中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
    
    • 207
  2. Joao Costa
    2014-01-02T07:31:44+08:002014-01-02T07:31:44+08:00
    sudo -E -s
    
    • -E 将保护环境
    • -s 运行命令,默认为 shell

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

    • 94
  3. Viliam Pucik
    2012-11-16T02:58:20+08:002012-11-16T02:58:20+08:00

    允许其他用户访问$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 用户?

    • 40
  4. phylae
    2012-03-21T16:01:39+08:002012-03-21T16:01:39+08:00

    我发现这也有效。

    sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"
    

    正如其他人所指出的那样,如果您要切换到的用户没有 $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"
    

    不过这是相当冒险的。您基本上是授予系统上的每个其他用户使用 SSH 代理的权限(直到您注销)。您还可以设置组并将权限更改为 770,这可能更安全。但是,当我尝试更改组时,我得到“不允许操作”。

    • 14
  5. gitaarik
    2013-11-28T06:56:58+08:002013-11-28T06:56:58+08:00

    您始终可以通过代理转发 ssh 到 localhost,而不是使用 sudo:

    ssh -A otheruser@localhost
    

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

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

    • 9
  6. David Mackintosh
    2010-01-29T06:08:04+08:002010-01-29T06:08:04+08:00

    如果您被授权sudo su - $USER,那么您可能有一个很好的理由来允许ssh -AY $USER@localhost您使用 $USER 的主目录中的有效公钥来代替。然后您的身份验证转发将与您一起进行。

    • 7
  7. warvariuc
    2015-06-11T09:39:28+08:002015-06-11T09:39:28+08:00

    结合来自其他答案的信息,我想出了这个:

    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
    

    我喜欢这个,因为我不需要编辑sudoers文件。

    在 Ubuntu 14.04 上测试(必须安装acl包)。

    • 5
  8. Fahad Sadah
    2010-01-29T08:51:16+08:002010-01-29T08:51:16+08:00

    不要使用sudo su - USER,而是sudo -i -u USER。为我工作!

    • 4
  9. Koala Yeung
    2016-04-06T02:03:35+08:002016-04-06T02:03:35+08:00

    -我认为命令中的(dash) 选项有问题su:

    sudo su - otheruser
    

    如果您阅读su的手册页,您可能会发现该选项-, -l, --login将 shell 环境作为登录 shell 启动。otheruser无论您运行的环境变量如何,这都会加载环境su。

    简单地说,破折号会破坏你从sudo.

    相反,您应该尝试以下命令:

    sudo -E su otheruser
    

    正如@joao-costa 指出的那样,-E将保留您运行的环境中的所有变量sudo。然后没有破折号,su将直接使用该环境。

    • 2
  10. voretaq7
    2010-01-29T08:52:33+08:002010-01-29T08:52:33+08:00

    不幸的是,当您 su 到另一个用户(甚至使用 sudo)时,您将失去使用转发密钥的能力。这是一项安全功能:您不希望随机用户连接到您的 ssh-agent 并使用您的密钥 :)

    “ssh -Ay ${USER}@localhost” 方法有点麻烦(正如我在对大卫回答容易损坏的评论中指出的那样),但这可能是你能做的最好的。

    • 1

相关问题

  • 如何最好地设置 ssh 隧道以访问远程网络 (Linux)

  • SSH 和重定向

  • 通过 SSH 会话使用 NET USER 命令拒绝访问

  • SSH 服务器零日漏洞利用 - 保护自己的建议

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve