资讯动态

RockyLinux OpenSSH升级加固:RPM打包至10.0p1与OpenSSL 3.5.0

发布时间:2026/10/20 21:18:37 来源:尧图企业网站定制
简介面向Rocky Linux 9.5 x86_64服务器OpenSSH安全加固的一站式升级包适配OpenSSH 10.0p1与OpenSSL 3.5.0版本组合内含预编译好的RPM软件包并配套自动升级加固脚本能够帮助运维人员快速修复SSH服务已知漏洞、完成安全基线加固有效免去手动编译和依赖冲突带来的实施风险。包内共6个文件包括5个RPM安装包和1个shell升级脚本其中RPM覆盖主程序、客户端、服务端及相关系统依赖脚本则自动处理文件替换、服务重启与开机自启配置整个压缩包仅10.96MB轻量易部署适合离线批量安装。整套升级方案已在Rocky Linux 9.5环境下实际验证通过适用于内网批量交付、等保整改、生产环境SSH升级等多种场景运维人员拿到即可执行能显著压缩升级窗口并降低操作难度。目前已有205人学习下载适合系统运维与安全工程师作为SSH专项加固参考下载后不仅能获得完整RPM集合还可得到可直接运行的加固脚本便于后续按需调整、复用或二次封装。1. 升级加固脚本把 RockyLinux 9.5 的 OpenSSH 安全带到 10.0p1 与 OpenSSL 3.5.0漏扫报告把一堆 OpenSSH 高危漏洞拍到脸上的时候我心里清楚系统还是 RockyLinux 9.5 自带的 8.x 版本openssh 加固这件事拖不过这个星期了。要解决的是一整套问题不只是跑一遍 make install——用 rpm 在 x86_64 架构上把 OpenSSH 升到 10.0p1同时把底层 OpenSSL 提到 3.5.0最后再对 sshd_config 做一轮安全加固。这份升级加固脚本把整个流程拧成一条命令检查环境、构建 RPM、备份、升级、加固、验证每一步都留了回滚的余地适合手里管着一批生产服务器的运维同学。2. 架构设计RPM 重打包 SSL 先行 sshd 基线加固的三层逻辑拿到这套脚本我第一反应不是直接执行而是先看它的处理顺序。整个方案拆成三层第一层用 rpm 重打包替代源码安装让包管理器接管文件的来去第二层把 OpenSSL 3.5.0 先构建成独立 RPM再用它编译 OpenSSH 10.0p1解决依赖顺序问题第三层是 sshd_config 的基线加固和升级后的验证回滚。这三层相互独立又按严格的先后关系串在一起理解了这一点后面看脚本就不会晕。2.1 为什么选 RPM 打包而不是直接 make install在生产服务器上现场执行./configure make make install属于典型的图省事埋隐患。装完ssh -V确实变了但rpm -q openssh显示的还是系统旧版本rpm -V openssh会报一堆文件校验失败。半年后安全基线扫描再过来客户端版本扫描、审计记录、包管理一致性全都对不上账想回滚还得手动删文件删不干净又是一笔糊涂账。把源码打成 RPM 再安装等于把升级纳入包管理器管辖。文件清单由 spec 的%files段管理升级前后rpm -ql能对照要回滚直接rpm -Uvh --oldpackage装回旧包后续做批量分发、做自动化运维也能复用现成的包分发通道。脚本里构建依赖放在 rpmbuild 环境源码包丢进 SOURCESspec 丢进 SPECSrpmbuild -bb一次出包结构很清爽这也是 RHEL 系生产环境最常用的升级打包套路。我这边组织构建目录时一般长这样/root/rpmbuild/ ├── SPECS/ │ ├── openssl.spec │ └── openssh.spec ├── SOURCES/ │ ├── openssl-3.5.0.tar.gz │ └── openssh-10.0p1.tar.gz ├── BUILD/ # rpmbuild 自动生成 ├── RPMS/x86_64/ # 构建出的 rpm 落在这里 ├── SRPMS/ └── BUILDROOT/构建环境本身需要 gcc、make、zlib-devel、pam-devel、krb5-devel 这些依赖脚本里会先用一条dnf install全部装齐。包管理器管得住后面做版本基线、做迁移复制才有依据这也是我坚持不走源码安装的根本原因。2.2 升级顺序为什么 OpenSSL 3.5.0 必须排在 OpenSSH 10.0p1 前面OpenSSH 10.0p1 对 OpenSSL 的要求比旧版高出一截。编译期 configure 会做版本检查运行期 sshd 还会直接调用 libcrypto 里的新接口RockyLinux 9.5 自带的 OpenSSL 3.0.x 拿过来直接编译新版 ssh运气好能编过但 sshd 起服务时可能出现 symbol 缺失或者握手阶段表现诡异。所以脚本把 OpenSSL 3.5.0 的构建放在最前面顺序不能反。这里有个容易用力过猛的点直接rpm -Uvh覆盖系统自带的 openssl-libs会把 dnf、yum、curl 一起搞坏因为这些工具都动态依赖/usr/lib64/libcrypto.so.3。我的做法是给 OpenSSL 3.5.0 单独开一个 prefix装到/usr/local/ssl不碰系统库路径。这样新版库只被 sshd 通过编译期指定的路径找到系统里其他服务完全不感知变化。编译 OpenSSH 时对应的配置参数是--with-ssl-dir/usr/local/ssl让 configure 去那个前缀下找头文件和库。装完以后用ldd /usr/sbin/sshd | grep ssl确认实际加载的是 3.5.0 的 libcrypto而不是系统旧库。这一步验证很关键编译成功不代表运行期加载对了我见过不少升级后 sshd 起不来的案例最后都查到这里。2.3 脚本主流程六个阶段串起来的一条命令整体流程设计为 check_env、build_rpm、backup、upgrade、secure、verify 六段。check_env 检查系统版本、架构是不是 x86_64、磁盘空间够不够build_rpm 负责装构建依赖、拉源码、执行 rpmbuildbackup 把 sshd_config、pam.d/sshd、moduli 等文件打上时间戳备份upgrade 按 openssl 在前、openssh 在后的顺序安装 rpmsecure 阶段应用加固基线verify 阶段用sshd -t、sshd -T、ss -tlnp确认服务没有坏掉。每段都写成独立函数任一段失败就中断并跳 rollback。我拆这类脚本时很看重这个升级操作不能是一长串裸命令否则中间某个步骤出错机器可能就地失联。比如说 backup 失败直接退出rollback 段从备份目录恢复 sshd_config 和 pam 文件再把旧 rpm 装回去。脚本里的备份目录保留了旧版 rpm 包、配置、pam.d 文件回滚命令就是rpm -Uvh --oldpackage 旧包然后恢复配置、重启 sshd。3. 核心模块拆解spec 文件、加固策略和主脚本的关键实现这一章直接看代码。三个文件最值得读openssh.spec 决定打出来的 rpm 长什么样sshd_config 加固模板决定升级后 ssh 的安全姿态run_upgrade.sh 把前两者串成可靠的主流程。代码块后面我会把每个参数的含义和排错思路讲清楚照抄作业时注意别漏注释里写的坑。3.1 openssh.specconfigure 参数和文件清单是灵魂spec 是最容易抄歪的文件抄错一个路径rpmbuild 可能编不出来或者编出来的包装不上。核心段是这样%define _prefix /usr %define _sysconfdir /etc/ssh Name: openssh Version: 10.0p1 Release: 1%{?dist} Summary: OpenSSH 10.0p1 rebuilt with OpenSSL 3.5.0 License: BSD Source0: %{name}-%{version}.tar.gz BuildRequires: gcc make zlib-devel openssl-devel pam-devel krb5-devel %description Rebuild of OpenSSH with a separate OpenSSL 3.5.0 prefix. Used for upgrade hardening on RockyLinux 9.5 x86_64. %prep %setup -q %build %configure \ --with-pam \ --with-ssl-dir/usr/local/ssl \ --with-privsep-path/var/empty/sshd \ --without-x11-forwarding \ --disable-utmp \ --with-md5-passwords make %{?_smp_mflags} %install make install DESTDIR%{buildroot} %files /usr/sbin/sshd /usr/bin/ssh /usr/bin/scp %config(noreplace) /etc/ssh/sshd_configVersion 写在 10.0p1Release 从 1 开始。以后打小补丁就把 Release 递增小版本升级就改 Versionrpm 的版本比较规则会自动处理新旧关系不会出现装不上去的情况。--with-ssl-dir/usr/local/ssl是本次打包的核心它把 OpenSSH 的编译和运行都指向独立的 OpenSSL 3.5.0避免污染系统库。关键参数的作用对照如下configure 参数作用--with-pam对接系统 PAM保留原有的账号认证方式--with-ssl-dir/usr/local/ssl指定 OpenSSL 3.5.0 的编译前缀--without-x11-forwarding关闭 X11 转发减少攻击面--with-privsep-path/var/empty/sshd权限分离目录维持系统默认的 /var/empty/sshd--disable-utmp关闭 utmp 记录避免和系统自带 pam 冲突最后%config(noreplace)这个标记值得单独说。sshd_config 属于会被管理员改动的文件rpm 安装时如果检测到本地已经改过noreplace 保证它不覆盖现有文件而是生成一份.rpmnew。反过来如果 spec 里漏了这个标记新包会把加固过的配置直接冲掉升级完反而退回默认配置。我第一次打包就吃过这个亏后来所有.conf 类文件都按这个习惯处理。3.2 sshd_config 加固基线从不敢关密码登录到按策略开关加固策略最容易犯的错是一上来就PasswordAuthentication no。接手的新机器可能还没注入任何公钥直接关掉密码登录等于把自己锁在门外。所以脚本把加固分成基础层和高级层基础层保证安全下限高级层等确认公钥可用后再启用。基础加固模板长这样# 基础加固项 PermitRootLogin no PubkeyAuthentication yes PasswordAuthentication yes PermitEmptyPasswords no MaxAuthTries 3 LoginGraceTime 30 X11Forwarding no AllowTcpForwarding no ClientAliveInterval 300 ClientAliveCountMax 0 # sftp 子系统走 internal-sftp不调系统命令 Subsystem sftp internal-sftp这里PasswordAuthentication yes是故意的。脚本跑完后管理员还有机会在窗口期里注入公钥、验证新配置等确认公钥能登录了再把高级加固项放开。我一般建议把高级项单独放一个文件/etc/ssh/sshd_config.d/hardening.conf用主配置里的Include引入切换策略时只动这个文件不用碰主配置。# 高级加固项确认已注入公钥后再启用 PasswordAuthentication no KbdInteractiveAuthentication no AllowUsers ops deploy UseDNS noAllowUsers做精确到用户的访问控制业务侧如果有跳板机还可以配合Match Address限制来源 IP。UseDNS no是老生常谈反解失败会拖慢连接建立内网场景没必要开。这套分层设计的好处是降级容易某个业务组件需要临时开密码登录只改hardening.conf里一行sshd -t校验后 reload 就生效。3.3 run_upgrade.sh备份、升级、加固、验证一体主脚本把前面所有逻辑收口成一条命令核心流程如下#!/bin/bash set -euo pipefail TS$(date %Y%m%d%H%M%S) BACKUP_DIR/root/ssh_upgrade_backup/$TS SSHD_CONF/etc/ssh/sshd_config mkdir -p $BACKUP_DIR # ---------- 1. 备份关键文件 ---------- cp $SSHD_CONF $BACKUP_DIR/sshd_config.bak cp /etc/pam.d/sshd $BACKUP_DIR/pam.d-sshd.bak 2/dev/null || true cp /etc/ssh/moduli $BACKUP_DIR/moduli.bak 2/dev/null || true rpm -qa | grep -E ^(openssh|openssl) $BACKUP_DIR/old-rpms.txt # ---------- 2. 安装新 rpm ---------- rpm -Uvh RPMS/x86_64/openssl-3.5.0-1.el9.x86_64.rpm rpm -Uvh RPMS/x86_64/openssh-10.0p1-1.el9.x86_64.rpm \ RPMS/x86_64/openssh-server-10.0p1-1.el9.x86_64.rpm \ RPMS/x86_64/openssh-clients-10.0p1-1.el9.x86_64.rpm # ---------- 3. 应用加固基线 ---------- if ! grep -q ^PermitRootLogin no $SSHD_CONF; then sed -i s/^#*PermitRootLogin.*/PermitRootLogin no/ $SSHD_CONF fi if ! grep -q ^ClientAliveInterval $SSHD_CONF; then echo ClientAliveInterval 300 $SSHD_CONF echo ClientAliveCountMax 0 $SSHD_CONF fi # ---------- 4. 校验并重启 ---------- sshd -t systemctl restart sshd # ---------- 5. 验证 ---------- sshd -V 21 | head -n1 ss -tlnp | grep :22 set -euo pipefail保证某一步失败立即退出避免带病继续往下走。备份目录打时间戳回滚时就找这个目录。安装顺序固定为先 ssl 后 ssh这是第 2 章讲过的依赖关系。sed 和 grep 的组合实现幂等已经配过的项不会被重复追加脚本重跑不会把配置改乱。重启前有个细节sshd -t只校验语法不保证重启后连接能建起来。我会在重启前另外开一个后台连接做探测连接不通就自动从BACKUP_DIR恢复配置并回滚 rpm。这个预处理脚本里没写出来但运维老手通常都会加毕竟远程服务器失联的代价太大。4. 运行与验证从源码到 RPM 落地的完整跑通记录这一章完整走一遍构建到安装的流程照着敲即可。构建机和目标机可以是同一台但我建议分开构建机负责产出 rpm目标机只负责安装这样产物可迁移、可复验。4.1 准备构建环境构建机需要先装工具链和依赖一条命令搞定dnf groupinstall -y Development Tools dnf install -y rpm-build rpmdevtools wget tar gcc make \ zlib-devel openssl-devel pam-devel krb5-devel rpmdev-setuptreerpmdev-setuptree会自动生成~/rpmbuild目录结构省得手动 mkdir。zlib-devel、pam-devel、krb5-devel 分别是压缩库、PAM 认证、Kerberos 支持的头文件缺一个 configure 就会在检查环节报错。openssl-devel装的是系统 OpenSSL 的头文件新版 OpenSSL 虽然编到独立目录但 OpenSSH 编译时还会引用部分系统库头文件不要省略。4.2 一键构建两个 RPM 包源码下载地址建议用自己的内网镜像脚本里用变量占位#!/bin/bash set -eumo pipefail MIRROR_BASE${MIRROR_BASE:-https://mirror.example.internal/pub} RPMBUILD_DIR~/rpmbuild mkdir -p $RPMBUILD_DIR/{SPECS,SOURCES,BUILD,RPMS,SRPMS} wget -q $MIRROR_BASE/openssl-3.5.0.tar.gz -O $RPMBUILD_DIR/SOURCES/openssl-3.5.0.tar.gz wget -q $MIRROR_BASE/openssh-10.0p1.tar.gz -O $RPMBUILD_DIR/SOURCES/openssh-10.0p1.tar.gz cp openssl.spec openssh.spec $RPMBUILD_DIR/SPECS/ rpmbuild -bb $RPMBUILD_DIR/SPECS/openssl.spec rpmbuild -bb $RPMBUILD_DIR/SPECS/openssh.spec echo RPM 产物: ls -lh $RPMBUILD_DIR/RPMS/x86_64/rpmbuild -bb表示只构建二进制包不产出 src.rpm。两个 spec 必须匹配各自的源码包名否则%setup -q解压阶段会找不到目录。构建完成后RPMS/x86_64/下应该有四个关键产物文件作用安装顺序openssl-3.5.0-1.el9.x86_64.rpm独立前缀 OpenSSL1openssh-10.0p1-1.el9.x86_64.rpmOpenSSH 主程序2openssh-server-10.0p1-1.el9.x86_64.rpmsshd 服务2openssh-clients-10.0p1-1.el9.x86_64.rpmssh/scp 客户端24.3 安装升级并做连通性验证把 rpm 包 scp 到目标机执行升级脚本# 在构建机上执行 scp -P 22 RPMS/x86_64/*.rpm root目标机IP:/root/rpm_install/ # 在目标机上执行升级 cd /root/rpm_install bash run_upgrade.sh # 升级后验证 ssh -V systemctl status sshd ss -tlnp | grep :22 sshd -T | grep -E permitrootlogin|passwordauthentication|pubkeyauthenticationsshd -T会输出实际生效的配置项注意它输出的是小写键名。如果permitrootlogin no和pubkeyauthentication yes都出现在输出里说明加固基线已经生效。ss -tlnp确认 22 端口处于 LISTEN 状态systemctl status sshd再看一眼进程是否稳定运行。验证阶段最好保持当前 ssh 会话不断另开一个新窗口测试登录两边都通了才算升级成功。升级完不要急着关旧会话先观察一段时间。比较稳妥的做法是把新会话保持 5 到 10 分钟确认没有连接抖动、没有反复断开再退出旧会话。这是远程升级的基本素养也是我在这类操作上吃过亏留下的习惯。5. 避坑指南远程升级最容易翻车的五个真实现场这里记录的是我在实际升级过程中踩过的坑也是这套脚本能稳定复跑的关键。每一条都按现象、原因、解决三步展开下次你遇到同样问题可以直接对号入座。5.1 升级后 sshd 起不来SELinux 把进程挡在门外现象systemctl restart sshd提示 job failedjournalctl -u sshd里看到 avc denied 记录sshd 反复重启但 22 端口就是起不来。原因新编译的 sshd 二进制落盘后文件 SELinux 上下文可能不是标准的sshd_exec_t尤其是经过 scp 复制或者 rpmbuild 临时目录搬运过的文件上下文很容易跑偏。Rocky 9 默认 SELinux 是 Enforcing上下文不对就直接拒绝执行。解决先恢复文件上下文再重启服务restorecon -Rv /usr/sbin/sshd /etc/ssh/sshd_config systemctl restart sshd ausearch -m avc -ts recent | tail -20restorecon把 sshd 相关文件的上下文恢复到策略默认值。ausearch用来确认还有没有其他 AVC 拒绝记录如果 restorecon 后仍有拦截再用semanage fcontext针对具体路径加规则。这个问题在 RHEL 系升级自定义软件时太常见了养成重启前先 restorecon 的习惯能省很多事。5.2 关掉密码登录后所有人都连不上了现象高级加固项一上PasswordAuthentication no生效结果所有同事都报连不上连你自己也被挡在外面。原因公钥没有提前写入目标机的authorized_keys或者写入了但~/.ssh目录权限不对sshd 直接忽略公钥加上密码登录已关等于封死所有入口。解决关闭密码登录前先在另一个终端验证公钥链路是通的。用ssh -o PasswordAuthenticationno -i 你的私钥 用户主机试连一次能进再改配置。改完以后立刻新开会话验证一次确认能登录再退出旧会话。脚本里我建议把公钥注入做成前置步骤放在 backup 阶段之后、修改配置之前避免人工忘记。5.3 dnf 报 SSL 证书错误软件仓库拉取失败现象升级完 openssl 之后在机器上执行dnf makecache报 SSL certificate 相关错误或者提示从仓库下载元数据失败。原因新版 OpenSSL 的 rpm 覆盖了系统/usr/lib64下的 libcrypto.so.3dnf 依赖的libssl.so.3运行时不兼容SSL 握手直接挂掉。这就是第 2 章讲的替换系统库的典型翻车现场。解决如果已经踩了需要回滚 openssl-libsrpm -Uvh --oldpackage openssl-libs-原有版本.el9.x86_64.rpm再检查/usr/lib64/libcrypto.so.3指向是否恢复正常。正确做法是从一开始就把 OpenSSL 3.5.0 装到独立 prefix比如本脚本的/usr/local/ssl通过ldconfig单独配置加载路径彻底绕开系统库目录。5.4 rpm 安装时报文件冲突包管理器拒绝执行现象rpm -Uvh报file /usr/sbin/sshd conflicts between attempted installs或者提示包已经安装升级无法继续。原因目标机上之前可能装过第三方源的 openssh文件归属和本次 rpm 包冲突也可能系统里残留了旧版 rpm 的%config残留文件导致新包落盘时撞车。解决升级前先查包归属rpm -qf /usr/sbin/sshd确认现有包来自官方源。正常情况rpm -Uvh可以覆盖升级不需要--force。只有确认冲突文件确实是旧版遗留、且备份过原文件时才加--replacefiles。这是最后的办法不要无脑--force --nodeps否则依赖关系会乱成一锅粥。5.5 systemd socket 激活占着 22 端口restart sshd 不生效现象systemctl restart sshd提示成功但ss -tlnp | grep :22 看到监听进程对应的是sshd.socketssh 连接也不走新的 sshd 进程。原因Rocky 9 默认采用 systemd socket 激活方式22 端口由sshd.socket持有sshd.service 是按需启动的状态。只 restart sshd.service监听 socket 还是旧的新配置没真正接管连接。解决关掉 socket 激活改用传统 service 方式启动systemctl stop sshd.socket systemctl mask sshd.socket systemctl enable --now sshd systemctl status sshdmask 之后 socket 单元不会随开机自启22 端口完全交给 sshd.service 管理。这样升级后的新 sshd 才能真正接管全部连接日志排查也更直观不会出现明明 restart 了却看不到新进程日志的玄学问题。6. 二次开发把加固基线接进你的运维体系脚本跑通之后真正的价值在于能不能变成可复用、可调参的运维工具。这一章讲两个改造方向。6.1 把加固项抽成变量按环境出不同基线不同环境对 sshd 的安全要求是不一样的内网开发环境可能允许密码登录跳板机生产环境则要求全部走公钥。把加固项抽成变量脚本就能一套通吃HARDEN_LEVEL${HARDEN_LEVEL:-standard} case $HARDEN_LEVEL in standard) sed -i s/^#*PermitRootLogin.*/PermitRootLogin no/ $SSHD_CONF ;; strict) sed -i s/^#*PasswordAuthentication.*/PasswordAuthentication no/ $SSHD_CONF sed -i s/^#*PermitRootLogin.*/PermitRootLogin no/ $SSHD_CONF ;; esacHARDEN_LEVEL做成环境变量后不同环境的部署脚本只需要在调用前声明各自的级别不用改主脚本逻辑。我一般还会把MaxAuthTries、LoginGraceTime这类参数也纳入变量表形成一份完整的安全基线模板随环境变量切换。6.2 用 Ansible 把升级加固变成可重复的批量任务单机脚本跑通后接下来是批量。用 Ansible 把 rpm 分发和脚本执行包装成 role几十台机器一次性搞定- name: 批量升级加固 OpenSSH hosts: {{ target_hosts }} become: true serial: 5 tasks: - name: 上传 rpm 包 copy: src: rpms/{{ item }} dest: /tmp/{{ item }} loop: - openssl-3.5.0-1.el9.x86_64.rpm - openssh-10.0p1-1.el9.x86_64.rpm - openssh-server-10.0p1-1.el9.x86_64.rpm - openssh-clients-10.0p1-1.el9.x86_64.rpm - name: 执行升级加固脚本 script: run_upgrade.shserial: 5控制每次只并发升级 5 台避免一整批机器同时断连导致运维通道全灭。script模块会把脚本推到被管机执行这一步也可以换成调用已经构建好的 rpm 包做本地安装具体取决于你更相信包分发还是脚本分发。改造完成后建议在测试环境先跑一轮完整流程把第 5 章提到的几个坑全部验证一遍确认回滚路径可用后再上生产。第一次把这条升级链路跑通之后我养成了一个习惯凡是涉及 sshd 的变更哪怕只是改一个参数都先把旧配置拉一份副本再做语法校验再考虑重启。后来把脚本交给同事执行出问题最多的也都是跳过验证步骤的。包括现在不管换什么新版本我都是先构建、试装、验证、加固、回滚整套走一遍确认没有断连风险后再批量推。希望这套流程能帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑