一、前言

最近运营商审计和安全性要求,需要所有服务器的ssh升级到最新版本,截止当前官网最新版本为9.0p1。本文重点记录实际的操作过程。

二、准备工作

2.1 软件包下载

OpenSSH需要依赖ZLIB和LibreSSL(替换OpenSSL),因此需要从官网下载三者的源码包。
本文用的版本及官网链接

zlib-1.2.12.tar.gz
libressl-3.5.2.tar.gz
openssh-9.0p1.tar.gz

2.2 系统当前版本查看

#cat /etc/redhat-release
#rpm -q zlib
#openssl version -a
#ssh -V

如下:

redhat

cestos

2.3 安装telnet

因升级OpenSSH过程中需要卸载现有OpenSSH, 因此为了保持服务器的远程连接可用,需要启用telnet服务作为替代。
如升级出现问题,也可通过telnet登录服务器进行回退。
可以从CentOS-6.5-x86_64-bin-DVD1.iso里找的xinetd-2.3.14-39.el6_4.x86_64.rpm和telnet-server-0.17-47.el6_3.1.x86_64.rpm

查询是否安装了xinetd及telnet

#rpm -q telnet
#rpm -q xinetd

如未安装,执行如下安装命令

#rpm -ivh xinetd-2.3.14-39.el6_4.x86_64.rpm
#rpm -ivh telnet-server-0.17-47.el6_3.1.x86_64.rpm

2.4 启用telnet

编辑如下文件,将其中disable字段的yes改为no,就能开启telnet服务

#vi /etc/xinetd.d/telnet

允许root用户通过telnet登录

#mv /etc/securetty /etc/securetty.old

启动telnet服务

#service xinetd restart

使telnet服务开机启动,避免升级过程中服务器意外重启后无法远程登录系统

#chkconfig xinetd on

注意1: 可以使用MobaXterm的telnet等telnet工具,远程连接服务器检验是否已开启telnet服务

注意2:如果服务器开了防火墙需要做响应处理,否则连不上,如关闭防火墙或者开放telnet的23端口。

参考:关闭防火墙

#service iptables status
#service iptables stop
#chconfig iptables off

2.5、安装编译GCC

编译源码必须要安装GCC,可以使用CentOS-6.5-x86_64-bin-DVD1.iso的Packages文件夹下里的rpm包安装 本文的GCC版本gcc-4.4.7-4.el6.x86_64.rpm
相关依赖包,不同版本不太一样,可以百度gcc安装

CentOS6.5安装时选用了Basic Server是的依赖包

ppl-0.10.2-11.el6.x86_64.rpm
mpfr-2.4.1-6.el6.x86_64.rpm
kernel-headers-2.6.32-358.el6.x86_64.rpm
glibc-headers-2.12-1.107.el6.x86_64.rpm
glibc-devel-2.12-1.107.el6.x86_64.rpm
glibc-common-2.12-1.107.el6.x86_64.rpm
glibc-2.12-1.107.el6.x86_64.rpm
glib2-devel-2.22.5-7.el6.x86_64.rpm
cpp-4.4.7-3.el6.x86_64.rpm
cloog-ppl-0.15.7-1.2.el6.x86_64.rpm

查看是否安装了GCC

#rpm -q gcc

未安装的话,可以将所有rpm包放在同一个目录下,使用如下命令可批量安装

rpm -ivh --force --nodeps *.rpm

三、正式升级

3.1、升级ZLIB

注意:redhat和centos的5.x版本不持高于1.2.3的zlib版本

备份旧版libz.so

注意:这步软链接很重要,不然卸载旧版zlib后,就无法编译新版zlib

#ll /lib64/libz*
lrwxrwxrwx. 1 /lib64/libz.so.1 -> libz.so.1.2.3
-rwxr-xr-x. 1 /lib64/libz.so.1.2.3

#cp /lib64/libz.so.1.2.3 /lib64/libz.so.1.2.3.ori
#ln -snf /lib64/libz.so.1.2.3.ori /lib64/libz.so.1

卸载当前zlib

#rpm -q zlib
zlib-1.2.3-29.el6.x86_64
#rpm -e --nodeps zlib

参考:这里是未拆卸前zlib的相关so,以及软链接
lrwxrwxrwx. /usr/lib64/libcrypto.so.10 -> /usr/lib64/libcrypto.so.1.0.0
lrwxrwxrwx. /usr/lib64/libcrypt.so -> /lib64/libcrypt.so.1
lrwxrwxrwx. /usr/lib64/libssl.so.10 -> /usr/lib64/libssl.so.1.0.0
lrwxrwxrwx. /lib64/libz.so.1 -> /lib64/libz.so.1.2.3
-rwxr-xr-x. /lib64/libz.so.1.2.3

解压zlib_1.2.12源码并编译

#tar -zxvf zlib-1.2.12.tar.gz
#cd zlib-1.2.12
#./configure --prefix=/usr --libdir=/lib64
#make && make install

在centos主机下可能会报下面错误

1
2
3
4
5
6
7
8
9
10
In file included from /usr/include/bits/posix1_lim.h:160:0,
from /usr/include/limits.h:144,
from /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/limits.h:168,
from /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/syslimits.h:7,
from /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/limits.h:34,
from conftest.c:10:
/usr/include/bits/local_lim.h:38:26: fatal error: linux/limits.h: No such file or directory
#include <linux/limits.h>
^
compilation terminated.

需要执行下面命令解决:

yum install kernel-headers -y

作者使用的是CentOS Linux release 7.6.1810 (Core),可在CentOS-7-x86_64-DVD-1810.iso中周到下面安装包进行安装:kernel-headers-3.10.0-957.el7.x86_64.rpm

注册共享库

zlib安装完成后,会在/lib64目录中生产zlib相关库文件。

#ln -s /lib64/libz.so.1.2.12 /usr/lib/libz.so.1
#ln -s /lib64/libz.so.1.2.12 /usr/lib/libz.so
#ln -s /lib64/libz.so.1.2.12 /usr/lib64/libz.so.1
#ln -s /lib64/libz.so.1.2.12 /usr/lib64/libz.so
#ldconfig

3.2、升级OpenSSL,这里使用了LibReSSL替换

备份当前openssl

#find / -name openssl
/usr/lib64/openssl
/usr/include/openssl
/usr/bin/openssl

#mv /usr/lib64/openssl /usr/lib64/openssl.old
#mv /usr/bin/openssl /usr/bin/openssl.old
#mv /usr/include/openssl /usr/include/openssl.old

卸载当前openssl

#rpm -q openssl
openssl-1.0.1e-15.el6.x86_64
#rpm -e --nodeps openssl-1.0.1e-15.el6.x86_64

解压libressl-3.5.2源码并编译安装

#tar -zxvf libressl-3.5.2.tar.gz
#cd libressl-3.5.2
必须加上--shared,否则编译时会找不到新安装的openssl的库而报错
#./config --prefix=/usr --openssldir=/etc/ssl --libdir=lib64 --shared zlib
#make && make install

注册共享库、查看是否升级成功

#openssl version -a
-bash: /usr/local/bin/openssl: No such file or directory

如果提示目录不存在,主要是环境变量里面为包含目录,执行以下:

#export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

#openssl version -a
openssl: error while loading shared libraries: libssl.so.52: cannot open shared object file: No such file or directory

如果提示如上错误,执行以下操作,主要是建立软链接

#ll /usr/lib/libssl*
-rw-r--r--. /usr/lib/libssl.a
-rw-r--r--. /usr/lib/libssl.la
lrwxrwxrwx. /usr/lib/libssl.so -> libssl.so.52.0.0
lrwxrwxrwx. /usr/lib/libssl.so.52 -> libssl.so.52.0.0
-rw-r--r--. /usr/lib/libssl.so.52.0.0
#ln -s /usr/lib/libssl.so.52.0.0 /usr/lib64/libssl.so.52

继续检查是否升级成功

#openssl version -a
openssl: error while loading shared libraries: libcrypto.so.49: cannot open shared object file: No such file or directory

如果提示如上错误,执行以下操作,主要是建立软链接

#ll /usr/lib/libcrypto*
-rw-r--r--. 1 /usr/lib/libcrypto.a
-rw-r--r--. 1 /usr/lib/libcrypto.la
lrwxrwxrwx. 1 /usr/lib/libcrypto.so -> libcrypto.so.49.0.0
lrwxrwxrwx. 1 /usr/lib/libcrypto.so.49 -> libcrypto.so.49.0.0
-rw-r--r--. 1 /usr/lib/libcrypto.so.49.0.0
#ln -s /usr/lib/libcrypto.so.49.0.0 /usr/lib64/libcrypto.so.49

3.3、升级OpenSSH

检查依赖及备份当前openssh

OpenSSH源码安装编译时依赖pam-devel(应该是带了--with-pam参数的原因),没安装需要装一下

#rpm -q pam-devel
pam-devel-1.1.1-17.el6.x86_64
#mv /etc/ssh /etc/ssh.old

卸载当前openssh

#rpm -qa | grep openssh
openssh-askpass-5.3p1-94.el6.x86_64
openssh-clients-5.3p1-94.el6.x86_64
openssh-server-5.3p1-94.el6.x86_64
openssh-5.3p1-94.el6.x86_64
#rpm -e --nodeps openssh-askpass-5.3p1-94.el6.x86_64 openssh-clients-5.3p1-94.el6.x86_64 openssh-server-5.3p1-94.el6.x86_64 openssh-5.3p1-94.el6.x86_64

解压openssh-9.0p1源码并编译安装

#tar -zxvf openssh-9.0p1.tar.gz
#cd openssh-9.0p1
#./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-zlib --with-openssl-includes=/usr --with-privsep-path=/var/lib/sshd
#make && make install

推荐:在redhat系统上,推荐使用下面脚本:

./configure --prefix=/usr/local/bin --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-zlib --with-ssl-dir=/usr/local/openssl/ --with-ssl-engine --with-privsep-path=/var/lib/sshd

启用OpenSSH服务

#cp contrib/redhat/sshd.pam /etc/pam.d/sshd

pam有研究的可以启用下,本人不会配置,开了pam会导致ssh连不上

#echo "UsePAM no" >> /etc/ssh/sshd_config

允许root用户通过ssh登录

#echo "PermitRootLogin yes" >> /etc/ssh/sshd_config

开启SSH秘钥登录

#echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config

开启远程GUI支持

#echo "X11Forwarding yes" >> /etc/ssh/sshd_config

注册服务,并设置开机启动

#cp -p contrib/redhat/sshd.init /etc/init.d/sshd
#chown root.root /etc/init.d/sshd
#chmod +x /etc/init.d/sshd
#chkconfig --add sshd
#chkconfig sshd on
#chkconfig --list sshd
#service sshd restart

四、后期工作

新开启远程终端以ssh [ip]登录系统,确认一切正常升级成功后,只需关闭telnet服务以保证系统安全性即可

注意:保险起见,建议重启下服务器后,尝试用ssh登录

启用telnet服务的反向操作

#mv /etc/securetty.old /etc/securetty
#chkconfig xinetd off
#service xinetd stop

开启防火墙

#service iptables start
#chkconfig iptables on
#service iptables status

如需还原之前的ssh配置信息,可直接删除升级后的配置信息,恢复备份。

#rm -rf /etc/ssh# mv /etc/ssh.old /etc/ssh

小技巧:安装过程中需要用telnet上传文件时,可以考虑将文件使用base64转成文本,输入到telnet命令行界面中,并保存到文本文件中(如temp.txt),然后用如下命令还原

#base64 -d < temp.txt | tee > xxx.tar.gz

五、测试验证

登陆服务器。输入下面命令验证:

#ssh -V

redhat:

cestos: