CentOS7.X从OpenSSH7.4p1升级到OpenSSH8.4p1

升级前准备工作


确认操作系统版本和OpenSSH版本

确认操作系统版本为CentOS7.X,OpenSSH版本为7.4p1

1
2
cat /etc/redhat-release
ssh -V

说明
如果OpenSSH不是7.4p1可通过执行yum install openssh -y命令升级到7.4p1

配置telnet服务

说明
为了防止升级失败导致服务器无法登录,建议在升级前安装并配置telnet服务。

执行以下命令安装xinetdtelnet-server

1
yum install xinetd telnet-server -y

新建/etc/xinetd.d/telnet文件,添加以下内容

1
2
3
4
5
6
7
8
9
10
service telnet
{
disable = yes
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}

编辑/etc/securetty文件,在文件末尾增加pts终端,如下:

1
2
3
4
pts/0
pts/1
pts/2
pts/3

启动xinetdtelnet服务并设置开机自启

1
2
3
4
5
6
systemctl enable xinetd
systemctl enable telnet.socket
systemctl restart xinetd
systemctl restart telnet.socket
systemctl status xinetd
systemctl status telnet.socket

查看telnet端口是否正常监听

1
netstat -ntple |grep 23

说明
配置完成后请在本地通过telnet客户端或者SecureCRT、XShell等工具测试是否可以正常连接

下载安装包

到官网下载zlibOpenSSLOpenSSH的安装包并上传到/root目录下

说明
本文下载的zlib版本为1.2.13OpenSSL版本为1.1.1sOpenSSH版本为8.4p1

正式升级


安装编译所需的依赖包

执行以下命令安装gcc等软件

1
yum install gcc gcc-c++ kernel-devel -y

安装zlib

解压zlib安装包到/usr/local/src/

1
tar zxf zlib-1.2.13.tar.gz -C /usr/local/src/

编译并安装zlib

1
2
3
4
cd /usr/local/src/zlib-1.2.13/
./configure --prefix=/usr/local/zlib-1.2.13
make -j 4
make install

安装OpenSSL

解压OpenSSL安装包到/usr/local/src/

1
tar zxf openssl-1.1.1s.tar.gz -C /usr/local/src/

安装perl

1
yum install perl -y

说明
执行./config时需要Perl5版本,否则会提示You need Perl 5.

编译并安装OpenSSL

1
2
3
4
cd /usr/local/src/openssl-1.1.1s/
./config --prefix=/usr/local/ssl-1.1.1s -d shared
make -j 4
make install

OpenSSL动态库路径添加到/etc/ld.so.conf

1
2
echo '/usr/local/ssl-1.1.1s/lib/' >> /etc/ld.so.conf
ldconfig -v

安装OpenSSH

解压OpenSSH安装包到/usr/local/src/

1
tar zxf openssh-8.4p1.tar.gz -C /usr/local/src/

编译并安装OpenSSH

1
2
3
4
5
mv /etc/ssh /etc/ssh-7.4p1.bak
cd /usr/local/src/openssh-8.4p1/
./configure --prefix=/usr/local/openssh-8.4p1 --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/ssl-1.1.1s --with-zlib=/usr/local/zlib-1.2.13
make -j 4
make install

修改/etc/ssh/sshd_config配置文件

1
2
3
4
5
6
echo "X11Forwarding yes" >> /etc/ssh/sshd_config
echo "UseDNS no" >> /etc/ssh/sshd_config
echo "GSSAPIAuthentication no" >> /etc/ssh/sshd_config
echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
echo 'PubkeyAuthentication yes' >> /etc/ssh/sshd_config
echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config

备份/usr/sbin/usr/sbin下SSH原有二进制文件

1
2
3
4
5
6
7
8
9
mkdir -p /usr/sbin/openssh-7.4p1
mv /usr/sbin/sshd /usr/sbin/openssh-7.4p1/

mkdir -p /usr/bin/openssh-7.4p1
mv /usr/bin/ssh /usr/bin/openssh-7.4p1/
mv /usr/bin/ssh-add /usr/bin/openssh-7.4p1/
mv /usr/bin/ssh-agent /usr/bin/openssh-7.4p1/
mv /usr/bin/ssh-keygen /usr/bin/openssh-7.4p1/
mv /usr/bin/ssh-keyscan /usr/bin/openssh-7.4p1/

将新版本OpenSSH文件拷贝到指定目录

1
2
3
4
5
6
7
cp -a /usr/local/openssh-8.4p1/sbin/sshd /usr/sbin/sshd

cp -a /usr/local/openssh-8.4p1/bin/ssh /usr/bin/ssh
cp -a /usr/local/openssh-8.4p1/bin/ssh-add /usr/bin/ssh-add
cp -a /usr/local/openssh-8.4p1/bin/ssh-agent /usr/bin/ssh-agent
cp -a /usr/local/openssh-8.4p1/bin/ssh-keygen /usr/bin/ssh-keygen
cp -a /usr/local/openssh-8.4p1/bin/ssh-keyscan /usr/bin/ssh-keyscan

查看OpenSSH版本

1
ssh -V

启动新版本SSHD服务

1
2
3
4
5
6
systemctl stop sshd
mv /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service.bak
systemctl daemon-reload

cp -a /usr/local/src/openssh-8.4p1/contrib/redhat/sshd.init /etc/init.d/sshd
/etc/init.d/sshd restart

版本回退


说明
如果升级后无法正常使用,可参照以下步骤进行版本回退

关闭SSHD服务,恢复服务启动文件

1
2
3
4
5
systemctl stop sshd
rm -rf /etc/init.d/sshd

mv /usr/lib/systemd/system/sshd.service.bak /usr/lib/systemd/system/sshd.service
systemctl daemon-reload

恢复OpenSSH原有二进制文件

1
2
3
4
5
6
7
8
9
10
rm -rf /usr/sbin/sshd

rm -rf /usr/bin/ssh
rm -rf /usr/bin/ssh-add
rm -rf /usr/bin/ssh-agent
rm -rf /usr/bin/ssh-keygen
rm -rf /usr/bin/ssh-keyscan

mv /usr/sbin/openssh-7.4p1/* /usr/sbin/
mv /usr/bin/openssh-7.4p1/* /usr/bin/

恢复OpenSSH配置目录

1
2
mv /etc/ssh /etc/ssh-8.4p1.bak
mv /etc/ssh-7.4p1.bak /etc/ssh

查看OpenSSH版本

1
ssh -V

重新启动旧版本SSD服务

1
systemctl restart sshd

关闭xinetd和telnet

升级完成后请及时关闭xinetdtelnet服务

1
2
3
4
systemctl disable xinetd
systemctl disable telnet.socket
systemctl stop xinetd
systemctl stop telnet.socket

参考文档