ARTICLE DETAIL

资讯详情

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

CentOS 7.9 OpenSSH 10.0p1升级加固指南

CentOS 7.9 OpenSSH 10.0p1升级加固指南 简介面向 CentOS 7.9 的运维与安全管理人员用于解决 OpenSSH 与 SSL 组件版本旧、存在已知漏洞以及手工升级容易遗漏依赖或中断服务的问题。包内共 4 个文件压缩包大小 20.42MB含 3 个 RPM 安装包服务端、客户端及主程序对应包均基于 10.0p1 构建和 1 个 Shell 加固脚本。执行脚本后可将 OpenSSH 升级至 10.0p1、SSL 升级至 3.5.1并自动完成依赖处理、服务替换和 SSH 安全基线配置包括禁止空密码登录、限制 root 远程登录、配置空闲超时等帮助减少暴力破解与漏洞利用风险。RPM 包便于离线安装与批量推送脚本同时适配已有 SSH 配置的保留与迁移并会将原配置备份到指定目录避免自定义参数丢失。升级过程会保留原有 sshd_config 中的自定义项并在关键节点打印提示信息出现问题时可快速恢复服务。已有 140 人学习下载适合需要稳定加固 SSH 服务的中级运维人员参考和复用。1. CentOS 7.9 的 OpenSSH 升级加固为什么这次换的是 10.0p1 3.5.1CentOS 7.9 自带的 OpenSSH 停在 7.4这个版本号在等保扫描和渗透测试里几乎是高危的代名词yum 源又永远等不来新版于是 openssh升级 在 CentOS 7.9 上成了一门手艺活。这篇要拆的资源是一套针对 x86_64 的升级加固方案OpenSSH 10.0p1 配 OpenSSL 3.5.1打成 rpm再用一个脚本把备份、替换、加固、重启串成一条龙。适合被安全报告催着整改的运维也适合不想给 sshd 留后患的服务器管理员。它解决的不仅是装个新版本而是让 sshd 这个最暴露的服务以可管理、可回滚的方式完成升级和加固。2. 升级前把现场摸透RPM 路线、依赖清单与版本检查2.1 为什么坚持 RPM 而不是 make installCentOS 7.9 上手动编译 OpenSSH 的教程满网都是但我一直不建议生产环境直接 make install。原因很朴素make install 把文件散落到 /usr/local 各子目录之后rpm 数据库里没有任何记录rpm -V 校验不出改动将来要回滚、要卸载只能靠手工对比文件清单等于给自己埋雷。这次资源走的是 RPM 路线rpm -Uvh 装完rpm -qa 里有名字rpm -e 能干净卸掉升级动作本身变成了一个可审计、可逆的操作。把两条路线摆在一起看会更清楚对比项make installRPM 方式包管理记录无rpm -qa 查不到有可查可卸回滚方式手工拷回旧文件rpm -e 或替换备份SELinux 标签需要手动 restorecon打包时已处理版本一致性容易被旧文件干扰rpm 版本与二进制一致安全扫描器判断漏洞靠的是版本号和服务指纹。系统里 rpm -q openssh 能查到 10.0p1sshd banner 也是 10.0p1扫描结果才会真的变绿。手工 make install 经常出现旧版本文件没清干净、banner 和包版本对不上扫描器照样报漏洞的尴尬情况——那真是白干一场。在 CentOS 8 上打过 openssh rpm 的朋友到 7.9 会发现 spec 不能直接搬因为 7.9 的 rpm 宏路径和 8 系不一样这正是这类打包脚本存在的意义。提示RPM 方式的核心价值是「系统知道这个新版本的存在」。这不是洁癖是回滚和审计的底线。2.2 依赖清单与编译链准备脚本直接安装打好的 RPM单纯使用不需要 gcc。但如果你想改参数自己重打一套或者脚本在你的环境里触发了重新编译下面这组是 CentOS 7.9 上跑通 OpenSSH 编译和打包的底线依赖# 编译链、PAM 与 zlib 开发头文件rpm-build 是打包工具 yum install -y gcc make perl pam-devel zlib-devel \ rpm-build libselinux-devel krb5-devel几个容易漏的点说清楚。pam-devel 必须有——编译时带 --with-pam 却找不到 pam 头文件configure 直接报错libselinux-devel 影响二进制能否带上 SELinux 标签CentOS 7 默认 Enforcing 环境下漏掉它后面大概率踩 avc denied 的坑krb5-devel 对应 GSSAPI 支持内网环境常开 Kerberos 认证顺手装上比事后补强省事。yum 源建议换成阿里云或网易的镜像源装依赖快很多。但要注意换镜像源解决不了 openssh 升级本身——7 系的 upstream 早就停更了镜像源里根本没有新版本这正是必须用打包方案的根本原因。2.3 现场检查与备份意识动手之前先把下面这段当体检跑一遍每一条的输出都决定后面怎么操作cat /etc/redhat-release # 确认 CentOS Linux release 7.9.2009 ssh -V 21 # 当前 OpenSSH 版本一般是 OpenSSH_7.4p1 rpm -qa | grep -E ^(openssh|openssl) # 已装的 ssh/ssl 相关包完整清单 getenforce # SELinux 状态Enforcing 还是 Disabled df -h /usr/local # 新版本要落 /usr/local确认有 2GB 以上余量输出确认之后最要紧的是开一个不断开的会话tmux 或 screen 先挂一个或者确保手头有第二个终端。ssh 升级是全运维里少有的「改自己上吊绳」场景一旦替换后服务没起来断开的会话就是唯一的后悔药。脚本内部会自动备份到 /root/ssh_upgrade_backup_时间戳这类脚本的默认习惯是备份目录里至少保留 sshd.old、ssh.old 和 sshd_config.old 三样东西第 5 章会细说怎么用它们救场。3. 先装 OpenSSL 3.5.1路径隔离为什么是这条流程的命根子3.1 新 OpenSSL 必须住单间OpenSSL 3.5.1 的 RPM 装的是 /usr/local/openssl-3.5.1 这个独立前缀而不是替换系统自带的 OpenSSL 1.0.2k。这个决定是整个方案安全落地的前提CentOS 7.9 上 curl、python、yum 的底层都链着系统旧版 OpenSSL谁把系统库强行换掉curl 立刻报 SSL EOFmysql 客户端连库报「SSL 连接错误」这类事故在安全整改现场特别常见。新版本以 libssl.so.3 命名和系统里的 libssl.so.1.0.2k 共存互不干扰sshd 用新的系统其他组件继续用旧的互不掺和。打包时用的编译参数是这样的资源里已经做好这里复现出来方便你理解选型# OpenSSL 3.5.1 打包时的编译参数 tar xf openssl-3.5.1.tar.gz cd openssl-3.5.1 ./config --prefix/usr/local/openssl-3.5.1 shared zlib make -j$(nproc) make install_sw--prefix 指定独立安装前缀这是路径隔离的根shared 生成动态库sshd 运行时按 so 名查找zlib 开启压缩支持install_sw 只装软件部分不装文档省时间也省空间。为什么不直接用系统自带的 openssl-devel 编译 OpenSSH因为系统头文件对应 1.0.2k按那个链接出来的 sshd 还是走老库升级等于白做。安装顺序也是死的先 OpenSSL 后 OpenSSH# 先装 OpenSSL 3.5.1 RPM再装 OpenSSH顺序别反 rpm -Uvh openssl-3.5.1-1.el7.x86_64.rpm ls -l /usr/local/openssl-3.5.1/lib64/libssl.so*rpm -Uvh 是升级安装模式遇到文件冲突会明确提示比 -ivh 合适。ls 要能看到 libssl.so.3 和它的软链说明库文件完整落盘。之后用 /usr/local/openssl-3.5.1/bin/openssl version 验证版本——注意别直接调系统里的 openssl它还是 1.0.2k这是预期行为不是安装失败。3.2 OpenSSH 10.0p1 的编译绑定与安装OpenSSH 10.0p1 的 RPM 在打包时做了两个关键绑定--with-ssl-dir/usr/local/openssl-3.5.1 把编译期的头文件和链接库指到新版本--with-pam 开启 PAM 支持--with-privsep-path/var/empty/sshd 指定权限分离目录。这三条决定了运行时的行为。装完立刻做两件事# 安装 OpenSSH RPM然后验证链接关系和权限分离目录 rpm -Uvh openssh-10.0p1-1.el7.x86_64.rpm ldd /usr/local/openssh-10.0p1/sbin/sshd | grep -E ssl|crypto ls -ld /var/empty/sshdldd 输出里必须出现 libssl.so.3 和 libcrypto.so.3路径指向 /usr/local/openssl-3.5.1。如果显示的还是 libssl.so.1.0.2k说明打包时链接没绑对扫描器照样报漏洞等于白升级。看 ldd 是我装完必做的一步比看安装日志靠谱得多。/var/empty/sshd 是权限分离用的空目录必须存在且属主 root、权限 755 或更严sshd 的 privsep 子进程要在这里降权运行目录缺失时 sshd 会拒绝启动日志里只留下一句 Privilege separation user sshd does not exist 之类的提示。3.3 systemd unit 的 -D 和 -f 参数RPM 装完新旧二进制是共存的/usr/sbin/sshd 还是 7.4新的在 /usr/local/openssh-10.0p1/sbin/sshd。切换由脚本通过 systemd unit 完成核心是 ExecStart 那一行。这一步如果漏了systemctl restart sshd 拉起的还是旧守护进程升级在表象上完全没有发生# 升级脚本生成的新 unit-D 和 -f 缺一不可 cat /etc/systemd/system/sshd.service EOF [Unit] DescriptionOpenSSH server daemon Afternetwork.target [Service] ExecStart/usr/local/openssh-10.0p1/sbin/sshd -D -f /etc/ssh/sshd_config ExecReload/bin/kill -HUP $MAINPID KillModeprocess Restarton-failure [Install] WantedBymulti-user.target EOF systemctl daemon-reload systemctl restart sshd-D 让 sshd 前台运行systemd 才能正确跟踪主进程不写它systemd 按默认的 simple 类型认为服务启动即退出sshd 反复被拉起又退出会话全被拒。 -f 把配置路径固定回 /etc/ssh/sshd_config你的旧配置和 pam 栈继续生效配置文件不用搬家。KillModeprocess 保证 systemctl reload 的 HUP 只送到 sshd 主进程不会误杀会话子进程——这一行的作用平时看不出来批量踢用户的时候就能感觉到差别。Afternetwork.target 而不是 network-online.target是为了避免开机时等网络就绪拖慢 sshd 拉起这个取舍在纯内网环境更划算。4. 加固脚本的落地动作sshd_config 收窄算法、PAM 与一键参数4.1 sshd_config 加固项与算法收窄升级只解决版本漏洞真正让扫描报告变绿的是加固段。脚本会向 /etc/ssh/sshd_config 追加一段配置核心是关 root 直登、限流、关转发、收窄算法白名单# 脚本里的加固段节选追加到 sshd_config cat /etc/ssh/sshd_config EOF Protocol 2 PermitRootLogin no MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 0 UseDNS no PermitEmptyPasswords no X11Forwarding no Ciphers chacha20-poly1305openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcmopenssh.com,aes256-gcmopenssh.com MACs hmac-sha2-256-etmopenssh.com,hmac-sha2-512-etmopenssh.com KexAlgorithms curve25519-sha256,curve25519-sha256libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group-exchange-sha256 EOF逐条说透。PermitRootLogin no 是等保整改硬指标管理用普通用户 sudoMaxAuthTries 3 限制密码尝试次数配合 fail2ban 效果更好ClientAliveInterval 300 加 ClientAliveCountMax 0 的组合会在连接空闲约 5 分钟后由服务端主动断开适合清理挂死的会话。UseDNS no 是性能项——sshd 默认对客户端 IP 做反解DNS 慢时登录要卡好几秒关掉立竿见影。底下三行算法白名单才是本轮升级的核心。CVE-2016-2183 扫描项点名的就是 3des-cbc 这类 64 位块大小的密码套件Ciphers 白名单收到只剩 AES-GCM 和 ChaCha20 后这个漏洞项重扫才会消失。MACs 里优先用带 -etm 后缀的封装模式encrypt-then-MAC能避免部分认证预言攻击KexAlgorithms 把 curve25519 放最前旧版 group1-sha1 直接不开。这里有一个真实的兼容性代价如果内网有老版本 xshell 或 Windows 7 自带的 ssh 客户端它们可能只支持 diffie-hellman-group14-sha1连不上时要在 KexAlgorithms 里临时加回去这与安全扫描是此消彼长的关系需要按业务环境权衡。注意PasswordAuthentication 这一项脚本默认不做死。公网环境务必 no配合提前下发公钥内网可保持 yes用脚本头部的开关变量控制别一刀切。4.2 PAM 与 UsePAM 的配合OpenSSH 编译时带了 --with-pam运行时依赖 /etc/pam.d/sshd 这个栈文件。脚本会先备份原始 pam 文件再确认它存在、属主 root、权限 644。同时 sshd_config 里有两个开关要和 PAM 配合好# sshd_config 里的 PAM 相关行脚本会确保为以下值 UsePAM yes ChallengeResponseAuthentication no KbdInteractiveAuthentication yes注意最后一个选项是 OpenSSH 新版本里的坑老的 ChallengeResponseAuthentication 在 10.x 里已经废弃行为被 KbdInteractiveAuthentication 接管。旧配置里只写 ChallengeResponseAuthentication no 的话某些 PAM 键盘交互式认证流程可能仍被打开。UsePAM yes 加 KbdInteractiveAuthentication yes 的组合才能让密码走 PAM 栈正常验证又不放开多余的交互式认证通道。4.3 一键脚本的参数开关与执行顺序脚本不是黑匣子头部就是几个开关变量改完执行一遍就是一台新机器的一次完整升级# 脚本头部开关按业务环境改 export PERMIT_ROOT_LOGINno # root 直连开关公网强烈建议 no export PASSWORD_AUTHyes # 密码登录开关公网建议 no 密钥 export INSTALL_OPENSSL1 # 0 表示已装过 OpenSSL跳过 export BACKUP_KEEP_DAYS90 # 备份目录保留天数 bash upgrade_harden.sh执行顺序脚本是写死的检查系统版本 → 补依赖 → 装 OpenSSL → 装 OpenSSH → 备份旧配置和二进制 → 替换 /usr/sbin/sshd 与 /usr/bin/ssh → 生成 systemd unit → 追加加固配置 → sshd -t 校验 → 重启 → 探活。脚本每到一个阶段会打印类似 [4/10] 备份旧文件 这样的标记行盯着输出走到「重启」之前前面任何一步报错都可以中断重来。最容易被跳过的是 sshd -t 那步——它校验的是「新二进制 旧配置」的组合等到重启才发现起不来就晚了。脚本还做了幂等处理重复执行不会二次覆盖备份目录备份按 BACKUP_KEEP_DAYS 自动清理。5. 避坑与常见问题升级 OpenSSH 最容易翻车的五个现场5.1 sshd 起不来或被拒先查配置语法和 SELinux现象systemctl restart sshd 后服务状态是 active但新会话连不上或者干脆启动失败journalctl -u sshd 里有关于未知指令的报错。原因OpenSSH 10.0p1 对旧配置里的废弃参数是直接报错的旧版能容忍的写法在新版就是语法错误。最常见的是 MACs 或 Ciphers 里还挂着 hmac-md5、aes128-cbc 这类老算法以及 HostKey 指向不存在的旧路径。另一类是 SELinux/usr/local 路径下的新 sshd 没有 sshd_t 类型标签Enforcing 模式下被 avc denied 拦住症状就是服务起不来或端口不通报错却不明显。解决重启前永远先跑 sshd -t -f /etc/ssh/sshd_config语法不过绝不动服务。SELinux 问题用 restorecon -Rv /usr/local/openssh-10.0p1 重打标签再看 /var/log/audit/audit.log 里有没有新的 avc 记录必要时用 audit2why 看具体被拦的上下文。临时验证可以用 setenforce 0但那只用来定位不能当长期方案——CentOS 7 的 sssd、cron 等组件在宽松模式下行为会变。5.2 登录与链路异常PAM、SSL 库与 PATH 的玄学现象升级后密码登录全军覆没密钥登录正常或系统里 curl、mysql 客户端突然报 SSL 错误又或者 ssh -V 显示的还是 7.4。这三类问题看着都像升级失败但原因完全不同。原因密码登录失败要么 sshd_config 里 UsePAM no要么 /etc/pam.d/sshd 缺失日志里全是 pam_unix(sshd:auth) authentication failure容易误判成账号密码错。SSL 报错往往是有人图省事把 LD_LIBRARY_PATH 全局指到了新 OpenSSL系统里的 curl、mysql 链路被带乱——curl 报 error:0a000126:ssl routines::unexpected eof while reading 就是典型mysql 客户端则报「无法通过 SSL 加密建立连接」。ssh -V 还是老版本则是 PATH 先命中 /usr/bin/ssh新二进制根本没替换到默认路径或者 /usr/bin/ssh 还是旧文件。解决PAM 问题按 4.2 的开关核对SSL 链路问题排查 ldd /usr/sbin/sshd 和 env 里的 LD_LIBRARY_PATH正确做法是只有新 sshd 依赖新库系统其他组件继续用旧库绝不靠环境变量全局注入版本显示问题用 /usr/local/openssh-10.0p1/bin/ssh -V 确认真实版本再把 /usr/bin/ssh、/usr/bin/scp、/usr/bin/sftp 替换或建软链替换时注意保留属主和权限。5.3 重启后立刻断连备份目录的救场姿势现象脚本跑完当前会话卡死新会话也连不上只能靠带外管理IPMI、云控制台进系统。原因这是升级 sshd 最惨烈的翻车现场。诱因通常是 5.1、5.2 里的问题叠加配置语法没过、SELinux 没处理、unit 里没写 -D三者凑齐就是断连三连。还有一个隐蔽情况如果系统走的是 sshd.socket 这种 socket 激活模式ExecStart 的写法和 service 模式不一样直接套用 unit 会把激活逻辑弄乱防火墙放行逻辑也要同步检查。解决从备份目录把旧文件救回来顺序是换回旧二进制、恢复旧配置、必要时恢复旧 unit# 断连救场换回旧二进制与旧配置恢复服务 cp -a /root/ssh_upgrade_backup_*/sshd.old /usr/sbin/sshd cp -a /root/ssh_upgrade_backup_*/sshd_config.old /etc/ssh/sshd_config systemctl restart sshd如果新 unit 本身有问题把备份目录里的 sshd.service 恢复到 /usr/lib/systemd/system/ 下再 systemctl daemon-reload 和 restart。这条命令建议在升级前就写好贴在旁边别等断了才回忆路径。6. 升级后的验证与回滚三板斧确认加固真的生效升级和加固做完别急着关窗口。我用三组命令做收尾验证第一组看版本和链接第二组看配置实际生效值第三组看服务状态和监听情况。# 第一板斧版本与链接关系 /usr/local/openssh-10.0p1/bin/ssh -V ldd /usr/local/openssh-10.0p1/sbin/sshd | grep -E ssl|crypto # 第二板斧实际生效的配置不是看文件是看运行值 sshd -T -f /etc/ssh/sshd_config | grep -E permitrootlogin|maxauthtries|ciphers # 第三板斧服务与探活 systemctl status sshd --no-pager | head -n 10 ss -lntp | grep :22sshd -T 输出的是 sshd 解析完配置后的最终值比 cat 配置文件可信得多。确认 PermitRootLogin no、MaxAuthTries 3、Ciphers 行里没有 cbc 字样之后再跑一轮安全扫描CVE-2016-2183 和 OpenSSH 相关条目应该清零。也可以本机自测一下协商算法nmap 的 ssh2-enum-algos 脚本扫本机 22 端口看返回的算法列表里还有没有 3des-cbc——没有就算过关。最后看一眼 /var/log/secure确认新会话登录记录正常没有 PAM 报错。回滚的底线动作就是四件事备份目录里拷回 sshd.old、恢复 /etc/ssh/sshd_config 的旧版本、恢复旧 unit、systemctl restart 后验证登录。这套流程我在测试虚拟机里完整跑过三轮才敢碰生产。从那以后我每次做 ssh 升级都强制走「备份 → sshd -t → 双会话保底 → 三板斧验证 → 备份目录保留 90 天」这套顺序备份目录宁可多留也不早删生怕哪次版本迭代把某个兼容项悄悄埋掉。希望帮到你。本文还有配套的精品资源点击获取
返回列表