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

Bru*_*sky 23 ssh

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

设置

  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
Run Code Online (Sandbox Code Playgroud)

但是,我不希望每个用户都必须将他们的公钥放在每台服务器中。

Bru*_*sky 30

第1步

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

仅仅因为您可以 ssh 进入您的堡垒服务器而不指定您的密钥路径或提示输入密码,并不意味着您的 ssh 代理正在运行并持有您的密钥。一些现代操作系统(例如:OSX)会为您处理这个问题。

在您的本地机器上

$ ssh-add -L
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13== ~/.ssh/mykey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13== ~/.ssh/sharedkey.pem
Run Code Online (Sandbox Code Playgroud)

图。1

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

$ ssh-add -L
The agent has no identities.
Run Code Online (Sandbox Code Playgroud)

图2

这意味着您尚未向代理添加任何密钥。解决这个问题:

ssh-add ~/.ssh/mykey.pem ~/.ssh/sharedkey.pem
Run Code Online (Sandbox Code Playgroud)

图3

第2步

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

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

$ ssh-add -L
Could not open a connection to your authentication agent.
Run Code Online (Sandbox Code Playgroud)

图4

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

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

$ ssh -A bastion.ec2
Run Code Online (Sandbox Code Playgroud)

图5

第 3 步

确保您使用正确的键

如果您向代理添加了密钥,则您的代理正在转发,并且您的远程代理会列出您的本地密钥。您无法连接的可能原因只有两个。要么您没有使用正确的密钥,要么您没有使用正确的用户名。

输出与您的私钥对应的公共副本:

$ cd
$ cd .ssh
$ ssh-keygen -y -f mykey.pem
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13
$ ssh-keygen -y -f sharedkey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13
Run Code Online (Sandbox Code Playgroud)

图6

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

现在,您必须以一种或另一种方式进入无法连接的框,并查看$HOME/.ssh/authorized_keys您尝试连接的用户的文件内容。您需要确保使用上述命令输出的公钥单独位于该文件中的一行中。您不能相信sharedkey.pubBro 2 立方体通过电子邮件发送给您的是正确的。核实!这可能需要让可以作为该用户通过 SSH 登录的其他人为您获取 authorized_keys 文件或获得 root 访问权限。如果你已经走到这一步,但它仍然不起作用,你就不能走捷径了。

第四步

让它变得容易

希望上面的步骤已经让你进入。现在,只要你使用这个工作站,就让这个头痛消失。

配置您的本地 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
Run Code Online (Sandbox Code Playgroud)

图7

如果您从图 7 中没有采取任何其他措施,则应该正确使用ProxyCommand& ForwardAgent

自动填充您的 .bash_profile

您不想ssh-add每次登录机器时都必须手动操作。~/.bash_profile是每次登录时运行的脚本**。把图中的线3在那里,你应该随时准备好你的代理。

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

替代使用 .bash_profile

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

curl -sSL https://gist.github.com/RichardBronosky/429a8fff2687a16959294bcee336dd2a/raw/install.sh | bash
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

13381 次

最近记录:

7 年,2 月 前