禁用 SSH 远程主机的公钥检查&ssh key login
禁用 SSH 远程主机的公钥检查
SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击。但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查。
首先看看什么是 SSH 公钥检查
SSH 连接远程主机时,会检查主机的公钥。如果是第一次该主机,会显示该主机的公钥摘要,提示用户是否信任该主机:
The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established. RSA key fingerprint is a3:ca:ad:95:a1:45:d2:57:3a:e9:e7:75:a8:4c:1f:9f. Are you sure you want to continue connecting (yes/no)?
当选择接受,就会将该主机的公钥追加到文件 ~/.ssh/known_hosts 中。当再次连接该主机时,就不会再提示该问题了。 如果因为某种原因(服务器系统重装,服务器间IP地址交换,DHCP,虚拟机重建,中间人劫持),该IP地址的公钥改变了,当使用 SSH 连接的时候,会报错:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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 the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05. Please contact your system administrator. Add correct host key in /home/jiangxin/.ssh/known_hosts to get rid of this message. Offending key in /home/jiangxin/.ssh/known_hosts:81 RSA host key for 192.168.0.110 has changed and you have requested strict checking. Host key verification failed.
上面的警告信息说的是:
- 服务器公钥已经改变,新的公钥的摘要是:e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
- 该服务器原来的公钥记录在文件 ~/.ssh/known_hosts 中第 81 行。
如果确认不是中间人劫持,需要连接到该服务器,怎么办呢?最简单的就是用 vi 打开 ~/.ssh/known_hosts 文件,定位到 81 行,将该行删除。之后就可以使用 ssh 连接了。
如何让连接新主机时,不进行公钥确认?
在首次连接服务器时,会弹出公钥确认的提示。这会导致某些自动化任务,由于初次连接服务器而导致自动化任务中断。或者由于 ~/.ssh/known_hosts 文件内容清空,导致自动化任务中断。 SSH 客户端的 StrictHostKeyChecking 配置指令,可以实现当第一次连接服务器时,自动接受新的公钥。只需要修改 /etc/ssh/ssh_config 文件,包含下列语句:
Host * StrictHostKeyChecking no
或者在 ssh 命令行中用 -o 参数
$ ssh -o StrictHostKeyChecking=no 192.168.0.110
如何防止远程主机公钥改变导致 SSH 连接失败
当确认中间人劫持攻击风险比较小的情况下,才可以使用下面的方法,禁用 SSH 远程主机的公钥检查。 SSH 客户端提供一个 UserKnownHostsFile 配置,允许指定不同的 known_hosts 文件。那么将 known_hosts 指向不同的文件,不就不会造成公钥冲突导致的中断了么?
$ ssh -o UserKnownHostsFile=/dev/null 192.168.0.110 The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established. RSA key fingerprint is e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05. Are you sure you want to continue connecting (yes/no)?
看,提示信息由公钥改变中断警告,变成了首次连接的提示。 和之前提到的 StrictHostKeyChecking 配置配合使用,则不再有任何警告出现了:
$ ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 192.168.0.110 Warning: Permanently added '192.168.0.110' (RSA) to the list of known hosts. jiangxin@192.168.0.110's password:
SSH简介:
传统的网络服务程序,SSH的英文全称是 Secure Shell,通过使用ssh,可以对所有的传输的数据进行加密,这样既可以防止攻击又可以防止IP欺骗。
SSH 提供2种级别的安全验证
1,基于口令的安全验证,这也是我们常用的一种,只要知道用户名和密码,就可以远程登陆到远程主机上。
2,基于密钥的安全认证,就是说用户必须为自己创建一对密钥,并把公用密钥放到需要访问的服务器上。
2种安全级别的验证,后者相对比前者更安全一些,第二种级别不需要在网络上传递口令。
SSH密钥认证登录配置
原理:用户首先需要为自己创建一对密钥:公钥(用在登录的服务器上)和私钥。OPENSSH 公开的密钥的密码体质有RSA,DSA等,这里就用RSA。
客户端ip:192.168.72.11
服务器ip:192.168.72.129
1.密钥认证的生成
[root@xyly ~]# ifconfig eth0 | awk ‘/inet addr/{print }’
inet addr:192.168.72.11 Bcast:192.168.72.255 Mask:255.255.255.0
[root@xyly ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #密钥报存的位置和名称
Enter passphrase (empty for no passphrase): #密钥为空
Enter same passphrase again: #再一次输入
Your identification has been saved in /root/.ssh/id_rsa. #私钥的位置
Your public key has been saved in /root/.ssh/id_rsa.pub. #公钥的位置
The key fingerprint is:
04:c5:7a:57:f6:2e:9c:1f:b5:e7:45:b3:11:f3:c7:18 root@xyly
公钥已经生成
现在把公钥上传到另一台服务器上去。
[root@xyly ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.72.129
15
The authenticity of host ‘192.168.72.129 (192.168.72.129)’ can’t be established.
RSA key fingerprint is 3b:26:19:2e:51:ca:cc:de:ac:bc:00:09:f0:7c:7d:f1.
Are you sure you want to continue connecting (yes/no)? yes #由于是第一次登录,服务器要进行确认
Warning: Permanently added ‘192.168.72.129’ (RSA) to the list of known hosts.
Address 192.168.72.129 maps to localhost, but this does not map back to the address – POSSIBLE BREAK-IN ATTEMPT!
root@192.168.72.129’s password:
Now try logging into the machine, with “ssh ‘root@192.168.72.129’“, and check in:
.ssh/authorized_keys #把公钥上传的位置和公钥的文件名
to make sure we haven’t added extra keys that you weren’t expecting.
登录到服务器上,查看公钥是否上传
[root@localhost ~]# ll .ssh/authorized_keys
-rw——- 1 root root 391 Aug 4 18:31 .ssh/authorized_keys
说明公钥上传成功了。
修改ssh配置文件,设置公钥认证登录
将下边2行的注释去掉,重启ssh服务
RSAAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
/etc/init.d/sshd restart
配置完毕,现在开始登录一下
[root@xyly ~]# ssh 192.168.72.129
Address 192.168.72.129 maps to localhost, but this does not map back to the address – POSSIBLE BREAK-IN ATTEMPT!
Last login: Thu Aug 4 18:08:05 2011 from 192.168.72.1
[root@localhost ~]#
现在不用输入密码,就可以登录了。退出登录
[root@localhost ~]# exit
logout
Connection to 192.168.72.129 closed.
linux ssh 密钥认证无需输入密码即可登录,在设置密钥的同时,也可以输入密码,即可密码+密钥认证就可以完成!
dotcloud的ssh连接就是用密钥登陆的。想当初在windows里弄这个dotcloud的ssh弄了很久。
可以使用 Tunnelier ,这个可以直接导入openssh的私钥