尧图精选

银河麒麟V10手动升级OpenSSH 9.x实操指南与避坑

🕒 发布时间:2026/9/20 11:25:30 📁 来源:尧图网络
1. 为什么要在银河麒麟V10上折腾OpenSSH升级银河麒麟V10x86_64这套系统接触过的人都知道它底层是Linux内核包管理走的是RPM体系但软件源里的OpenSSH版本往往停留在比较老的阶段。我这次接到的需求很直接一批内网服务器跑的是银河麒麟V10 SP系列安全扫描报告里把OpenSSH版本标成了中高风险项要求限期整改。摆在面前的路其实就两条——要么等官方源更新要么自己动手编译或打RPM包升级。等官方源这件事做过运维的都懂周期不可控所以最终选择了手动升级这条路。这篇文章要讲的就是我完整走通一遍的实操过程包括版本选择、依赖处理、编译参数、服务切换、回滚预案以及中间踩到的几个坑。适合正在被安全扫描追着跑、又不想把系统搞崩的运维同行参考。需要提前说明的是升级OpenSSH这件事本身有风险操作不当会导致SSH服务起不来如果这台机器是你唯一的远程入口那在动手之前一定要先确认有带外管理或者本地控制台可用否则一旦断连就只能去机房了。我这次升级的目标版本选的是OpenSSH 9.x系列的一个稳定版。为什么不直接上最新的10.x因为银河麒麟V10自带的OpenSSL版本相对保守OpenSSH 10.x对OpenSSL的最低版本要求更高强行上会导致编译阶段就报一堆API不匹配的错。选9.x是在兼容性和安全性之间取了一个平衡点既能满足扫描报告对版本号的要求又不需要连带升级OpenSSL减少了变量。整个升级过程我拆成了几个阶段先做环境和依赖摸底再编译出可用的二进制然后做替换前的备份接着执行替换并验证最后处理服务管理和开机自启。下面按这个顺序展开每一步我都会说清楚为什么这么做以及不做会怎样。2. 动手前的环境摸底与依赖确认2.1 先搞清楚当前系统的真实状态很多人拿到机器就直接开始下载源码编译这是最容易翻车的地方。银河麒麟V10虽然基于RPM体系但它和标准的CentOS、RHEL在某些包的命名和路径上有差异尤其是开发工具链的完整性。我第一步做的是确认系统版本和现有OpenSSH的状态cat /etc/kylin-release ssh -V rpm -qa | grep opensshssh -V的输出会告诉你当前版本以及它链接的OpenSSL版本这个信息非常关键因为后面编译新版本时要保证OpenSSL的兼容性。rpm -qa | grep openssh则列出了所有已安装的openssh相关包通常包括openssh、openssh-server、openssh-clients、openssh-askpass这几个。记下这些包名回滚的时候要用。2.2 开发工具链和依赖库的检查编译OpenSSH需要的东西不算多但缺一个就编译不过。核心依赖包括gcc、make、zlib-devel、openssl-devel、pam-devel。银河麒麟V10默认安装可能不带这些开发包需要从本地源或者ISO镜像里装。我习惯先检查一遍rpm -qa | grep -E gcc|make|zlib-devel|openssl-devel|pam-devel如果缺用yum install或者从挂载的ISO里用rpm -ivh装。这里有个细节银河麒麟V10的yum源有时候会因为网络策略或者源地址失效而报cannot find a valid baseurl for repo这类错误如果遇到直接挂载系统ISO作为本地源是最稳的做法。挂载命令大概是mount -o loop /path/to/kylin.iso /mnt然后在/etc/yum.repos.d/下新建一个指向file:///mnt的repo文件。这样做的好处是不依赖外网速度也快。提示openssl-devel的版本要和系统当前运行的OpenSSL版本一致否则编译出来的sshd可能链接到错误的库。用openssl version确认一下。2.3 确认PAM配置和sshd_config的关键项在替换之前我建议先把当前的/etc/ssh/sshd_config备份一份并且重点看几个配置项PermitRootLogin、PasswordAuthentication、Port、AllowUsers。新版本的OpenSSH对这些配置项的默认值和解析规则可能有细微变化比如某些老版本支持的算法在新版本里被默认禁用了。如果你有老客户端需要连接可能还要在配置里显式启用一些遗留算法。这一步不做升级后可能出现能连上但认证失败或者直接连接被拒绝的情况。3. 编译参数的选择与源码构建过程3.1 源码获取与校验源码我一般从官方镜像站下载速度快且文件完整。下载完成后务必做一次校验wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.x.tar.gz wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.x.tar.gz.asc如果有条件用gpg验证签名没有条件的话至少比对一下官方公布的SHA256值。这一步看起来多余但在内网环境里源码包被中间环节篡改的风险是真实存在的。3.2 configure参数怎么定解压后进入目录执行configure。我用的参数组合是这样的./configure --prefix/usr --sysconfdir/etc/ssh \ --with-pam --with-zlib --with-ssl-dir/usr \ --with-md5-passwords --with-privsep-path/var/lib/sshd逐个解释一下为什么这么选。--prefix/usr是为了让新编译的二进制直接覆盖系统默认路径这样不用改PATH服务管理脚本也不用动。--sysconfdir/etc/ssh保证配置文件路径和原来一致。--with-pam必须加否则密码认证会失效因为银河麒麟的用户认证走的是PAM模块。--with-ssl-dir/usr指定OpenSSL的位置避免它去找一个不存在的路径。--with-md5-passwords是为了兼容一些老密码哈希格式内网里如果有很老的账户不加这个可能登录不了。--with-privsep-path指定特权分离目录这个目录必须存在且权限正确否则sshd启动会报错。configure跑完之后留意一下输出末尾的摘要信息确认PAM、OpenSSL、zlib都是yes。如果有no说明对应的开发包没装全要回去补。3.3 make和make install的注意事项make -j$(nproc)用-j参数并行编译能快不少但如果你对编译过程的稳定性有顾虑单线程也行。编译完成后不要急着make install先做一件事把现有的ssh相关二进制再备份一次到别的目录比如/root/ssh_backup/。因为make install会直接覆盖/usr/bin/ssh、/usr/sbin/sshd这些文件覆盖之后如果新版本有问题你连回退的命令都要从备份里找。make install安装完成后检查一下新版本的路径和权限ls -l /usr/sbin/sshd /usr/bin/ssh /usr/sbin/sshd -V如果sshd -V能正常输出版本号说明二进制本身没问题。4. 替换后的服务切换与连通性验证4.1 不要直接重启sshd这是整个过程中最危险的一步。很多教程会告诉你systemctl restart sshd但如果你当前就是通过SSH连上去的重启的瞬间连接会断如果新配置有问题你就再也连不上了。正确的做法是先不杀老进程用新二进制在一个临时端口上起一个测试实例/usr/sbin/sshd -p 2222 -f /etc/ssh/sshd_config -t-t是测试配置语法先确认配置文件没问题。然后/usr/sbin/sshd -p 2222 -f /etc/ssh/sshd_config这样会在2222端口起一个新的sshd老的那个还在22端口跑着。然后你另开一个终端用ssh -p 2222 userhost测试能不能登录。能登录说明新版本工作正常不能登录去看/var/log/secure或者journalctl -u sshd的日志排查完再继续。4.2 正式切换的时机和方式确认2222端口的新实例工作正常后再停掉老服务、用新二进制重启systemctl stop sshd systemctl start sshd注意这里用的是stop再start不是restart。因为restart可能会复用一些老的进程状态。start之后立刻用另一个已经连着的会话确认22端口可用或者用ss -tlnp | grep 22看监听状态。4.3 验证清单切换完成后我通常会跑一遍验证清单检查项命令预期结果版本号ssh -V显示新版本服务状态systemctl status sshdactive (running)端口监听ss -tlnp | grep :22sshd在监听密码登录新开终端用密码登录成功密钥登录用密钥登录成功PAM认证用普通用户登录成功开机自启systemctl is-enabled sshdenabled这张表里的每一项我都实际跑过尤其是PAM认证和密钥登录这两个是最容易在新版本上出问题的。PAM出问题通常是/etc/pam.d/sshd的路径或者模块版本不匹配密钥登录出问题多半是算法协商失败需要在sshd_config里显式指定PubkeyAcceptedAlgorithms。5. 那些让我停下来排查的坑5.1 sshd启动报Privilege separation user sshd does not exist这个报错第一次遇到的时候卡了我十几分钟。原因是新编译的sshd默认使用sshd这个用户做特权分离但银河麒麟V10上可能没有这个用户。解决办法是手动创建useradd -r -s /sbin/nologin -d /var/empty/sshd sshd或者直接在configure的时候用--with-privsep-usernobody指定一个已存在的用户。我倾向于创建专用用户权限隔离更干净。5.2 升级后root无法直接登录新版本OpenSSH对PermitRootLogin的默认值改成了prohibit-password也就是说root只能用密钥登录不能用密码。如果你之前的配置是yes升级后这个配置项可能被新版本的默认值覆盖或者因为语法变化被忽略。检查/etc/ssh/sshd_config里这一项显式写成PermitRootLogin yes如果确实需要然后重启服务。5.3 老客户端连接时报no matching key exchange method found内网里如果有很老的客户端工具它们支持的密钥交换算法可能在新版本里被默认禁用了。解决办法是在sshd_config里加一行KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1加号表示在默认算法基础上追加而不是替换。同理如果遇到no matching host key type found就加HostKeyAlgorithms遇到no matching cipher found就加Ciphers。但要注意这些老算法本身有安全风险加之前要评估是否真的必要。5.4 systemctl管理脚本不识别新二进制有时候make install之后systemctl start sshd会失败报start-service : 无法启动服务。这通常是因为systemd的unit文件里写死了老版本的路径或者ExecStart指向的二进制被SELinux策略挡住了。检查/usr/lib/systemd/system/sshd.service里的ExecStart路径确认指向/usr/sbin/sshd。如果是SELinux的问题用ausearch -m avc -ts recent看拒绝日志然后restorecon -Rv /usr/sbin/sshd恢复上下文。6. 回滚预案与升级后的收尾工作6.1 回滚要能在五分钟内完成升级之前我做的备份包括/usr/sbin/sshd、/usr/bin/ssh、/usr/bin/ssh-keygen、/etc/ssh/整个目录、以及rpm -qa | grep openssh的输出。回滚的时候把备份的二进制拷回去配置文件恢复然后重启服务。为了确保回滚可行我在测试环境先完整走了一遍升级和回滚流程确认备份文件能正常恢复服务。这一步花的时间不多但真出事的时候能救命。6.2 升级后要检查的几件事升级完成后除了前面说的连通性验证还有几件事要做。一是检查/var/log/secure里有没有异常的认证失败记录确认没有因为算法变更导致某些自动化任务连不上。二是确认所有依赖SSH的定时任务、备份脚本、监控采集都正常这些往往用的是密钥或者特定算法容易在升级后被忽略。三是把新的版本号更新到资产管理系统和安全扫描的白名单里避免下次扫描又报同样的风险项。6.3 关于离线环境的补充如果目标机器完全离线那整个流程需要调整。源码和依赖包要提前在有网的机器上下载好用U盘或者内网文件服务器传进去。依赖包的版本要和目标系统的glibc版本匹配否则装了也跑不起来。我一般会在同版本的测试机上先yum install --downloadonly把依赖包下全再一起拷过去。离线环境下编译OpenSSH本身没问题麻烦的是依赖链的完整性建议多留几台同版本机器做验证。7. 关于版本选择和长期维护的一点个人看法这次升级走通之后我后来又陆续在几台同版本的银河麒麟V10上重复了这个过程整体流程已经比较稳定了。有一点体会比较深OpenSSH的版本不是越新越好而是要和你系统的OpenSSL、PAM、glibc版本匹配。我见过有人直接上最新版结果编译过了但运行时报符号找不到最后还得回退。所以选版本的时候先看OpenSSH官方文档里对OpenSSL的最低要求再对照你系统的openssl version取一个交集。另外升级完成后建议把编译参数和备份路径记到运维文档里。过半年再有人问你这台机器的SSH是怎么升的你翻文档比翻记忆靠谱。如果团队里有多个同版本系统可以考虑把编译好的RPM包用fpm或者rpmbuild打成标准包后续批量部署会省很多事。我目前还在用源码编译的方式主要是因为机器数量不多但如果你面对的是几十上百台打RPM包是更工程化的做法。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →