最近在使用 南大通用GBase8aMPP 数据库集群的附带的监控工具 GMonitor ,不得不说这个工具很好用。然而我在使用该工具操作集群相关监控时,发现会报 ssh 连接的错误,故而深入探究下。
究其原因,因为集群所在服务器的 ssh 服务即 openSSH 版本不断升级,导致一些就旧有连接或加密协议不再被默认支持。故而报错。以下为探究过程粗略记录。
Java 操作 ssh 原创连接 shell 执行命令探究
导言
SSH 是啥?
SSH(Secure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。在实际应用中,它 主要用于保证远程登录和远程通信的安全,任何网络服务都可以用这个协议来加密。
问题描述与解决
服务器的 ssh 服务比较新,而新版的 ssh 服务中,ssh 服务端配置文件 /etc/ssh/sshd_config
与之前旧版本差距较大。
OpenSSH 服务器在启动时读取配置文件。通常这个文件是/etc/ssh/sshd _ config,但是在启动 sshd 时可以使用-f 命令行选项更改位置。有些组织以不同的端口号运行多个 SSH 服务器,使用此选项为每个服务器指定不同的配置文件。
OpenSSH 中某些配置选项的默认值限制性很强,经常需要更改。通常,这是通过编辑默认配置文件来实现的,只需要修改一些选项。
MAC 码不匹配问题
可以看到 no matching MAC found. xxxx
,显然意思是客户端的支持的 mac 码与服务端配置的 mac 码不匹配,此时查看服务端的配置文件 cat /etc/ssh/sshd_config
有一行:它描述了服务端支持的 mac 码算法,这就解释了为什么把这行注释掉就可以成功访问的原因。 当然,不注释这一行,而是在后面继续添加客户端支持的那几种算法的一个或多个,这个问题也是可以解决的。
MACs hmac-sha2-256,hmac-sha2-512
kexalgorithm 密钥交换算法报错
其实由于版本差异,kexalgorithm 密钥交换算法这个选项也是极有可能出现问题的。这时候要与上文 mac 码不匹配解决方案是一样的。在新版本由于安全原因不建议使用的参数可以选择手动添加在配置文件里:
KexAlgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,diffie-hellman-group1-sha1
这是一张在 ssh 官网的文档截图:里面是最新版本加密策略四个选项(Ciphers、HostKeyAlgorithms、KexAlgorithms、MACs)的一些推荐与不推荐的配置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OgQOSENk-1651197947278)(mac 安装虚拟机.assets/image-20220310111728580.png)]
命令参考
# 查看当前 ssh 支持的 MACs 有哪些。可以选择将这些统统加到 sshd_config 配置文件最后的 MACs 里,使用逗号分隔
ssh -Q mac
# 查看当前 ssh 支持的。可操作方法同 MACs
ssh -Q cipher
# 查看 sshd_config 配置文件,一般只需要注意最后几行,也可使用 tail /etc/ssh/sshd_config
cat /etc/ssh/sshd_config
# 查看当前 ssh 服务器操作日志。借此一般都可以发现到底是哪个加密策略有问题,然后对应处理
tail -f /var/log/secure
其他解决方案
除了修改服务端的配置,也可以修改客户端的配置——即在客户端连接代码里添加全面的加密策略算法支持。例如在 ch.ethz.ssh2
的 jar 包,对于 mac 信息识别算法里面明确写了只支持 hmac-sha1-96", "hmac-sha1", "hmac-md5-96", "hmac-md5
四种,所以在新版本的 openssh 报错。**所以除了修改ssh服务端配置文件的方法外,我们也可以试图寻找一种对以上四种加密策略算法支持更好的 jar 包。**有以下几种:
-
现有的 ganymed-ssh2-262(ch.ethz.ssh2-262)
-
[Jsch](JSch - Java Secure Channel (jcraft.com)):支持较 ganymed-ssh2 好点,但还是不全
-
[sshj](hierynomus/sshj: ssh, scp and sftp for java (github.com)):支持是三者之中最全面的,包括旧的 sha1、新的 sha256 等等,附一张 github 截图:
ch.ethz.ssh2
暂略。
jsch
暂略。
sshj
SSHJ 是 hierynomus 在 Github 上开源的 Java SSH 库,项目位于 https://github.com/hierynomus/sshj,目前版本为 v0.32.0。
SSHJ 功能齐全,支持从 known_hosts 文件读取验证公钥,支持公钥、密码和交互式的验证方式,支持命令、子系统和 Shell Channel,支持本地和远程端口转发,支持 SCP 安全拷贝协议,支持从版本 0 到 3 的完全的 SFTP 安全文件传输协议,支持广泛的加密、签名、压缩等的算法实现。
Lisense:Apache License Version 2.0