最近要把一批老旧的 CentOS 7 服务器做安全加固,第一件事就是处理 OpenSSH 版本太旧的问题。这批机器上默认还是 OpenSSH 7.4,跑了六七年,期间爆出的 CVE 一个接一个,尤其是远程未授权访问和算法弱点相关的漏洞,安全扫描根本过不了。因为线上机器多、不能一台台搞特殊化,我选了 rpm 包升级的方式,统一把 OpenSSH 升到 9.5。这篇文章是这次升级的完整记录,包含方案选型、依赖分析、批量安装步骤、回滚预留,以及我在实际升级中踩过的坑。给同样在 CentOS 7 上升级 OpenSSH 的人做个参考,不管你是只升一台测试机,还是想批量推生产环境,这篇都能直接照抄。
1. 升级前的准备与方案选型
1.1 为什么坚持选 rpm 包而不是源码编译
先说说为什么这次没有用源码编译。第一个原因是 CentOS 7 默认 OpenSSH 7.4p1 用的是系统自带的 OpenSSL 1.0.2k,如果我下载 openssh-9.5 源码包去 ./configure && make && make install,编译过程中很可能链接到系统里新装的 OpenSSL 1.1.1 或 3.x 版本,新旧依赖混在一起,极容易出现 sshd 启动时报错 OpenSSL version mismatch 的情况。第二个原因是源码编译默认会装到 /usr/local 下,和系统自带的 ssh/sshd 命令并存,后续排错时到底调的是哪个版本都分不清,维护成本高。
rpm 包方案最大的优势是:升级包由第三方仓库统一构建,所有依赖关系都写死在 rpm 的 metadata 里,系统里缺什么它会自动提示,而且安装后直接替换 /usr/bin/ssh、/usr/sbin/sshd,行为可预期,更适合批量推送。整个升级过程不需要 gcc、make、openssl-devel 这一堆编译工具链,对生产环境来说也缩小了攻击面。
这里我用了一张表格,把几种主流升级方式做了对比,方便你根据自己环境选型:
| 升级方式 | 依赖处理 | 可回滚性 | 批量操作 | 适用场景 |
|---|---|---|---|---|
| 源码编译安装 | 手动逐个解决,麻烦 | 低,/usr/local 下残留多 | 差,每台都要编译 | 单机折腾、测试环境 |
| rpm 包升级 | 自动检测,rpm 会提示缺什么 | 高,旧 rpm 包可降级 | 好,rpm -Uvh 即可 | 生产环境批量升级 |
| 二进制包直接解压 | 不自带依赖,纯绿色 | 中,备份原文件即可 | 一般 | 临时救急、无 root 场景 |
结论很明确:多台 CentOS 7 要升级到 OpenSSH 9.5,优先选 rpm 包。量大、可回滚、可自动校验依赖,这几条对生产环境就是决定性的。
1.2 先摸清当前环境再动手
开始操作之前,先把目标机器的系统版本、当前 OpenSSH 版本、系统架构摸清楚。重点看两个东西:
bash复制# 查看系统版本和架构
cat /etc/redhat-release
uname -m
# 查看当前 OpenSSH 版本
ssh -V
我当时执行的结果是这样:
text复制CentOS Linux release 7.9.2009 (Core)
x86_64
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
确认是 CentOS 7.9、x86_64 架构、自带 OpenSSH 7.4p1。这一步很重要,因为 OpenSSH 9.5 的 rpm 包是按不同系统版本和架构分别构建的,CentOS 7 的包不能拿到 CentOS 8 上装,x86_64 的包也不能装到 aarch64 机器上,下载之前必须先确认这两点。
另外还要确认系统里有没有安装过第三方的 ssh 相关组件,比如 openssh-ldap、openssh-server 的旧版本、pam_ssh_agent_auth 之类的依赖包。如果装了这些扩展包,升级时可能会和 openssh 主包版本冲突,rpm 会报 package openssh-7.4p1-21.el7.x86_64 (which is newer than openssh-9.5p1-1.el7.x86_64) is already installed 这类错误。这类冲突我之前遇到过,后面专门放到常见问题里说。
1.3 搞定 rpm 包的下载和校验
OpenSSH 9.5 的 rpm 包可以直接从系统自带 yum 仓库扩展源、第三方开源镜像站下载。我这里用的是在线下载模式:先把 rpm 包下载到本地,然后通过 scp 传到目标机器,或者直接在目标机器上用 wget 下载。需要下载的包主要有这几个:
bash复制openssh-9.5p1-1.el7.x86_64.rpm
openssh-server-9.5p1-1.el7.x86_64.rpm
openssh-clients-9.5p1-1.el7.x86_64.rpm
有的第三方仓库还会额外打出 openssh-askpass 和 openssh-debuginfo,生产环境用不到,可以不下。如果你之前系统里装过 openssh-ldap,那还要补一个对应版本的 openssh-ldap 包,这个比较少见,多数服务器不会装。
下载完之后,习惯性做一次完整性校验,确保下载过程中没有文件损坏:
bash复制# 在 rpm 文件所在目录执行,检查包是否完整
rpm -K *.rpm
正常输出会有 digests signatures OK 字样。这一步别跳过,我遇到过下载工具中途断流导致 rpm 包损坏的情况,直接安装会报 rpm: not an rpm package (or package manifest),既浪费时间又容易让人误判问题方向。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 关键细节:升级前必须做好的风险控制
2.1 升级 OpenSSH 会改动哪些文件
OpenSSH
