一、概述
1.1 背景介紹
Linux 主機(jī)的“安全問(wèn)題”在生產(chǎn)中往往不是 0/1,而是一個(gè)持續(xù)被配置細(xì)節(jié)放大的風(fēng)險(xiǎn)曲線:同一套業(yè)務(wù)在不同團(tuán)隊(duì)、不同鏡像、不同運(yùn)維習(xí)慣下,最終暴露面會(huì)出現(xiàn)數(shù)量級(jí)差異。
常見(jiàn)誤判主要有三類:
“裝了殺軟/EDR 就安全”:主機(jī)被暴露的第一步通常來(lái)自弱口令、SSH 暴露、sudo 濫用、內(nèi)核參數(shù)不當(dāng)、日志審計(jì)缺失等配置問(wèn)題;EDR 只能覆蓋部分已知攻擊鏈。
“只要開防火墻就行”:防火墻是重要的一層,但如果賬號(hào)策略、權(quán)限邊界、審計(jì)鏈路缺失,攻擊者在內(nèi)網(wǎng)橫向時(shí)仍然非常順。
“一次加固就一勞永逸”:加固是持續(xù)過(guò)程,需要把基線、變更、回滾、驗(yàn)證、監(jiān)控串成閉環(huán),否則一次誤改就能把主機(jī)變成不可維護(hù)狀態(tài)(鎖死 SSH、sudo 失效、業(yè)務(wù)端口誤封等)。
本文按“調(diào)優(yōu)避坑類”方式組織:先講默認(rèn)值與適用邊界,再給出高頻誤改與風(fēng)險(xiǎn)矩陣,最后給出可落地的推薦配置、回滾方案與驗(yàn)證動(dòng)作,并覆蓋賬號(hào)安全、SSH 加固、防火墻、內(nèi)核參數(shù)、文件權(quán)限、審計(jì)日志六大方向。
1.2 安全基線對(duì)照表(CIS 視角 + 生產(chǎn)落地視角)
說(shuō)明:CIS Benchmark 的要求會(huì)因發(fā)行版與版本而不同。表中給出“方向?qū)φ铡?,落地時(shí)仍需按發(fā)行版官方文檔與企業(yè)合規(guī)要求調(diào)整。
| 加固域 | 本文關(guān)鍵點(diǎn)(20項(xiàng)) | CIS/常見(jiàn)基線關(guān)注點(diǎn) | 典型收益 | 典型風(fēng)險(xiǎn)點(diǎn) |
|---|---|---|---|---|
| 賬號(hào)安全 | 密碼復(fù)雜度/有效期、失敗鎖定、root 登錄限制、最小權(quán)限 sudo | 賬戶策略、口令策略、root/系統(tǒng)賬號(hào) | 降低爆破與憑據(jù)濫用 | 誤改導(dǎo)致運(yùn)維無(wú)法登錄 |
| SSH | 禁止密碼登錄、限制來(lái)源、強(qiáng)算法、空閑斷開、Banner | SSHD 配置、加密套件 | 減少暴露面與憑據(jù)攻擊 | 鎖死遠(yuǎn)程、舊客戶端不兼容 |
| 防火墻 | 默認(rèn)拒絕、最小放行、管理面隔離、出站策略 | Host firewall | 降低端口掃描與橫向 | 誤封業(yè)務(wù)端口、健康檢查失敗 |
| 內(nèi)核參數(shù) | 反欺騙、關(guān)閉重定向、SYN 防護(hù)、core dump 控制、ASLR | sysctl hardening | 降低網(wǎng)絡(luò)/內(nèi)核攻擊面 | 與容器/網(wǎng)絡(luò)棧策略沖突 |
| 文件權(quán)限 | umask、關(guān)鍵文件權(quán)限、禁止 SUID/SGID 濫用、/tmp 防護(hù) | permissions, mount options | 降低提權(quán)路徑 | 誤改影響程序?qū)懭?/td> |
| 審計(jì)日志 | auditd 規(guī)則、日志留存、遠(yuǎn)端匯聚、告警指標(biāo) | audit/logging | 事后可追溯、合規(guī)證據(jù) | 規(guī)則過(guò)多導(dǎo)致性能與磁盤壓力 |
1.3 適用場(chǎng)景
互聯(lián)網(wǎng)暴露主機(jī):跳板機(jī)、邊緣節(jié)點(diǎn)、對(duì)外 API 網(wǎng)關(guān)、獨(dú)立對(duì)外提供 SSH 的運(yùn)維主機(jī)。
內(nèi)網(wǎng)關(guān)鍵業(yè)務(wù)主機(jī):支付、訂單、賬號(hào)、權(quán)限、核心數(shù)據(jù)庫(kù)周邊。
交付前基線統(tǒng)一:鏡像制作、金鏡像、自動(dòng)化裝機(jī)(PXE/Cloud-init/Ansible)。
合規(guī)與審計(jì)要求:等保、ISO27001、SOC2 相關(guān)審計(jì)留證。
事故后補(bǔ)強(qiáng):發(fā)生爆破、異常登錄、橫向移動(dòng)、提權(quán)疑似后。
1.4 環(huán)境要求
| 組件 | 版本 / 要求 | 說(shuō)明 |
|---|---|---|
| 操作系統(tǒng) | RHEL/CentOS 7/8/9、Rocky/Alma、Ubuntu 20.04/22.04/24.04、Debian 11/12 | 不同發(fā)行版 PAM/sshd/auditd 路徑略有差異 |
| OpenSSH | 7.4+(建議 8.0+) | 老版本算法支持差,需兼容性評(píng)估 |
| 防火墻組件 | firewalld 或 nftables/iptables | 新發(fā)行版優(yōu)先 nftables |
| 審計(jì)組件 | auditd(audit) | 與 systemd-journald/rsyslog 配合 |
| 權(quán)限 | root 或具備 sudo 權(quán)限的運(yùn)維賬號(hào) | 加固需修改系統(tǒng)配置 |
| 監(jiān)控/日志 | Prometheus/Agent、ELK/EFK、SIEM(可選) | 用于落地監(jiān)控與告警閉環(huán) |
1.5 安全加固坐標(biāo)系(不要“東一榔頭西一棒子”)
本文把主機(jī)加固拆成 5 個(gè)層次,所有動(dòng)作都要能定位到坐標(biāo)系,并能回滾與驗(yàn)證:
| 層次 | 目標(biāo) | 關(guān)鍵檢查點(diǎn) | 典型證據(jù) |
|---|---|---|---|
| 入口層 | 控制誰(shuí)能連進(jìn)來(lái) | SSH、端口暴露、來(lái)源限制 | ss/iptables/firewalld 狀態(tài)、sshd_config |
| 身份層 | 控制誰(shuí)是誰(shuí) | 賬號(hào)策略、失敗鎖定、MFA(可選) | /etc/login.defs、PAM、faillock |
| 權(quán)限層 | 控制能做什么 | sudo 最小權(quán)限、SUID、文件權(quán)限 | sudoers.d、find 權(quán)限掃描 |
| 內(nèi)核/網(wǎng)絡(luò)層 | 控制攻擊面與系統(tǒng)行為 | sysctl hardening、內(nèi)核參數(shù) | sysctl -a、/etc/sysctl.d |
| 可觀測(cè)/審計(jì)層 | 控制能否追溯 | auditd、日志留存、告警 | audit.log、journald、SIEM 告警 |
二、詳細(xì)步驟(調(diào)優(yōu)避坑類結(jié)構(gòu))
本章分三段:
2.1 默認(rèn)值與適用邊界:告訴你“系統(tǒng)默認(rèn)大概是什么”“哪些場(chǎng)景別亂改”。
2.2 常見(jiàn)誤改與風(fēng)險(xiǎn)邊界:把最常見(jiàn)的“自殺式加固”寫清楚。
2.3 推薦調(diào)整、回滾與驗(yàn)證:給出可以直接落地的配置塊 + 驗(yàn)證命令鏈。
2.1 默認(rèn)值和適用場(chǎng)景
2.1.1 賬號(hào)安全默認(rèn)值概覽
不同發(fā)行版默認(rèn)策略差異較大,尤其是口令策略與失敗鎖定。
Ubuntu/Debian:常見(jiàn)依賴 PAM(pam_pwquality / pam_faillock 或舊的 pam_tally2),默認(rèn)并不一定啟用強(qiáng)復(fù)雜度。
RHEL 系:system-auth/password-auth 棧較完整,但企業(yè)鏡像可能被二次改動(dòng)。
關(guān)鍵默認(rèn)文件:
/etc/login.defs:密碼有效期、最小長(zhǎng)度(并不強(qiáng)制復(fù)雜度)。
/etc/pam.d/*:認(rèn)證棧(真正決定復(fù)雜度/鎖定/限制)。
驗(yàn)證命令鏈:
# 當(dāng)前密碼策略相關(guān)文件 ls -l /etc/login.defs /etc/security/pwquality.conf 2>/dev/null ||true # 失敗鎖定(RHEL系常見(jiàn)) command-v faillock >/dev/null && faillock --user root ||true # PAM 棧(不同發(fā)行版路徑不同) ls -l /etc/pam.d/system-auth /etc/pam.d/password-auth 2>/dev/null ||true
2.1.2 SSH 默認(rèn)值概覽
OpenSSH 默認(rèn)通常偏“可用性優(yōu)先”,在互聯(lián)網(wǎng)暴露環(huán)境需要收緊。
關(guān)鍵默認(rèn)點(diǎn):
PasswordAuthentication:很多發(fā)行版默認(rèn)yes。
PermitRootLogin:可能是prohibit-password或yes(老系統(tǒng))。
加密算法:新版本默認(rèn)更安全,但兼容舊客戶端時(shí)會(huì)被人為放寬。
驗(yàn)證命令鏈:
sshd -T | egrep -i'passwordauthentication|permitrootlogin|pubkeyauthentication|kexalgorithms|ciphers|macs'| sed's/^/sshd -T: /' # 已暴露監(jiān)聽(tīng) ss -lntp | egrep':22|:2222'||true
2.1.3 防火墻默認(rèn)值概覽
firewalld:默認(rèn) zone 往往是public,入站策略可能較寬。
nftables/iptables:很多主機(jī)默認(rèn)沒(méi)有規(guī)則,等同“全開”。
驗(yàn)證命令鏈:
# firewalld command-v firewall-cmd >/dev/null && firewall-cmd --state && firewall-cmd --get-default-zone && firewall-cmd --list-all ||true # nftables command-v nft >/dev/null && nft list ruleset | head -n 50 ||true # iptables command-v iptables >/dev/null && iptables -S ||true
2.1.4 內(nèi)核參數(shù)默認(rèn)值概覽(sysctl)
常見(jiàn)默認(rèn)風(fēng)險(xiǎn)點(diǎn):
net.ipv4.conf.*.accept_redirects/send_redirects/accept_source_route:部分系統(tǒng)默認(rèn)未完全關(guān)閉。
net.ipv4.ip_forward:在路由/容器主機(jī)可能開啟,業(yè)務(wù)機(jī)通常不需要。
fs.suid_dumpable、kernel.core_pattern:影響 core dump 與泄露。
驗(yàn)證命令鏈:
sysctl -a 2>/dev/null | egrep'accept_redirects|send_redirects|accept_source_route|rp_filter|ip_forward|randomize_va_space|kptr_restrict|dmesg_restrict|fs.suid_dumpable'| sort
2.1.5 文件權(quán)限與掛載默認(rèn)值概覽
默認(rèn)umask可能是022(更偏可讀),關(guān)鍵服務(wù)建議更嚴(yán)。
/tmp多數(shù)系統(tǒng)未強(qiáng)制noexec,nodev,nosuid(兼容性考慮)。
驗(yàn)證命令鏈:
umask mount | egrep' on /tmp | on /var/tmp | on /dev/shm '||true stat-c'%a %U:%G %n'/etc/passwd /etc/shadow /etc/gshadow /etc/ssh/sshd_config 2>/dev/null ||true
2.1.6 審計(jì)與日志默認(rèn)值概覽
auditd 可能未安裝/未啟動(dòng)。
journald 可能只本地短期保存。
驗(yàn)證命令鏈:
systemctl is-enabled auditd 2>/dev/null ||true systemctl is-active auditd 2>/dev/null ||true # journald 持久化 grep -E'^(Storage|SystemMaxUse|SystemKeepFree|MaxRetentionSec)='/etc/systemd/journald.conf 2>/dev/null ||true journalctl --disk-usage 2>/dev/null ||true
2.2 常見(jiàn)誤改和風(fēng)險(xiǎn)邊界
2.2.1 高風(fēng)險(xiǎn)誤改清單(先看這個(gè),再動(dòng)手)
| 誤改動(dòng)作 | 為什么危險(xiǎn) | 更穩(wěn)的做法 |
|---|---|---|
| 直接把PasswordAuthentication no寫入 sshd_config 并立即重啟 | 沒(méi)驗(yàn)證公鑰登錄鏈路就可能鎖死遠(yuǎn)程 | 先開第二個(gè) SSH 會(huì)話、先用sshd -t校驗(yàn)、再 reload |
| 把PermitRootLogin no但沒(méi)有預(yù)留 sudo 賬號(hào) | root 入口被關(guān),sudo 又不可用會(huì)直接“失聯(lián)” | 先確認(rèn)至少 2 個(gè)可 sudo 的運(yùn)維賬號(hào) |
| 防火墻default deny后忘記放行業(yè)務(wù)端口/健康檢查端口 | 業(yè)務(wù)下線、探活失敗、集群摘除 | 先列出端口清單(含探活/監(jiān)控/同步)再應(yīng)用 |
| rp_filter=1 強(qiáng)制開啟在多網(wǎng)卡/策略路由主機(jī) | 可能導(dǎo)致回包被丟、網(wǎng)絡(luò)異常 | 多網(wǎng)卡/策略路由用2(loose)或按接口精細(xì)配置 |
| 給/tmp加noexec但業(yè)務(wù)/安裝腳本依賴臨時(shí)執(zhí)行 | 安裝失敗、運(yùn)行時(shí)崩潰 | 先在灰度機(jī)驗(yàn)證,或用應(yīng)用專用臨時(shí)目錄 |
| audit 規(guī)則堆滿(每個(gè) syscalls 都記錄) | 高 IO/CPU、日志爆盤 | 只對(duì)關(guān)鍵動(dòng)作審計(jì),啟用 rotate、設(shè)置閾值告警 |
2.2.2 根因矩陣:加固后“看起來(lái)像故障”的現(xiàn)象如何定位
| 現(xiàn)象 | 首看證據(jù) | 二次驗(yàn)證 | 高概率根因 | 處理動(dòng)作 |
|---|---|---|---|---|
| SSH 連不上(連接被拒/超時(shí)) | ss -lntp 、防火墻狀態(tài) | journalctl -u sshd -n 200 | sshd 未監(jiān)聽(tīng)/防火墻未放行 | 回滾最近變更,先放行 22/管理端口 |
| SSH 能連但認(rèn)證失敗 | /var/log/auth.log 或/var/log/secure | sshd -T 、PAM 日志 | 禁用密碼但無(wú)公鑰;PAM 鎖定 | 先恢復(fù)至少一種認(rèn)證方式或解鎖 |
| sudo 報(bào)錯(cuò)/無(wú)法提權(quán) | sudo -l 輸出、/var/log/secure | 檢查/etc/sudoers.d權(quán)限 | sudoers 語(yǔ)法錯(cuò)誤/權(quán)限不對(duì) | 用visudo -c修復(fù),回滾文件 |
| 業(yè)務(wù)網(wǎng)絡(luò)異常 | dmesg 、ip route、sysctl | 抓包/連接跟蹤 | rp_filter/redirect 參數(shù)影響 | 調(diào)整為 loose 或按接口配置 |
| 磁盤快速增長(zhǎng) | audit.log/journalctl | du -sh /var/log/* | 審計(jì)規(guī)則過(guò)量、日志未輪轉(zhuǎn) | 收斂規(guī)則,配置 logrotate |
2.3 推薦調(diào)整、回滾與驗(yàn)證(20項(xiàng)關(guān)鍵配置)
建議原則:
每一項(xiàng)都要有回滾手段;2) 每一項(xiàng)都要有驗(yàn)證命令;3) 先灰度、后全量;4) 所有變更落盤可追溯(配置備份 + 變更記錄)。
下面的 20 項(xiàng)按六大域組織:
賬號(hào)安全(1-6)
SSH 加固(7-12)
防火墻(13-14)
內(nèi)核參數(shù)(15-17)
文件權(quán)限與掛載(18-19)
審計(jì)日志(20)
2.3.1 賬號(hào)安全(1/20):最小化可登錄賬號(hào) + 鎖定無(wú)用系統(tǒng)賬號(hào)
推薦調(diào)整:
對(duì)無(wú)交互登錄需求的系統(tǒng)賬號(hào),將 shell 設(shè)置為/sbin/nologin或/usr/sbin/nologin。
對(duì)不再使用的本地賬號(hào)執(zhí)行鎖定。
# 找出可登錄賬號(hào)(shell 非 nologin/false)
awk -F:'($7 !~ /(nologin|false)$/){print $1" "$7}'/etc/passwd
# 鎖定賬號(hào)(示例:olduser)
passwd -l olduser
usermod -s /sbin/nologin olduser 2>/dev/null || usermod -s /usr/sbin/nologin olduser
# 驗(yàn)證鎖定狀態(tài)
passwd -S olduser ||true
回滾:
passwd -u olduser usermod -s /bin/bash olduser
風(fēng)險(xiǎn)邊界:不要鎖定正在跑業(yè)務(wù)的服務(wù)賬號(hào)(如應(yīng)用進(jìn)程需要 su/sudo 或登錄執(zhí)行維護(hù)腳本的賬號(hào))。
2.3.2 賬號(hào)安全(2/20):口令復(fù)雜度(pam_pwquality)
推薦調(diào)整:?jiǎn)⒂貌⑹站o口令質(zhì)量(長(zhǎng)度、字符類、重復(fù)限制)。
Ubuntu/Debian 常見(jiàn)配置:/etc/security/pwquality.conf
# /etc/security/pwquality.conf minlen = 14 dcredit = -1 ucredit = -1 lcredit = -1 ocredit = -1 maxrepeat = 3 maxclassrepeat = 4 gecoscheck = 1 reject_username = 1
RHEL 系常見(jiàn)在 PAM 棧中指定(示例片段):
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok
驗(yàn)證:
# 嘗試給測(cè)試賬號(hào)設(shè)置弱口令(應(yīng)被拒絕) # passwd testuser # 查看 pwquality 生效路徑 grep -R"pam_pwquality"-n /etc/pam.d 2>/dev/null | head
回滾:恢復(fù)原 pwquality.conf 與 PAM 文件(見(jiàn)第 3 章腳本“備份/回滾”)。
風(fēng)險(xiǎn)邊界:過(guò)度收緊會(huì)導(dǎo)致自動(dòng)化賬號(hào)/機(jī)器人賬號(hào)改密失敗,建議把機(jī)器賬號(hào)改為密鑰/令牌機(jī)制,不要靠弱口令。
2.3.3 賬號(hào)安全(3/20):密碼有效期與最小更改間隔(login.defs)
推薦調(diào)整:
人員賬號(hào):強(qiáng)制周期換密(例如 90 天)。
機(jī)器賬號(hào):不建議靠周期換密;建議用密鑰/證書。
/etc/login.defs建議值:
PASS_MAX_DAYS 90 PASS_MIN_DAYS 1 PASS_WARN_AGE 14
驗(yàn)證:
chage -l
回滾:將 PASS_* 恢復(fù)或只對(duì)特定用戶用chage定向設(shè)置。
風(fēng)險(xiǎn)邊界:對(duì)大量賬號(hào)直接統(tǒng)一改會(huì)觸發(fā)集中改密潮,建議分批推進(jìn)并結(jié)合 IAM 流程。
2.3.4 賬號(hào)安全(4/20):登錄失敗鎖定(pam_faillock)
推薦調(diào)整:對(duì)本地認(rèn)證啟用失敗鎖定,降低爆破成功率。
RHEL 8/9 示例(system-auth/password-auth 常見(jiàn)寫法):
auth required pam_faillock.so preauth silent deny=5 unlock_time=900 fail_interval=900 auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900 fail_interval=900 account required pam_faillock.so
驗(yàn)證:
# 連續(xù)輸錯(cuò)密碼后查看 faillock --user# 解鎖 faillock --user --reset
回滾:移除 pam_faillock 相關(guān)行或恢復(fù)備份。
風(fēng)險(xiǎn)邊界:
需要明確“鎖定的是誰(shuí)”:對(duì)運(yùn)維賬號(hào)也鎖定會(huì)增加值班風(fēng)險(xiǎn)。
建議配套“break-glass”賬號(hào)(強(qiáng)權(quán)限、強(qiáng)審計(jì)、離線保管)。
2.3.5 賬號(hào)安全(5/20):限制 su(僅 wheel 組可 su)
推薦調(diào)整:?jiǎn)⒂胮am_wheel限制su。
/etc/pam.d/su示例:
auth required pam_wheel.so use_uid group=wheel
驗(yàn)證:
getent group wheel || grep'^wheel:'/etc/group # 非 wheel 用戶執(zhí)行 su 應(yīng)失敗 # su -
回滾:注釋/移除該行。
風(fēng)險(xiǎn)邊界:在不使用 su、只用 sudo 的團(tuán)隊(duì)可不啟用,避免對(duì)歷史腳本造成影響。
2.3.6 賬號(hào)安全(6/20):sudo 最小權(quán)限與日志
推薦調(diào)整:
業(yè)務(wù)運(yùn)維按職責(zé)拆分 sudoers(命令級(jí)最小化)。
強(qiáng)制 sudo 日志記錄與 TTY。
/etc/sudoers.d/ops-minimal示例(權(quán)限文件必須 0440):
Defaults use_pty Defaults logfile="/var/log/sudo.log" Defaults loglinelen=0 # 僅允許運(yùn)維組執(zhí)行 systemctl/journalctl 等 %ops ALL=(root) NOPASSWD: /bin/systemctl, /bin/journalctl # 禁止通配符給出 /bin/bash 之類的逃逸命令
驗(yàn)證:
visudo -c sudo -l sudo systemctl status sshd sudo tail -n 5 /var/log/sudo.log 2>/dev/null ||true
回滾:刪除/恢復(fù) sudoers.d 文件(先用備份)。
風(fēng)險(xiǎn)邊界:
NOPASSWD不是原罪,但必須配套審計(jì)與來(lái)源控制。
禁止把ALL直接給到廣泛人群。
2.3.7 SSH(7/20):禁止 root 直接登錄(保留可審計(jì)的 sudo 入口)
推薦調(diào)整:
互聯(lián)網(wǎng)暴露:PermitRootLogin no
內(nèi)網(wǎng)可控:至少prohibit-password(僅允許密鑰)
/etc/ssh/sshd_config:
PermitRootLogin no
驗(yàn)證:
sshd -t && systemctl reload sshd sshd -T | grep -i permitrootlogin
回滾:改回prohibit-password或yes(僅臨時(shí)救援,需配套來(lái)源限制)。
2.3.8 SSH(8/20):關(guān)閉口令登錄,強(qiáng)制公鑰(生產(chǎn)推薦)
/etc/ssh/sshd_config:
PasswordAuthentication no KbdInteractiveAuthentication no PubkeyAuthentication yes AuthenticationMethods publickey
驗(yàn)證:
sshd -t sshd -T | egrep -i'passwordauthentication|kbdinteractiveauthentication|authenticationmethods' # 在另一個(gè)終端用密鑰登錄驗(yàn)證 # ssh -i ~/.ssh/id_ed25519 user@host
回滾:臨時(shí)打開PasswordAuthentication yes(必須同時(shí)限制來(lái)源 IP,并設(shè)置時(shí)間窗口)。
風(fēng)險(xiǎn)邊界:
舊自動(dòng)化腳本可能依賴密碼;應(yīng)遷移為密鑰或證書。
2.3.9 SSH(9/20):限制可登錄用戶/組(AllowUsers/AllowGroups)
/etc/ssh/sshd_config:
AllowGroups ops wheel # 或者精確到用戶:AllowUsers alice bob
驗(yàn)證:
getent group ops wheel ||true sshd -T | egrep -i'allowgroups|allowusers'
回滾:注釋該行或加入必要賬號(hào)。
風(fēng)險(xiǎn)邊界:
與集中賬號(hào)(LDAP/SSSD)結(jié)合時(shí),需要確認(rèn)組名解析正常。
2.3.10 SSH(10/20):收緊算法(Kex/Ciphers/MACs)并考慮兼容性
/etc/ssh/sshd_config(示例,需按版本調(diào)整):
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
驗(yàn)證:
sshd -T | egrep -i'kexalgorithms|ciphers|macs|hostkeyalgorithms' # 從客戶端探測(cè)(需要 nmap 或 ssh -Q) ssh -Q cipher | head ssh -Q kex | head
回滾:恢復(fù)為發(fā)行版默認(rèn)或逐步放寬(不要一次性把弱算法全開)。
風(fēng)險(xiǎn)邊界:某些老設(shè)備/老系統(tǒng)的 ssh 客戶端不支持新算法,需在跳板/堡壘層做兼容隔離。
2.3.11 SSH(11/20):空閑斷開與連接限制(防止掛起會(huì)話濫用)
/etc/ssh/sshd_config:
ClientAliveInterval 300 ClientAliveCountMax 2 LoginGraceTime 30 MaxAuthTries 3 MaxSessions 10
驗(yàn)證:
sshd -T | egrep -i'clientaliveinterval|clientalivecountmax|logingracetime|maxauthtries|maxsessions'
回滾:恢復(fù)原值。
2.3.12 SSH(12/20):記錄與提示(Banner、日志級(jí)別)
/etc/ssh/sshd_config:
LogLevel VERBOSE Banner /etc/issue.net
/etc/issue.net示例:
Authorized access only. All activity may be monitored and reported.
驗(yàn)證:
sshd -T | egrep -i'loglevel|banner'
風(fēng)險(xiǎn)邊界:Banner 不要泄露系統(tǒng)版本與內(nèi)部信息。
2.3.13 防火墻(13/20):入站默認(rèn)拒絕 + 最小放行(含回滾窗口)
以 firewalld 為例(nftables/iptables 類似):
# 查看當(dāng)前區(qū)與規(guī)則 firewall-cmd --get-default-zone firewall-cmd --list-all # 示例:只放行 SSH(22) + 業(yè)務(wù)(443) + 監(jiān)控(9100) firewall-cmd --permanent --add-service=ssh firewall-cmd --permanent --add-service=https firewall-cmd --permanent --add-port=9100/tcp # reload 前先在當(dāng)前會(huì)話確認(rèn)規(guī)則 firewall-cmd --reload firewall-cmd --list-all
回滾:
# 刪除放行 firewall-cmd --permanent --remove-port=9100/tcp ||true firewall-cmd --permanent --remove-service=https ||true firewall-cmd --reload
驗(yàn)證:
ss -lntp # 從允許來(lái)源探測(cè)端口 # nc -vz22 443 9100
風(fēng)險(xiǎn)邊界:要把集群健康檢查端口、配置下發(fā)端口、日志/監(jiān)控出站依賴一起納入“端口清單”。
2.3.14 防火墻(14/20):管理面隔離(來(lái)源 IP 白名單/跳板機(jī))
推薦:SSH 僅允許運(yùn)維網(wǎng)段或跳板機(jī) IP。
firewalld rich rule 示例:
# 僅允許 10.10.0.0/16 訪問(wèn) 22 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.0.0/16" port port="22" protocol="tcp" accept' # 其他來(lái)源拒絕(如果 zone 默認(rèn) accept,需要顯式 drop) firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" drop' firewall-cmd --reload
驗(yàn)證:
firewall-cmd --list-rich-rules
風(fēng)險(xiǎn)邊界:多跳板、多運(yùn)維網(wǎng)段時(shí)要確保白名單完整,否則會(huì)誤傷。
2.3.15 內(nèi)核參數(shù)(15/20):反欺騙與重定向關(guān)閉(sysctl)
/etc/sysctl.d/99-hardening.conf:
# 反欺騙與路由相關(guān) net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # 關(guān)閉 ICMP 重定向接收/發(fā)送 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # 禁止 source route net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0
應(yīng)用與驗(yàn)證:
sysctl --system sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.all.accept_redirects net.ipv4.conf.all.send_redirects
回滾:刪除該 sysctl 文件或恢復(fù)備份后sysctl --system。
風(fēng)險(xiǎn)邊界:
多網(wǎng)卡/策略路由:建議rp_filter=2(loose),或按接口設(shè)置。
2.3.16 內(nèi)核參數(shù)(16/20):SYN flood 防護(hù)與連接行為收斂
/etc/sysctl.d/99-hardening.conf增補(bǔ):
net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_synack_retries = 3 net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_fin_timeout = 15
驗(yàn)證:
sysctl net.ipv4.tcp_syncookies net.ipv4.tcp_max_syn_backlog
風(fēng)險(xiǎn)邊界:此類參數(shù)需要結(jié)合業(yè)務(wù)連接模型與壓測(cè)數(shù)據(jù);不要在無(wú)壓測(cè)情況下極端收緊。
2.3.17 內(nèi)核參數(shù)(17/20):內(nèi)核信息泄露與調(diào)試面收緊(ASLR/dmesg/kptr)
/etc/sysctl.d/99-hardening.conf增補(bǔ):
kernel.randomize_va_space = 2 kernel.kptr_restrict = 2 kernel.dmesg_restrict = 1 fs.suid_dumpable = 0
驗(yàn)證:
sysctl kernel.randomize_va_space kernel.kptr_restrict kernel.dmesg_restrict fs.suid_dumpable
風(fēng)險(xiǎn)邊界:某些調(diào)試與崩潰分析需要 core dump;生產(chǎn)可以按需對(duì)特定服務(wù)開啟,而不是全局開啟。
2.3.18 文件權(quán)限(18/20):關(guān)鍵文件權(quán)限基線(shadow/sudoers/ssh)
推薦基線:
# 典型期望: # /etc/shadow 000/400/600 僅 root 可讀 # /etc/sudoers 440 root:root # /etc/ssh/sshd_config 600 root:root chown root:root /etc/shadow /etc/gshadow /etc/sudoers /etc/ssh/sshd_config chmod 600 /etc/shadow /etc/gshadow /etc/ssh/sshd_config chmod 440 /etc/sudoers # 驗(yàn)證 stat-c'%a %U:%G %n'/etc/shadow /etc/gshadow /etc/sudoers /etc/ssh/sshd_config visudo -c
回滾:恢復(fù)為發(fā)行版默認(rèn)權(quán)限(建議從包管理器校驗(yàn):rpm -V sudo openssh-server或debsums)。
風(fēng)險(xiǎn)邊界:
如果把 sudoers 權(quán)限設(shè)錯(cuò)(如 644),sudo 會(huì)拒絕工作。
2.3.19 文件權(quán)限與掛載(19/20):/tmp、/dev/shm 防護(hù)(nodev,nosuid,noexec)
推薦調(diào)整:在安全要求高的環(huán)境,把臨時(shí)目錄掛載選項(xiàng)收緊。
/etc/fstab示例(需結(jié)合實(shí)際分區(qū)):
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0 tmpfs /tmp tmpfs defaults,nodev,nosuid,noexec,mode=1777 0 0
應(yīng)用與驗(yàn)證:
mount -o remount /tmp mount -o remount /dev/shm mount | egrep' on /tmp | on /dev/shm ' # 驗(yàn)證 noexec(應(yīng)失?。?cat > /tmp/test_exec.sh <<'EOF' #!/usr/bin/env bash echo?ok EOF chmod +x /tmp/test_exec.sh /tmp/test_exec.sh ||?echo?"noexec 生效,執(zhí)行被拒絕" rm -f /tmp/test_exec.sh
回滾:移除 noexec 后 remount;若業(yè)務(wù)依賴臨時(shí)執(zhí)行,可只對(duì) /dev/shm 做收緊。
風(fēng)險(xiǎn)邊界:
某些語(yǔ)言/框架會(huì)在 /tmp 生成可執(zhí)行臨時(shí)文件;必須在灰度驗(yàn)證。
2.3.20 審計(jì)日志(20/20):auditd 關(guān)鍵規(guī)則 + 留存與告警閾值
推薦調(diào)整:只審計(jì)“高價(jià)值動(dòng)作”,避免全量 syscalls。
/etc/audit/rules.d/hardening.rules示例:
# 刪除舊規(guī)則并設(shè)置緩沖 -D -b 8192 -f 1 # 賬戶與權(quán)限關(guān)鍵文件 -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/group -p wa -k identity -w /etc/gshadow -p wa -k identity # sudoers 變更 -w /etc/sudoers -p wa -k scope -w /etc/sudoers.d/ -p wa -k scope # sshd 配置 -w /etc/ssh/sshd_config -p wa -k sshd # 特權(quán)命令執(zhí)行(按需選?。?-a always,exit -F arch=b64 -S execve -F euid=0 -k privileged # 時(shí)間修改 -a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k time-change -w /etc/localtime -p wa -k time-change # 網(wǎng)絡(luò)配置變更 -a always,exit -F arch=b64 -S sethostname,setdomainname -k system-locale -w /etc/hosts -p wa -k system-locale -w /etc/sysctl.conf -p wa -k sysctl -w /etc/sysctl.d/ -p wa -k sysctl
應(yīng)用與驗(yàn)證:
augenrules --load 2>/dev/null ||true systemctl restart auditd # 觸發(fā)一次 sudoers 讀取與查看近期事件 auditctl -s ausearch -k scope -ts recent | head -n 20
回滾:恢復(fù) rules.d 目錄備份并重載規(guī)則。
風(fēng)險(xiǎn)邊界:
-f 1表示審計(jì)失敗時(shí)觸發(fā)告警(不同策略含義不同),生產(chǎn)需評(píng)估;不要在磁盤不足情況下強(qiáng)制啟用。
三、示例代碼和配置
本章提供可復(fù)用的配置與腳本,目標(biāo)是“配置-執(zhí)行-驗(yàn)證-回滾”閉環(huán)。
3.1 完整配置樣例:sshd_config(可按需裁剪)
# 文件位置:/etc/ssh/sshd_config Port 22 Protocol 2 PermitRootLogin no PasswordAuthentication no KbdInteractiveAuthentication no PubkeyAuthentication yes AuthenticationMethods publickey AllowGroups ops wheel LogLevel VERBOSE Banner /etc/issue.net ClientAliveInterval 300 ClientAliveCountMax 2 LoginGraceTime 30 MaxAuthTries 3 MaxSessions 10 # 算法(按 OpenSSH 版本調(diào)整) KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com # 禁止轉(zhuǎn)發(fā)(跳板機(jī)按需開放) AllowTcpForwarding no X11Forwarding no PermitTunnel no # 限制環(huán)境變量注入 AcceptEnv LANG LC_*
說(shuō)明:
AllowGroups會(huì)影響集中賬號(hào)解析,啟用前確認(rèn)getent group正常。
禁止轉(zhuǎn)發(fā)會(huì)影響部分隧道類運(yùn)維方式(如 ssh -L),需要在跳板層統(tǒng)一規(guī)劃。
3.2 完整配置樣例:sysctl 加固文件
# 文件位置:/etc/sysctl.d/99-hardening.conf # 網(wǎng)絡(luò)基礎(chǔ)防護(hù) net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 # 反欺騙(多網(wǎng)卡/策略路由按需改為 2) net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # SYN 與連接行為(需要壓測(cè)驗(yàn)證) net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_synack_retries = 3 net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_fin_timeout = 15 # 信息泄露與調(diào)試面 kernel.randomize_va_space = 2 kernel.kptr_restrict = 2 kernel.dmesg_restrict = 1 fs.suid_dumpable = 0
應(yīng)用:
sysctl --system
3.3 完整配置樣例:auditd 規(guī)則(關(guān)鍵動(dòng)作審計(jì))
# 文件位置:/etc/audit/rules.d/hardening.rules -D -b 8192 -f 1 -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/group -p wa -k identity -w /etc/gshadow -p wa -k identity -w /etc/sudoers -p wa -k scope -w /etc/sudoers.d/ -p wa -k scope -w /etc/ssh/sshd_config -p wa -k sshd -a always,exit -F arch=b64 -S execve -F euid=0 -k privileged -a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k time-change -w /etc/localtime -p wa -k time-change -w /etc/sysctl.conf -p wa -k sysctl -w /etc/sysctl.d/ -p wa -k sysctl
驗(yàn)證:
augenrules --load 2>/dev/null ||true systemctl restart auditd ausearch -k identity -ts recent | head
3.4 腳本一:快速采集加固證據(jù)(適合工單/復(fù)盤留檔)
#!/usr/bin/env bash
set-euo pipefail
# 文件名:collect-hardening-evidence.sh
# 作用:采集主機(jī)加固相關(guān)證據(jù)與關(guān)鍵配置
# 適用場(chǎng)景:變更前對(duì)比、變更后留檔、審計(jì)抽查
# 使用方法:sudo bash collect-hardening-evidence.sh /tmp/hardening-evidence
# 輸入?yún)?shù):輸出目錄
# 輸出結(jié)果:在輸出目錄生成多個(gè)文本文件
# 風(fēng)險(xiǎn)提示:只讀采集,風(fēng)險(xiǎn)低
OUT_DIR="${1:-/tmp/hardening-evidence}"
mkdir -p"$OUT_DIR"
{
echo"== time =="; date -Is
echo
echo"== os =="; cat /etc/os-release 2>/dev/null ||true
echo
echo"== kernel =="; uname -a
echo
echo"== sshd -T (selected) =="; sshd -T 2>/dev/null | egrep -i'port|permitrootlogin|passwordauthentication|pubkeyauthentication|authenticationmethods|allowusers|allowgroups|loglevel|clientaliveinterval|ciphers|macs|kexalgorithms'||true
echo
echo"== listening ports =="; ss -lntp
echo
echo"== firewall ==";
ifcommand-v firewall-cmd >/dev/null;thenfirewall-cmd --state && firewall-cmd --get-default-zone && firewall-cmd --list-all;fi
ifcommand-v nft >/dev/null;thennft list ruleset | head -n 200;fi
ifcommand-v iptables >/dev/null;theniptables -S;fi
echo
echo"== sysctl (selected) =="; sysctl -a 2>/dev/null | egrep'rp_filter|accept_redirects|send_redirects|accept_source_route|tcp_syncookies|randomize_va_space|kptr_restrict|dmesg_restrict|fs.suid_dumpable'| sort
echo
echo"== critical file perms ==";stat-c'%a %U:%G %n'/etc/passwd /etc/shadow /etc/gshadow /etc/sudoers /etc/ssh/sshd_config 2>/dev/null ||true
echo
echo"== auditd =="; systemctl is-active auditd 2>/dev/null ||true; auditctl -s 2>/dev/null ||true
} | tee"$OUT_DIR/summary.txt">/dev/null
# 單獨(dú)保存配置文件(若存在)
cp -a /etc/ssh/sshd_config"$OUT_DIR/"2>/dev/null ||true
cp -a /etc/sysctl.conf"$OUT_DIR/"2>/dev/null ||true
cp -a /etc/sysctl.d"$OUT_DIR/"2>/dev/null ||true
cp -a /etc/audit/rules.d"$OUT_DIR/"2>/dev/null ||true
echo"Evidence collected in:$OUT_DIR"
3.5 腳本二:加固前自動(dòng)備份(強(qiáng)烈建議每次變更先跑)
#!/usr/bin/env bash
set-euo pipefail
# 文件名:backup-hardening-configs.sh
# 作用:對(duì)關(guān)鍵配置進(jìn)行時(shí)間戳備份
# 適用場(chǎng)景:任何加固/變更前
# 使用方法:sudo bash backup-hardening-configs.sh /var/backups/hardening
# 輸入?yún)?shù):備份根目錄
# 輸出結(jié)果:創(chuàng)建一個(gè)帶時(shí)間戳的備份目錄
# 風(fēng)險(xiǎn)提示:只讀復(fù)制,風(fēng)險(xiǎn)低
BACKUP_ROOT="${1:-/var/backups/hardening}"
TS="$(date +%Y%m%d-%H%M%S)"
DST="$BACKUP_ROOT/$TS"
mkdir -p"$DST"
copy_if_exists() {
localp="$1"
if[ -e"$p"];then
mkdir -p"$DST$(dirname "$p")"
cp -a"$p""$DST$p"
fi
}
copy_if_exists /etc/ssh/sshd_config
copy_if_exists /etc/login.defs
copy_if_exists /etc/security/pwquality.conf
copy_if_exists /etc/pam.d
copy_if_exists /etc/sudoers
copy_if_exists /etc/sudoers.d
copy_if_exists /etc/sysctl.conf
copy_if_exists /etc/sysctl.d
copy_if_exists /etc/fstab
copy_if_exists /etc/audit/auditd.conf
copy_if_exists /etc/audit/rules.d
printf'Backup created: %s
'"$DST"
3.6 腳本三:加固變更驗(yàn)證(集中跑一遍,避免遺漏)
#!/usr/bin/env bash
set-euo pipefail
# 文件名:verify-hardening.sh
# 作用:對(duì)關(guān)鍵加固項(xiàng)做一致性檢查與輸出
# 適用場(chǎng)景:變更后自檢、上線前檢查
# 使用方法:sudo bash verify-hardening.sh
# 輸入?yún)?shù):無(wú)
# 輸出結(jié)果:標(biāo)準(zhǔn)輸出,便于工單留存
# 風(fēng)險(xiǎn)提示:只讀檢查,風(fēng)險(xiǎn)低
fail=0
check() {
localname="$1";shift
echo"[CHECK]$name"
if"$@";then
echo" PASS"
else
echo" FAIL"
fail=1
fi
}
# sshd 語(yǔ)法
check"sshd config syntax"sshd -t
# sshd 關(guān)鍵項(xiàng)
check"sshd: PermitRootLogin is no"bash -lc"sshd -T | grep -qi '^permitrootlogin no$'"
check"sshd: PasswordAuthentication is no"bash -lc"sshd -T | grep -qi '^passwordauthentication no$'"
# 防火墻狀態(tài)(若使用 firewalld)
ifcommand-v firewall-cmd >/dev/null;then
check"firewalld running"firewall-cmd --state
fi
# sysctl 關(guān)鍵項(xiàng)
check"sysctl: accept_redirects=0"bash -lc"sysctl -n net.ipv4.conf.all.accept_redirects | grep -qx '0'"
check"sysctl: send_redirects=0"bash -lc"sysctl -n net.ipv4.conf.all.send_redirects | grep -qx '0'"
# 關(guān)鍵文件權(quán)限
check"/etc/shadow perms"bash -lc"stat -c '%a' /etc/shadow 2>/dev/null | egrep -qx '400|000|600'"
check"/etc/sudoers perms"bash -lc"stat -c '%a' /etc/sudoers 2>/dev/null | grep -qx '440'"
# auditd
ifsystemctl is-active auditd >/dev/null 2>&1;then
echo"[INFO] auditd active"
auditctl -s ||true
else
echo"[WARN] auditd not active"
fi
exit"$fail"
3.7 腳本四:一鍵回滾(從備份目錄恢復(fù)關(guān)鍵文件)
#!/usr/bin/env bash
set-euo pipefail
# 文件名:rollback-hardening.sh
# 作用:從備份目錄回滾關(guān)鍵配置
# 適用場(chǎng)景:誤改導(dǎo)致登錄/業(yè)務(wù)異常,需要快速恢復(fù)
# 使用方法:sudo bash rollback-hardening.sh /var/backups/hardening/20260101-010101
# 輸入?yún)?shù):備份目錄(由 backup-hardening-configs.sh 生成)
# 輸出結(jié)果:恢復(fù)配置并提示下一步
# 風(fēng)險(xiǎn)提示:會(huì)覆蓋系統(tǒng)配置,需在控制臺(tái)/帶外通道可用時(shí)操作
SRC="http://m.makelele.cn/images/chaijie_default.png"
restore_if_exists() {
localp="$1"
if[ -e"$SRC$p"];then
mkdir -p"$(dirname "$p")"
cp -a"$SRC$p""$p"
echo"restored:$p"
fi
}
restore_if_exists /etc/ssh/sshd_config
restore_if_exists /etc/login.defs
restore_if_exists /etc/security/pwquality.conf
restore_if_exists /etc/pam.d
restore_if_exists /etc/sudoers
restore_if_exists /etc/sudoers.d
restore_if_exists /etc/sysctl.conf
restore_if_exists /etc/sysctl.d
restore_if_exists /etc/fstab
restore_if_exists /etc/audit/auditd.conf
restore_if_exists /etc/audit/rules.d
echo"Reloading services (best-effort) ..."
systemctl reload sshd 2>/dev/null ||true
sysctl --system 2>/dev/null ||true
systemctl restart auditd 2>/dev/null ||true
echo"Rollback done. Re-test SSH/sudo and service health."
3.8 腳本五:審計(jì)日志歸桶(按關(guān)鍵事件分桶,便于排障/復(fù)盤)
#!/usr/bin/env bash
set-euo pipefail
# 文件名:bucket-security-logs.sh
# 作用:把常見(jiàn)安全事件從日志中歸桶:SSH失敗、sudo、用戶變更、審計(jì)關(guān)鍵 key
# 適用場(chǎng)景:安全事件排查、審計(jì)抽查、事故復(fù)盤
# 使用方法:sudo bash bucket-security-logs.sh /var/log /tmp/sec-buckets
# 輸入?yún)?shù):日志目錄、輸出目錄
# 輸出結(jié)果:在輸出目錄生成多類事件文件
# 風(fēng)險(xiǎn)提示:只讀讀取日志,風(fēng)險(xiǎn)低
LOG_DIR="${1:-/var/log}"
OUT_DIR="${2:-/tmp/sec-buckets}"
mkdir -p"$OUT_DIR"
AUTH_LOG=""
if[ -f"$LOG_DIR/auth.log"];thenAUTH_LOG="$LOG_DIR/auth.log";fi
if[ -f"$LOG_DIR/secure"];thenAUTH_LOG="$LOG_DIR/secure";fi
if[ -n"$AUTH_LOG"];then
egrep -i'Failed password|Invalid user|authentication failure'"$AUTH_LOG"| tail -n 2000 >"$OUT_DIR/ssh_failed.log"||true
egrep -i'sudo:'"$AUTH_LOG"| tail -n 2000 >"$OUT_DIR/sudo.log"||true
egrep -i'useradd|usermod|passwd[|chage'"$AUTH_LOG"| tail -n 2000 >"$OUT_DIR/account_change.log"||true
fi
AUDIT_LOG="$LOG_DIR/audit/audit.log"
if[ -f"$AUDIT_LOG"];then
egrep' key=(identity|scope|sshd|privileged|sysctl|time-change)'"$AUDIT_LOG"| tail -n 5000 >"$OUT_DIR/audit_key_events.log"||true
fi
echo"Buckets written to:$OUT_DIR"
四、實(shí)際應(yīng)用案例(4個(gè)生產(chǎn)環(huán)境加固案例)
案例以“現(xiàn)象→判斷→下鉆→證據(jù)→根因→修復(fù)→驗(yàn)證→防再發(fā)”組織,并給出可復(fù)用檢查點(diǎn)。
4.1 案例一:互聯(lián)網(wǎng)跳板機(jī)遭遇 SSH 爆破(從告警到閉環(huán))
4.1.1 現(xiàn)場(chǎng)現(xiàn)象
SIEM 告警:短時(shí)間大量 SSH 登錄失敗。
跳板機(jī) CPU 升高,sshd進(jìn)程頻繁。
4.1.2 第一輪判斷
先確認(rèn)是否為外部爆破與來(lái)源集中:
# 統(tǒng)計(jì)失敗來(lái)源 IP(示例:auth.log)
awk'/Failed password/ {print $(NF-3)}'/var/log/auth.log | sort | uniq -c | sort -nr | head
# 當(dāng)前連接
ss -tn state established'( sport = :22 )'| head
4.1.3 第二輪下鉆
核對(duì) sshd 是否允許口令登錄、是否開啟失敗鎖定:
sshd -T | egrep -i'passwordauthentication|permitrootlogin|loglevel' command-v faillock >/dev/null && faillock --user <被攻擊賬號(hào)> ||true
4.1.4 關(guān)鍵證據(jù)
日志片段示例(/var/log/auth.log):
Mar 11 1001 bastion sshd[12345]: Failed password for invalid user admin from 203.0.113.10 port 51234 ssh2 Mar 11 1003 bastion sshd[12346]: Failed password for root from 203.0.113.10 port 51288 ssh2
4.1.5 根因
跳板機(jī)對(duì)公網(wǎng)暴露 22,且啟用了PasswordAuthentication yes,缺少來(lái)源白名單與失敗鎖定,導(dǎo)致爆破成本極低。
4.1.6 修復(fù)動(dòng)作
立即止血:防火墻限制 SSH 來(lái)源到運(yùn)維網(wǎng)段。
長(zhǎng)期修復(fù):關(guān)閉口令登錄,強(qiáng)制公鑰;啟用失敗鎖定;收緊MaxAuthTries。
4.1.7 修復(fù)后驗(yàn)證
# 驗(yàn)證只有白名單能訪問(wèn) 22 firewall-cmd --list-rich-rules # 驗(yàn)證口令關(guān)閉 sshd -T | grep -i'^passwordauthentication no$' # 觀察 30 分鐘失敗次數(shù)是否明顯下降 # 可結(jié)合日志或指標(biāo)統(tǒng)計(jì)
4.1.8 防再發(fā)建議
把“跳板機(jī)必須白名單 + 禁止口令 + 失敗鎖定”做成上線門禁。
接入集中日志與告警(第 6 章給出規(guī)則模板)。
4.2 案例二:內(nèi)網(wǎng)業(yè)務(wù)機(jī)加固后服務(wù)異常(rp_filter 誤傷回包)
4.2.1 現(xiàn)場(chǎng)現(xiàn)象
變更后:業(yè)務(wù)間歇性超時(shí),重試可恢復(fù)。
應(yīng)用日志無(wú)明顯錯(cuò)誤,但請(qǐng)求鏈路出現(xiàn)丟包。
4.2.2 第一輪判斷
先確認(rèn)是否網(wǎng)絡(luò)層丟包與路由異常:
ip a ip route sysctl net.ipv4.conf.all.rp_filter
4.2.3 第二輪下鉆
該主機(jī)存在多網(wǎng)卡與策略路由,嚴(yán)格反向路徑校驗(yàn)會(huì)丟棄“非對(duì)稱路由回包”。
抓取內(nèi)核丟包統(tǒng)計(jì)(示意):
dmesg | tail -n 50 nstat -az | egrep'IpInNoRoutes|IpInDiscards|TcpExtTCPAbortOnMemory'
4.2.4 關(guān)鍵證據(jù)
rp_filter=1(strict)在策略路由主機(jī)觸發(fā)回包丟棄。
4.2.5 根因
把通用加固配置“無(wú)差別”套到了多網(wǎng)卡/策略路由主機(jī)。
4.2.6 修復(fù)動(dòng)作
將rp_filter調(diào)整為2(loose)或按接口定向配置。
sysctl -w net.ipv4.conf.all.rp_filter=2 sysctl -w net.ipv4.conf.default.rp_filter=2 # 固化到 sysctl 文件 sed -i's/net.ipv4.conf.all.rp_filter = 1/net.ipv4.conf.all.rp_filter = 2/'/etc/sysctl.d/99-hardening.conf sed -i's/net.ipv4.conf.default.rp_filter = 1/net.ipv4.conf.default.rp_filter = 2/'/etc/sysctl.d/99-hardening.conf sysctl --system
4.2.7 修復(fù)后驗(yàn)證
觀察業(yè)務(wù)超時(shí)是否消失。
指標(biāo)側(cè):P99 延遲回落、超時(shí)率下降(第 6 章給出指標(biāo)表)。
4.2.8 防再發(fā)建議
加固要“按角色模板化”:?jiǎn)尉W(wǎng)卡業(yè)務(wù)機(jī) vs 多網(wǎng)卡網(wǎng)關(guān)/容器節(jié)點(diǎn)必須分模板。
4.3 案例三:/tmp noexec 導(dǎo)致發(fā)布腳本失?。庸膛c可用性沖突)
4.3.1 現(xiàn)場(chǎng)現(xiàn)象
發(fā)布失敗,錯(cuò)誤提示“Permission denied”。
回滾發(fā)布也失敗。
4.3.2 第一輪判斷
快速確認(rèn)是否為掛載選項(xiàng)導(dǎo)致:
mount | grep' on /tmp ' # 嘗試在 /tmp 執(zhí)行最小腳本 printf'#!/bin/sh echo ok '> /tmp/x && chmod +x /tmp/x && /tmp/x
4.3.3 第二輪下鉆
發(fā)布工具把臨時(shí)執(zhí)行文件放在 /tmp,noexec 會(huì)拒絕執(zhí)行。
4.3.4 關(guān)鍵證據(jù)
mount顯示/tmp具備noexec。
4.3.5 根因
沒(méi)有對(duì)發(fā)布鏈路做灰度驗(yàn)證就強(qiáng)制啟用/tmp noexec。
4.3.6 修復(fù)動(dòng)作
兩種穩(wěn)妥做法:
臨時(shí)回滾/tmp的noexec;
更推薦:發(fā)布工具改用應(yīng)用專用目錄(如/var/lib/app/tmp),并只對(duì)/dev/shm做 noexec。
4.3.7 修復(fù)后驗(yàn)證
發(fā)布成功率恢復(fù)。
/tmp不再作為可執(zhí)行臨時(shí)目錄或僅在白名單機(jī)器啟用。
4.3.8 防再發(fā)建議
把/tmp noexec納入“需要業(yè)務(wù)驗(yàn)證的高風(fēng)險(xiǎn)加固項(xiàng)”,統(tǒng)一灰度策略。
4.4 案例四:審計(jì)規(guī)則過(guò)量導(dǎo)致磁盤告警(審計(jì)要可持續(xù))
4.4.1 現(xiàn)場(chǎng)現(xiàn)象
/var使用率快速上漲。
auditd日志每小時(shí)數(shù) GB。
4.4.2 第一輪判斷
du -sh /var/log/* | sort -h | tail wc -l /var/log/audit/audit.log auditctl -l | wc -l
4.4.3 第二輪下鉆
發(fā)現(xiàn)審計(jì)規(guī)則包含大量 syscalls 全量記錄,并且沒(méi)有有效輪轉(zhuǎn)策略。
4.4.4 關(guān)鍵證據(jù)
auditctl -l輸出規(guī)則數(shù)量異常大。
ausearch查詢顯示大量無(wú)價(jià)值事件。
4.4.5 根因
把“審計(jì)=全量記錄”當(dāng)作安全,忽略可持續(xù)性。
4.4.6 修復(fù)動(dòng)作
收斂為關(guān)鍵規(guī)則(第 2.3.20)。
配置 logrotate 或 auditd 的 max_log_file 與 rotate。
/etc/audit/auditd.conf關(guān)鍵項(xiàng)示例:
max_log_file = 50 num_logs = 10 max_log_file_action = ROTATE space_left = 500 space_left_action = SYSLOG admin_space_left = 200 admin_space_left_action = SUSPEND
4.4.7 修復(fù)后驗(yàn)證
觀察 24 小時(shí)日志增長(zhǎng)曲線回歸平穩(wěn)。
告警閾值(見(jiàn)第 6 章)不再頻繁觸發(fā)。
4.4.8 防再發(fā)建議
審計(jì)規(guī)則納入容量評(píng)估:以“每秒事件數(shù)”“每日增量”作為上線門檻。
五、最佳實(shí)踐和注意事項(xiàng)
5.1 最佳實(shí)踐(可執(zhí)行版)
變更前必須備份:先跑backup-hardening-configs.sh,保證任何時(shí)候可回滾。
始終保留帶外/控制臺(tái)通道:涉及 SSH、sudo 的變更必須保證有控制臺(tái)可用。
按主機(jī)角色分模板:跳板機(jī)、業(yè)務(wù)機(jī)、容器節(jié)點(diǎn)、網(wǎng)關(guān)節(jié)點(diǎn)的加固項(xiàng)不同。
安全項(xiàng)也要壓測(cè)與灰度:sysctl 與掛載選項(xiàng)對(duì)網(wǎng)絡(luò)/性能影響不可忽略。
最小暴露面優(yōu)先:先做來(lái)源白名單與端口收斂,再做復(fù)雜審計(jì)。
審計(jì)要“可持續(xù)”:關(guān)鍵事件優(yōu)先,容量閾值與輪轉(zhuǎn)必須到位。
5.2 注意事項(xiàng)(高頻踩坑點(diǎn))
禁用口令前必須驗(yàn)證密鑰登錄鏈路(至少兩人/兩把密鑰)。
AllowGroups/AllowUsers配合 LDAP/SSSD 時(shí)要驗(yàn)證解析鏈路,否則會(huì)誤封。
防火墻規(guī)則要包含:業(yè)務(wù)端口、探活端口、監(jiān)控端口、配置同步端口、必要出站。
rp_filter與多網(wǎng)卡/策略路由沖突高,必須按角色模板。
5.3 常見(jiàn)錯(cuò)誤清單(適合做變更門禁)
| 錯(cuò)誤動(dòng)作 | 為什么危險(xiǎn) | 更穩(wěn)的做法 |
|---|---|---|
| 直接在生產(chǎn)全量改 sshd | 誤傷會(huì)導(dǎo)致大面積失聯(lián) | 先灰度 1-2 臺(tái) + 預(yù)案演練 |
| sysctl 一把梭且無(wú)壓測(cè) | 網(wǎng)絡(luò)/性能問(wèn)題難歸因 | 逐項(xiàng)啟用 + 指標(biāo)對(duì)照 |
| audit 全量記錄 | 爆盤、性能下降 | 關(guān)鍵事件審計(jì) + 閾值告警 |
| sudo 給 ALL 或 bash | 直接權(quán)限逃逸 | 命令級(jí)白名單 + use_pty + logfile |
六、故障排查和監(jiān)控(安全事件監(jiān)控、審計(jì)規(guī)則)
6.1 關(guān)鍵指標(biāo)(建議納入監(jiān)控看板)
| 指標(biāo)名稱 | 正常范圍 | 告警閾值 | 說(shuō)明 |
|---|---|---|---|
| SSH 登錄失敗次數(shù)(每分鐘) | 0-少量 | > 20/min(按環(huán)境) | 爆破/憑據(jù)攻擊信號(hào) |
| SSH 登錄成功次數(shù)(非工作時(shí)間) | 0 | > 0 | 異常時(shí)間窗口登錄 |
| sudo 使用次數(shù)(按用戶/主機(jī)) | 低頻 | 突增 | 提權(quán)操作異常 |
| audit 日志增長(zhǎng)(MB/h) | 穩(wěn)定 | 突增 | 規(guī)則過(guò)量或異常行為 |
| /var 分區(qū)使用率 | < 70% | > 85% | 防止日志爆盤 |
| 防火墻丟包/拒絕計(jì)數(shù) | 穩(wěn)定 | 突增 | 誤封或掃描攻擊 |
6.2 日志與審計(jì)的排障命令鏈
# SSH 失敗與成功 if[ -f /var/log/auth.log ];then egrep -i'Failed password|Accepted publickey|Accepted password'/var/log/auth.log | tail -n 200 fi if[ -f /var/log/secure ];then egrep -i'Failed password|Accepted publickey|Accepted password|sudo:'/var/log/secure | tail -n 200 fi # 審計(jì)關(guān)鍵 key ausearch -k identity -ts today | tail -n 50 ausearch -k scope -ts today | tail -n 50 ausearch -k privileged -ts today | tail -n 50 # 最近 1 小時(shí)的 sudo 日志(如果啟用) tail -n 200 /var/log/sudo.log 2>/dev/null ||true
6.3 告警規(guī)則模板(Prometheus/Alertmanager 思路)
說(shuō)明:主機(jī)側(cè)需要把日志轉(zhuǎn)指標(biāo)(如 promtail + loki、或 node_exporter textfile、或 auditd exporter)。以下用“偽規(guī)則”表達(dá)核心口徑。
# 規(guī)則名:HostSSHBurstFailures
# 指標(biāo)前提:將 SSH 失敗日志聚合為計(jì)數(shù)指標(biāo) ssh_login_failed_total
alert: HostSSHBurstFailures
expr: rate(ssh_login_failed_total[5m]) > 0.3
for: 10m
labels:
severity: warning
annotations:
summary: "SSH failures burst on {{ $labels.instance }}"
description: "High rate of SSH failed logins,可能存在爆破或異常掃描"
# 規(guī)則名:AuditLogGrowthTooFast
# 指標(biāo)前提:采集 /var/log/audit/audit.log 文件大小為 audit_log_bytes
alert: AuditLogGrowthTooFast
expr: (audit_log_bytes - audit_log_bytes offset 1h) / 1024 / 1024 > 500
for: 30m
labels:
severity: warning
annotations:
summary: "audit log growth too fast on {{ $labels.instance }}"
description: "audit 日志 1 小時(shí)增長(zhǎng)超過(guò)閾值,可能規(guī)則過(guò)量或異常行為"
6.4 修復(fù)后驗(yàn)證(回歸動(dòng)作清單)
# 1) SSH 配置校驗(yàn) sshd -t systemctl reload sshd # 2) 從白名單來(lái)源登錄驗(yàn)證(至少公鑰 + sudo) # ssh user@host # sudo -l # 3) 防火墻規(guī)則校驗(yàn) command-v firewall-cmd >/dev/null && firewall-cmd --list-all # 4) 審計(jì)規(guī)則生效 auditctl -s ausearch -k sshd -ts recent | head -n 10 # 5) 觀察 30-60 分鐘指標(biāo)(失敗次數(shù)、磁盤增長(zhǎng)) # 結(jié)合監(jiān)控平臺(tái)確認(rèn)曲線回落
七、總結(jié)
7.1 技術(shù)要點(diǎn)回顧(可執(zhí)行)
主機(jī)加固必須是“可回滾”的工程實(shí)踐,而不是一次性手工改配置。
SSH 優(yōu)先做來(lái)源隔離與密鑰化,再做算法收緊。
賬號(hào)安全的核心是:強(qiáng)口令/鎖定/最小可登錄賬號(hào) + sudo 最小權(quán)限。
防火墻要以“端口清單”為輸入,包含探活與監(jiān)控,避免誤傷。
sysctl 與掛載選項(xiàng)屬于“高影響項(xiàng)”,必須按主機(jī)角色模板化。
auditd 的價(jià)值在“關(guān)鍵事件可追溯”,不是“全量記錄”。
任何加固項(xiàng)都需要明確驗(yàn)證命令鏈與監(jiān)控指標(biāo),否則無(wú)法閉環(huán)。
7.2 進(jìn)階學(xué)習(xí)方向
OpenSSH 證書登錄與集中密鑰管理:解決大規(guī)模密鑰分發(fā)與撤銷問(wèn)題。
主機(jī)基線自動(dòng)化:Ansible/OSQuery/SCAP 等實(shí)現(xiàn)持續(xù)合規(guī)。
審計(jì)到 SIEM:把 audit/journald 與告警聯(lián)動(dòng),形成響應(yīng)閉環(huán)。
零信任與訪問(wèn)代理:把 SSH 入口遷移到統(tǒng)一訪問(wèn)層,實(shí)現(xiàn)強(qiáng)審計(jì)與策略化。
7.3 參考資料
CIS Benchmarks - 各發(fā)行版安全基線對(duì)照
OpenSSH Manual Pages - sshd_config 官方參數(shù)說(shuō)明
Linux Audit Documentation - auditd 規(guī)則與實(shí)踐
附錄
A. 命令速查表(加固/驗(yàn)證常用)
sshd -t # 校驗(yàn) sshd_config 語(yǔ)法 sshd -T # 展開生效配置(含 include) ss -lntp # 查看監(jiān)聽(tīng)端口 firewall-cmd --list-all # 查看 firewalld zone 規(guī)則 nft list ruleset # 查看 nftables 規(guī)則集 sysctl --system # 加載 sysctl.d 配置 stat -c '%a %U:%G %n' FILE # 查看權(quán)限 visudo -c # 校驗(yàn) sudoers 語(yǔ)法 auditctl -s # 查看 audit 狀態(tài) ausearch -k KEY -ts recent # 按 key 查詢審計(jì)事件 journalctl --disk-usage # 查看 journald 占用
B. 參數(shù)詳解(挑關(guān)鍵的講邊界)
| 參數(shù) | 推薦值 | 作用 | 風(fēng)險(xiǎn)邊界 |
|---|---|---|---|
| PasswordAuthentication | no | 關(guān)閉口令登錄 | 必須先驗(yàn)證公鑰鏈路 |
| PermitRootLogin | no | 禁止 root 直接登錄 | 需確保 sudo 入口可用 |
| AllowGroups | ops/wheel | 限制可登錄組 | 需驗(yàn)證 LDAP/SSSD 解析 |
| rp_filter | 1(單網(wǎng)卡)/2(多網(wǎng)卡) | 反向路徑校驗(yàn) | 策略路由慎用 strict |
| /tmp noexec | 按需啟用 | 阻斷臨時(shí)執(zhí)行提權(quán) | 可能影響發(fā)布/安裝 |
| audit -b | 8192 | 審計(jì)緩沖 | 過(guò)大占內(nèi)存,過(guò)小丟事件 |
C. CIS 基線對(duì)照(示例映射表)
| 本文加固項(xiàng) | CIS 常見(jiàn)條目方向(概念對(duì)應(yīng)) | 備注 |
|---|---|---|
| SSH 禁止 root 登錄 | SSH Server Configuration | 發(fā)行版條目編號(hào)不同 |
| SSH 禁止口令登錄 | SSH Server Configuration | 需結(jié)合運(yùn)維體系 |
| 口令復(fù)雜度/有效期 | Password Policies | 建議與 IAM 統(tǒng)一 |
| 失敗鎖定 | Account Lockout | 注意值班風(fēng)險(xiǎn) |
| sudo 最小權(quán)限與日志 | Privilege Escalation | 強(qiáng)烈建議啟用 |
| sysctl 關(guān)閉 redirect/source_route | Network Configuration | 多網(wǎng)卡需評(píng)估 |
| /tmp 掛載收緊 | Filesystem Configuration | 影響兼容性 |
| auditd 關(guān)鍵規(guī)則 | Audit Configuration | 需配合容量與告警 |
-
Linux
+關(guān)注
關(guān)注
88文章
11772瀏覽量
219118 -
防火墻
+關(guān)注
關(guān)注
0文章
448瀏覽量
36714 -
主機(jī)
+關(guān)注
關(guān)注
0文章
1054瀏覽量
36763
原文標(biāo)題:Linux系統(tǒng)安全加固實(shí)戰(zhàn):20項(xiàng)關(guān)鍵配置詳解
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Linux系統(tǒng)安全機(jī)制及技術(shù)大觀
Linux系統(tǒng)安全加固實(shí)戰(zhàn)
評(píng)論