@
说明
- 原文档出处:linkopenssh离线升级到最新版本【openssh8.0和8.6展示】方法-详细说明
本文档是我参考原文以及我这边的环境,部分步骤参考原文,在此说明。
环境说明
- 虚拟化环境是华为的FC6.3.1,虚拟机(Centos7.2)可以上外网但不能上国外网站,生产环境也是如此。
- 因为系统是最新小化安装,升级过程我在防火墙设备做了策略放通国外网站以便于安装一些依赖包。
目的及验证
- 顺利升级openssh和openssl 过程不想重启系统,毕竟是生产环境 。
- 升级完,openssl version 和 ssh -V及sshd -V 列出的信息一致 systemctl status sshd 查看sshd运行状态正常running
- 原有的生产环境虚拟机SSH配置文件并没有大的更改,所以这次没有备份。
-
当前服务器使用的版本是7.2,openssh的版本为7.4p1,openssl的版本为1.0.2k
注:如果openssh版本低于7.4,可以使用镜像升级到yum仓库默认的openssh7.4p1版本【方法为挂载镜像以后,执行:yum update openssh -y即可】
[root@test ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@test ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
[root@test ~]# sshd -V
unknown option -- V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
[-E log_file] [-f config_file] [-g login_grace_time]
[-h host_key_file] [-o option] [-p port] [-u len]
[root@test ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
- 整个过程不需要卸载原先的openssl包和openssh的rpm包。
- 本文的环境都是系统自带的openssh,没有经历过手动编译安装方式,如果之前有手动编译安装过openssh【需要修改路径位置】,请参照本文自行测试是否能成功。
配置本地源
- 原文出处建议配置本地源,我这里没有配置本地源都是提前更换了华为源,外网源。
- 原文配置本地源出处:
- linkopenssh离线升级到最新版本【openssh8.0和8.6展示】方法-详细说明
- linkyum源本地配置和网络源配置——超级完整详细
配置telnet【可以不做】
- 这个可以不用配置的,生产服务器上也不建议配置开启telnet,这只是简单说明telnet的配置开启方法。
- 配置telnet的意义就是防止升级ssh过程中远程工具连接中断,我整个升级环节没有断过,而且FC虚拟化平台支持快照和VNC登录,所以没有配置telnet
- 原文出处步骤:linkopenssh离线升级到最新版本【openssh8.0和8.6展示】方法-详细说明
安装依赖包
- 注:依赖包只需要镜像中的本地源就足矣了;
- 升级需要几个组件,有些是和编译相关的等
[root@test ~]# yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel pam-devel
更新完毕:
glibc.x86_64 0:2.17-324.el7_9 make.x86_64 1:3.82-24.el7 openssl.x86_64 1:1.0.2k-21.el7_9
作为依赖被升级:
e2fsprogs.x86_64 0:1.42.9-19.el7 e2fsprogs-libs.x86_64 0:1.42.9-19.el7 glibc-common.x86_64 0:2.17-324.el7_9
krb5-libs.x86_64 0:1.15.1-50.el7 libcom_err.x86_64 0:1.42.9-19.el7 libgcc.x86_64 0:4.8.5-44.el7
libgomp.x86_64 0:4.8.5-44.el7 libss.x86_64 0:1.42.9-19.el7 libstdc++.x86_64 0:4.8.5-44.el7
openssl-libs.x86_64 1:1.0.2k-21.el7_9 pam.x86_64 0:1.1.8-23.el7 pcre.x86_64 0:8.32-17.el7
zlib.x86_64 0:1.2.7-19.el7_9
[root@test ~]# yum install -y pam* zlib*
已安装:
pam_krb5.x86_64 0:2.4.8-6.el7 pam_pkcs11.x86_64 0:0.6.2-30.el7 pam_snapper.x86_64 0:0.2.8-4.el7
pam_ssh_agent_auth.x86_64 0:0.10.3-2.21.el7 zlib-static.x86_64 0:1.2.7-19.el7_9
作为依赖被安装:
boost-serialization.x86_64 0:1.53.0-28.el7 boost-system.x86_64 0:1.53.0-28.el7
boost-thread.x86_64 0:1.53.0-28.el7 pcsc-lite-libs.x86_64 0:1.8.8-8.el7
snapper.x86_64 0:0.2.8-4.el7 snapper-libs.x86_64 0:0.2.8-4.el7
完毕!
准备openssh包和openssl的包
- 自行去下载openssh和openssl的tar包
- 如果不想去找的,可以直接下载,链接如下:
https://ftp.openssl.org/source/
https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/ - 原文描述:
- 注意:上面的4个包中,openssl如果你当前是1.0的,就只能用openssl-1.0.2s.tar编译。
- 【openssl-1.1.1j.tar编译出来会各种出错【因为没有1.1的依赖库】openssh2个版本都可以正常使用。 如果当前是1.0的,建议不要安装1.1,否则降回去有可能会失败。
- 这儿需要对这个包做些简单的说明,网上很多帖子说openssh和openssl的包有兼容性这个意思,但我找了很多资料,均没有看到一个正式介绍openssh和openssl使用版本对应。
所以我做了几个版本测试,发现openssl只要是和自己当前版本一致就不会有问题【当前是1.0的,就安装为1.0的最新版本就不会有问题】,而openssh,安装任何版本都行】
我本人是下载的:openssl-1.0.2u.tar 和 openssh-8.6p1.tar最新的包
将openssl和openssh包上传到服务器
- 我是直接用filezilla将两个包上传到root目录下
[root@test ~]# ll
总用量 6984
-rw-------. 1 root root 1253 10月 22 2020 anaconda-ks.cfg
-rw-r--r--. 1 root root 1786328 6月 25 18:13 openssh-8.6p1.tar.gz
-rw-r--r--. 1 root root 5355412 6月 25 18:13 openssl-1.0.2u.tar.gz
开始安装openssl
升级前版本查看
[root@test ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
文件备份
[root@test ~]# ll /usr/bin/openssl
-rwxr-xr-x. 1 root root 555288 12月 17 2020 /usr/bin/openssl
[root@test ~]# mv /usr/bin/openssl /usr/bin/openssl_bak
[root@test ~]# ll /usr/include/openssl
总用量 1864
-rw-r--r--. 1 root root 6146 12月 17 2020 aes.h
...
[root@test ~]# mv /usr/include/openssl /usr/include/openssl_bak
解压tar包
[root@test ~]# ls
anaconda-ks.cfg openssh-8.6p1.tar.gz openssl-1.0.2u.tar.gz
[root@test ~]# tar xfz openssl-1.0.2u.tar.gz
[root@test ~]# ll
总用量 6988
-rw-------. 1 root root 1253 10月 22 2020 anaconda-ks.cfg
-rw-r--r--. 1 root root 1786328 6月 25 18:13 openssh-8.6p1.tar.gz
drwxr-xr-x. 20 root root 4096 6月 25 18:42 openssl-1.0.2u
-rw-r--r--. 1 root root 5355412 6月 25 18:13 openssl-1.0.2u.tar.gz
编译安装新版本的openssl
- 配置、编译、安装3个命令一起执行 ,&&符号表示前面的执行成功才会执行后面的
[root@test ~]# cd openssl-1.0.2u/
[root@test openssl-1.0.2u]# ./config shared && make && make install
...等待编译...
- 以上命令执行完毕,echo $?【会shell的应该知道这个,这个是查看返回值的,0为执行成功】查看下最后的make install是否有报错,0表示没有问题,除了0以外的任何数字都是错误的。
- 【上面某个步骤出错了,需要重新弄,一直到显示结果为0才能进行下一步】
成功界面如下:
[root@test openssl-1.0.2u]# echo $?
0
目录做软链接
下面2个文件或者目录做软链接 【刚才前面的步骤mv备份过原来的】
[root@test openssl-1.0.2u]# ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
[root@test openssl-1.0.2u]# ln -s /usr/local/ssl/include/openssl /usr/include/openssl
[root@test openssl-1.0.2u]# ll /usr/bin/openssl
lrwxrwxrwx. 1 root root 26 6月 25 18:54 /usr/bin/openssl -> /usr/local/ssl/bin/openssl
[root@test openssl-1.0.2u]# ll /usr/include/openssl
lrwxrwxrwx. 1 root root 30 6月 25 18:54 /usr/include/openssl -> /usr/local/ssl/include/openssl
加载新配置
如果多次重复上面步骤【下面echo内容不要重复做,只做一次即可】
/sbin/ldconfig每次执行都无所谓的。
[root@test openssl-1.0.2u]# echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
[root@test openssl-1.0.2u]# /sbin/ldconfig
查看确认版本
-
不能有报错,报错就完犊子【报错了看下面的解决方案】
未报错,成功。
[root@test openssl-1.0.2u]# openssl version
*升级前为OpenSSL 1.0.2k-fips 26 Jan 2017*
OpenSSL 1.0.2u 20 Dec 2019
报错实例和解决方案,原文如下:
- 如果执行openssl version查看版本报错了,大概率是当前openssl包和当前系统不兼容导致的,解决方法,换一个openssl的版本即可
- 报错查看
[root@centos76_1 openssl-1.1.1j]# openssl version
-bash: /usr/bin/openssl: 没有那个文件或目录实际上这个文件肯定是存在的
这就是不兼容导致的,直接重装其他版本
[root@centos76_1 openssl-1.1.1j]# ll /usr/bin/openssl
lrwxrwxrwx. 1 root root 26 5月 19 17:34 /usr/bin/openssl -> /usr/local/ssl/bin/openssl
[root@centos76_1 openssl-1.1.1j]#
- 重装步骤,重复上面方法,不同的是,上面文件备份换成删除即可
[root@centos76_1 software]# rm -rf /usr/bin/openssl
[root@centos76_1 software]# rm -rf /usr/include/openssl
开始安装openssh
- 我升级的是8.6
升级前版本查看
主要就是用来对比后面是否升级成功
[root@test ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
[root@test ~]# sshd -V
unknown option -- V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
[-E log_file] [-f config_file] [-g login_grace_time]
[-h host_key_file] [-o option] [-p port] [-u len]
文件备份删除
- 如果ssh里面配置的东西比较多,可以备份,升级完成以后把这个文件拷贝回来【如果没有配置过什么东西,直接跳过备份这部,根据下面操作给删掉】
- 注:下面编译安装操作成功以后,把这个备份的文件恢复【建议不要恢复,直接参照之前的配置重新配置一遍,极端情况下会因为版本不一致,直接用原来配置会导致ssh出现不可预期的问题】
[root@controll software]# mkdir /etc/ssh.bak
[root@controll software]# cp -r /etc/ssh /etc/ssh.bak/
- 因为我的服务器是没有对ssh做过什么配置修改的,所以我不用考虑配置问题就直接删掉了
[root@controll software]# rm -rf /etc/ssh/*
解压tar包
[root@test ~]# ls
anaconda-ks.cfg openssh-8.6p1.tar.gz openssl-1.0.2u openssl-1.0.2u.tar.gz
[root@test ~]# tar xfz openssh-8.6p1.tar.gz
[root@test ~]# ls
anaconda-ks.cfg openssh-8.6p1 openssh-8.6p1.tar.gz openssl-1.0.2u openssl-1.0.2u.tar.gz
[root@test ~]#
编译安装新版本的openssh
- 配置、编译、安装一起执行
命令有点长,注意复制完,最好先复制到文本文档上,否则可能会带上其他后缀内容
[root@test ~]# cd openssh-8.6p1/
[root@test openssh-8.6p1]# ./configure --prefix=/usr/ --sysconfdir=/etc/ssh --with-openssl-includes=/usr/local/ssl/include --with-ssl-dir=/usr/local/ssl --with-zlib --with-md5-passwords --with-pam && make && make install
- 以上命令执行完毕,echo $?【会shell的应该知道这个,这个是查看返回值的,0为执行成功】查看下最后的make install是否有报错,0表示没有问题,除了0以外的任何数字都是错误的。
- 【上面某个步骤出错了,需要重新弄,一直到显示结果为0才能进行下一步】
成功界面如下
[root@test openssh-8.6p1]# echo $?
0
[root@test openssh-8.6p1]#
配置root可登录
- 上面文件备份步骤说过如果/etc/ssh里面配置太多的话,备份以后就在这恢复就行【重复一次,不建议恢复,直接参照备份的文件,重新配置一次】
- 这儿只对新文件中的一个地方做修改,就是设置允许root登录【升级完毕以后默认是不允许root登录的】
在文件/etc/ssh/sshd_config中将 PermitRootLogin 改为yes 即可。
[root@controll openssh-8.6p1]# cat /etc/ssh/sshd_config | egrep -nC 1 PermitRootLogin
31-#LoginGraceTime 2m
32:#PermitRootLogin prohibit-password
33:PermitRootLogin yes
34-#StrictModes yes
新文件拷贝
- 从原先的解压的包中拷贝一些文件到目标位置【如果目标目录存在就覆盖】
- 可能下面的ssh.pam文件没用到,因为sshd_config配置文件貌似没使用它,请自行测试。
[root@test openssh-8.6p1]# cp -a contrib/redhat/sshd.init /etc/init.d/sshd
[root@test openssh-8.6p1]# cp -a contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
[root@test openssh-8.6p1]# chmod +x /etc/init.d/sshd
[root@test openssh-8.6p1]#
新增sshd服务并设置开机自启动
- 让chkconfig管理sshd服务并把sshd加入开机自启动
# --add 增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。
[root@test openssh-8.6p1]# chkconfig --add sshd
[root@test openssh-8.6p1]# systemctl enable sshd
[root@test openssh-8.6p1]#
- 把原先的systemd管理的sshd文件删除或者移走或者删除,不移走的话影响我们重启sshd服务
可以移动到任何地方,但建议记住移动的目的位置,便于后续如果需要的话能找到源文件。
[root@test openssh-8.6p1]# mkdir /data
[root@test openssh-8.6p1]# mv /usr/lib/systemd/system/sshd.service /data/
[root@test openssh-8.6p1]#
- 因为改为chkconfig管理了,所以需要设置sshd服务开机启动
[root@test openssh-8.6p1]# chkconfig sshd on
注意:正在将请求转发到“systemctl enable sshd.socket”。
Created symlink from /etc/systemd/system/sockets.target.wants/sshd.socket to /usr/lib/systemd/system/sshd.socket.
[root@test openssh-8.6p1]#
- 最后重启sshd服务并查看端口是否正常监听
[root@test openssh-8.6p1]# systemctl restart sshd
[root@test openssh-8.6p1]# systemctl is-active sshd
active
[root@test openssh-8.6p1]# netstat -ntlp | grep 22
-bash: netstat: 未找到命令 #yum -y install net-tools yum安装下
[root@test openssh-8.6p1]# netstat -ntlp | grep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 53605/sshd: /usr/sb
tcp6 0 0 :::22 :::* LISTEN 53605/sshd: /usr/sb
[root@test openssh-8.6p1]#
到此 openssh就升级完成了
查看确认版本
- 上面编译没出错,每一个步骤都做完了,肯定不会有问题的。
- 注:ssh -V 【查看SSH版本】和 sshd -v 【查看启动文件版本】,2个都需要执行,并且2个都需要保持一致才算真正的升级成功【如果不一致,解决方法往下看】。
sshd -v和ssh -V版本不一致解决办法
- 只要按着上班操作步骤做完,不会出现这种问题,只是把这种情况的处理方法放这。
- -sshd -v和ssh -V不一个版本,需要拷贝下列sshd (ssh -V是正确的)
cp /usr/local/openssh/sbin/sshd
/usr/local/sbin/sshd
【 如果拷贝不成功先删除/usr/local/sbin/的sshd文件。
命令如下 rm -rf /usr/local/sbin/sshd】
升级到8.6必须操作【否则工具无法连接】
-
如果升级的是openssh8.0,忽略这步
-
升级到8.6以后,如果不做下面操作,会导致crt工具无法连接【但可以从服务器ssh过去】,报错信息如下:
密钥交换失败。
没有兼容的加密程序。服务器支持这些加密程序:
chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com -
原因
SSH和SSL升级后,取消了原先一些不太安全的加密算法,Clinet不支持新的算法所以无法交换密钥; -
解决方法:
-
1、要求客户升级SecureCRT版本至6.5或7.x,或更换最新版的Xshell、Putty等工具,即可正常登录【建议如果这种方法能解决就不要用下面方法】
2、修改ssh配置,添加对原加密算法的支持:登录到无法登录的服务器【可以从正常的服务器ssh过去】修改/etc/ssh/sshd_config文件,在文件的末尾添加如下内容,然后重启ssh服务
[root@controll openssh-8.6p1]# tail -n 2 /etc/ssh/sshd_config
下面这行信息很长,注意复制完
KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org
[root@controll openssh-8.6p1]#
[root@controll openssh-8.6p1]#systemctl restart sshd
- 我的实测中:我的CRT和Xshell的版本都是比较高的,结果重开一个SSH远程,登录不上
加了上述代码对原加密算法的支持也不行 - 翻了好多其他文档,以及查看日志/var/log/messages,看到error: Could not get shadow information for root等等
-结果都是要改参数vim /etc/ssh/sshd_config ,将#UsePAM no 改为 UsePAM yes设置通过PAM验证。
参数更改之后:
SSH登录正常,
升级完登录测试【重要】
说明
openssh升级完毕以后,下面3项必须测试,而且每一项都必须正常才算升级成功,如果有任何一项测试失败,都不行!
工具测试
- 如果升级了较新版本的openssh,SecureCRT版本至6.5或7.x,或更换最新版的Xshell、Putty等工具。
- 升级完毕以后,如果是工具连接的,断开连接,重新连接看是否正常【我是更改该了UsePAM的参数】
别的服务器ssh该台服务器【很重要】
-
找一个以前能正常ssh到升级服务器的机器
发现,报错了【上面升级openssh的主机名为test,现在是用ZHZG的服务器连接升级服务器测试】
k,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3doMTAwNzEyNjQ2OA==,size_16,color_FFFFFF,t_70) -
原因:是因为ssh升级过后,服务器的公钥信息改变了,所以导致无法连接的。
-
用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,如果我们重新安装系统,其公钥信息还在,连接会出现如上图所示
-
解决方法:
rm -rf ~/.ssh/known_hosts 优点:干净利索 / 缺点:把其他正确的公钥信息也删除,下次链接要全部重新经过认证
vi ~/.ssh/known_hosts 删除对应ip的相关rsa信息 优点:其他正确的公钥信息保留 / 缺点:还要vi,还要找到对应信息,稍微优点繁琐
ssh-keygen -R 172.16.5.251 清除旧的公钥信息优点:快、稳、狠 / 缺点:没有缺点
我用的是ssh-keygen -R 跟IP地址
ssh别的服务器测试
不用修改信息
telnet关闭 【未配置telnet忽略】
如果之前开启,记得关闭,尤其生产环境
原文出处步骤:linkopenssh离线升级到最新版本【openssh8.0和8.6展示】方法-详细说明