Linux Centos7.9 OpenSSH升级到9.8p1最新版详细教程

[复制链接]
发表于 2026-10-4 19:22:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

CentOS 7.9 自带的 OpenSSH 是 7.4p1,OpenSSL 是 1.0.2k,两者都已经过了维护周期,不少新披露的问题在老版本上没有补丁。把 SSH 升级到 9.8p1 是运维里常见的加固动作,但源码编译升级 SSH 有个绕不开的风险:yum remove -y openssh 会立刻杀掉当前的 SSH 会话,人可能直接被关在服务器外面。本文按“先保住回退通道、再编译升级、最后收敛安全配置”的顺序讲完整流程,并标出每一步需要注意的点。

一、升级前必须想清楚的几件事

  • 必须留一条临时通道:升级过程中 SSH 大概率会短时不可用,先用 telnet 或串行口(物理机)开一条备用登录方式。
  • 确认远程场景:如果在云上或 IDC 托管,机房有 KVM 的话最保险;纯远程、只有 SSH 一条路、且没有控制台权限的机器,动手前先想清楚。
  • 备份要能直接用:备份的目录和配置文件,要能在系统起不来时手动拷回去。
  • 确认依赖版本:新版本 OpenSSH 依赖较新的 OpenSSL 与 zlib,老系统上的库太旧会导致编译失败或运行异常,所以下面会先单独升 zlib 和 OpenSSL。

二、环境确认

cat /etc/centos-release
rpm -qa | grep -E "openssh|openssl|zlib"

# 查看当前 OpenSSH 与 OpenSSL 版本
ssh -V
openssl version

本文记录的环境是 CentOS 7.9,升级前 OpenSSH 7.4p1、OpenSSL 1.0.2k。其他系统与版本请自行核对对应包的版本再动手。

三、备份现有配置

cp -rf /etc/ssh /etc/ssh.bak
cp -rf /usr/bin/openssl /usr/bin/openssl.bak
cp -rf /etc/pam.d /etc/pam.d.bak
cp -rf /usr/lib/systemd/system /usr/lib/systemd/system.bak

这四处分别是 SSH 配置、OpenSSL 可执行文件、PAM 认证配置和 systemd 服务文件,回到出问题状态时基本都要用到。

四、临时通道:telnet 的装与用

telnet 是明文协议,只对升级期间的临时排错场景使用,用完后应当及时关闭,绝不要长期开着。安装与启动方式如下:

# 1. 安装
yum install -y telnet telnet-server xinetd

# 2. 启动服务
systemctl start xinetd && systemctl start telnet.socket

# 3. 防火墙放行 23 端口
firewall-cmd --zone=public --add-port=23/tcp --permanent

# 4. 重新加载防火墙规则
firewall-cmd --complete-reload

# 5. 确认放行结果
firewall-cmd --query-port=23/tcp

# 6. 允许 root 通过 telnet 登录(仅临时排错)
sed -i 's/^auth[[:space:]]\+required[[:space:]]\+pam_securetty.so/#&/' /etc/pam.d/remote

# 7. 连通性测试
telnet 服务器IP

# 8. 设置开机自启(仅临时)
systemctl enable telnet.socket

升级结束后要做的收尾

  • 确认新 SSH 正常工作后,systemctl disable telnet.socket 并 stop 掉对应服务。
  • 防火墙里把 23 端口移除,别留下半开半关的状态。
  • 把 /etc/pam.d/remote 那行注释改回去,或者直接重装 telnet-server。
  • 生产环境不建议开启 root 明文登录,这条通道只作为紧急出口。

五、安装编译依赖

# 完整依赖,执行时若报错再按提示补
yum install -y vim gcc gcc-c++ glib cmake autoconf \
  openssl openssl-devel pcre-devel pam-devel zlib-devel \
  tcp_wrappers tcp_wrappers libedit-devel perl-IPC-Cmd wget tar lrzsz nano

# 精简依赖也可以,大部分场景够用
yum -y install gcc pam-devel zlib-devel openssl-devel net-tools

六、下载源码包

cd /usr/local/src

wget https://www.zlib.net/zlib-1.3.1.tar.gz
wget https://www.openssl.org/source/openssl-3.3.1.tar.gz
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz

从官方站点下载,保证包的可信度。下载后用 md5sum 或 sha256sum 对照官网公布的值核对一下,能避免小概率的传输损坏或源站被污染。

cd /usr/local/src/
tar -zxvf zlib-1.3.1.tar.gz
tar -zxvf openssl-3.3.1.tar.gz
tar -zxvf openssh-9.8p1.tar.gz

七、安装 zlib

cd /usr/local/src/zlib-1.3.1

# 配置安装位置
./configure --prefix=/usr/local/src/zlib

# 编译并安装,耗时几分钟,视机器性能而定
make -j4 && make test && make install

八、安装 OpenSSL

cd /usr/local/src/openssl-3.3.1

./config --prefix=/usr/local/src/openssl
make -j4 && make install

装完后接管系统里的 openssl 命令,并更新动态库搜索路径:

mv /usr/bin/openssl /usr/bin/old_openssl
ln -s /usr/local/src/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/src/openssl/lib64/libssl.so.3 /usr/lib64/libssl.so.3
ln -s /usr/local/src/openssl/lib64/libcrypto.so.3 /usr/lib64/libcrypto.so.3

echo "/usr/local/src/openssl/lib64" >> /etc/ld.so.conf
ldconfig

# 查看更新后的版本
openssl version -v

这里有个容易踩的点:如果系统的其他软件(curl、wget、Python 的 ssl 模块)原本依赖旧版 OpenSSL,替换后可能出现兼容问题。稳妥做法是升级完成后跑一遍常用命令,确认没有异常再继续。

九、安装 OpenSSH

1. 卸载旧版本

# 卸载 openssh 7.4p1
yum remove -y openssh

# 清理残余文件
rm -rf /etc/ssh/*

注意这一步会中断当前 SSH 连接,操作前务必确认备用通道可用。

2. 编译安装

cd /usr/local/src/openssh-9.8p1

./configure \
  --prefix=/usr/local/src/ssh \
  --sysconfdir=/etc/ssh \
  --with-pam \
  --with-ssl-dir=/usr/local/src/openssl \
  --with-zlib=/usr/local/src/zlib

make -j4 && make install

# 查看新版本
/usr/local/src/ssh/bin/ssh -V

3. 把新版本接管到系统路径

cp -rf /usr/local/src/openssh-9.8p1/contrib/redhat/sshd.init /etc/init.d/sshd
cp -rf /usr/local/src/openssh-9.8p1/contrib/redhat/sshd.pam /etc/pam.d/sshd

cp -rf /usr/local/src/ssh/sbin/sshd /usr/sbin/sshd
cp -rf /usr/local/src/ssh/bin/ssh /usr/bin/ssh
cp -rf /usr/local/src/ssh/bin/ssh-keygen /usr/bin/ssh-keygen

十、安全配置:本文对原方案做的收敛

很多升级教程在收尾时会直接执行下面两句:

echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config

本文不建议在生产这么做。允许 root 直接登录、允许密码认证,等于把两台攻击面最大的入口同时打开。升级 SSH 的目的是提升安全性,收尾却把认证方式放宽,方向是反的。推荐的做法是:

  • 禁用 root 直登:保持 PermitRootLogin no,需要 root 时先登录普通用户再用 sudo 提权。
  • 优先密钥认证:把客户端公钥写入对应用户的 ~/.ssh/authorized_keys,然后设 PasswordAuthentication no。
  • 确需密码认证再单独放开,并且限定允许的登录用户:AllowUsers youruser。
  • 用非 22 端口:Port 2202 之类的改动能显著降低无差别扫描命中率,配合防火墙白名单效果更好。
  • 确认 /etc/pam.d/sshd 正常:改错 PAM 配置会导致所有人都登不上,改之前先留一份备份。

改完重启服务,并确认开机自启:

/etc/init.d/sshd restart
/etc/init.d/sshd status
chkconfig --add sshd

# 查看最终版本
ssh -V

十一、排坑清单

  • 升级后 SSH 连不上:先去控制台看 /var/log/secure,常见原因是 PAM 配置不对或 sshd_config 语法有误,用 /usr/sbin/sshd -t 校验配置。
  • 编译报缺头文件或库:补对应的 -devel 包,尤其是 pam-devel、zlib-devel、openssl-devel。
  • openssl 命令失效:动态库路径没更新,确认 /etc/ld.so.conf 已加入新路径并执行了 ldconfig。
  • scp / sftp 异常:多半是 sftp 子系统路径变了,检查 /etc/ssh/sshd_config 里的 Subsystem sftp 指向是否正确。
  • systemctl start sshd 提示 unit 不存在:init 脚本没装好,重新拷贝 sshd.init 并执行 systemctl daemon-reload。

十二、总结

源码编译升级 SSH 并不复杂,真正需要投入精力的是升级前后的连通性保障:备份到位、备用登录通道先开、升级顺序先库后服务、收尾把安全配置往收敛方向调而不是放宽。升级完成后建议做一次基线核对——版本、sshd 配置、PAM、开机自启、备份文件是否还在,确认无误再关掉 telnet 临时通道。这样一次操作才真正提升了系统的安全水位。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表