加固實(shí)戰(zhàn))
簡(jiǎn)介本資源面向 Rocky Linux 9.5 系統(tǒng)運(yùn)維人員與安全加固實(shí)踐者針對(duì)舊版 OpenSSH 與 OpenSSL 存在的安全風(fēng)險(xiǎn)提供一套可直接落地的升級(jí)加固方案幫助讀者在 x86_64 環(huán)境下完成 SSH 服務(wù)的高版本替換與安全配置。壓縮包共 6 個(gè)文件包含 5 個(gè) rpm 安裝包與 1 個(gè) sh 腳本涵蓋 openssh、openssh-clients、openssh-server 等核心組件及 chkconfig、initscripts 依賴(lài)包整體約 10.96MB腳本負(fù)責(zé)串聯(lián)升級(jí)流程rpm 包則用于替換系統(tǒng)自帶舊版本。資源描述中展示了升級(jí)后 ssh -V 輸出 OpenSSH_10.0p2 與 OpenSSL 3.5.0 的驗(yàn)證結(jié)果并附有 sshd 服務(wù)運(yùn)行狀態(tài)說(shuō)明方案已在 Rocky Linux 9.5 上完成實(shí)測(cè)。目前已有 199 人學(xué)習(xí)適合需要快速完成 SSH 版本升級(jí)、減少手工編譯排錯(cuò)成本的中高級(jí)運(yùn)維人員參考也可作為內(nèi)網(wǎng)安全加固的腳本模板。1. 從一次 SSH 升級(jí)翻車(chē)說(shuō)起這套 RPM 腳本到底解決什么問(wèn)題上個(gè)月幫一個(gè)朋友處理一臺(tái) Rocky Linux 9.5 的服務(wù)器OpenSSH 還停在系統(tǒng)自帶的 8.7 版本掃描報(bào)告里一堆中危項(xiàng)全指著它。他之前自己手動(dòng)編譯升級(jí)過(guò)一次結(jié)果第二天 SSH 直接連不上只能跑機(jī)房掛 KVM 救回來(lái)。這種血淚經(jīng)驗(yàn)在運(yùn)維圈太常見(jiàn)了——源碼編譯 OpenSSH 看著簡(jiǎn)單但 PAM 模塊路徑、sshd_config 權(quán)限、SELinux 上下文、systemd 單元文件任何一個(gè)環(huán)節(jié)對(duì)不上就是把自己關(guān)在門(mén)外的節(jié)奏。這套rockylinux9.5-ssh10.0p1-ssl3.5.0-rpm-x86-64升級(jí)加固腳本就是沖著這個(gè)場(chǎng)景來(lái)的。它把 OpenSSH 10.0p1 和 OpenSSL 3.5.0 打包成 RPM在 Rocky Linux 9.5 x86_64 上做原地升級(jí)同時(shí)附帶一套加固配置。適合兩類(lèi)人一是手里有 Rocky 9.5 機(jī)器、被合規(guī)掃描追著跑的運(yùn)維二是想學(xué) RPM 打包和 SSH 加固聯(lián)動(dòng)邏輯的工程師。它不解決“從零編譯”的教學(xué)需求解決的是“別把自己鎖在門(mén)外”的落地問(wèn)題。2. 拆開(kāi) RPM 包看門(mén)道OpenSSH 10.0p1 與 OpenSSL 3.5.0 的依賴(lài)鏈2.1 為什么選 RPM 而不是源碼編譯源碼編譯 OpenSSH 的經(jīng)典翻車(chē)點(diǎn)在于./configure時(shí)--with-ssl-dir指向的 OpenSSL 路徑和運(yùn)行時(shí)ldd /usr/sbin/sshd實(shí)際加載的庫(kù)路徑經(jīng)常不一致。你編譯時(shí)用的是/usr/local/ssl/lib64但 sshd 啟動(dòng)時(shí)LD_LIBRARY_PATH沒(méi)帶上它就去/lib64找系統(tǒng)自帶的 OpenSSL 1.1版本對(duì)不上直接段錯(cuò)誤。更隱蔽的是 PAM編譯時(shí)--with-pam開(kāi)了但pam.d/sshd文件沒(méi)同步更新認(rèn)證階段靜默失敗日志里只留一句PAM: Authentication failure排查半天。RPM 方案的核心優(yōu)勢(shì)是把依賴(lài)關(guān)系寫(xiě)死在 spec 文件的Requires和Provides里。安裝時(shí)rpm -ivh或dnf localinstall會(huì)自動(dòng)校驗(yàn) OpenSSL 版本、glibc 版本、PAM 庫(kù)版本不滿(mǎn)足直接拒絕安裝不會(huì)出現(xiàn)“裝完了才發(fā)現(xiàn)跑不起來(lái)”的情況。而且 RPM 的%post腳本可以自動(dòng)處理sshd_config權(quán)限、生成 host key、重載 systemd這些手工步驟全被固化下來(lái)。2.2 包內(nèi)文件布局與關(guān)鍵路徑拿到 RPM 包后先別急著裝。用rpm -qlp看一眼文件清單心里有數(shù)再動(dòng)手# 查看 RPM 包內(nèi)所有文件路徑不實(shí)際安裝 rpm -qlp openssh-10.0p1-ssl3.5.0.el9.x86_64.rpm | head -40 # 查看包的依賴(lài)聲明確認(rèn) OpenSSL 版本要求 rpm -qRp openssh-10.0p1-ssl3.5.0.el9.x86_64.rpm | grep -i ssl # 查看包的元信息版本、構(gòu)建時(shí)間、簽名 rpm -qip openssh-10.0p1-ssl3.5.0.el9.x86_64.rpm這里有個(gè)細(xì)節(jié)rpm -qRp輸出的依賴(lài)?yán)锶绻霈F(xiàn)libcrypto.so.3()(64bit)這種 soname 依賴(lài)說(shuō)明包是動(dòng)態(tài)鏈接到 OpenSSL 3.x 的。如果系統(tǒng)里還殘留 OpenSSL 1.1 的 compat 包dnf可能會(huì)嘗試同時(shí)滿(mǎn)足兩個(gè)版本導(dǎo)致沖突。常見(jiàn)做法是先dnf remove openssl-compat清理舊庫(kù)再裝新包。關(guān)鍵路徑對(duì)照表路徑作用升級(jí)后注意事項(xiàng)/usr/sbin/sshd主程序確認(rèn)ldd指向新 OpenSSL/etc/ssh/sshd_config服務(wù)端配置權(quán)限必須 600屬主 root/etc/ssh/ssh_config客戶(hù)端配置一般不動(dòng)除非要禁弱算法/etc/pam.d/sshdPAM 認(rèn)證配置升級(jí)后檢查是否被覆蓋/usr/lib/systemd/system/sshd.servicesystemd 單元確認(rèn)ExecStart路徑正確/etc/ssh/ssh_host_*_key主機(jī)密鑰升級(jí)不會(huì)自動(dòng)重建除非手動(dòng)刪2.3 升級(jí)前的快照與回滾準(zhǔn)備RPM 升級(jí)雖然比源碼編譯可控但也不是沒(méi)有后悔藥。動(dòng)手前先做三件事# 1. 備份當(dāng)前 sshd 配置和二進(jìn)制 cp -a /etc/ssh /etc/ssh.bak.$(date %Y%m%d) cp -a /usr/sbin/sshd /usr/sbin/sshd.bak # 2. 記錄當(dāng)前版本和依賴(lài)關(guān)系 rpm -qa | grep -E openssh|openssl /root/pkg-before.txt ldd /usr/sbin/sshd /root/ldd-before.txt # 3. 確認(rèn)當(dāng)前 SSH 會(huì)話不會(huì)被中斷關(guān)鍵 # 不要在生產(chǎn)環(huán)境直接重啟 sshd先用新端口起一個(gè)測(cè)試實(shí)例 /usr/sbin/sshd -f /etc/ssh/sshd_config -p 2222 -t第三步的-t是語(yǔ)法檢查-p 2222是臨時(shí)端口。如果語(yǔ)法檢查通過(guò)再用-p 2222實(shí)際啟動(dòng)一個(gè)測(cè)試實(shí)例從另一個(gè)終端連上去驗(yàn)證確認(rèn)沒(méi)問(wèn)題再替換主服務(wù)。這個(gè)習(xí)慣我每次升級(jí) SSH 都強(qiáng)制走一遍能擋掉八成“改完連不上”的事故。3. 加固配置落地從 sshd_config 到 PAM 的逐項(xiàng)調(diào)優(yōu)3.1 sshd_config 核心加固項(xiàng)與參數(shù)含義OpenSSH 10.0p1 的默認(rèn)配置比 8.x 嚴(yán)格了不少但離合規(guī)要求還有距離。下面這份配置是我在多個(gè) Rocky 9.5 環(huán)境里驗(yàn)證過(guò)的直接抄# /etc/ssh/sshd_config 關(guān)鍵加固段 Protocol 2 Port 22 AddressFamily inet ListenAddress 0.0.0.0 # 認(rèn)證策略 PermitRootLogin no PubkeyAuthentication yes PasswordAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no UsePAM yes # 算法限制只保留強(qiáng)加密套件 KexAlgorithms curve25519-sha256,curve25519-sha256libssh.org,diffie-hellman-group16-sha512 Ciphers chacha20-poly1305openssh.com,aes256-gcmopenssh.com,aes128-gcmopenssh.com MACs hmac-sha2-512-etmopenssh.com,hmac-sha2-256-etmopenssh.com # 會(huì)話限制 LoginGraceTime 30 MaxAuthTries 3 MaxSessions 5 ClientAliveInterval 300 ClientAliveCountMax 2 # 日志與轉(zhuǎn)發(fā) SyslogFacility AUTH LogLevel VERBOSE X11Forwarding no AllowAgentForwarding no AllowTcpForwarding no逐項(xiàng)說(shuō)明幾個(gè)容易踩坑的PermitRootLogin no是硬要求但改之前確認(rèn)你有普通用戶(hù)能 sudo否則重啟后 root 登不上、普通用戶(hù)也沒(méi)配就真進(jìn)不去了。PasswordAuthentication no意味著必須提前把公鑰塞進(jìn)~/.ssh/authorized_keys而且權(quán)限必須是 700目錄和 600文件屬主是用戶(hù)自己否則 sshd 會(huì)靜默拒絕。KexAlgorithms里我保留了diffie-hellman-group16-sha512因?yàn)橛行├吓f的網(wǎng)絡(luò)設(shè)備只支持這個(gè)。如果你的環(huán)境全是新客戶(hù)端可以只留 curve25519。MACs里的-etm后綴是 encrypt-then-MAC比傳統(tǒng) MAC 更安全但極老的客戶(hù)端可能不支持。3.2 PAM 與 SELinux 的聯(lián)動(dòng)檢查改完sshd_config別急著重啟先過(guò)一遍 PAM 和 SELinux# 檢查 PAM 配置是否引用了正確的模塊路徑 grep -E pam_unix|pam_sss|pam_faillock /etc/pam.d/sshd # 確認(rèn) SELinux 上下文正確 ls -Z /usr/sbin/sshd /etc/ssh/sshd_config # 期望輸出類(lèi)似system_u:object_r:sshd_exec_t:s0 /usr/sbin/sshd # 如果上下文不對(duì)手動(dòng)修復(fù) restorecon -Rv /etc/ssh /usr/sbin/sshd # 檢查 SELinux 是否阻止了 sshd 綁定端口 ausearch -m avc -ts recent | grep sshdRocky 9.5 默認(rèn)開(kāi) SELinux enforcing。RPM 安裝時(shí)%post腳本通常會(huì)調(diào)restorecon但如果你之前手動(dòng)改過(guò)/etc/ssh下的文件上下文可能被破壞。ls -Z看到default_t而不是sshd_exec_tsshd 啟動(dòng)就會(huì)被拒。ausearch那條命令是排查 SELinux 拒絕的萬(wàn)能鑰匙任何“配置都對(duì)但就是起不來(lái)”的情況先看這里。3.3 用 sshd -T 做配置有效性驗(yàn)證OpenSSH 10.0p1 的sshd -T比老版本輸出更詳細(xì)能直接看到生效的最終配置# 以測(cè)試模式輸出最終生效配置不實(shí)際啟動(dòng)服務(wù) /usr/sbin/sshd -T -f /etc/ssh/sshd_config | grep -E permitrootlogin|passwordauth|kexalgorithms|ciphers|macs # 如果配置文件有語(yǔ)法錯(cuò)誤-t 會(huì)直接報(bào)錯(cuò)并指出行號(hào) /usr/sbin/sshd -t -f /etc/ssh/sshd_config-T的好處是它會(huì)把 include 的文件、默認(rèn)值全部展開(kāi)你看到的就是 sshd 實(shí)際用的。有時(shí)候你在sshd_config里寫(xiě)了PasswordAuthentication no但/etc/ssh/sshd_config.d/下有個(gè) 50-cloud-init.conf 又把它改回 yes-T一跑就露餡。Rocky 9.5 默認(rèn)會(huì)加載sshd_config.d/*.conf這個(gè)目錄里的文件優(yōu)先級(jí)比主配置高升級(jí)后務(wù)必檢查。4. 避坑排查升級(jí) SSH 時(shí)最容易翻車(chē)的五個(gè)點(diǎn)4.1 現(xiàn)象重啟 sshd 后當(dāng)前會(huì)話斷開(kāi)新連接被拒原因sshd_config里L(fēng)istenAddress或Port改了但防火墻沒(méi)放行新端口或者AllowUsers/AllowGroups限制了來(lái)源而當(dāng)前用戶(hù)不在列表里。解決永遠(yuǎn)不要直接systemctl restart sshd。先用sshd -p 2222 -t測(cè)試再sshd -p 2222起臨時(shí)實(shí)例從另一個(gè)終端連 2222 驗(yàn)證。確認(rèn)無(wú)誤后用systemctl reload sshd不是 restart平滑加載。如果已經(jīng)鎖死只能通過(guò) KVM 或串口進(jìn)單用戶(hù)模式改回來(lái)。4.2 現(xiàn)象公鑰認(rèn)證失敗日志顯示 “Authentication refused: bad ownership or modes”原因~/.ssh或authorized_keys權(quán)限不對(duì)。sshd 對(duì)權(quán)限極其敏感目錄必須是 700文件必須是 600且屬主必須是登錄用戶(hù)本人不能是 root 或其他用戶(hù)。解決chmod 700 /home/username/.ssh chmod 600 /home/username/.ssh/authorized_keys chown -R username:username /home/username/.ssh # 同時(shí)檢查家目錄本身不能是 group-writable chmod g-w /home/username4.3 現(xiàn)象升級(jí)后 root 無(wú)法登錄普通用戶(hù) sudo 也報(bào)錯(cuò)原因PermitRootLogin no生效了但普通用戶(hù)的 sudo 權(quán)限沒(méi)配好或者 PAM 的pam_faillock模塊因?yàn)槎啻问“奄~戶(hù)鎖了。解決升級(jí)前務(wù)必確認(rèn)至少有一個(gè)普通用戶(hù)能sudo su -。如果已經(jīng)被鎖進(jìn)單用戶(hù)模式后faillock --user username --reset解鎖。PAM 配置里pam_faillock的deny3和unlock_time900是默認(rèn)值可以根據(jù)需要調(diào)整。4.4 現(xiàn)象sshd 啟動(dòng)報(bào) “error while loading shared libraries: libcrypto.so.3”原因OpenSSL 3.5.0 的 RPM 沒(méi)裝或者裝了但ldconfig緩存沒(méi)更新sshd 找不到新庫(kù)。解決# 確認(rèn) OpenSSL 3.5.0 已安裝 rpm -qa | grep openssl # 更新動(dòng)態(tài)鏈接器緩存 ldconfig -v | grep libcrypto # 如果還是找不到手動(dòng)指定庫(kù)路徑測(cè)試 LD_LIBRARY_PATH/usr/local/ssl/lib64 ldd /usr/sbin/sshd | grep crypto4.5 現(xiàn)象SELinux 導(dǎo)致 sshd 無(wú)法綁定端口或讀取 host key原因RPM 安裝時(shí)%post腳本沒(méi)執(zhí)行restorecon或者手動(dòng)拷貝文件時(shí)丟了上下文。解決# 查看拒絕日志 ausearch -m avc -ts today | grep sshd # 恢復(fù)默認(rèn)上下文 restorecon -Rv /etc/ssh /usr/sbin/sshd /var/empty/sshd # 如果還不行臨時(shí)設(shè)為 permissive 確認(rèn)是否是 SELinux 問(wèn)題 setenforce 0 # 確認(rèn)后記得改回 enforcing setenforce 15. 進(jìn)階技巧用 RPM 腳本做批量加固與版本回滾5.1 把加固配置寫(xiě)進(jìn) RPM 的 %post 腳本如果你要在多臺(tái)機(jī)器上批量部署手動(dòng)改sshd_config太慢??梢园鸭庸踢壿媽?xiě)進(jìn) RPM 的%post段安裝時(shí)自動(dòng)執(zhí)行# 在 spec 文件的 %post 段中加入 %post # 備份原配置 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.rpmsave # 用 sed 批量替換關(guān)鍵項(xiàng) sed -i s/^#*PermitRootLogin.*/PermitRootLogin no/ /etc/ssh/sshd_config sed -i s/^#*PasswordAuthentication.*/PasswordAuthentication no/ /etc/ssh/sshd_config sed -i s/^#*MaxAuthTries.*/MaxAuthTries 3/ /etc/ssh/sshd_config # 確保權(quán)限正確 chmod 600 /etc/ssh/sshd_config chown root:root /etc/ssh/sshd_config # 語(yǔ)法檢查失敗則回滾 if ! /usr/sbin/sshd -t -f /etc/ssh/sshd_config; then cp /etc/ssh/sshd_config.rpmsave /etc/ssh/sshd_config echo sshd_config syntax error, rolled back 2 exit 1 fi # 平滑重載 systemctl reload sshd || systemctl restart sshd這段腳本的關(guān)鍵在于sshd -t失敗時(shí)自動(dòng)回滾。很多批量升級(jí)事故就是因?yàn)榕渲脤?xiě)錯(cuò)了但沒(méi)人發(fā)現(xiàn)直到重啟后所有機(jī)器都連不上。加上這個(gè)判斷至少能保證配置語(yǔ)法層面不出問(wèn)題。5.2 版本回滾用 dnf history 撤銷(xiāo)升級(jí)RPM 體系最大的好處就是有后悔藥。如果升級(jí)后發(fā)現(xiàn)兼容性問(wèn)題可以回滾# 查看 dnf 操作歷史找到升級(jí)那一步的 ID dnf history list | head -20 # 假設(shè)升級(jí)操作 ID 是 15回滾到之前的狀態(tài) dnf history undo 15 # 如果 dnf history 不夠用直接降級(jí) RPM 包 rpm -Uvh --oldpackage openssh-8.7p1-38.el9.x86_64.rpm # 恢復(fù)備份的配置 cp -a /etc/ssh.bak.20250101/* /etc/ssh/ systemctl restart sshddnf history undo會(huì)自動(dòng)處理依賴(lài)關(guān)系比手動(dòng)rpm -Uvh --oldpackage更干凈。但注意如果升級(jí)后已經(jīng)改了配置文件undo 不會(huì)恢復(fù)配置需要手動(dòng)從備份還原。5.3 驗(yàn)證加固效果的三個(gè)命令升級(jí)加固完別只看systemctl status顯示 running 就完事。用這三個(gè)命令做最終驗(yàn)證# 1. 確認(rèn)實(shí)際生效的算法列表 ssh -vvv localhost 21 | grep -E kex: algorithm|ciphers: |mac: # 2. 確認(rèn)版本號(hào) ssh -V # 3. 用 nmap 從外部掃描確認(rèn)沒(méi)有弱算法暴露 nmap --script ssh2-enum-algos -p 22 target_ip第一條命令的-vvv會(huì)打印握手細(xì)節(jié)你能看到實(shí)際協(xié)商的 kex、cipher、mac 是不是你配置里指定的那些。如果出現(xiàn)了diffie-hellman-group14-sha1這種弱算法說(shuō)明配置沒(méi)生效大概率是sshd_config.d/下有文件覆蓋了。第三條用 nmap 從外部視角看更接近掃描器的判斷邏輯。從那以后我每次升級(jí) SSH都強(qiáng)制走一遍“備份 → 臨時(shí)端口測(cè)試 → sshd -T 驗(yàn)證 → 外部掃描確認(rèn)”的流程再也沒(méi)被鎖在門(mén)外過(guò)。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取