ssh:自动接受密钥


218

我已经编写了这个小实用程序脚本:

for h in $SERVER_LIST; do ssh $h "uptime"; done

将新服务器添加到时$SERVER_LIST,该脚本将通过以下方式停止:

The authenticity of host 'blah.blah.blah (10.10.10.10)' can't be established.
RSA key fingerprint is a4:d9:a4:d9:a4:d9a4:d9:a4:d9a4:d9a4:d9a4:d9a4:d9a4:d9.
Are you sure you want to continue connecting (yes/no)?

我已经试过yes

for h in $SERVER_LIST; do yes | ssh $h "uptime"; done

没有运气。

有没有一种方法可以ssh自动接受任何新密钥?


6
Lekensteyn的回答是非常正确的,但是我只想指出,由于ssh期望“ yes”并yes输出“ y”,因此您可能会比较幸运for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(请注意额外的yes,它表示yes而不是“ y” ”)。
chazomaticus 2012年

Answers:


239

使用StrictHostKeyChecking选项,例如:

ssh -oStrictHostKeyChecking=no $h uptime

此选项也可以添加到〜/ .ssh / config中,例如:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

请注意,更改主机密钥后,即使使用此选项,也会收到警告:

$ ssh -oStrictHostKeyChecking=no somehost uptime
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
31:6f:2a:d5:76:c3:1e:74:f7:73:2f:96:16:12:e0:d8.
Please contact your system administrator.
Add correct host key in /home/peter/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/peter/.ssh/known_hosts:24
  remove with: ssh-keygen -f "/home/peter/.ssh/known_hosts" -R 10.0.0.1
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
ash: uptime: not found

如果不经常重新安装主机,则可以使用该选项降低安全性(但对于经常更改的主机密钥来说更方便)-oUserKnownHostsFile=/dev/null。这将丢弃所有接收到的主机密钥,因此它将永远不会生成警告。


在18.04版本中,有一种新的可能性:StrictHostKeyChecking=accept-new。来自man 5 ssh_config

If this flag is set to accept-new then ssh will automatically
add new host keys to the user known hosts files, but will not
permit connections to hosts with changed host keys.  If this flag
is set to no or off”, ssh will automatically add new host keys
to the user known hosts files and allow connections to hosts with
changed hostkeys to proceed, subject to some restrictions.

10
这不是最佳解决方案,因为它绕过了内置安全工具。ssh-keyscan如果您的系统上可用,则是更可取的。
Stefan Lasiewski,2015年

2
@StefanLasiewski如果您位于不受信任的网络上,则它允许中间人攻击。为了接受固定主机的新密钥,该ssh-keyscan方法更为理智。对于具有动态/重用IP地址的受信任网络中的本地虚拟机和其他主机,所描述的方法就足够了。
Lekensteyn 2015年

8
只是为了阐明两种解决方案之间的区别:该ssh-keyscan解决方案仅ssh-keyscan在运行一次时容易受到中间人攻击。该-oStrictHostKeyChecking=no解决方案很容易在每次ssh运行时受到中间人攻击。
ErikSjölund'8

121

您可以使用以下命令将服务器的指纹添加到known_hosts

ssh-keyscan -H <ip-address> >> ~/.ssh/known_hosts
ssh-keyscan -H <hostname> >> ~/.ssh/known_hosts

注:将<ip-address>和<主机名>替换为要添加的服务器的IP和dns名称。

唯一的问题是,您将最终两次在known_hosts中获得一些服务器。只是提及,这并不是什么大不了的事情。为了确保没有重复项,可以先运行以下命令,然后首先删除所有服务器:

ssh-keygen -R <ip-address>
ssh-keygen -R <hostname>

这样就可以运行:

for h in $SERVER_LIST; do
    ip=$(dig +search +short $h)
    ssh-keygen -R $h
    ssh-keygen -R $ip
    ssh-keyscan -H $ip >> ~/.ssh/known_hosts
    ssh-keyscan -H $h >> ~/.ssh/known_hosts
done

删除只是重新添加时要记住的一件事,实际上就是删除了验证指纹的安全性。因此,您绝对不希望在每次执行实用程序脚本之前都运行此脚本。


1
通过排序运行| uniq,然后在之后使用awk查找重复的主机,将使脚本能够检测已更改的主机并仅警告那些主机,因为具有不同密钥的同一主机可能会带来麻烦
Lennart Rolland 2015年

2
您可能需要添加注释,以-H散列主机名和地址。
David Cullen

25

我对这个响应有些迟,但是明智的方法是在运行正常运行时间之前在新机器上进行ssh-keyscan。

ssh-keyscan  <newhost> >> ~/.ssh/known_hosts

为了方便起见,禁用健全性检查听起来是一个坏计划,即使您认为自己完全控制环境也是如此。


运行上面的命令并且不实际检查主机密钥是否与您从带外获取的指纹相对应,这很容易受到攻击StrictHostKeyChecking no
code_monk'Apr 4'17

3
@code_monk:不,不是。我打开了一次失败的机会(接受来自错误主机的密钥要添加到已知主机)。 StrictHostKeyChecking否将允许其他机器重复接受。
天衣

0

为了自动添加服务器列表,我们可以执行以下操作:

在文件服务器列表中添加服务器IP

IP应该以以下格式添加。

输出 cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

通过替换您的IP来更改上述IP。

下面的命令将添加列表中的所有服务器。

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
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.