SSH 安全:金鑰登入、改埠與 Fail2ban(2026)
一句話結論:SSH 安全的本質是金鑰登入加關閉密碼登入,禁用 root 登入與 Fail2ban 是配合,改埠只減少掃描噪音;先驗證金鑰能登入,再關掉密碼登入,順序不能反。
金鑰登入的原理:私鑰留本地,公鑰放伺服器
金鑰登入用一對金鑰代替密碼:私鑰儲存在自己的電腦上,公鑰放在伺服器上對應使用者的 authorized_keys 檔案裡。登入時,客戶端向伺服器證明自己持有與公鑰配對的私鑰,伺服器核對公鑰是否在授權列表裡。私鑰從不上傳到伺服器,也不發給任何人;公鑰即使公開,也推導不出私鑰。密碼是可被反覆猜測的秘密,金鑰是持有私鑰檔案的證明,驗證方式變了,密碼猜測也就失去了可猜的目標。
演算法選擇上,Ubuntu 官方文件推薦 ed25519,理由是金鑰更短、計算需求更低;備選是 RSA,金鑰長度 4096 位。生成金鑰的工具是 ssh-keygen,把公鑰裝到伺服器的便利工具是 ssh-copy-id;生成時可以給私鑰設一個口令,多一道口令關。authorized_keys 檔案的許可權有要求:只有被認證的使用者本人可以寫,許可權不對時金鑰登入會被拒絕。
關閉密碼登入:先驗證金鑰,再改配置
伺服器端的 SSH 配置檔案是 /etc/ssh/sshd_config,控制密碼登入的選項是 PasswordAuthentication,OpenSSH 官方手冊給出的預設值是 yes,也就是預設允許密碼登入。改成 no 之後,密碼登入被關閉。控制金鑰登入的選項是 PubkeyAuthentication,預設值是 yes,改配置時要確認它沒有被改成 no。鍵盤互動認證由 KbdInteractiveAuthentication 單獨控制,與 PasswordAuthentication 是兩個選項;伺服器是否依賴它做多因素認證,決定了它是否一併關閉。
還有一個容易漏的點:OpenSSH 對多數配置項取第一個讀到的值,而 Ubuntu 的主配置檔案頂部包含 sshd_config.d 目錄下的片段檔案,雲廠商映象可能已在該目錄預置配置;只改主檔案末尾的一行,可能被片段檔案裡的值蓋過。改完之後,用 sshd -t 檢查語法、用 sshd -T 檢視實際生效值,確認無誤再重啟 SSH 服務。順序是全部要點:先在新會話裡驗證金鑰登入能用,再關閉密碼登入,全程保持原會話不斷開。首次部署流程見站內Vultr 建站全流程文章。
禁用 root 登入:分清兩個檔位
控制 root 登入的選項是 PermitRootLogin,OpenSSH 官方手冊給出的預設值是 prohibit-password,四個取值是 yes、prohibit-password、forced-commands-only、no。預設值的意思是:root 可以用金鑰登入,但密碼與鍵盤互動認證對 root 無效。設為 no 則是 root 完全不能透過 SSH 登入,比預設值更嚴。日常用非 root 使用者加 sudo 提權,root 直接登入就沒有保留的必要;仍需 root 金鑰登入做特定用途時,保留預設值。順序與上一節相同:先建好有 sudo 許可權的非 root 使用者並驗證金鑰登入,再禁用 root 登入。
改埠:只減少掃描噪音,不是安全本質
控制監聽埠的選項是 Port,OpenSSH 官方手冊給出的預設值是 22。把 SSH 換到非預設埠之後,針對 22 埠的批次掃描與密碼猜測嘗試會大幅減少,日誌清淨很多。但這只是減少掃描噪音,不是安全本質:埠掃描可以發現實際監聽的埠,知道埠的人面對的認證方式與原來完全相同。沒有金鑰登入打底,改埠擋不住有針對性的嘗試。
改埠的代價是處處要同步:防火牆要放行新埠,客戶端連線時要指定新埠,Fail2ban 的 jail 要按新埠封禁,服務商的防火牆組也要跟著改,漏改一處就是連不上。過渡期間可以利用 Port 允許多個取值的特點,讓新舊兩個埠同時監聽,確認無誤之後再去掉舊埠。
Fail2ban:讀日誌、計數、封禁
Fail2ban 的工作原理分三步:讀認證日誌,識別登入失敗的記錄,按來源地址計數,達到閾值後透過防火牆動作封禁該來源一段時間。針對 SSH 的 jail 名為 sshd,封禁是臨時的,到期自動解除。三個預設引數來自 Fail2ban 上游倉庫的 jail.conf,2026-11-13 核實:bantime(封禁時長)10 分鐘,findtime(統計視窗)10 分鐘,maxretry(失敗次數)5 次。意思是:同一來源在 10 分鐘內累計 5 次失敗,就被封禁 10 分鐘。發行版可能改動預設值,以本機 jail.conf 為準;上游預設所有 jail 都是關閉的,需在覆蓋配置裡啟用 sshd jail。
配置檔案的規則是:不要直接改 jail.conf,升級時它可能被覆蓋;自定義配置寫在 jail.local 或 jail.d 目錄下的覆蓋檔案裡。封禁動作由 banaction 決定,要與本機實際使用的防火牆配合。日誌來源隨發行版而異:較新的系統可能不再寫傳統的認證日誌檔案,啟用後要確認 jail 真的在監視日誌,而不是隻確認服務在執行。Fail2ban 是事後攔截,封禁之前攻擊者已經完成了幾次失敗嘗試;面對換地址的分散式嘗試,單個地址的計數很難達到閾值。金鑰登入關閉密碼登入之後,Fail2ban 的作用主要是減少無效流量與日誌噪音。把自己的常用地址加入忽略名單,可以避免自己輸錯幾次就被封在門外。
防火牆配合:兩層都要對上埠
防火牆分兩層:服務商的防火牆組在例項之外過濾流量,機內防火牆(如 Ubuntu 的 UFW)在例項之內過濾流量。兩層都要放行 SSH 埠,缺一層就連不上;改了 SSH 埠,兩層都要跟著改。機內防火牆的基線是預設拒絕入站、預設允許出站,只放行需要的埠;啟用之前必須先放行 SSH 埠。UFW 的 limit 規則可以對 SSH 做速率限制,作為補充;它不讀日誌,替代不了 Fail2ban。容器工具可能直接改動底層防火牆規則,用容器的伺服器要按容器工具的官方文件單獨核對。
| 檢查項 | 確認內容 |
|---|---|
| 金鑰可用 | 新會話用金鑰登入成功,私鑰有口令且未上傳 |
| 密碼已關 | PasswordAuthentication 生效值為 no |
| root 已限 | PermitRootLogin 生效值符合預期,可 sudo 提權 |
| 埠同步 | SSH 埠、兩層防火牆、客戶端、Fail2ban 四處一致 |
| 防護執行 | sshd jail 已啟用且在監視日誌,封禁動作與防火牆配合 |
侷限
本文未實測。做法以 Ubuntu 與 2026 年 11 月的官方文件口徑為準,其他發行版的預設值、日誌位置與防火牆後端可能不同,以本機配置檔案為準。UFW 速率限制的具體閾值本次未核實到官方文件原文,本文只定性寫。
2026-11-13:首發
相關:VPS 與網路 · 伺服器安全基礎 · Vultr 建站全流程 · 備份與快照 · 方法論