打包CentOS7 新版OpenSSH rpm

CentOS Linux 7 的生命周期（EOL）将于 2024 年 6 月 30 日终止，目前仍然有大量服务器使用 CentOS7.

官方的 YUM 源中 OpenSSH 停止在 7.4 版本，每年低版本 OpenSSH 都会爆出新漏洞，需要升级最新版 OpenSSH 往往需要下载源码编译安装，但是很多内网服务器缺少编译环境，Github 上 boypt 大佬提供了最新版 OpenSSH 源码构建 rpm 包的脚本，并嵌入了新版 OpenSSL, 使升级最新版 OpenSSH 变得简单了.

生成 rpm 包

准备打包环境

最好在 CentOS7 的环境中打包，可以使用 CentOS7 的虚拟机，也可以部署 CentOS7 的 WSL, 进入 CentOS7, 执行下面的命令安装开发工具和依赖，本次打包环境为 CentOS7.9

Copy
yum groupinstall -y "Development Tools"
yum install -y imake rpm-build pam-devel krb5-devel zlib-devel libXt-devel libX11-devel gtk2-devel perl perl-IPC-Cmd

下载打包脚本

可以使用 git clone 拉取脚本，也可以从 github 下载 zip 解压，这里使用 git

Copy
git clone https://github.com/boypt/openssh-rpms.git

执行 pullsrc.sh 下载源码

执行脚本目录下 pullsrc.sh 会自动下载 OpenSSH 和 OpenSSL 以及 x11-ssh-askpass 的最新版源码文件

下载完成后会保存到 openssh-rpms/downloads 目录下，openssh-rpms 是上一步下载的脚本目录

Copy
[root@localhost ~]# cd openssh-rpms/
[root@localhost openssh-rpms]# ./pullsrc.sh

执行 compile.sh 编译源码构建 rpm 包

执行脚本目录下 compile.sh 解压源码包进行编译，最后在 openssh-rpms/el7/RPMS/x86_64 / 目录下生成最新版 OpenSSH 的 rpm 包

编译过程与系统性能相关，使用 WSL 的 CentOS7 打包在 3 分钟左右，虚拟机 CentOS7 根据分配的 CPU 和内存大小时间会有差异

Copy
[root@localhost openssh-rpms]# ./pullsrc.sh

rpm 归档

rpm 构建完成后可以使用 tar 归档，将 4 个 rpm 包压缩为.tar.gz 文件，拷贝到需要升级 ssh 的 CentOS 的服务器上解压安装

Copy
[root@localhost openssh-rpms]# cd el7/RPMS/x86_64/
[root@localhost x86_64]# tar czvf openssh-9.8_el7.tar.gz openssh*.rpm

服务器安装新版 OpenSSH

注意：若使用 ssh 登录升级服务器，不要断开 ssh 连接，升级结束后新建 ssh 窗口可以正常登录后才算升级完成，测试升级服务器为 CentOS7.9

拷贝安装包，卸载旧版 OpenSSH

首先把打包好的 openssh-9.8_el7.tar.gz 使用 scp 或者 sftp 拷贝到目标服务器，这里拷贝到了 opt 目录下，然后卸载服务器的旧版 openssh

Copy
[root@server ~]# yum remove openssh* -y

安装新版 OpenSSH

进入 opt 目录，解压 openssh-9.8_el7.tar.gz, 然后使用 rpm 命令安装即可

Copy
[root@server ~]# cd /opt
[root@server opt]# tar xf openssh-9.8_el7.tar.gz
[root@server opt]# rpm -ivh openssh*.rpm

问题处理

安装完重启 sshd 会报错，查看错误信息发现是 /etc/ssh/ssh_host_ed25519_key 文件权限为 0640 报错，修改 ssh_host_*_key 文件权限后重启 sshd 即可

Copy
[root@server opt]# chmod 0600 /etc/ssh/ssh_host_*_key
[root@server opt]# systemctl restart sshd

sshd 服务正常运行后新建 ssh 连接窗口，测试是否可以正常登录，一切正常则升级完成