一、前言
最近运营商审计和安全性要求,需要所有服务器的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 | In file included from /usr/include/bits/posix1_lim.h:160:0, |
需要执行下面命令解决:
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:







