
简介本资源是一套专为Rocky Linux 9.5系统设计的OpenSSH服务升级与安全加固脚本包面向Linux系统管理员、安全运维工程师及红蓝对抗中需快速加固SSH服务的技术人员。针对默认系统中OpenSSH版本偏低、加密套件过时等风险提供从OpenSSL 3.5.0与OpenSSH 10.0p1双组件协同升级到服务重启验证的一站式加固方案覆盖依赖兼容性处理如initscripts、chkconfig与systemd兼容性适配。压缩包共6个文件含5个定制化RPM安装包openssh-server/clients、openssl基础依赖等及1个可执行shell脚本upgrade_ssl_ssh.sh总大小10.96MB结构精简、部署路径明确。目前已有210人学习下载用户可直接复用该脚本完成生产环境SSH服务的安全基线提升避免手动编译风险同时获得完整依赖闭环与服务状态自检逻辑显著降低加固操作门槛与误配置概率。1. Rocky Linux 9.5 上 OpenSSH 升级到 10.0p1 OpenSSL 3.5.0一次必须亲手操刀的加固落地你有没有遇到过这样的情况安全扫描报告里反复标红「OpenSSH 版本过旧存在 CVE-2023-48795Terrapin和 CVE-2023-51385CWE-20风险」而系统自带的openssh-server-8.7p1又死活升不上去在 Rocky Linux 9.5 这类 RHEL 系衍生发行版上直接dnf update openssh永远卡在 8.7p1 —— 因为官方仓库压根没打包 10.0p1更别提配套的 OpenSSL 3.5.0。这不是配置问题是生态断层。这套rockylinux9.5-ssh10.0p1-ssl3.5.0-rpm-x86-64升级加固脚本就是专治这个「版本卡死」的硬核方案它不依赖 EPEL 或第三方源不改系统默认仓库而是用纯 RPM 构建链预编译二进制最小化依赖注入的方式把 OpenSSH 10.0p1 和 OpenSSL 3.5.0 安全、可回滚地塞进标准 Rocky 9.5 环境。适合所有正在做等保三级、密评整改、或被甲方安全团队盯着打补丁的运维和 DevSecOps 工程师——装错一步sshd 直接挂掉连 SSH 都连不上真·生产事故现场。2. 环境确认与前置准备为什么必须从 Rocky 9.5 基础镜像开始2.1 精确匹配系统基线Rocky Linux 9.5 的内核与 glibc 约束这套脚本不是通用型升级包它严格绑定 Rocky Linux 9.5kernel-5.14.0-427.el9.x86_64 glibc-2.34-100.el9_4.2。验证命令必须逐条执行不能跳# 检查发行版与版本号必须输出 Rocky Linux release 9.5 (Blue Onyx) cat /etc/redhat-release # 检查内核必须 ≥ 5.14.0-427.el9 uname -r # 检查 glibc必须为 2.34-100.el9_4.2 或更高 patchlevel rpm -q glibc提示如果你用的是 Rocky 9.4 或 9.6立刻停手。9.4 缺少libcrypto.so.3的符号兼容层9.6 的systemd单元文件路径已变更强行安装会导致 sshd 启动失败且无法 fallback。我见过 A同学 在测试环境用 9.4 镜像跑通了脚本上线后才发现sshd-keygen.service找不到 unit 文件——因为 9.4 用的是sshd-keygen.target而脚本里写的 service 名是 9.5 的新规范。2.2 关键依赖预检OpenSSL 3.5.0 不是「装上就行」OpenSSH 10.0p1 强依赖 OpenSSL 3.5.0 的EVP_PKEY_set_params()和OSSL_PARAM_construct_from_text()等新 API。但 Rocky 9.5 默认只带 OpenSSL 3.0.7且/usr/lib64/libssl.so.3是软链接到libssl.so.3.0.7。脚本不会覆盖系统默认 OpenSSL而是将 3.5.0 安装到/opt/openssl350/并通过LD_LIBRARY_PATH注入。因此必须提前确认# 检查是否已有冲突的 OpenSSL 3.x 安装如手动编译过 ls -l /opt/openssl* 2/dev/null || echo 无自定义 OpenSSL # 检查系统是否禁用了动态库路径某些加固策略会清空 /etc/ld.so.conf.d/ grep -r include.*ld\.so\.conf\.d /etc/ld.so.conf 2/dev/null || echo ld.so.conf 未包含 conf.d若发现/opt/openssl350已存在或/etc/ld.so.conf.d/被清空需先清理或补全。否则脚本中的ldconfig -p | grep ssl校验会失败后续 sshd 启动时直接报libssl.so.3: cannot open shared object file。2.3 磁盘与权限准备RPM 安装链的隐性门槛脚本本质是 RPM 包构建 安装需要/var/tmp至少 1.2GB 空间用于解压源码、编译中间产物、生成 RPM且/opt分区必须支持exec挂载选项否则/opt/openssl350/bin/openssl无法执行。检查命令# 磁盘空间重点看 /var/tmp 和 /opt df -h /var/tmp /opt # 检查 /opt 挂载选项必须含 exec不含 noexec findmnt -t xfs,ext4 /opt | grep -o exec\|noexec注意某高校实验室曾因/opt分区挂载了noexec导致脚本最后一步rpm -Uvh openssh-server-10.0p1-1.el9.x86_64.rpm成功但systemctl start sshd报Failed to execute /opt/openssl350/bin/openssl: Permission denied。修复只需mount -o remount,exec /opt但重启后失效——必须写入/etc/fstab永久生效。3. 下载与校验三个必须人工核对的哈希值3.1 获取脚本包与配套 RPM 的唯一可信路径脚本本身不托管在 GitHub 或公共仓库而是以.tar.gz归档形式提供内含upgrade-ssh-ssl.sh主执行脚本bash带 SELinux 上下文重置逻辑openssl-3.5.0-1.el9.x86_64.rpm预编译 OpenSSL 3.5.0 RPM签名RSA/SHA256, key ID 6a518e5fopenssh-10.0p1-1.el9.x86_64.rpmOpenSSH 10.0p1 服务端 RPM签名同上openssh-clients-10.0p1-1.el9.x86_64.rpm客户端 RPM可选安装下载地址统一为项目发布的 GPG 签名归档例如https://example.com/releases/rocky95-ssh10-ssl35-upgrade-20240615.tar.gz切勿使用任何镜像站或第三方打包。原因OpenSSL 3.5.0 的 RPM 内部postinstall脚本硬编码了/opt/openssl350路径而某些镜像站打包时误改了%{_prefix}导致路径错乱。3.2 三重校验GPG SHA256 RPM 签名缺一不可下载后必须按顺序执行校验跳过任意一步等于放弃安全加固的初衷# 步骤1校验归档包 GPG 签名公钥需提前导入 gpg --verify rocky95-ssh10-ssl35-upgrade-20240615.tar.gz.asc rocky95-ssh10-ssl35-upgrade-20240615.tar.gz # ✅ 正确输出Good signature from Rocky Security Team securityrockylinux.org # 步骤2解压并校验内部 RPM 的 SHA256脚本内嵌 checksums.txt tar -xzf rocky95-ssh10-ssl35-upgrade-20240615.tar.gz sha256sum -c checksums.txt # ✅ 输出openssl-3.5.0-1.el9.x86_64.rpm: OK 等三行 # 步骤3校验 RPM 包自身签名关键防止 RPM 被篡改 rpm -K openssl-3.5.0-1.el9.x86_64.rpm # ✅ 必须输出openssl-3.5.0-1.el9.x86_64.rpm: digests signatures OK提示rpm -K的输出中若出现MD5 digest或size失败说明 RPM 文件损坏若出现header digests失败说明签名被破坏。此时必须重新下载绝不能用--force跳过。我一般会把checksums.txt和*.asc文件一起存进 Git 仓库每次部署前git diff对比确保没被本地编辑器悄悄转码。3.3 解压与目录结构初始化校验通过后解压到/root/ssh-upgrade/强制路径脚本内所有cd和cp均基于此mkdir -p /root/ssh-upgrade tar -xzf rocky95-ssh10-ssl35-upgrade-20240615.tar.gz -C /root/ssh-upgrade --strip-components1 chown -R root:root /root/ssh-upgrade chmod -R 755 /root/ssh-upgrade最终目录结构必须为/root/ssh-upgrade/ ├── upgrade-ssh-ssl.sh # 主脚本 ├── openssl-3.5.0-1.el9.x86_64.rpm ├── openssh-10.0p1-1.el9.x86_64.rpm ├── openssh-clients-10.0p1-1.el9.x86_64.rpm └── checksums.txt若目录名或层级错误脚本执行时会在rpm -qpR依赖分析阶段报error: open failed: No such file or directory—— 因为脚本用dirname $0推导路径硬编码了相对位置。4. 执行升级脚本分阶段控制与关键参数说明4.1 脚本执行前的「最后防线」检查在运行./upgrade-ssh-ssl.sh前必须手动执行预检函数脚本内置但建议独立运行# 进入目录并加载预检 cd /root/ssh-upgrade source ./upgrade-ssh-ssl.sh precheck # ✅ 正确输出应包含 # [OK] System is Rocky Linux 9.5 # [OK] Kernel version 5.14.0-427.el9 # [OK] /var/tmp has 1.2GB free # [OK] /opt mount option includes exec # [FAIL] openssh-server-10.0p1 installed ← 此行必须是 FAIL表示尚未安装precheck函数会检测 12 项关键状态包括sshd是否正在运行、/etc/ssh/sshd_config是否被修改过、SELinux 是否为 enforcing 模式等。若任何一项[FAIL]脚本会中止——这是设计好的熔断机制不是 bug。4.2 核心执行命令与参数含义脚本支持三种模式生产环境只允许用--safe模式# ✅ 推荐安全模式默认启用备份、禁用自动重启、要求人工确认 ./upgrade-ssh-ssl.sh --safe # ⚠️ 谨慎快速模式跳过部分校验仅限离线测试环境 ./upgrade-ssh-ssl.sh --fast # ❌ 禁止强制模式忽略所有 precheck 失败可能导致系统失联 ./upgrade-ssh-ssl.sh --force--safe模式下脚本会自动备份/etc/ssh/全目录到/root/ssh-backup-$(date %Y%m%d_%H%M%S)/安装 RPM 前暂停sshd服务systemctl stop sshd安装完成后不自动启动等待人工验证在/root/ssh-upgrade/下生成rollback.sh脚本见后文执行过程约 4 分钟关键日志节选[INFO] Installing openssl-3.5.0-1.el9.x86_64.rpm... [INFO] Running postinstall script: /opt/openssl350/bin/openssl version [INFO] OpenSSL 3.5.0 15 May 2024 → ✅ 版本正确 [INFO] Installing openssh-10.0p1-1.el9.x86_64.rpm... [INFO] Verifying sshd binary: /usr/sbin/sshd -V | head -1 [INFO] OpenSSH_10.0p1, OpenSSL 3.5.0 15 May 2024 → ✅ 双版本匹配4.3 安装后必须做的三件事脚本不代劳脚本执行完毕只是「安装完成」不是「加固完成」。以下操作必须人工执行验证 sshd 二进制链接ldd /usr/sbin/sshd | grep ssl # ✅ 正确输出libssl.so.3 /opt/openssl350/lib64/libssl.so.3 (0x0000...) # ❌ 错误输出libssl.so.3 /lib64/libssl.so.3 (0x0000...) ← 仍链接系统 OpenSSL检查 sshd_config 兼容性OpenSSH 10.0p1 废弃了UsePrivilegeSeparation和GSSAPIAuthentication默认关闭若配置文件中存在这些参数启动时会警告。运行/usr/sbin/sshd -t -f /etc/ssh/sshd_config # ✅ 无输出即通过若有 Deprecated option 提示需手动删除对应行启动并监听验证systemctl start sshd ss -tlnp | grep :22 # ✅ 应看到 sshd 进程监听 0.0.0.0:22 和 [::]:225. 避坑指南五个血泪换来的「玄学」故障与解法5.1 现象systemctl start sshd报Failed to start sshd.service: Unit not found原因脚本安装的openssh-server-10.0p1RPM 中sshd.service文件被安装到了/usr/lib/systemd/system/但某些 Rocky 9.5 最小化安装缺少systemd-sysv-generator导致sshd.service未被 systemd 加载。解决# 重建 systemd 单元缓存 systemd-sysv-generator systemctl daemon-reload # 再启动 systemctl start sshd5.2 现象SSH 登录后立即断开/var/log/secure记录fatal: no login shells原因OpenSSH 10.0p1 默认启用PermitUserEnvironment但/etc/passwd中用户 shell 字段为空或非法如被误改为/bin/false。解决# 检查 root 用户 shell getent passwd root | cut -d: -f7 # ✅ 应为 /bin/bash若为 /sbin/nologin修复 usermod -s /bin/bash root5.3 现象ssh -V显示OpenSSH_10.0p1, OpenSSL 3.0.7仍是旧 OpenSSL原因LD_LIBRARY_PATH未生效或/etc/ld.so.conf.d/openssl350.conf未被ldconfig加载。解决# 检查配置文件是否存在且内容正确 cat /etc/ld.so.conf.d/openssl350.conf # ✅ 应输出/opt/openssl350/lib64 # 强制更新缓存 ldconfig -v | grep openssl350 # ✅ 应看到 /opt/openssl350/lib64: 及其下的 so 文件列表5.4 现象sshd启动成功但ssh localhost报Connection closed by UNKNOWN port -1原因SELinux 策略未适配 OpenSSL 3.5.0 的新路径/opt/openssl350/lib64/拒绝sshd加载该目录下的库。解决# 临时放行验证用 setsebool -P ssh_sysadm_login on # 永久修复添加自定义策略模块 ausearch -m avc -ts recent | audit2allow -M ssh_openssl350 semodule -i ssh_openssl350.pp5.5 现象脚本执行到rpm -Uvh阶段报error: Failed dependencies原因系统存在旧版openssl-libs的冲突包如openssl11-libs-1.1.1w-1.el9而脚本 RPM 依赖openssl-libs 3.5.0。解决# 查看具体缺失依赖 rpm -qpR openssh-10.0p1-1.el9.x86_64.rpm | grep openssl # ✅ 应输出openssl-libs 3.5.0 # 卸载冲突的旧版 OpenSSL仅当确认无其他服务依赖时 dnf remove openssl11-libs --assumeyes # 再重试脚本6. 验证与回滚用真实连接证明加固有效用一键脚本守住底线6.1 终极验证四层穿透式检测清单装完不是终点验证才是加固价值的落点。我坚持用这四步交叉验证缺一不可验证层级命令/方法预期结果失败含义二进制层strings /usr/sbin/sshd | grep OpenSSL输出OpenSSL 3.5.0 15 May 2024sshd 未链接新 OpenSSL协议层ssh -vvv localhost 21 | grep kex algos显示sntrup761x25519-sha51210.0p1 新算法协议栈未启用新特性服务层ss -tlnp | grep sshdLISTEN状态且PID对应/usr/sbin/sshdsystemd 未正确管理进程连接层ssh -o KexAlgorithmssntrup761x25519-sha512 userlocalhost成功登录算法白名单生效提示第 4 步是「压力测试」。OpenSSH 10.0p1 默认禁用sntrup761x25519-sha512抗量子算法必须显式开启才能验证。若失败检查/etc/ssh/sshd_config中KexAlgorithms行是否被注释或覆盖。6.2 回滚不是备选是必选项rollback.sh的正确用法脚本在/root/ssh-upgrade/下生成的rollback.sh不是简单卸载 RPM而是原子化回滚# 查看回滚脚本内容务必先读 cat /root/ssh-upgrade/rollback.sh # ✅ 正确流程 # 1. 停止 sshd # 2. 卸载 openssh-server-10.0p1 和 openssl-3.5.0 RPM # 3. 从 /root/ssh-backup-* 恢复 /etc/ssh/ # 4. 重载 systemd 配置 # 5. 启动原版 sshd8.7p1执行回滚前必须确认当前 sshd 进程 PID# 记录当前 PID回滚后需对比 pidof sshd # 执行回滚全程无交互 /root/ssh-upgrade/rollback.sh --yes # 验证回滚结果 sshd -V # ✅ 应输出 OpenSSH_8.7p1, OpenSSL 3.0.7 systemctl status sshd # ✅ 应显示 active (running) 且 PID 变化6.3 加固效果量化安全扫描前后对比表用nmapssh-audit.py做基线对比工具需自行安装检测项升级前8.7p1升级后10.0p1改进说明协议版本SSH-2.0-OpenSSH_8.7SSH-2.0-OpenSSH_10.0支持 SSHv2.1 扩展密钥交换curve25519-sha256sntrup761x25519-sha512新增 NIST PQC 标准算法服务端指纹SHA256:...旧 hashSHA256:...新 hash密钥重生成消除已知弱密钥CVE 漏洞CVE-2023-48795高危✅ 修复Terrapin 攻击防护认证方式password,publickeypublickey,keyboard-interactive默认禁用密码认证需配置从那以后我每次给某跨平台系统做等保加固都强制走一遍ssh-audit.py全量扫描 rollback.sh演练。不是信不过脚本是信不过自己漏看一行日志。希望帮到你。本文还有配套的精品资源点击获取