背景

CentOS6.4版自带SSH版本为过低, 基于审计和安全性需求,需将其升级到最新的OpenSSH版本,截止2022年4月27日官网最新版本为9.0p1。

参考链接:http://devops.weiminginfo.com/os/linux/606.html

已知问题

  • 问题1:selinux开启情况下,重启服务器后,需要重启sshd服务才能正常使用ssh,可能是selinux开机时限制了openssh服务,暂时没研究
  • 问题2:安装openssh使用了with-pam,开启pam后无法连接,可能是pam的配置问题,暂时没研究
  • 问题3:原码编译安装的zlib、libressl、openssh无法用rpm -q查询到,不影响正常使用

1、准备工作

1.1、下载相关软件包

OpenSSH需要依赖ZLIB和LibreSSL(替换OpenSSL),因此需要从官网下载三者的源码包。
本文用的版本及官网链接
zlib-1.2.12.tar.gz http://www.zlib.net/
libressl-3.5.2.tar.gz https://www.libressl.org/
openssh-9.0p1.tar.gz http://www.openssh.org/

1.2、查看系统当前软件版本

# rpm -q zlib
# openssl version -a
# ssh -V

1.3、安装telnet服务并启用

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

CentOS-6.4-x86_64-bin-DVD1.iso下载地址:https://vault.centos.org/

# 查询是否安装了xinetd及telnet
# rpm -q xinetd telnet

# 如未安装,执行如下安装命令
# rpm -ivh xinetd-2.3.14-38.el6.x86_64.rpm
# rpm -ivh telnet-server-0.17-47.el6_3.1.x86_64.rpm

1.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

1.5、安装编译GCC

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

# CentOS6.4安装时选用了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

2、正式升级

2.1、升级ZLIB

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

A、备份旧版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

B、卸载当前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

C、解压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

D、注册共享库

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

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

A、备份当前openssl

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

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

B、卸载当前openssl

# rpm -q openssl
openssl-1.0.0-27.el6.x86_64
# rpm -e --nodeps openssl-1.0.0-27.el6.x86_64

C、解压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

D、注册共享库

# 查看是否升级成功
# 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

2.3、升级OpenSSH

A、检查依赖及备份当前openssh

# OpenSSH源码安装编译时依赖pam-devel(应该是带了--with-pam参数的原因),没安装需要装一下
# rpm -q pam-devel
# rpm -ivh pam-devel-1.1.1-13.el6.x86_64.rpm
# mv /etc/ssh /etc/ssh.old

B、卸载当前openssh

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

C、解压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

D、启用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

3、善后工作

新开启远程终端以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
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐