Centos7环境升级openssh7.4p1至openssh9.8p1版本 Centos7环境升级openssh7.4p1至openssh9.8p1版本引测试步骤centos7容器安装yum-utils安装opensshopenssh配置和启动生成 SSH 主机密钥修改 SSH 配置文件设置 Root 密码启动 SSH 服务远程连接容器内centos安装打包依赖下载打包脚本、指定 openssh 版本一键下载源码 编译打包编译升级配置更新并重载引生产环境系统使用的是Centos7版本默认安装的是openssh7.4p1最近扫描出来这个组件存在很多中高风险的安全漏洞打补丁的方式感觉很繁琐工作量比较大选择尝试直接升级openssh版本最终比对了一下选择了9.8p1版本。由于是生产环境之前的安装部署工作都没有参与个人还是比较谨慎。想到的办法是在本地docker环境模拟一下7.4升级9.8的操作看是否会出现ssh会话断连以及升级后无法连接等问题。测试步骤centos7容器配置好镜像源后直接拉取centos:7镜像dockerpull centos:7启动容器# 注意将容器内部的22端口映射出来dockerrun-d--namecentos7-p2222:22 centos:7sleepinfinity启动没问题后可以使用docker exec命令进入容器内部使用ssh -V命令查看应该是没有预装的镜像版本的centos比较纯净很多工具都没有安装的。# 进入容器内部注意替换为自己的container iddockerexec-it容器Id /bin/bash# 查看ssh和ssl版本ssh-Vopenssl version安装yum-utils我这里的容器内部可以访问外网并且我的宿主机是arm架构的对应的容器也是arm的可能和主流的x86 amd架构有区别大体思路我认为是一致的。修改ARM64 专用阿里云 centos7 vault 源cat/etc/yum.repos.d/CentOS-Base.repoEOF [base] nameCentOS-7.9 Base-Aliyun-aarch64 baseurlhttps://mirrors.aliyun.com/centos-vault/altarch/7.9.2009/os/aarch64/ enabled1 gpgcheck0 [updates] nameCentOS-7.9 Updates-Aliyun-aarch64 baseurlhttps://mirrors.aliyun.com/centos-vault/altarch/7.9.2009/updates/aarch64/ enabled1 gpgcheck0 [extras] nameCentOS-7.9 Extras-Aliyun-aarch64 baseurlhttps://mirrors.aliyun.com/centos-vault/altarch/7.9.2009/extras/aarch64/ enabled1 gpgcheck0 EOF刷新 yum 缓存yum clean allyum makecache安装yum-utilsyuminstall-yyum-utils安装openssh在/opt/ssh目录下下载openssh-server及其依赖包并升级安装安装mkdir-p/opt/ssh# 进入目录cd/opt/ssh# 下载rpm包yumdownloader--resolveopenssl openssh openssh-server openssh-clients# 升级覆盖安装rpm-Uvh--replacepkgs*.rpm查看ssh和ssl版本ssh-Vopenssl versionopenssh配置和启动生成 SSH 主机密钥由于容器是纯净环境通常缺少主机密钥直接启动 sshd 会报错提示无法加载 host key。bashssh-keygen-A(注该命令会自动在 /etc/ssh/ 目录下生成 RSA、ECDSA 和 ED25519 等类型的密钥)修改 SSH 配置文件编辑 /etc/ssh/sshd_config 文件确保允许 root 用户通过密码登录vi/etc/ssh/sshd_config找到并修改或取消以下两行的注释PermitRootLoginyesPasswordAuthenticationyes设置 Root 密码Docker 默认拉取的 CentOS 镜像中root 账户是没有密码的必须手动设置一个密码才能进行 SSH 认证passwdroot按提示输入两次新密码启动 SSH 服务# 后台运行/usr/sbin/sshd-D远程连接容器内centos使用ssh工具连接localhost的2222端口输入用户名root和秘钥测试连接正常情况到这里就可以登录了。如果使用localhost不行换成127.0.0.1试试。到此准备工作就算完成了。其实如果我的环境是x86 amd的应该更好办网上9.8的资源支持amd架构的比较多但是arm的不好找。能找到完整有效rpm包的话直接下载下来升级覆盖就行了。安装打包依赖# 安装开发套件rpmbuild打包工具yum groupinstall-yDevelopment Toolsyuminstall-yrpm-build pam-devel krb5-devel zlib-devel libXt-devel libX11-devel gtk2-devel perl-IPC-Cmd perl-Time-Piece systemd-devel imakewgetunzip下载打包脚本、指定 openssh 版本cd/optwgethttps://github.com/boypt/openssh-rpms/archive/refs/heads/main.zipunzipmain.zipcdopenssh-rpms-main这里如果容器里面下载不下来可以在宿主机直接通过地址下载后复制到容器内部的/opt目录下编辑ssl和ssh的版本信息# 修改版本配置version.envvimversion.env# 修改OPENSSHSRCopenssh-9.8p1.tar.gz# 要9.9就改成openssh-9.9p1.tar.gz# OpenSSL选型9.x openssh最低需要openssl1.1.1脚本自动下载内置openssl源码编译进rpm不改动系统原生openssl1.0.2k完美兼容centos7自带opensslOPENSSLSRCopenssl-1.1.1w.tar.gz一键下载源码 编译打包这里会根据version.env配置的版本去拉取对应的源码再编译# 下载openssh、openssl、askpass源码bashpullsrc.sh这里如果拉取有问题可以直接替换镜像源或者切换到downloads目录下直接wget下载目的其实你就是根据version信息去下载对应版本的源码包。编译# 编译生成rpm输出目录./RPMS/aarch64/bashcompile.sh el7我这里编译时遇到了以下报错error: File not found: /opt/openssh-rpms-main/el7/BUILDROOT/openssh-9.8p1-1.el7.aarch64/usr/libexec/openssh/sshd-auth RPM build errors: File not found: /opt/openssh-rpms-main/el7/BUILDROOT/openssh-9.8p1-1.el7.aarch64/usr/libexec/openssh/sshd-auth /opt/openssh-rpms-main删除 spec 里的 sshd-auth 行再重新编译sed-i/sshd-auth/del7/SPECS/openssh.specbashcompile.sh el7升级编译完成后在目录/opt/openssh-rpms-main/el7/RPMS/aarch64下生成了以下三个rpm包进入该目录直接安装rpm包# 进入目录cd/opt/openssh-rpms-main/el7/RPMS/aarch64# 检查以下依赖项yumdownloader--resolveopenssh-9.8p1-1.el7.aarch64.rpm openssh-clients-9.8p1-1.el7.aarch64.rpm openssh-server-9.8p1-1.el7.aarch64.rpm# 安装rpm-Uvh--force--nodepsopenssh-*.rpm到了这里升级安装就完成了但新的会话可能还是连接不进来需要做一些配置特别注意不要关闭当前窗口配置更新并重载# 检查配置如果有报错的话就用ai查一下缺啥sshd-t# 新的 sshd 配置里带了容器不支持的 GSSAPI 认证参数sed-is/^GSSAPIAuthentication/#//etc/ssh/sshd_configsed-is/^GSSAPICleanupCredentials/#//etc/ssh/sshd_config# 删除错误的配置行sed-i/^HostKeyAlgorithms/d/etc/ssh/sshd_configsed-i/^PubkeyAcceptedAlgorithms/d/etc/ssh/sshd_configsed-i/^KexAlgorithms/d/etc/ssh/sshd_config# 写入 OpenSSH 9.8 支持的正确兼容配置echoPubkeyAcceptedAlgorithms ssh-rsa/etc/ssh/sshd_configechoHostKeyAlgorithms ssh-rsa/etc/ssh/sshd_config# 开启密码登录 root 登录sed-is/^#PermitRootLogin.*/PermitRootLogin yes//etc/ssh/sshd_configsed-is/^PasswordAuthentication.*/PasswordAuthentication yes//etc/ssh/sshd_configsed-is/^#PasswordAuthentication.*/PasswordAuthentication yes//etc/ssh/sshd_config# 测试配置sshd-t检查没问题后重启或者重新加载配置我这里为了避免重启之后出现断联模拟生产环境选择重新加载配置sshd_pid$(psaux|grep/usr/sbin/sshd -D|grep-vgrep|awk{print $2})kill-HUP$sshd_pid至此升级工作测试完成新的会话可以正常连接。