对于仍在使用 CentOS 6 的系统,手动编译升级 OpenSSH 是应对停止维护后安全漏洞的可行方案,但需严格遵循操作规范并评估业务连续性风险。CentOS 6 默认 OpenSSL 版本过低,无法直接编译新版 OpenSSH,且系统使用 SysVinit 管理服务,操作不当极易导致远程连接中断。
先说结论:通过源码编译升级 OpenSSH 可解决 CVE 漏洞,但必须先编译 OpenSSL 依赖并保留 Telnet 应急通道
- 先备份:保留当前 SSH 会话,开启 Telnet 服务作为 fallback
- 再依赖:CentOS 6 需先源码编译 OpenSSL 1.1.1+ 供 OpenSSH 调用
- 后验证:新会话连接成功后再关闭旧会话,严禁直接重启服务
升级前高危预警
升级 SSH 服务存在锁机风险,操作前必须完成以下应急准备:
- 保留当前会话:打开一个终端窗口执行升级操作,不要关闭,直到新 SSH 连接验证成功。
- 开启 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 - 确保控制台访问:如果是云服务器,确认拥有 VNC 或控制台登录权限。
编译依赖环境准备
CentOS 6 默认缺少编译工具且 OpenSSL 版本过低(1.0.1e),OpenSSH 9.x 需要 OpenSSL 1.1.1 及以上版本。
# 安装基础编译工具
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。
验证与回滚
验证步骤:
- 版本检查:
ssh -V应显示新版本号(如 OpenSSH_9.6p1)。 - 新会话测试:打开新终端窗口尝试 SSH 登录,确认密码/密钥认证正常。
- 日志检查:
tail -f /var/log/secure观察是否有认证错误。 - 清理:确认新连接稳定后,方可关闭旧会话。
回滚步骤:
若新版本无法连接,立即通过 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。