站点图标 Liao's blog

UOS离线升级OpenSSH 10.3p1

本文由Codex生成

下载脚本,解压密码:dabai

适用环境:

一、重要原则

升级 SSH 时不要关闭当前 SSH 会话。

正确操作顺序:

  1. 先编译安装新版 OpenSSH。
  2. 先启动 2222 测试端口。
  3. 用新终端测试 ssh -p 2222 root@服务器IP
  4. 测试通过后再切换生产 22 端口。
  5. 切换生产后,再用新终端测试 ssh root@服务器IP
  6. 新终端确认可以登录后,当前旧终端才可以关闭。

二、离线包准备

将以下文件放到 /data/downloads

/data/downloads/zlib-1.3.2.tar
/data/downloads/openssl-3.5.6.tar
/data/downloads/openssh-10.3p1.tar

如果是 .tar.gz 也可以,脚本会自动识别:

zlib-1.3.2.tar.gz
openssl-3.5.6.tar.gz
openssh-10.3p1.tar.gz

三、一键脚本运行方式

脚本路径示例:

/root/upgrade_openssh_10.3p1.sh

先做语法检查:

bash -n /root/upgrade_openssh_10.3p1.sh

没有输出表示语法检查通过。

默认运行,只编译并启动 2222 测试端口,不替换生产 SSH:

bash /root/upgrade_openssh_10.3p1.sh

测试端口登录:

ssh -p 2222 root@服务器IP

测试通过后,切换生产 22 端口:

bash /root/upgrade_openssh_10.3p1.sh --switch

四、当前遇到的问题和处理方式

1. 找不到 pam-devel

现象:

rpm -qa | grep pam

只有:

pam-1.4.0-8.up5.uel20.aarch64

没有:

pam-devel

处理方式:

原因:

无 PAM 编译时,新版 sshd 不认识 UsePAM 这个配置项。如果配置里存在该项,会出现:

Unsupported option UsePAM

2. OpenSSL libssl.so.3 找不到

现象:

/usr/local/openssl-3.5.6/bin/openssl: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory

原因:

OpenSSL 已安装,但系统动态链接器没有加载 /usr/local/openssl-3.5.6/lib

处理方式:

cat > /etc/ld.so.conf.d/openssl-3.5.6-openssh-upgrade.conf <<'EOF'
/usr/local/openssl-3.5.6/lib64
/usr/local/openssl-3.5.6/lib
/usr/local/zlib-1.3.2/lib
EOF

ldconfig

验证:

/usr/local/openssl-3.5.6/bin/openssl version -a

3. RSAAuthentication 旧参数告警

现象:

Deprecated option RSAAuthentication
Deprecated option RhostsRSAAuthentication

处理方式:

注释旧参数:

sed -i \
  -e 's/^[[:space:]]*RSAAuthentication[[:space:]].*/#&/' \
  -e 's/^[[:space:]]*RhostsRSAAuthentication[[:space:]].*/#&/' \
  /etc/ssh/sshd_config

4. GSSAPI 参数兼容问题

部分新版 OpenSSH 可能不支持旧配置里的 GSSAPI 参数。

处理方式:

sed -i \
  -e 's/^[[:space:]]*GSSAPIAuthentication[[:space:]].*/#&/' \
  -e 's/^[[:space:]]*GSSAPICleanupCredentials[[:space:]].*/#&/' \
  /etc/ssh/sshd_config

5. 主机密钥权限问题

新版 sshd 对主机密钥权限要求较严格。

处理方式:

chown root:root /etc/ssh/ssh_host_*
chmod 600 /etc/ssh/ssh_host_*_key
chmod 644 /etc/ssh/ssh_host_*_key.pub
chmod 755 /etc/ssh
chmod 644 /etc/ssh/sshd_config

五、验证服务端版本

注意:

在服务器上执行:

ssh -V

看到的是本机 SSH 客户端版本,不是服务端 sshd 版本。

服务端是否已切换,看下面命令。

查看 systemd 状态:

systemctl status sshd --no-pager

应看到类似:

sshd: /usr/local/openssh-10.3p1/sbin/sshd -D [listener]

查看进程:

ps -ef | grep '[s]shd'

验证新版服务端二进制:

/usr/local/openssh-10.3p1/sbin/sshd -V

客户端远程确认服务端 banner:

ssh -vvv root@服务器IP

输出中应有类似:

remote software version OpenSSH_10.3

六、停止 2222 测试端口

生产 22 端口切换并验证成功后,可以停止测试端口:

kill $(cat /tmp/sshd-10.3p1-test.pid)
rm -f /tmp/sshd-10.3p1-test.pid

确认 2222 不再监听:

ss -lnt | grep ':2222' || echo "2222 test sshd stopped"

七、替换 ssh -V 客户端显示

生产 sshd 切换后,服务器上执行 ssh -V 仍可能显示旧版本:

OpenSSH_8.2p1, OpenSSL 1.1.1f

这是因为 /usr/bin/ssh 还是系统旧客户端。

如果需要让 ssh -V 显示新版,可以用软链接替换客户端命令。

1. 备份旧客户端

TS=(date +%F-%H%M%S)

cp -a /usr/bin/ssh /usr/bin/ssh.old-8.2p1-TS
cp -a /usr/bin/scp /usr/bin/scp.old-8.2p1-TS 2>/dev/null || true
cp -a /usr/bin/sftp /usr/bin/sftp.old-8.2p1-TS 2>/dev/null || true
cp -a /usr/bin/ssh-keygen /usr/bin/ssh-keygen.old-8.2p1-TS 2>/dev/null || true
cp -a /usr/bin/ssh-agent /usr/bin/ssh-agent.old-8.2p1-TS 2>/dev/null || true
cp -a /usr/bin/ssh-add /usr/bin/ssh-add.old-8.2p1-$TS 2>/dev/null || true

2. 创建新版软链接

ln -sf /usr/local/openssh-10.3p1/bin/ssh /usr/bin/ssh
ln -sf /usr/local/openssh-10.3p1/bin/scp /usr/bin/scp
ln -sf /usr/local/openssh-10.3p1/bin/sftp /usr/bin/sftp
ln -sf /usr/local/openssh-10.3p1/bin/ssh-keygen /usr/bin/ssh-keygen
ln -sf /usr/local/openssh-10.3p1/bin/ssh-agent /usr/bin/ssh-agent
ln -sf /usr/local/openssh-10.3p1/bin/ssh-add /usr/bin/ssh-add

3. 验证客户端版本

which ssh
ls -l /usr/bin/ssh
ssh -V
scp -V 2>&1 | head -1
sftp -V 2>&1 | head -1

预期:

OpenSSH_10.3p1, OpenSSL 3.5.6

4. 更保守的方式:只改 PATH

如果不想改 /usr/bin,可以只改 PATH:

echo 'export PATH=/usr/local/openssh-10.3p1/bin:$PATH' > /etc/profile.d/openssh-10.3p1.sh
source /etc/profile.d/openssh-10.3p1.sh
ssh -V

这种方式不会覆盖系统命令,但只对加载该 profile 的 shell 生效。

八、服务端回滚

如果执行 --switch 后,新终端无法登录 22 端口,但当前旧终端还在,立即执行:

systemctl revert sshd
systemctl daemon-reload
systemctl restart sshd
systemctl status sshd --no-pager

恢复 sshd 配置文件。

查看脚本自动备份:

ls -lh /etc/ssh/sshd_config.before-10.3p1-*

选择最近的备份恢复:

cp -a /etc/ssh/sshd_config.before-10.3p1-具体时间 /etc/ssh/sshd_config
systemctl restart sshd

也可以使用脚本开头生成的完整备份目录:

ls -ld /root/ssh-bak-*

恢复示例:

cp -a /root/ssh-bak-具体时间/ssh/sshd_config /etc/ssh/sshd_config
systemctl restart sshd

回滚后重新开一个终端测试:

ssh root@服务器IP

九、客户端软链接回滚

如果已经替换了 /usr/bin/ssh 等客户端命令,需要回滚:

先找到备份:

ls -lh /usr/bin/ssh.old-8.2p1-*
ls -lh /usr/bin/scp.old-8.2p1-* 2>/dev/null
ls -lh /usr/bin/sftp.old-8.2p1-* 2>/dev/null

删除软链接并恢复旧文件:

rm -f /usr/bin/ssh /usr/bin/scp /usr/bin/sftp

cp -a /usr/bin/ssh.old-8.2p1-具体时间 /usr/bin/ssh
cp -a /usr/bin/scp.old-8.2p1-具体时间 /usr/bin/scp 2>/dev/null || true
cp -a /usr/bin/sftp.old-8.2p1-具体时间 /usr/bin/sftp 2>/dev/null || true

如果也替换了管理工具:

rm -f /usr/bin/ssh-keygen /usr/bin/ssh-agent /usr/bin/ssh-add

cp -a /usr/bin/ssh-keygen.old-8.2p1-具体时间 /usr/bin/ssh-keygen 2>/dev/null || true
cp -a /usr/bin/ssh-agent.old-8.2p1-具体时间 /usr/bin/ssh-agent 2>/dev/null || true
cp -a /usr/bin/ssh-add.old-8.2p1-具体时间 /usr/bin/ssh-add 2>/dev/null || true

验证:

ssh -V

应恢复为:

OpenSSH_8.2p1, OpenSSL 1.1.1f

十、最终验收命令

服务端验收:

systemctl status sshd --no-pager
ps -ef | grep '[s]shd'
/usr/local/openssh-10.3p1/sbin/sshd -V

客户端验收:

ssh -V
which ssh
ls -l /usr/bin/ssh

远程连接验收:

ssh root@服务器IP
ssh -vvv root@服务器IP

如果 ssh -vvv 中显示:

remote software version OpenSSH_10.3

说明远端服务端已经是新版。

十一、注意事项

退出移动版