前言
由于一次大规模安全演示扫描到一些 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
那一行的注释)。
用法:
- 下载软件包(或手动上传):
wget -c https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-8.9p1.tar.gz
- 将下方整个函数块复制并粘贴到系统后,执行
_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
}
引用
温馨提示
升级 OpenSSH 属于危险操作(对于远程管理),建议先在测试机测试后进行,同时建议保留多种登录方式,以及升级中多开一个窗口。
如果不想保留系统原生openssh软件包,可以卸载:
rpm -e --nodeps `rpm -qa | grep openssh`
- 升级时由于重建了 /etc/ssh,升级后客户端连接时可能出现指纹错误,重新接受新指纹即可。