CentOS8编译升级OpenSSH至9.x:零翻车实录,老系统也能秒变安全堡垒
CentOS8编译升级OpenSSH至9.x

手里那台跑了好些年的CentOS8,SSH版本还停在7.x,扫一眼漏洞库,心脏都能少跳半拍。甲方爸爸一句“整改”,只能撸袖子自己上。踩坑一夜,把血泪步骤压成这篇,照着敲,包你天亮前收工。
先别急着动手,把退路留好
第一要务:留一条不死的SSH口。开一台临时小机,配个iptables转发,把2222端口流量转到本机22;或者干脆开云服务器的VNC控制台,真翻车还能爬进去救命。再拍一份快照,磁盘快照比后悔药便宜。
依赖一次装全,省得编译报缺
CentOS8默认仓库里,gcc、make、automake这些都有,但OpenSSH9.x新加了openssl-1.1.1+硬需求,系统自带版本不够。先整一套:
dnf install -y gcc make automake openssl-devel zlib-devel pam-devel wget tar

如果提示缺kernel-headers,别纠结,一起拉进来,省得后面编译pam时哭。
源码三件套:openssh、openssl、zlib
去官网拉最新tar包,别用git快照,稳定版最香。我下的是openssh-9.4p1.tar.gz、openssl-1.1.1u.tar.gz、zlib-1.2.13.tar.gz。统一放在/usr/local/src,好找。
重点:把旧配置先备份。
cp -a /etc/ssh /etc/ssh.bak.$(date +%s)
别偷懒,少这一步,回滚时想撞墙。

编译zlib:最轻量,却最容易被忽视
cd /usr/local/src
tar xf zlib-1.2.13.tar.gz
cd zlib-1.2.13
./configure --prefix=/usr/local/zlib
make -j$(nproc) && make install
装完顺手写个软链,省得后面configure找不到:
echo '/usr/local/zlib/lib' > /etc/ld.so.conf.d/zlib.conf && ldconfig
编译openssl:别装到系统目录,避免把yum的openssl顶掉
cd /usr/local/src
tar xf openssl-1.1.1u.tar.gz
cd openssl-1.1.1u
./config --prefix=/usr/local/openssl --shared zlib
make -j$(nproc) && make install
装完把pkgconfig路径喂给shell:
echo 'export PKGCONFIGPATH=/usr/local/openssl/lib/pkgconfig:$PKGCONFIGPATH' >> /etc/profile.d/openssl.sh
source /etc/profile.d/openssl.sh
编译openssh:把新openssl和zlib绑死
cd /usr/local/src
tar xf openssh-9.4p1.tar.gz
cd openssh-9.4p1
./configure --prefix=/usr/local/openssh \
--with-ssl-dir=/usr/local/openssl \
--with-zlib=/usr/local/zlib \
--with-pam \
--with-md5-passwords \
--with-4in6 \
--disable-strip
看到“PAM support: yes”再往下走,否则登录会跪。
make -j$(nproc) && make install
配置:别直接覆盖,先并行跑
新二进制丢到/usr/local/openssh,老的在/usr/sbin,井水不犯河水。先改端口,别让新旧冲突:
cp /etc/ssh/sshdconfig /usr/local/openssh/etc/sshdconfig
vim /usr/local/openssh/etc/sshd_config
把Port改成2222,PermitRootLogin设成prohibit-password,PubkeyAuthentication yes,PasswordAuthentication no,按自己规矩调。保存后启动新服务:
/usr/local/openssh/sbin/sshd -f /usr/local/openssh/etc/sshd_config -t
测试配置没报错,再:
/usr/local/openssh/sbin/sshd -f /usr/local/openssh/etc/sshd_config -p 2222
另开窗口,ssh -p 2222 本机IP,能进说明新包OK。
收尾:把旧服务踢掉,新服务扶正
systemctl停掉老sshd:
systemctl stop sshd
systemctl disable sshd
写个新unit文件,别直接改老文件,方便回滚:
cat > /etc/systemd/system/sshd9.service <<'EOF'
[Unit]
Description=OpenSSH 9.x Server
After=network.target
[Service]
ExecStart=/usr/local/openssh/sbin/sshd -D -f /usr/local/openssh/etc/sshd_config
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now sshd9
确认端口已切回22:
netstat -tunlp | grep sshd
看到新进程占22,旧进程消失,收工。
常见翻车点速查
1. 编译完一启动就报“no hostkeys”,那是缺少ssh-keygen,/usr/local/openssh/bin/ssh-keygen -A一把梭。
2. 登录提示“Permission denied (publickey)”,99%是权限问题,chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorizedkeys。
3. SELinux拦端口,setsebool -P sshchrootrwhomedirs on,或者干脆临时setenforce 0验证。
一键回滚脚本,真出事能救命
#!/bin/bash
systemctl stop sshd9
systemctl disable sshd9
systemctl enable sshd
systemctl start sshd
echo '已回滚至旧版sshd'
扔在/root/rollback.sh,chmod +x,真香。
升级后别忘了的小动作
把新路径写进环境变量,省得以后敲全路径:
echo 'export PATH=/usr/local/openssh/bin:$PATH' >> ~/.bashrc
客户端也能享受新版本带来的ssh -Q cipher算法列表,一眼看尽安全度。
至此,CentOS8老骥伏枥,SSH版本直奔9.x,漏洞扫描报告一片绿油油,甲方爸爸闭嘴,运维也能睡整觉。
