SSH代理使用不同的用户名和不同的密钥转发


19

有一个非常相似的问题,如果回答,可能就是该问题的答案。不幸的是,这是“不需要回答我提出的问题,因为问题不是我想的那样”的情况。

设置

  1. 服务器bastion.ec2通过我的工作站接受ssh连接ssh -i mykey.pem myname@bastion.ec2
  2. 服务器service1.ec2 通过以下方式从bastion.ec2接受ssh连接:ssh -i sharedkey.pem shareduser@service1.ec2

要求

  1. 这两个密钥都只在我的工作站上,因此我不能在不复制密钥的情况下实际执行第二个命令
  2. 出于安全原因,我想使用ssh-agent转发而不是将ssh密钥复制到bastion.ec2

解决方案

这是您进入的地方。如何为第二连接转发其他密钥?

如果shareduser中有mykey.pub,则~/.ssh/authorized_keys可以使用:

ssh -i mykey.pem myname@bastion.ec2 ssh shareduser@service1.ec2

但是,我不希望每个用户都必须将其公用密钥放入每个服务器中。

Answers:


22

第1步

确保您的本地代理已准备就绪

仅仅因为您可以在不指定密钥路径或提示输入密码的情况下SSH进入堡垒服务器,并不意味着SSH代理正在运行并按住密钥。一些现代的OS(例如OSX)可以为您处理此问题。

在您的本地机器上

$ ssh-add -L
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13== ~/.ssh/mykey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13== ~/.ssh/sharedkey.pem

图。1

这意味着您的代理正在运行并拥有密钥。

$ ssh-add -L
The agent has no identities.

图2

这意味着您尚未向代理添加任何密钥。使用以下方法解决此问题:

ssh-add ~/.ssh/mykey.pem ~/.ssh/sharedkey.pem

图3

第2步

确保您的远程代理已准备就绪

SSH到您的堡垒服务器并重复检查图1图2。但是,您更可能遇到的错误是:

$ ssh-add -L
Could not open a connection to your authentication agent.

图4

这很可能意味着您的SSH客户端未转发身份验证代理连接。

您可以使用-A标志来强制执行此操作(只要服务器上的sshd配置允许它,这是默认设置)。

$ ssh -A bastion.ec2

图5

第三步

确保您使用的是正确的键

如果您已向代理添加密钥,则您的代理正在转发,并且您的远程代理列出您的本地密钥。没有建立连接只有两个可能的原因。您没有使用正确的密钥,或者您没有使用正确的用户名。

将公共副本输出到您的私钥:

$ cd
$ cd .ssh
$ ssh-keygen -y -f mykey.pem
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13
$ ssh-keygen -y -f sharedkey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13

图6

这些应该是一样的,你是从看到的ssh-add -L==接近尾声。

现在,您必须以一种或另一种方式进入无法连接的框,并$HOME/.ssh/authorized_keys为您尝试以其身份连接的用户查看文件的内容。您需要确保使用上面的命令输出的公钥本身在该文件中。您不能相信sharedkey.pubBro 2 cubes给您发送的电子邮件是正确的。校验!这可能需要让其他可以以该用户SSH身份登录的人来获取您的authorized_keys文件或获得根访问权限。如果您走了这么远而仍然无法正常工作,那么您将超越捷径。

第4步

轻松一点

希望上面的步骤能帮助您。现在,只要您使用此工作站,就让我们不再头痛。

配置本地ssh客户端

Host *
    # A lot of people put an IdentityFile line in this Host * section.
    # Don't do that unless you will use only 1 key everywhere forever.
    #IdentityFile id_rsa

Host bastion.ec2
    # You want to make sure you always forward your agent to this host.
    # But don't forward to untrusted hosts. So don't put it in Host *
    ForwardAgent yes
    # Go a head and put the IP here in case DNS ever fails you.
    # Comment it out if you want. Having it recorded is a good backup.
    HostName 172.31.0.1
    # You don't want to create a proxy loop later, so be explicit here.
    ProxyCommand none
    # SSH should try using all keys in your .ssh folder, but if you
    # know you want this key, being explicit speeds authentication.
    IdentityFile ~/.ssh/mykey.pem

# Connect effortlessly by hostname or IP address
# This assumes that your internal DNS uses the fake TLD ec2
# This assumes that 172.31.0.0 is your C-Class subnet
Host *.ec2 172.31.*
    # This command says proxy all ssh connections through bastion as if
    # you had done an ssh -A
    ProxyCommand ssh -W %h:%p bastion.ec2
    ForwardAgent yes
    # These next lines are documentation you leave as a love letter to
    # your future self when all else fails or you have to help a
    # coworker and decide to look at your own config.
    # ssh-add ~/.ssh/*.pem
    # ssh -At bastion.ecs ssh admin@172.31.18.19

图7

如果您没有从图7中删除其他内容,则应正确使用ProxyCommandForwardAgent

自动填充您的.bash_profile

您不需要ssh-add每次登录计算机时都必须手动进行操作。~/.bash_profile是每次您登录时运行的脚本**。把的线3在那里,您应该始终准备好您的代理。

**不要将其与.bashrc为每个新的[interactive]终端运行的混淆。即使关闭所有终端会话,您的代理也会继续运行。无需重新加载密钥

替代使用.bash_profile

我还创建了要添加OSX / macOS启动代理的要点。您可以使用该方法启动ssh-agent启动。安装非常简单:

curl -sSL https://gist.github.com/RichardBronosky/429a8fff2687a16959294bcee336dd2a/raw/install.sh | bash

步骤2:如果主机不允许ForwardAgent yes-A则无法强制执行。
dlamblin

感谢@dlamblin,我添加了相关信息和sshd文档的链接。
布鲁诺·布罗诺斯基

1

这是您进入的地方。如何为第二连接转发其他密钥?

您不转发密钥。您转发代理,它可以具有完全独立的密钥,而不是您在第一次跳转中用于身份验证的密钥。使用来检查代理中的密钥ssh-add -L

但更好的是,在上运行连接ProxyCommand ssh -W %h:%p myname@bastion.ec2,这将避免转发代理程序,堆或命令行选项的需求,也无需从直接主机进行身份验证的需求。

您可以简单地将其放入配置中(请参阅参考资料man ssh_config)。


1
幸运的是,我实际上知道您在这里说什么,但普通用户却不知道。您用“您转发代理而不是密钥”来争论语义。您给了我足够的帮助,我能够解决这个问题,因此我想给您机会,在我添加自己的答案之前,先更正您的答案。提示:ssh-add mykey.pem sharedkey.pem再确认与ssh-add -Lssh -At myname@bastion.ec2 ssh shareduser@service1.ec2
布鲁诺Bronosky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.