CentOS 6 停止维护后怎么手动编译升级 OpenSSH 版本

文章导读
对于仍在使用 CentOS 6 的系统,手动编译升级 OpenSSH 是应对停止维护后安全漏洞的可行方案,但需严格遵循操作规范并评估业务连续性风险。CentOS 6 默认 OpenSSL 版本过低,无法直接编译新版 OpenSSH,且系统使用 SysVinit 管理服务,操作不当极易导致远程连接中断。
📋 目录
  1. 升级前高危预警
  2. 编译依赖环境准备
  3. 编译安装 OpenSSL 1.1.1
  4. 编译安装 OpenSSH
  5. 服务配置与启动
  6. 验证与回滚
  7. 常见坑
A A

对于仍在使用 CentOS 6 的系统,手动编译升级 OpenSSH 是应对停止维护后安全漏洞的可行方案,但需严格遵循操作规范并评估业务连续性风险。CentOS 6 默认 OpenSSL 版本过低,无法直接编译新版 OpenSSH,且系统使用 SysVinit 管理服务,操作不当极易导致远程连接中断。

先说结论:通过源码编译升级 OpenSSH 可解决 CVE 漏洞,但必须先编译 OpenSSL 依赖并保留 Telnet 应急通道

  • 先备份:保留当前 SSH 会话,开启 Telnet 服务作为 fallback
  • 再依赖:CentOS 6 需先源码编译 OpenSSL 1.1.1+ 供 OpenSSH 调用
  • 后验证:新会话连接成功后再关闭旧会话,严禁直接重启服务

升级前高危预警

升级 SSH 服务存在锁机风险,操作前必须完成以下应急准备:

  1. 保留当前会话:打开一个终端窗口执行升级操作,不要关闭,直到新 SSH 连接验证成功。
  2. 开启 Telnet 应急通道:若 SSH 升级失败,可通过 Telnet 登录修复。
    # 安装 Telnet 服务及 xinetd 守护进程
    yum install -y telnet-server xinetd
    
    # 启用 Telnet 并设置开机自启
    chkconfig telnet on
    chkconfig xinetd on
    
    # 启动服务
    service xinetd start
    
    # 验证 Telnet 端口监听
    netstat -tlnp | grep 23
  3. 确保控制台访问:如果是云服务器,确认拥有 VNC 或控制台登录权限。

编译依赖环境准备

CentOS 6 默认缺少编译工具且 OpenSSL 版本过低(1.0.1e),OpenSSH 9.x 需要 OpenSSL 1.1.1 及以上版本。

CentOS 6 停止维护后怎么手动编译升级 OpenSSH 版本
# 安装基础编译工具
yum groupinstall -y "Development Tools"
yum install -y zlib-devel pcre-devel

# 检查当前 OpenSSL 版本(仅作记录,不要直接替换系统自带)
openssl version

编译安装 OpenSSL 1.1.1

为避免破坏系统 yum 等工具,将新版 OpenSSL 安装到独立目录,供 OpenSSH 编译链接使用。

# 下载 OpenSSL 1.1.1w 源码
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -zxf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w

# 配置编译路径(安装到 /usr/local/openssl)
./config shared `--prefix`=/usr/local/openssl `--openssldir`=/usr/local/openssl

# 编译并安装
make && make install

# 验证新 OpenSSL 版本
/usr/local/openssl/bin/openssl version

编译安装 OpenSSH

指定刚才编译的 OpenSSL 路径进行 OpenSSH 编译,确保二进制文件兼容。

# 下载 OpenSSH 源码(示例版本 9.6p1)
cd ~
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.6p1.tar.gz
tar -zxf openssh-9.6p1.tar.gz
cd openssh-9.6p1

# 检查 sshd 用户是否存在,不存在则创建
id sshd || useradd -r -g 0 -s /sbin/nologin -d /var/empty/sshd sshd

# 配置编译参数(注意去除参数外的反引号)
./configure `--prefix`=/usr `--sysconfdir`=/etc/ssh `--with-ssl-dir`=/usr/local/openssl `--with-zlib` `--with-privsep-path`=/var/empty/sshd

# 编译并安装
make && make install

服务配置与启动

CentOS 6 使用 SysVinit 管理服务,不支持 systemctl 命令。替换二进制文件后需重启服务。

# 备份原有配置与二进制文件
cp -r /etc/ssh /etc/ssh.bak_$(date +%F)
cp /usr/sbin/sshd /usr/sbin/sshd.bak

# 停止旧服务
service sshd stop

# 启动新服务
service sshd start

# 检查服务状态
service sshd status

service sshd start 报错,检查 /etc/init.d/sshd 脚本中引用的二进制路径是否为 /usr/sbin/sshd

CentOS 6 停止维护后怎么手动编译升级 OpenSSH 版本

验证与回滚

验证步骤:

  1. 版本检查:ssh -V 应显示新版本号(如 OpenSSH_9.6p1)。
  2. 新会话测试:打开终端窗口尝试 SSH 登录,确认密码/密钥认证正常。
  3. 日志检查:tail -f /var/log/secure 观察是否有认证错误。
  4. 清理:确认新连接稳定后,方可关闭旧会话。

回滚步骤:

若新版本无法连接,立即通过 Telnet 或控制台登录,恢复备份:

service sshd stop
cp /usr/sbin/sshd.bak /usr/sbin/sshd
cp -r /etc/ssh.bak_* /etc/ssh
service sshd start

常见坑

  • 权限错误:确保 /var/empty/sshd 目录存在且权限为 711,属主为 root。
  • SELinux 拦截:若服务启动失败,临时执行 setenforce 0 测试是否策略限制。
  • PAM 模块失效:检查 /etc/pam.d/sshd 配置完整性,避免认证模块缺失。
  • 依赖库路径:若启动报错缺少 libssl.so,需在 /etc/ld.so.conf.d/ 中添加 /usr/local/openssl/lib 并执行 ldconfig