ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

统信UOS aarch64自制OpenSSH 9.6p1 rpm升级实践

统信UOS aarch64自制OpenSSH 9.6p1 rpm升级实践 简介面向统信UOSUEL20aarch64架构的运维人员与系统管理员这份资源提供了一套自制的OpenSSH 9.6p1升级rpm安装包专用于将系统内置的低版本OpenSSH低于9.6p1一次性升级至9.6p1以修复老旧版本中已知的安全漏洞、兼容性不足与远程管理隐患。压缩包共4个文件总大小1.5MB包含openssh、openssh-clients、openssh-server三个rpm包以及一个upgrade_openssh.sh自动化升级脚本。三个rpm分别对应SSH主程序、客户端工具与服务端守护进程脚本则负责检测当前版本、备份原配置、安装新包并输出升级结果全程免编译、离线可用适合在内网生产环境快速批量部署。目前已有1286人学习下载。相比于从源码编译安装这套自制资源包依赖关系清晰、升级路径明确脚本内置的备份与校验步骤能有效降低升级风险升级后可获得9.6p1在传输加密、密钥交换与连接稳定性方面的改进可满足政务、金融等对SSH安全性有严格要求的统信UOS合规场景也非常适合有一定Linux基础的中高级运维人员参考学习是一份兼顾实战价值与安全交付的运维工具包。1. 把 OpenSSH 升到 9.6p1统信UOS aarch64 上为什么非要自制 rpm某个周四下午客户把等保扫描报告甩过来OpenSSH 存在中危漏洞限期整改。登录服务器一看统信UOS aarch64 架构系统源里根本没有新版 OpenSSH而这几台机器又统一走 rpm 包管理体系不能拿 CentOS 的包硬塞。这份资源就是我在相同架构、相同系统体系下编译并打好的 OpenSSH 9.6p1 rpm 安装包附带 configure 参数、SPEC 文件、升级脚本和回滚路径。适合信创环境、等保整改和需要批量分发 ssh 升级包的运维工程师。想少折腾先备份、再编译、最后验证顺序不能乱。2. 升级前的自检与依赖整理版本、so库、旧包一个都不能漏2.1 先摸清系统底子UOS版本、架构和当前 ssh 状况拿到机器别急着找包先把底子摸清楚。统信UOS的版本信息、CPU架构、当前 OpenSSH 版本、rpm 数据库是否存在这些直接决定你能不能直接装、装了会不会把系统搞挂。我一般会先跑下面这一套检查命令cat /etc/os-version | head -6 uname -m ssh -V 21 rpm -qa | grep -i openssh || echo no rpm database dpkg -l | grep -i openssh systemctl list-unit-files | grep -E ssh|sshd第一行看系统版本/etc/os-version里会有 MajorVersion、MinorVersion 和产品型号能区分是桌面版还是服务器版桌面版和服务器版的 PAM 路径、systemd 配置会有差异。uname -m确认是 aarch64这是硬门槛x86_64 的包一个都不能装。ssh -V看当前版本最后一行看 ssh 服务在 systemd 里注册的名字UOS 这类 Debian 派系系统上通常是ssh.service而不是sshd.service。这里有一个常见误区uname -m是 aarch64 不代表依赖库就兼容同一 aarch64 体系内 glibc、openssl 的版本可能差别很大后面会详细说。2.2 为什么不能直接拿 CentOS 的 aarch64 rpm 过来装很多运维第一反应是去 CentOS、Anolis、OpenCloudUS 的 aarch64 源里找一个 OpenSSH 9.6p1 rpm 装上去。思路没问题但统信UOS 20 是基于 Debian 体系重新定制的它的基础库版本和 CentOS 系列差异明显。最典型的是 opensslCentOS 7 带的是 openssl 1.1.1so 文件名是libcrypto.so.1.1UOS 20 上普遍是 openssl 3.xso 文件名是libcrypto.so.3。拿 CentOS 的 rpm 直接rpm -ivh依赖检查阶段就会报libcrypto.so.1.1()(64bit) is needed这类错误。有人会加--nodeps强行装这是给自己挖坑。rpm 包虽然装上了但/usr/sbin/sshd跑起来时ldd一查就是libcrypto.so.1.1 not foundsshd 直接起不来远程连接当场断掉。就算运气好能起来CentOS 的 OpenSSH 编译时链接的 PAM 模块路径、privilege separation 目录也和 UOS 不一样容易出现认证失败、sftp 异常这类玄学问题。自制 rpm 的核心理由就在这里在目标系统同源环境里编译让二进制链接的 so 库、PAM 路径、服务脚本全部对齐 UOS 的实际情况。下面这张表是 OpenSSH 运行时最常见的几个依赖在两种体系下的差异升级前可以对着看依赖CentOS 7 / Anolis统信UOS 20openssllibcrypto.so.1.1 / libssl.so.1.1libcrypto.so.3 / libssl.so.3zliblibz.so.1libz.so.1PAMlibpam.so.0模块在 /usr/lib64/securitylibpam.so.0模块在 /usr/lib/aarch64-linux-gnu/securitysystemd 服务名sshd.servicessh.service所以不是说 CentOS rpm 一定不能运行而是依赖匹配完全靠运气。自制安装包等于把变量全部关进黑匣子出问题的概率小得多。2.3 升级前要留好这些材料旧包备份、源码包和编译依赖动手之前先把升级所需的材料备齐这里最容易被忽略的是旧包备份。很多发行版的软件源里会缓存旧 rpm但 UOS 上不一定能翻到。我的做法是先把当前机器的 OpenSSH 相关二进制和配置完整存一份到本机防止升级失败后连回滚源都没有。mkdir -p /opt/ssh_upgrade/backup cp -a /etc/ssh /opt/ssh_upgrade/backup/ssh_etc_$(date %Y%m%d) cp -a /etc/pam.d/sshd /opt/ssh_upgrade/backup/pam_sshd cp -a /usr/sbin/sshd /opt/ssh_upgrade/backup/sshd.bin_$(date %Y%m%d) cp -a /usr/bin/ssh /opt/ssh_upgrade/backup/ssh.bin_$(date %Y%m%d) rpm -qa | grep -i openssh /opt/ssh_upgrade/backup/rpm_openssh_list.txt这里把配置目录、PAM 文件、sshd 和 ssh 二进制都复制出来了。rpm 列表文件记录了升级前装了哪些包、什么版本回滚时对着清单找旧包会方便很多。还有一种更省事的办法如果系统里有 yum 或 dnf可以在升级前用yumdownloader openssh-server openssh-clients把旧 rpm 拉到本地但 UOS 默认不一定带 yum所以二进制备份必须做。编译阶段的依赖也要提前列清楚。自制 rpm 不是在目标机器上直接编而是在编译机上准备好这些包包作用缺失时表现gcc / make / rpm-build编译工具链configure 或 rpmbuild 直接报错openssl-devel / libssl-dev提供头文件和链接库configure 找不到 OpenSSLzlib-devel / zlib1g-devzlib 压缩库头文件configure 报 zlib 版本太旧pam-develPAM 认证开发库无法开启 --with-pamglibc-devel标准 C 库头文件make 过程中大量 undefined reference同时从官方下载openssh-9.6p1.tar.gz源码包下载后立刻算 sha256 并记录下来。源码包在编译时会被打进 rpm 的 SOURCE 段若校验值不固定后续想复现编译都说不清用的是哪份代码。3. 自制 rpm 安装包从源码 configure 到 rpmbuild 产物的完整路径3.1 编译机的选择同架构是底线同源是安全线自制 rpm 的第一步不是写 SPEC而是选编译机。aarch64 是硬性条件x86 上编出来的二进制拿到 aarch64 上直接 Illegal instruction。在 aarch64 的前提下我建议优先找一台和目标机器同源的操作系统作为编译机最好也是统信UOS aarch64。如果手头只有 CentOS/Anolis 的 aarch64 机器也能编但编出来的包要格外关注 glibc 版本和 so 依赖否则装到 UOS 上会重现 2.2 节的问题。编译机装好系统后先把基础工具链补齐。UOS 是 Debian 系包管理走 apt但要用 rpmbuild 出 rpm 包需要额外把 rpm-build 装上。注意这里有一个很容易翻车的点UOS 本身是 dpkg 体系装 rpm-build 不等于系统变成 rpm 体系只是编译机上多了一个 rpmspec 编译工具。apt update apt install -y build-essential rpm-build zlib1g-dev libssl-dev libpam-dev rpmbuild --showrc | grep _topdirlibpam-dev对应 pam-devellibssl-dev对应 openssl-develzlib1g-dev对应 zlib-devel这套包名映射在 Debian 系里是固定的。最后一行rpmbuild --showrc | grep _topdir是为了确认 rpmbuild 的工作目录Debian 系里默认可能是/root/rpmbuild也有部分系统是/usr/src/rpm。后续 SPEC 文件的源码包要放进%{_topdir}/SOURCES编译产物会输出到%{_topdir}/RPMS/aarch64这个路径不能用死每台编译机都可能不同。3.2 configure 参数这几项不配好装上去就是半残源码编译 OpenSSH 的 configure 参数每个发行版都有自己一套惯例直接照抄 CentOS 的会有两个隐患一是把--with-ssl-dir写死成/usr/lib64导致链接不到正确的 libcrypto二是没指定--sysconfdir/etc/ssh编译出来的 sshd 默认找/usr/etc下的配置升级完连配置都读不到。我用的配置组合是这样照着抄基本不会出问题cd /root/rpmbuild/BUILD/openssh-9.6p1 ./configure \ --prefix/usr \ --sysconfdir/etc/ssh \ --with-pam \ --with-zlib \ --with-ssl-dir/usr \ --with-privsep-path/var/empty/sshd \ --mandir/usr/share/man \ --disable-libutil make -j$(nproc)--prefix/usr很关键它保证最终安装时二进制进入/usr/bin和/usr/sbin而不是/usr/local/bin。/usr/local/bin在 PATH 里通常排在/usr/bin前面一旦装到/usr/local下面ssh 命令可能被老版本覆盖产生“明明 rpm 是新版、ssh -V 还是旧版”的假象。--sysconfdir/etc/ssh让 sshd_config 留在原路径升级后配置文件不用迁移。--with-pam打开 PAM 认证支持UOS 的账户认证依赖 PAM不开的话密码认证会出各种诡异问题。--with-privsep-path/var/empty/sshd设置特权分离目录这个目录必须存在且权限正确否则 sshd 启动时直接报错退出。3.3 用 SPEC 文件打 rpm源码编译进包的关键configure 和 make 直接编出来的是一套可执行文件要变成可分发、可回滚的 rpm必须写 SPEC 文件。SPEC 文件描述包名、版本、依赖、构建步骤和安装步骤rpmbuild 会按照它把 make install 的内容打成安装包。Name: openssh Version: 9.6p1 Release: 1.uos Summary: OpenSSH 9.6p1 for UOS aarch64 License: BSD Group: Applications/Networking Source0: openssh-9.6p1.tar.gz BuildRequires: gcc, pam-devel, openssl-devel, zlib-devel Requires: openssl, zlib, pam %description OpenSSH 9.6p1 repackaged for UOS aarch64. %prep %setup -q %build ./configure --prefix/usr --sysconfdir/etc/ssh \ --with-pam --with-zlib --with-ssl-dir/usr \ --with-privsep-path/var/empty/sshd \ --mandir/usr/share/man --disable-libutil make -j%{_smp_mflags} %install rm -rf %{buildroot} make install DESTDIR%{buildroot} %files /usr/bin/ssh /usr/bin/sftp /usr/bin/scp /usr/sbin/sshd /usr/libexec/openssh/sftp-server /etc/ssh/sshd_config %attr(0755,root,root) /var/empty/sshdRelease: 1.uos用来区分和官方 rpm 的版本号关系批量升级时rpm -Uvh能正确识别新旧版本。Requires: openssl, zlib, pam不是写死的编译后可以用rpmbuild -ba再配合ldd核对如果缺哪个依赖可以用rpm --requires查看自动生成的依赖列表。需要注意%files段必须准确列出安装路径漏列会导致 rpm 装上后某些二进制不存在或者卸载时残留文件。cd /root/rpmbuild/SPECS rpmbuild -ba openssh-9.6p1.spec ls -lh /root/rpmbuild/RPMS/aarch64/编译结束后在RPMS/aarch64下会看到openssh-9.6p1-1.uos.aarch64.rpm、openssh-server-9.6p1-1.uos.aarch64.rpm、openssh-clients-9.6p1-1.uos.aarch64.rpm等文件这些就是可以直接分发到生产机的安装包。装包之前先在自己的测试机上跑一遍rpm -ivh确认没有依赖冲突再拿去生产。4. 升级实施与回滚先保当前会话再谈版本号4.1 升级前备份和“后悔药”远程升级 OpenSSH 最怕的不是版本升不上去而是当前会话被自己杀掉。所以升级实施的第一步不是装包而是把备份做完整。上一章在材料准备阶段已经把配置和二进制复制到/opt/ssh_upgrade/backup下这节补一个压缩包把整个备份目录固化为一个可移动的文件tar czf /opt/ssh_upgrade/backup_$(date %Y%m%d).tar.gz \ -C /opt/ssh_upgrade backup sha256sum /opt/ssh_upgrade/backup_$(date %Y%m%d).tar.gz /opt/ssh_upgrade/backup.sha256这里把备份打成 tar.gz 是为了防止升级过程中误删了/opt/ssh_upgrade目录。sha256 记录在案回滚前可以先校验备份包是否完整避免“备份文件坏了”这种最尴尬的情况。另一个实用技巧如果目标机上装了 yum可以用yumdownloader --resolve openssh-server openssh-clients在当前源里把旧版本 rpm 拉下来如果没有 yum就老老实实用刚才的 tar.gz两种方式都算数。4.2 安装实施不要手动重启用守护脚本接管安装这一步很多人会犯一个低级错误rpm -Uvh 装完新包马上执行systemctl restart ssh然后当前终端瞬间断连ssh 服务又没起来远程彻底失联。正确的做法是把“重启 sshd”这个动作延期到后台执行并且在重启前先做配置语法检查。我这里用的是守护脚本方案核心逻辑是当前会话还在时只拷贝 rpm 包真正重启动作放到 nohup 后台延迟几十秒给远程操作留出缓冲时间。cd /opt/ssh_upgrade/rpm rpm -Uvh openssh-9.6p1-1.uos.aarch64.rpm \ openssh-server-9.6p1-1.uos.aarch64.rpm \ openssh-clients-9.6p1-1.uos.aarch64.rpm cat /tmp/restart_sshd.sh EOF #!/bin/bash sleep 20 /usr/sbin/sshd -t if [ $? -eq 0 ]; then systemctl restart ssh echo $(date) restart ok /tmp/ssh_upgrade.log else echo $(date) config error, skip restart /tmp/ssh_upgrade.log fi EOF chmod x /tmp/restart_sshd.sh nohup /tmp/restart_sshd.sh /tmp/ssh_restart.log 21 逻辑拆解一下先执行 rpm -Uvh 完成包替换这一步不会立刻重启服务当前 ssh 会话不断。然后写入一个后台脚本脚本先 sleep 20 秒这 20 秒里如果发现连接异常或命令执行有误可以在后台脚本生效前手动 kill 掉。/usr/sbin/sshd -t是配置语法校验如果新版本 sshd_config 有语法错误这一步会直接暴露脚本会跳过重启并将错误记入日志而不是把服务搞挂。只有当sshd -t通过后才执行systemctl restart ssh注意服务名一定是ssh而不是sshd。nohup保证脚本不随当前 ssh 会话退出而终止。4.3 重启后的验证与配置收敛重启完成后第一时间确认新版本真正生效。ssh -V输出的可能还是老版本原因后面避坑部分会讲这里先看绝对路径的执行结果/usr/bin/ssh -V 21 /usr/sbin/sshd -V 21 systemctl is-active ssh tail -30 /var/log/auth.log | grep -i ssh重点看/usr/sbin/sshd -V是否输出OpenSSH_9.6p1以及 auth.log 里有没有认证失败记录。9.6p1 的 sshd_config 相比旧版有一些推荐配置变化比如PermitRootLogin的默认策略我会把新配置模板正式部署前先 diff 一遍diff /etc/ssh/sshd_config /etc/ssh/sshd_config.rpmnew 2/dev/nullrpm 安装新包时如果检测到已有配置文件被改动过会生成一个.rpmnew文件而不是直接覆盖。diff 出来以后把原有的自定义配置项合并回新模板再重启一次 ssh让配置收敛到 9.6p1 的语义下。4.4 回滚版本没升上去但连接不能丢如果sshd -t不通过或者重启后 ssh 服务直接起不来就必须走回滚路径。回滚的原则是“先恢复服务再讨论版本”。服务停了的时候优先从带外管理口进入系统或者找机房同事协助先把 ssh 拉起来systemctl stop ssh rm -f /usr/sbin/sshd /usr/bin/ssh /usr/bin/sftp /usr/bin/scp cp -a /opt/ssh_upgrade/backup/sshd.bin_20240xxx /usr/sbin/sshd cp -a /opt/ssh_upgrade/backup/ssh.bin_20240xxx /usr/bin/ssh cp -a /opt/ssh_upgrade/backup/ssh_etc_20240xxx /etc/ssh chmod 755 /usr/sbin/sshd /usr/bin/ssh /usr/sbin/sshd -t systemctl start ssh如果之前用 yumdownloader 保存了旧 rpm更干净的做法是rpm -Uvh --oldpackage openssh-server-旧版本.rpm让 rpm 数据库和实际二进制保持一致。用 tar 备份回滚的唯一风险是 rpm 数据库里记录的版本还是 9.6p1后续再执行rpm -qa会看到版本不对。因此回滚完成后建议用rpm -qa --qf %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n | grep openssh核对数据库状态必要时把对应的旧版本 rpm 重新安装一次让数据库口径变回真实状态。5. 避坑统信UOS aarch64 上升级 OpenSSH 的五个翻车点5.1 systemctl restart sshd 报错服务名是 ssh不是 sshd现象执行systemctl restart sshd提示Unit sshd.service not foundssh 服务没有反应。原因统信UOS 继承 Debian 的服务命名规范OpenSSH 服务在 systemd 中注册为ssh.service而不是 RHEL 系列的sshd.service。新装的 rpm 包虽然来自自制 SPEC但服务脚本沿用了 UOS 体系的命名所以 sshd 这个名字在 UOS 上根本不存在。解决统一改口用systemctl restart ssh、systemctl status ssh。在写启动脚本和批量执行命令时先把服务名变量化避免每台机器手改一次。检查开机自启也用systemctl enable ssh。5.2 配置没问题但 sshd 起不来PAM 模块路径引用错误现象sshd -t通过但systemctl start ssh后服务立即失败journalctl -u ssh显示PAM unable to dlopen(/usr/lib64/security/pam_unix.so)之类错误。原因UOS 的 PAM 模块目录是/usr/lib/aarch64-linux-gnu/security但 OpenSSH 的 SPEC 文件如果编译时显式指定了模块路径或者编译机是 CentOS 类系统模块路径会被写死成/usr/lib64/security。运行时根本找不到模块PAM 认证直接崩溃。解决编译 configure 时不要额外指定 PAM 模块路径让--with-pam自动探测系统当前路径。升级后如果还出现这个报错手动建一个软链接ln -s /usr/lib/aarch64-linux-gnu/security /usr/lib64/security但这是临时应急手段根因还是重新编译。5.3 root 登录被拒统信UOS 默认锁定 root 账户现象密码输入无误但 ssh 登录时一直提示Permission denied或者干脆Root login is not allowed普通用户却能正常登录。原因统信UOS 桌面版和部分服务器版默认锁定 root 账户/etc/shadow中 root 的密码字段是锁状态导致 PAM 认证阶段 root 永远无法通过。这与 OpenSSH 版本无关但升级后容易把注意力误判到 sshd_config 上排查方向跑偏。解决先确认 root 账户状态执行passwd -S root输出中看到L代表锁定。解锁并设置密码passwd root系统会提示输入新密码。然后在/etc/ssh/sshd_config中确认PermitRootLogin yes已设置重启systemctl restart ssh。如果安全策略要求禁止 root 直接登录可以保持锁定改用普通用户加 sudo 的方式不要强行解开。5.4 远程执行升级命令时连接断掉现象在远程会话里执行完 rpm -Uvhssh 窗口瞬间卡死再重连已经超时服务没有起来。原因新版 sshd 安装后如果用systemctl restart ssh手动重启正在跑的 sshd 进程被终止当前 ssh 会话随之断开如果新 sshd 因为配置或依赖问题没有正常接管端口重连自然失败。没有守护脚本兜底只能去机房了。解决升级动作一定要按 4.2 的做法拆成“装包”和“延迟重启”两步。装包不触发重启重启放到 nohup 后台预留 20 秒以上缓冲重启前先/usr/sbin/sshd -t校验失败则跳过重启。这个方案我从那以后每次都强制走一遍再也没半夜跑过机房。5.5 ssh -V 显示的版本没变现象rpm -qa | grep openssh看到的是 9.6p1执行ssh -V却还是OpenSSH_7.6p1这类老版本号。原因系统中存在两个 ssh 可执行文件。最常见的是/usr/local/bin/ssh优先级排在/usr/bin/ssh之前而/usr/local/bin下的旧版没有被 rpm 包接管另一种可能是 UOS 用update-alternatives管理 ssh 命令软链接还指向旧版本。解决用which -a ssh列出所有路径再用/usr/bin/ssh -V看真实版本。如果是/usr/local/bin里的旧文件备份后删除或改名如果是 alternatives 管理用update-alternatives --config ssh切换到新版路径。验证时不要只敲ssh -V要用绝对路径这是最容易误判的一步。6. 批量部署与验证清单交付后如何确认真的升成功了批量升级前我会先在 3 台配置相同的机器上完整走一遍第 4 章的流程确认没有人肉操作差异后再推全量。批量分发用脚本能省不少时间但每台机器的结果必须回收确认不能只看命令执行完就结束。for host in $(cat targets.txt); do scp -P 22 openssh-9.6p1-1.uos.aarch64.rpm \ openssh-server-9.6p1-1.uos.aarch64.rpm \ openssh-clients-9.6p1-1.uos.aarch64.rpm \ root$host:/opt/ssh_upgrade/ ssh -p 22 root$host bash /opt/ssh_upgrade/install_ssh_9.6p1.sh ssh -p 22 root$host /usr/sbin/sshd -V 21 donetargets.txt 每行一台内网 IP先确保这些机器端口和带外管理可用。脚本里 4.2 的守护重启逻辑要完整保留不要因为批量就简化成“装完立刻重启”。每一台都执行完后再统一收集结果重点看/usr/sbin/sshd -V的输出是否都是 9.6p1。最后附一份验证清单建议每台机器都过一遍再标记完成验证项命令期望结果版本/usr/sbin/sshd -VOpenSSH_9.6p1服务状态systemctl is-active sshactive配置语法/usr/sbin/sshd -t无输出退出码 0本地登录ssh localhost认证成功无报错sftp 传输sftp localhost get 文件文件完整传输审计日志grep -i ssh /var/log/auth.log无大量 Failed password这套清单执行完我才会把机器标记为“完成升级”。以前我也干过更初级的事新包直接往生产上一丢systemctl restart sshd然后远程断了那次去机房折腾到凌晨。从那以后我每次升级 OpenSSH 都强制先备份、写守护重启脚本、确认服务名检查 PAM最后再过一遍清单。这份资源里的编译与升级路径就是那次以后固化下来的流程希望帮到你。本文还有配套的精品资源点击获取
返回列表