升级OpenSSH可解决以下漏洞:

OpenSSH 用户枚举漏洞(CVE-2018-15919)
OpenSSH 安全漏洞(CVE-2017-15906)
OpenSSH 用户枚举漏洞(CVE-2018-15473)
OpenSSH 命令注入漏洞(CVE-2020-15778)【升级的时候不安装openssh-clients可以解决】

制作OpenSSH的RPM包

升级OpenSSH有两种方式,一种是用源码编译安装,另一种是手动制作RPM包,如果只升级一次的话用编译安装的方式倒也可以,作者这边是要升级报漏洞的多台服务器OpenSSH,做成RPM包来升级的话会更快一点
本文的操作环境是CentOS 7.6,需要升级的环境是服务器上的RHEL 7.6,因为服务器无法连接外网,因此选择在CentOS 上做好RPM包传到RHEL上,亲测可行
各位读者如果同样是CentOS/RHEL 7.6环境的话可以直接下载我做好的RPM包
在写本文时最新的版本是OpenSSH 8.5p1
OpenSSH 8.5
这里从下载源码包到制作RPM包都通过shell脚本来自动执行:

  1. touch rpmbuild_openssh.sh
  2. vim rpmbuild_openssh.sh,将下面的代码复制进去
  3. sh rpmbuild_openssh.sh 8.5
#!/usr/bin/env bash
# @File   :rpmbuild_openssh.sh 
# @Desc   :制作openssh rpm软件包,通过tar包build

openssh_version=$1
#判断是否传入正确的软件包
if [ "${openssh_version}" ] ;then
    echo -e "\033[41;37m当前build的openssh版本为: ${openssh_version}\033[0m"
else
    echo "常用版本有:8.0, 8.1, 8.2, 8.3, 8.4"
    echo
    echo -e "   请输入需要build的openssh版本号  示例: \033[36;1m$0 8.4\033[0m"
    exit 1
fi

# 安装依赖
function install_dependency() {
    yum install -y wget rpm-build zlib-devel openssl-devel gcc perl-devel pam-devel unzip libXt-devel imake gtk2-devel openssl-libs >> /dev/null && sleep 3
}

# 下载软件包
function download_package() {
    mkdir -p /root/rpmbuild/{SOURCES,SPECS}
    cd /root/rpmbuild/SOURCES
    echo -e "\033[34;1m开始下载软件包:openssh-${openssh_version}p1.tar.gz  \033[0m"
    wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${openssh_version}p1.tar.gz >> /dev/null && echo "openssh-${version}p1.tar.gz下载成功..."
    if [ $? -ne 0 ]; then
        echo "openssh-${openssh_version}p1.tar.gz下载失败...请检查网络环境或版本是否存在"
         exit 2
    else
        echo -e "\033[34;1m开始下载软件包:x11-ssh-askpass-1.2.4.1.tar.gz  \033[0m"
        wget https://src.fedoraproject.org/repo/pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz/8f2e41f3f7eaa8543a2440454637f3c3/x11-ssh-askpass-1.2.4.1.tar.gz >> /dev/null && echo "x11-ssh-askpass-1.2.4.1.tar.gz下载成功..." && sleep 3
        if [ $? -ne 0 ]; then
            echo "x11-ssh-askpass-1.2.4.1.tar.gz下载失败...请检查网络环境是否正常"
            exit 2
        else
            tar -xf openssh-${openssh_version}p1.tar.gz && tar -xf x11-ssh-askpass-1.2.4.1.tar.gz
        fi
    fi
}

# 修改配置文件和build
function config_and_build() {
    cp openssh-${openssh_version}p1/contrib/redhat/openssh.spec /root/rpmbuild/SPECS/
    sed -i -e "s/%define no_x11_askpass 0/%define no_x11_askpass 1/g" /root/rpmbuild/SPECS/openssh.spec
    sed -i -e "s/%define no_gnome_askpass 0/%define no_gnome_askpass 1/g" /root/rpmbuild/SPECS/openssh.spec
    sed -i 's/BuildRequires: openssl-devel < 1.1/#&/' /root/rpmbuild/SPECS/openssh.spec
    cd /root/rpmbuild/SPECS
    echo -e "\033[34;1m开始制作 openssh${openssh_version} 相关rpm软件包  \033[0m"
    rpmbuild -ba openssh.spec
    if [ $? -eq 0 ]; then
        echo -e "\033[34;1mopenssh${openssh_version} 相关rpm软件包制作成功,生成的软件包信息如下:  \033[0m"
        echo
        echo -e "\033[33;1m软件包存放路径:/root/rpmbuild/RPMS/x86_64/ \033[0m" && ls /root/rpmbuild/RPMS/x86_64/
    else
        echo -e "\033[33;1mopenssh${openssh_version} 相关rpm软件包制作失败,请根据报错信息进行解决,再重新进行编译 \033[0m"
    fi
}

function main() {
    install_dependency
    download_package
    config_and_build
}
main

准备升级

制作成功的话页面上会打印出以下内容,一共制作了6个包,一般只需要
openssh-8.5p1-1.el7.x86_64.rpm
openssh-server-8.5p1-1.el7.x86_64.rpm
openssh-clients-8.5p1-1.el7.x86_64.rpm
如果要解决OpenSSH 命令注入漏洞(CVE-2020-15778)的话就不需要openssh-clients

openssh8.5 相关rpm软件包制作成功,生成的软件包信息如下:  

软件包存放路径:/root/rpmbuild/RPMS/x86_64/ 
openssh-8.5p1-1.el7.x86_64.rpm		      openssh-clients-8.5p1-1.el7.x86_64.rpm
openssh-askpass-8.5p1-1.el7.x86_64.rpm	      openssh-debuginfo-8.5p1-1.el7.x86_64.rpm
openssh-askpass-gnome-8.5p1-1.el7.x86_64.rpm  openssh-server-8.5p1-1.el7.x86_64.rpm

备份配置文件

  1. mkdir ~/sshbak && cd ~
  2. cp /etc/pam.d/sshd sshbak/
  3. cp /etc/ssh/sshd_config sshbak
  4. 检查一下sshd_config里的PermitRootLogin yes,如果这一项被注释掉或者是no的话需要改成yes,否则无法登录

开始升级

1.停止sshd服务 service sshd stop
2.将做好的三个包放到同一个目录,我是直接放到了/root/

cd /root/rpmbuild/RPMS/x86_64
cp openssh-8.5p1-1.el7.x86_64.rpm ~/
cp openssh-server-8.5p1-1.el7.x86_64.rpm ~/
cp openssh-clients-8.5p1-1.el7.x86_64.rpm ~/

3.卸载旧版本的OpenSSH
rpm -erpm -qa | grep openssh--nodeps
4.rpm安装新版本

[root@localhost ~]# rpm -Uvh *.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:openssh-8.5p1-1.el7              ################################# [ 33%]
   2:openssh-clients-8.5p1-1.el7      ################################# [ 67%]
   3:openssh-server-8.5p1-1.el7       ################################# [100%]

5.还原配置文件

[root@localhost ~]# cp sshbak/sshd /etc/pam.d/sshd 
cp:是否覆盖"/etc/pam.d/sshd"? y
[root@localhost ~]# cp sshbak/sshd_config /etc/ssh/sshd_config
cp:是否覆盖"/etc/ssh/sshd_config"? y

6.授权并启动

# chmod这一步不执行的话可能无法启动sshd服务
[root@localhost ~]# chmod 600 /etc/ssh/* 
[root@localhost ~]# service sshd start
Starting sshd (via systemctl):                             [  确定  ]
[root@localhost ~]# ssh -V
OpenSSH_8.5p1, OpenSSL 1.0.2k-fips  26 Jan 2017

升级成功

现在已经升级到了OpenSSH 8.5,如果不需要使用scp的话可以卸载掉openssh-clients,因为OpenSSH 命令注入漏洞(CVE-2020-15778)是由openssh-clients引起的
rpm -e openssh-clients-8.5p1-1.el7.x86_64 --nodeps

Q.E.D.