1. 为什么非升不可,以及升级方案怎么选
1.1 存量CentOS机器的安全压力
这期“常用环境部署”系列,聊聊CentOS上升级OpenSSH 10.2p1。先说背景。我手上一批存量服务器,跑的是CentOS 7.9,系统自带OpenSSH 7.4。安全扫描一拉,高危漏洞一大串,CVE列表里好几个都直接影响sshd组件。老版本默认开启的算法也跟不上现在的等保和密评要求,ssh-rsa、CBC系列加密算法、diffie-hellman-group-exchange-sha1这些在合规检查里基本都是扣分项。很多团队碰到这种情况第一反应是升级整个系统,但现实里业务系统、中间件、数据库版本都绑定在那,说迁就迁不现实。折中方案就是把OpenSSH作为独立组件升级,风险面小、回滚容易,这也是行业里比较常见的做法。
需要说明的是,OpenSSH是服务器远程管理的命门,一旦升挂了,服务器就进不去,所以这篇文章会花大量篇幅讲准备工作和回滚方案,这些往往比编译命令本身更重要。我这次操作的机器都是内网环境,有一台还是隔离网段,不能访问外网,所以整个过程对离线场景也有参考价值。无论你是刚入行的运维新人,还是已经在生产环境摸爬滚打多年的系统工程师,这篇文章从环境检查、依赖安装、编译参数、二进制替换、systemd配置到问题排查都覆盖到了,照着做基本能复现。
1.2 源码编译和大版本升级的取舍
OpenSSH升级通常有几条路:改yum源、用第三方repo、直接源码编译。先说yum源方式,CentOS官方源里OpenSSH版本常年不动,第三方源要么只支持特定系统版本,要么和系统自带的openssl版本绑得太紧,在生产环境里用起来很容易出现依赖冲突。我用过几个第三方源,装完以后发现把系统里的openssl也一并替换了,吓得赶紧回滚,这种联动升级在存量生产环境里风险太大。
源码编译是更可控的思路:只更新sshd、ssh、scp、sftp这几个核心二进制,不碰rpm包管理,也不影响系统里其他组件对openssl的调用。OpenSSH 10.x这个版本本身也清理了大量旧代码,默认弃用了一批老算法,对合规审计非常友好,这也是我把目标定在10.2p1而不是继续用7.4打补丁的原因。版本号按你拿到的源码包为准,哪怕是10.2p1和后续的小版本,流程基本一致。
踩坑提示:升级前务必确认系统里有gcc、make、openssl-devel、zlib-devel、pam-devel这些基础包。我有一次在最小化安装的机器上升级,编译到一半报错找不到openssl/evp.h,只能花时间补包,如果当时是内网离线环境就更尴尬。还有一个隐患:CentOS 7自带的gcc 4.8.5太老,编译新版OpenSSH容易出现兼容问题,建议先升级gcc或者用devtoolset版本,后面我会细说。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 升级前的环境检查、备份与保底通道
2.1 先摸清系统底细
动手前先把自家环境搞清楚,我不建议上来就下载源码包开干。先用这几条命令把系统信息收集齐:
bash复制cat /etc/redhat-release
uname -m
ssh -V
openssl version
rpm -ql openssh-server | head -20
systemctl status sshd --no-pager | head -10
拿到这些信息后,确认下载的源码包和当前系统架构匹配,x86_64的就别下成aarch64的。还要确认服务是通过systemd管理的,CentOS 7之后基本都用systemctl start sshd,但有些自定义安装的机器可能用的是init脚本,处理方式不同。另外,记录一下当前sshd的监听端口和认证方式,升级后这些配置要尽量保持一致,减少业务侧感知。
我遇到过一台机器,sshd_config里被前人改得乱七八糟,除了监听22还监听了一个自定义端口,rsyslog的日志分割也没配好。升级前先把这些旧账理清楚,免得升级后排查问题时新旧问题混在一起,分不清是哪一步出的错。配置文件如果有大量自定义修改,建议先用sshd -T把生效配置导出来存一份,后面可以对账。
2.2 安装编译依赖
编译OpenSSH依赖的包不多,但一个都不能少。CentOS 7上执行:
bash复制yum install -y gcc make zlib-devel openssl-devel pam-devel
gcc版本别太老。CentOS 7自带的gcc 4.8.5编译OpenSSH 10.x确实有点吃力,我在gcc 4.8.5上编译新版openssh,configure能过,但make到一半遇到编译错误的情况也有。如果出现这种情况,要么升级gcc,要么用低版本的OpenSSH先顶着。不过我这台机器之前已经升过gcc到8.3.0,编译很顺利。建议编译前先gcc --version看一下,如果版本低于5,优先把gcc升上去,否则后面报错了再回头处理,反而耽误时间。
内网离线环境的话,提前在联网机器上用yum install --downloadonly --downloaddir=/root/deps gcc make zlib-devel openssl-devel pam-devel把rpm包拉下来,再拷进内网用rpm -ivh /root/deps/*.rpm安装。这一步一定要提前做,不要等到编译报错了才去找包,内网环境临时搞依赖非常被动。
2.3 备份,备份,再备份
备份是升级OpenSSH最不能省的步骤。我习惯把下面这些路径全部归档到一个带
