有一个非常相似的问题如果回答了,可能就是这个问题的答案。不幸的是,这是一个“不需要回答我提出的问题,因为问题不是我所想的那样”的情况。
设置
- 服务器堡垒.ec2接受来自我的工作站通过
ssh -i mykey.pem [email protected]
- 服务器服务1.ec2接受 ssh 连接仅来自 bastion.ec2通过
ssh -i sharedkey.pem [email protected]
要求
- 两个键都是仅在我的工作站上所以如果不复制密钥,我实际上无法执行第二条命令
- 出于安全原因,我想使用 ssh-agent 转发,而不是将 ssh 密钥复制到 bastion.ec2
解决方案
这就是你进来的地方。我如何为第二个连接转发不同的密钥?
如果 shareduser 中有 mykey.pub,那么~/.ssh/authorized_keys
将会起作用:
ssh -i mykey.pem [email protected] ssh [email protected]
但是,我不希望每个用户都必须将他们的公钥放在每个服务器上。
答案1
步骤1
确保您的当地代理已做好准备
只是因为你可以 ssh 进入你的堡垒服务器如果没有指定密钥路径或提示输入密码,并不意味着您的 ssh 代理正在运行并持有您的密钥。一些现代操作系统(例如: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
步骤3
确保使用正确的按键
如果您已将密钥添加到代理,则代理正在转发,并且远程代理会列出您的本地密钥。您无法建立连接的原因可能只有两个。要么您使用的密钥不正确,要么您使用的用户名不正确。
输出私钥的公钥对应部分:
$ 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.pub
Bro 2 立方体给你发的电子邮件是正确的。核实!这可能需要让其他可以以该用户身份通过 SSH 访问的人为您获取 authorized_keys 文件或获取 root 访问权限。如果您已经做到了这一点,但仍然无法解决问题,那么您已经无法走捷径了。
步骤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 [email protected]
图7
如果你没有带走其他任何东西图7ProxyCommand
这应该是&的正确用法ForwardAgent
。
自动填充你的 .bash_profile
您不想ssh-add
每次登录计算机时都手动执行此操作。~/.bash_profile
是一个每次登录时运行的脚本**。将以下行从图 3你应该随时让你的经纪人做好准备。
** 不要将其与.bashrc
为每个新的 [交互式] 终端运行的代理相混淆。即使您关闭所有终端会话,您的代理仍会继续运行。无需重新加载您的密钥
使用 .bash_profile 的替代方法
我也创建了添加 OSX/macOS 启动代理的要点。您可以使用该方法在开机时启动ssh-agent
。安装非常简单:
curl -sSL https://gist.github.com/RichardBronosky/429a8fff2687a16959294bcee336dd2a/raw/install.sh | bash
答案2
这就是你进来的地方。我如何为第二个连接转发不同的密钥?
您无需转发密钥。您转发代理,并且它可以拥有与您在第一次跳转中用于身份验证的完全独立的密钥。使用 检查代理中的密钥ssh-add -L
。
但更好的是,通过运行连接,这将避免转发代理、堆或命令行选项以及从直接主机进行身份验证的需要。ProxyCommand ssh -W %h:%p [email protected]
您可以简单地将其放入您的配置中(参见man ssh_config
)。