马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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企服评测-应用市场 编辑提示 |