前言

由于一次大规模安全演示扫描到一些 Linux 系统存在很多 OpenSSH 相关漏洞, 按照扫描建议,很多都建议升级到高版本(yum/apt无法更新到最新),索性直接升级到 v8.9。

实验系统:CentOS 7.9

当前版本:OpenSSH 7.4p

准备

请到 OpenSSH官网 下载8.9的软件包

官网不算很清晰,我们的系统是 CentOS,在网页左侧找到 ‘For other systems’ 中的 ‘Releases’, 点击进入,页面中有 ‘Installation instructions’ 安装指导(也就是软件包内也的INSTALL), 页面再往下有 ‘Download’ 下载链接,可以自行选择下载方式,以国内阿里云镜像为例: openssh-8.9p1.tar.gz

由安装指导中,第一条 ‘Prerequisites’ 得知依赖的 OpenSSL 版本 1.0.x >= 1.0.1 or 1.1.0 >= 1.1.0g or any 1.1.1 皆可,我系统中版本是 1.0.2k,满足要求,不用升级 OpenSSL。

手动升级操作

1. 准备软件包

从 ‘准备’ 一节中可以下载到 openssh v8.9 的软件包,任意方式上传到服务器或在服务器 wget/curl 直接下载。

2. 安装依赖包

CentOS/RHEL系列执行命令:

yum install -y gcc openssl-devel zlib-devel pam-devel

Ubuntu/Debian系列执行命令:

apt update && apt install -y build-essential libssl-dev libz-dev libpam-dev

3. 解压

tar zxf openssh-8.9p1.tar.gz
cd openssh-8.9p1

4. 编译

./configure -h

参数很多,含义可以看help提示,我们直接覆盖安装(覆盖系统本身版本的命令),配置目录还是/etc/ssh,编译如下:

./configure --prefix=/usr/ --sysconfdir=/etc/ssh/ --with-pam --with-zlib --with-ssl-engine
make

5. 安装

上述编译通过后,可以执行install安装命令工具,这一步会覆盖原来的ssh相关命令,由于安装会生成新的key等等, 存在配置目录会失败,我们直接备份原/etc/ssh配置目录:

mv /etc/ssh /etc/ssh.old
make install

6. 配置

现在已经升级到新版本了,它的服务配置文件也需要修改,否则重启服务会卡死超时导致失败:

cp -f /etc/ssh.old/sshd_config /etc/ssh/
sed -i 's/Type=notify/Type=simple/' /lib/systemd/system/sshd.service || sed -i 's/Type=notify/Type=simple/' /lib/systemd/system/ssh.service
systemctl daemon-reload
systemctl restart sshd

7. 完成

升级完成,查看版本:

ssh -V

自动升级操作

本节shell函数封装了上述手动操作步骤,适用于 CentOS(Ubuntu系统请注释 yum install 那一行,并取消 apt install 那一行的注释)。

用法:

  1. 下载软件包(或手动上传):
wget -c https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-8.9p1.tar.gz
  1. 将下方整个函数块复制并粘贴到系统后,执行 _upgrade_ssh 即可完成更新(执行时确保与上面软件包位于同目录):
_upgrade_ssh() {
    set -e
    if [ "$(id -u)" != "0" ]; then
        echo "Please run as root"
        exit 128
    fi
    # 安装依赖包
    # CentOS/RHEL
    yum install -y gcc openssl-devel zlib-devel pam-devel
    # Ubuntu
    #apt update && apt install -y build-essential libssl-dev libz-dev libpam-dev

    # 解压、编译、安装
    tar zxf openssh-8.9p1.tar.gz
    cd openssh-8.9p1
    ./configure --prefix=/usr/ --sysconfdir=/etc/ssh/ --with-pam --with-zlib --with-ssl-engine
    make
    /bin/mv -f /etc/ssh /etc/ssh.old
    make install

    # 还原配置文件
    /bin/cp -f /etc/ssh.old/sshd_config /etc/ssh/
    # 修改、重载服务
    sed -i 's/Type=notify/Type=simple/' /lib/systemd/system/sshd.service || sed -i 's/Type=notify/Type=simple/' /lib/systemd/system/ssh.service || false
    systemctl daemon-reload
    systemctl restart sshd
    ssh -V
    echo "Upgrade OpenSSH: successfully"
    set +e
    return 0
}

引用

温馨提示

  1. 升级 OpenSSH 属于危险操作(对于远程管理),建议先在测试机测试后进行,同时建议保留多种登录方式,以及升级中多开一个窗口。

  2. 如果不想保留系统原生openssh软件包,可以卸载:

rpm -e --nodeps `rpm -qa | grep openssh`
  1. 升级时由于重建了 /etc/ssh,升级后客户端连接时可能出现指纹错误,重新接受新指纹即可。

·End·