SSH 加固清單:上架第一小時的 12 個動作
新服務器上架第一小時的 12 個 SSH 加固動作:密鑰登入、禁 root 密碼、改默認行爲、fail2ban、日志與告警。每個動作一條命令 + 一個「爲什麼」,可直接照抄執行,全部冪等。
互聯網上無差別的掃描與爆破每分鍾都在發生——新服務器上線的第一小時做完這 12 個動作,能擋掉絕大多數自動化攻擊。安全不是買來的產品,是一組默認動作。本篇是安全基線中心的核心清單篇:每個動作給「命令 + 爲什麼 + 驗證」,照抄即可,腳本化版本在自動化腳本。
第一組:進門方式(動作 1–4)
- ① 配置密鑰登入——密鑰對本地生成,公鑰上服務器:
爲什麼:密碼可以被字典爆破,256 位密鑰不能。驗證:新開終端用密鑰能登入,才算完成本步;ssh-keygen -t ed25519 -C "admin@$(hostname)-$(date +%F)" # 本地執行;ed25519 短且強 ssh-copy-id root@新服務器IP # 公鑰推送;沒有 ssh-copy-id 就手動追加到 ~/.ssh/authorized_keys - ② 禁用密碼認證——確認①成功後執行:
爲什麼:這是爆破攻擊的終局開關——密碼認證關了,字典攻擊的收益歸零;echo -e "PasswordAuthentication no\nPubkeyAuthentication yes" > /etc/ssh/sshd_config.d/99-hardening.conf systemctl reload sshd # Debian/Ubuntu 服務名可能是 ssh - ③ 限制 root 直登——
PermitRootLogin prohibit-password(寫入同一 drop-in 文件):root 只許密鑰;更嚴格的做法是普通用戶 + sudo,審計粒度更細; - ④ 收緊嘗試參數——
MaxAuthTries 3與LoginGraceTime 20:把每次連接的試探成本抬高,日志噪音同步下降。
第二組:自動防御(動作 5–7)
- ⑤ 裝 fail2ban——
爲什麼:密鑰登入下爆破已無收益,但掃描噪音會淹沒有價值的日志——fail2ban 把慣犯 IP 關進小黑屋,日志清爽一半;apt-get install -y fail2ban # 或 yum/dnf printf '[sshd]\nenabled = true\nmaxretry = 5\nfindtime = 600\nbantime = 3600\n' > /etc/fail2ban/jail.d/sshd.local systemctl enable --now fail2ban && fail2ban-client status sshd - ⑥ 防火牆只留必要端口——默認拒絕入站,SSH(與業務端口)白名單放行,完整基線見防火牆基線;
- ⑦ 自動安全更新——
apt-get install -y unattended-upgrades && dpkg-reconfigure -f noninteractive unattended-upgrades:只自動裝安全補丁,大版本升級仍然人工——「不自動升級大版本」也是紀律的一部分。
第三組:可見性(動作 8–10)
- ⑧ 登入告警——每次 SSH 登入發一封郵件/一條通知(/root/.ssh/rc 或 pam 腳本掛一行 curl 到你的通知端點):你自己沒登入而告警響了,就是入侵的第一信號;
- ⑨ 審計日志確認——
爲什麼:出事後第一個問題永遠是「什麼時候進來的」——日志留存期與完整性要在第一天確認(雲鏡像有時默認裁剪日志);journalctl -u sshd --since "1 hour ago" | grep -E "Accepted|Failed" | tail -20 last -10 # 最近登入記錄:IP 都認識嗎? - ⑩ 基線快照——把當前狀態存檔:開放端口(ss -tlnp)、運行進程(ps auxf)、賬戶清單(awk -F: '$3>=1000{print $1}' /etc/passwd)、crontab——日後「多出來的東西」都對照這份快照找。
第四組:縱深(動作 11–12)
- ⑪ 時間同步——
timedatectl set-ntp true:日志時間戳錯亂的機器,取證時每一步都要先校時——第一小時就把它修好; - ⑫ 恢復通道確認——測試機房提供的 IPMI/VNC/控制臺通道可用(獨服)或快照功能可用(VPS):萬一 SSH 把自己鎖在門外(改配置手滑是高頻事故),這條通道就是唯一的門。驗證方式:真的用它登入一次。
十二動作速查表
| # | 動作 | 一句話命令/位置 | 驗證方式 |
|---|---|---|---|
| 1 | 密鑰登入 | ssh-keygen + ssh-copy-id | 新終端密鑰登入成功 |
| 2 | 禁密碼認證 | sshd_config.d drop-in | 密碼登入被拒 |
| 3 | 限制 root | PermitRootLogin prohibit-password | 配置回顯 |
| 4 | 收緊嘗試 | MaxAuthTries/LoginGraceTime | 配置回顯 |
| 5 | fail2ban | jail.d/sshd.local | status sshd 有 jail |
| 6 | 防火牆 | 默認拒絕+白名單 | 非白名單端口不通 |
| 7 | 自動安全更新 | unattended-upgrades | 服務在位 |
| 8 | 登入告警 | ssh rc/pam 掛鉤 | 自己登入收到通知 |
| 9 | 日志確認 | journalctl + last | 能看到 Accepted/Failed |
| 10 | 基線快照 | ss/ps/passwd/cron 歸檔 | 快照文件存在 |
| 11 | 時間同步 | timedatectl set-ntp | NTP 狀態 synchronized |
| 12 | 恢復通道 | IPMI/VNC/快照 | 真實走通一次 |
密鑰管理紀律:加固之後的一半工作
12 個動作把門換成了密鑰鎖,鑰匙本身的管理決定這套鎖的成色:①一機一鑰——每臺服務器獨立密鑰對,一把泄露不連坐;②私鑰加密存儲——ssh-keygen 時的 passphrase 別留空,私鑰文件權限 600,配合 ssh-agent 免去重復輸入;③人員變動即輪換——離職與外包結束的當天刪公鑰(authorized_keys 是一行一個的清單,刪行即斷權),這臺機器的授權面從此幹淨;④備份恢復通道與密鑰分離——IPMI/控制臺通道的憑據單獨存放(密碼管理器),SSH 密鑰全丟時它還在。四條約十分鍾就能落實到臺賬裏,但省掉的是「鑰匙失控」這類最難排查的事故。
常見翻車與誤區
- 改端口不是安全——換端口只降噪音不降風險(掃描器全端口掃),做了②⑤之後端口號的邊際價值趨近於零;改與不改都隨意,別把它當核心防線;
- 先禁密碼後配密鑰 = 自鎖門外——順序永遠是①→驗證→②;真鎖了走動作⑫的恢復通道;
- 清單做完 ≠ 安全完成——這 12 個動作擋住的是自動化攻擊(佔實際攻擊的絕大多數),針對性攻擊要靠應急響應流程(見安全基線中心的後續批次與診斷思路)。
下一步:12 個動作的冪等腳本版在自動化腳本(新機器一條命令跑完);防火牆的完整口徑在防火牆基線;備份與恢復在恢復演練;全景回安全基線中心。練手環境從入門 VPS($5.34/月)開始,成本最低的沙盒。