我们的产品部署工具是基于java开发的(使用的是jsch库),之前有项目组反馈说程序连不上部分服务器,然后我们团队的其他人上去看了,网络和用户名密码都是正确的,程序未见报错(这个要点名批评下研发同学)。我提供了一个思路,就是在国产化系统中,他们经常对加密算法的要求控制更严格,我让他们看了Hostkey是否存在不兼容的情况,但是修改指定以后还是不好。
排查过程
然后我就自己上手了,首先我验证了网络的联通性和稳定性,都很不错,然后我在客户端服务器使用ssh -vvv打印详细日志去连接目标服务器,可以看到正常的加密协商和密钥交换过程,并且这个过程还比较快,输入密码以后能够正常连接。
接着我在tomcat的日志里面翻找希望找到一点蛛丝马迹,但是很遗憾啥都没有。难道真的需要使用tcpdump来搞了吗?内网受控环境,完全不想上工具。本着死马当活马医的原则,我在发起连接的过程中,打开了服务端的日志。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: rexec line 144: Deprecated option RSAAuthentication
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: rexec line 146: Deprecated option RhostsRSAAuthentication
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: @ WARNING: UNPROTECTED PRIVATE KEY FILE! @
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: Permissions 0777 for '/etc/ssh/ssh_host_rsa_key' are too open.
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: It is required that your private key files are NOT accessible by others.
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: This private key will be ignored.
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: Unable to load host key "/etc/ssh/ssh_host_rsa_key": bad permissions
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: Unable to load host key: /etc/ssh/ssh_host_rsa_key
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: @ WARNING: UNPROTECTED PRIVATE KEY FILE! @
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: Permissions 0777 for '/etc/ssh/ssh_host_ecdsa_key' are too open.
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: It is required that your private key files are NOT accessible by others.
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: This private key will be ignored.
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: Unable to load host key "/etc/ssh/ssh_host_ecdsa_key": bad permissions
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: error: Unable to load host key: /etc/ssh/ssh_host_ecdsa_key
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: Connection from 10.97.229.50 port 37460 on 172.28.229.55 port 22 rdomain ""
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: sshd_selinux_change_privsep_preauth_context: SELinux context file needs to be owned by root and not writable by anyone else [preauth]
Mar 08 14:31:10 smart-0006.novalocal sshd[4158446]: Unable to negotiate with 10.97.229.50 port 37460: no matching host key type found. Their offer: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521 [preauth]
|
真是踏破铁屑无觅处啊!
根据服务器日志输出,这个错误的主要原因是 SSH 主机密钥文件的权限设置不正确。日志中明确提示了以下错误信息:
1
2
3
4
|
error: Permissions 0777 for '/etc/ssh/ssh_host_rsa_key' are too open.
error: It is required that your private key files are NOT accessible by others.
error: Unable to load host key "/etc/ssh/ssh_host_rsa_key": bad permissions
error: Unable to load host key "/etc/ssh/ssh_host_ecdsa_key": bad permissions
|
这些错误表示 SSH 私钥文件 /etc/ssh/ssh_host_rsa_key
和 /etc/ssh/ssh_host_ecdsa_key
的权限设置为 0777,即所有用户都有读写执行权限,SSH 服务器拒绝加载这些过于开放权限的私钥文件,从而导致连接失败。
解决方案是更改这些文件的权限,使其只有 root 用户拥有读写权限。使用以下命令:
1
2
|
chmod 600 /etc/ssh/ssh_host_rsa_key
chmod 600 /etc/ssh/ssh_host_ecdsa_key
|
那有小可爱就会问了:”为啥子客户端服务器使用ssh命令可以连上呢?“,我只能说你是个喜欢思考的宝宝,那是因为OpenSSH支持的加密算法比jsch更全呀,我看了 /etc/ssh/
里面有一个私钥的权限是600,也就是说当协商到那个时就能连上,人家支持得全,所以能协商到“漏网之鱼”。
总的来说,我觉得这个问题搞这么复杂,首先是程序打的日志太简单了,为啥没把jsch的异常抛出来?其次是项目组在服务器乱搞,权限控制不正确。