SSH 安全:金鑰登入、改埠與 Fail2ban(2026)

官網核實最後核驗:2026-11-13 · 依據:OpenSSH 官方手冊、Ubuntu 官方文件與 Fail2ban 上游配置

一句話結論:SSH 安全的本質是金鑰登入加關閉密碼登入,禁用 root 登入與 Fail2ban 是配合,改埠只減少掃描噪音;先驗證金鑰能登入,再關掉密碼登入,順序不能反。

核驗資訊:本文為官網核實,未實測。配置項與預設值來自 OpenSSH 官方手冊,金鑰演算法建議來自 Ubuntu 官方文件,Fail2ban 預設引數來自上游 jail.conf,來源見研究筆記。本文只講概念與方法,不寫可執行指令碼與逐條命令。總覽見站內伺服器安全基礎文章。
本質:金鑰登入 + 關閉密碼 密碼猜測失去可猜的目標 配合:禁用 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 速率限制的具體閾值本次未核實到官方文件原文,本文只定性寫。

鏈式閱讀 · 安全:2FA 丟失恢復:備用碼、恢復流程與事前準備(2026) · 伺服器安全基礎:新 VPS 到手先做這 6 件事(2026) · 備份與快照:VPS 資料保護的三種做法(2026) · 多賬號管理:身份隔離、瀏覽器配置與風險(2026) · 密碼管理與二步驗證:賬號安全的地基怎麼打(2026)
更新日誌:
2026-11-13:首發

相關:VPS 與網路 · 伺服器安全基礎 · Vultr 建站全流程 · 備份與快照 · 方法論