Ubuntu 24.04 安裝 Webmin 並完成安全設定
在 Ubuntu 24.04 安裝 Webmin,接著以 SSH tunnel 或 IP allowlist 限制存取,設定 Let's Encrypt 憑證、雙因素驗證,並在 port 10000 啟用 Fail2ban。
建置內容
Webmin 是一個 Web 控制面板,透過瀏覽器管理整台 Linux 伺服器,包括使用者、套件、cron 工作、防火牆、Apache、BIND、磁碟及上百個其他模組。它會透過 HTTPS 在埠 10000 上提供存取。安裝本身只需執行 3 個命令,大約 1 分鐘即可完成。本指南將大部分篇幅放在後半段,是因為 Webmin 會以 root 登入,並能執行 root 可執行的所有操作。完全開放或未經驗證的 Webmin 並不是「需要管理的風險」,而是前面多了一個登入頁面的完整伺服器遭入侵事件。因此,請在 10 分鐘內完成安裝,接著用剩餘的時間確認只有你能連線到它。
先備條件與一項重要提醒
準備一台全新的 Ubuntu 24.04 KVM VPS,並使用 root 或具備 sudo 權限的使用者。Webmin 以 Perl 撰寫且資源需求低,1 GB RAM 已十分充裕,閒置時的記憶體用量通常低於四分之一 GB。它會透過內建的 Web 伺服器監聽 TCP 10000 埠(miniserv.pl),不會使用 Apache 或 nginx,因此不必先安裝其他元件。
開始前要先決定兩件事。第一,決定登入帳號:Webmin 會透過 PAM 對 Unix 帳號進行驗證,因此要使用 root,或使用 sudo 群組中的使用者,並輸入該帳號的 Unix 密碼 登入。雲端映像通常只允許使用金鑰登入,預設使用者未設定密碼;Webmin 無法登入沒有密碼的帳號。請先使用 sudo passwd youruser 設定密碼,否則無論輸入什麼內容,登入都會失敗。
第二,這是一項重要提醒:不要只把 10000 埠開放到網際網路後就置之不理。現在就決定要透過 SSH tunnel 存取 Webmin(建議採用,不暴露任何連接埠),還是只允許自己的 IP 存取。這項決定會影響以下每個步驟,因此請先閱讀兩種方案,再修改防火牆設定。
從官方套件庫安裝 Webmin
Webmin 提供已簽署的 apt 套件庫。設定指令碼會加入套件庫及其 GPG 簽署金鑰,因此後續執行 apt upgrade 時,會像安裝其他套件一樣取得 Webmin。這樣可取得經過驗證的更新,不會只下載一個之後不會自行修補的 .deb。
curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.sh指令碼會顯示即將執行的操作,並詢問 Setup repository? (y/N);請回答 y。完成後,安裝套件。--install-recommends 旗標會一併安裝常用的 Perl 與 SSL 模組相依套件,避免個別模組日後因缺少函式庫而失敗。
sudo apt-get install --install-recommends webminWebmin 過去曾重新命名這個指令碼,較舊的指南會引用 setup-repos.sh。因此,如果原始 URL 回傳 404,請直接從 webmin.com/download 取得目前的一行安裝指令,不要固定使用特定名稱。安裝成功時,結尾會出現類似 Webmin install complete. You can now login to https://your-host:10000/ as root 的訊息。服務已啟用並執行中,設定檔位於 /etc/webmin,請求會記錄到 /var/webmin/miniserv.log;在 Ubuntu 24.04 上,登入失敗會寫入 syslog,也就是 systemd journal。
開啟瀏覽器前,先確認服務確實已啟動並正在監聽:
sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000你應看到 active (running) 狀態,以及顯示 miniserv.pl 綁定至 0.0.0.0:10000 的一行。採用下方的通道方式後,該位址會變更為 127.0.0.1:10000。如果 ss 在 10000 上沒有顯示任何內容,表示 Webmin 未啟動;請先查看 journalctl -u webmin -n 50。
首次登入與憑證警告
將瀏覽器指向 https://YOUR_SERVER_IP:10000。在全新安裝的主機上,會發生兩件事。
如果 ufw 處於啟用狀態,頁面將完全無法載入。Ubuntu 自己的 server image 預設不會啟用 ufw,但許多供應商會預先啟用。這種情況會在下方的故障模式一節說明。如果連接埠已開放,瀏覽器會顯示整頁封鎖訊息:Chrome 顯示 「您的連線不是私人連線」,並附上代碼 NET::ERR_CERT_AUTHORITY_INVALID;Firefox 則顯示 SEC_ERROR_UNKNOWN_ISSUER/「警告:前方可能有安全性風險」。這是預期行為,不代表遭到入侵。Webmin 在安裝時產生了自簽憑證(/etc/webmin/miniserv.pem)。由於沒有憑證授權單位為此憑證背書,瀏覽器不會在沒有提示的情況下信任它。連線仍然經過加密,只是沒有憑證授權單位背書。現在先按一下 Advanced,再按 Proceed 以繼續;稍後會正式替換這張憑證。
使用 root 或 sudo 使用者及其 Unix 密碼登入,接著會進入 System Information 儀表板。這裡常見的錯誤是輸入 http://,而不是 https://。miniserv 會在該連接埠以純 HTTP 回應,並顯示完整文字 「此 Web server 正以 SSL 模式執行。請嘗試使用 URL https://...」。修正方式很簡單,只要在網址列將 http 改為 https 即可。
安全決策:你要如何連線到 Webmin?
現在進入關鍵部分。具備 root 等效權限的管理面板,不應直接暴露在公開網際網路上,接受全球各地掃描器發出的登入嘗試。你有兩個合理選項,以下依建議優先順序排列。所有自架管理介面都會遇到相同問題;因此,Vaultwarden 是否安全取決於其管理端點與備份檔案,而不是取決於加密功能。
選項 B 中的 SSH tunnel 較佳,因為它完全不對外暴露任何服務。如果你的 IP 位址固定,選項 A 的 IP allowlist 也可以接受。兩者都不採用,正是這份指南要避免的錯誤。如果你希望透過 private network,而不是上述任一方式連線到 Webmin,請將主機置於自架的 WireGuard VPN後方,並將 Webmin 綁定至 tunnel 位址,而非公開位址。
選項 A:將 Webmin 限制為僅允許您的 IP
在面板中開啟 Webmin,接著開啟 Webmin Configuration,再開啟 IP Access Control。選取 「Only allow from listed addresses」,然後輸入您的公開 IP。您可以在筆記型電腦上執行 curl ifconfig.me 查詢此 IP。儲存設定。Webmin 會將此設定寫入 /etc/webmin/miniserv.conf 中的 allow= 行,然後重新啟動自身。
注意:如果您的住家 IP 是動態 IP 且發生變更,或您誤輸入 IP 位址,就會失去存取權。此時瀏覽器會顯示 「Access denied for <your IP>」,不會顯示登入表單,也沒有可透過 Web 介面重新登入的方式。您必須透過 SSH 或服務供應商提供的 VNC,從伺服器主控台修正設定:
sudo nano /etc/webmin/miniserv.conf
# find the line that begins allow=
# correct your IP, or delete the whole line to allow all again
sudo systemctl restart webmin刪除 allow= 行會恢復完全開放的存取權。因此只能將此操作用於復原,然後立即設定正確的值。
選項 B:繫結至 localhost,透過 SSH 建立通道(建議)
比任何 allowlist 更安全的做法,是完全不要在公開介面上監聽。讓 miniserv 只繫結至 loopback,再透過你已信任的加密 SSH 通道連線。
編輯 /etc/webmin/miniserv.conf,加入或修改以下一行:
bind=127.0.0.1使用 sudo systemctl restart webmin 重新啟動。現在 Webmin 無法從網際網路連線;對 10000 埠進行連接埠掃描時不會發現任何服務,而稍早的 ss 檢查現在會顯示它繫結至 127.0.0.1:10000。在筆記型電腦上建立通道:
ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IP保持該工作階段開啟,然後瀏覽 https://localhost:10000。網路流量會在 SSH 內傳輸。SSH 已由你的 cryptographic key 完成驗證並加密,因此在此接受 self-signed certificate 即可;真正提供保護的是 SSH 層。關閉 SSH 工作階段後,Webmin 就無法連線。無須設定 allowlist,沒有公開暴露的服務,也不需要強化額外服務。
如果設定了 bind=127.0.0.1 卻忘記建立通道,遠端存取會直接停止。這表示功能正常運作,不是故障。按照選項 A 的方式復原:從主控台移除 bind 這一行,或設定 bind=0.0.0.0,然後重新啟動。這與透過 SSH 連線至 在 tmux 中執行 Claude Code 的遠端開發主機時採用的通道方式相同:只需一個 SSH 工作階段,所有內容都保持私有,公開介面上不會有額外服務監聽。
將自簽憑證替換為正式憑證
如果您在 Option A 中讓 Webmin 透過主機名稱公開存取,請使用正式的 Let's Encrypt 憑證消除瀏覽器警告。您需要一個 DNS 名稱,例如 panel.example.com,並建立指向該伺服器的 A record。此外,在驗證期間,還必須有服務在 port 80 回應 HTTP challenge。
Webmin 已內建此功能:Webmin,接著選取 Webmin Configuration,再選取 SSL Encryption,最後開啟 Let's Encrypt 分頁。輸入主機名稱,將「website root directory」指定為該網域在 port 80 提供服務的路徑,然後提出申請。Webmin 會取得憑證、替您更新 miniserv.conf 中的 certfile= 與 keyfile= 行,並在憑證到期前自動續期。重新載入頁面後,瀏覽器的鎖頭圖示便不會再顯示警告。
需要注意的是:Webmin 本身在 port 10000 執行,而不是 port 80。因此,http-01 challenge 需要由 Apache 或 nginx 等實際的 web server 在 port 80 回應 panel.example.com,或改用以 DNS 為基礎的驗證方式。在只有 Webmin、port 80 沒有其他服務的伺服器上,申請會因驗證錯誤而失敗,直到您提供讓 Let's Encrypt 存取 challenge 檔案的方式為止。其運作方式、DNS records、port-80 challenge 與續期流程,和為任何網站簽發憑證相同。如需瞭解相關背景,使用 Certbot 與 nginx 取得 Let's Encrypt TLS 憑證指南會詳細說明驗證流程與 DNS 設定。如果您採用 SSH tunnel,則可完全略過本節:自簽憑證在 SSH 後方已足夠,而為 panel.example.com 簽發的正式憑證,在您造訪 https://localhost:10000 時反而只會產生名稱不相符警告。
啟用雙因素驗證
僅使用密碼不足以保護 root 管理介面,因此請加入第二個驗證因素。開啟 Webmin,接著依序選取 Webmin Configuration,再選取 Two-Factor Authentication。選取 Google Authenticator provider。這是標準的 TOTP,可搭配 Authy、1Password 或任何驗證器應用程式使用,然後儲存設定。Webmin 會安裝所需的小型 Perl 模組(Authen::OATH 及 QR 產生器),並啟用此功能;但這個步驟本身尚未保護任何帳戶。
之後,每個帳戶都必須註冊自己的裝置。啟用 2FA 後,開啟 Webmin,接著依序選取 Webmin Users,選取帳戶,再選擇 Enable Two-Factor For User。Webmin 會顯示 QR code;使用應用程式掃描後,輸入一組產生的驗證碼以確認。之後登入時,輸入密碼後還必須輸入 6 位數 token。請在登出前完成註冊。如果已要求使用 2FA,但帳戶尚未掃描任何驗證碼,仍可從 console 清除這項要求,但先完成註冊會簡單許多。
將 Fail2ban 加入以封鎖暴力破解登入
即使登入端點已受限制,也應對反覆失敗的嘗試進行封鎖。Webmin 會將失敗登入以 webmin[12345]: Invalid login as root from 10.0.0.9 的格式記錄到 syslog;如果使用的使用者名稱甚至不是 Unix 帳戶,則會記錄為 Non-existent login as ...。在 Ubuntu 24.04 上,這些行會寫入 systemd journal,因為標準映像沒有 /var/log/auth.log。Fail2ban 提供可直接使用的 webmin-auth filter,能精確比對這兩行;以下 jail 會自行設定 backend = systemd,因此不需要自訂 regex 或 log path。
建立 /etc/fail2ban/jail.d/webmin.local:
[webmin-auth]
enabled = true
port = 10000
filter = webmin-auth
backend = systemd
maxretry = 4
bantime = 1h使用 sudo systemctl restart fail2ban 重新載入,然後確認 jail 正在執行:
sudo fail2ban-client status webmin-auth開始時應會看到該 jail 列出,ban 計數為 0(使用 journal backend 時,不會有 File list: 行)。若要端對端確認設定有效,請從其他網路故意讓登入失敗數次,然後再次執行 status command,並監看 Currently banned 是否增加。如果計數始終沒有增加,請確認測試來源位址不在 Fail2ban 的 ignoreip 中,並在伺服器上執行 journalctl SYSLOG_IDENTIFIER=webmin,確認 Invalid login 行確實有被寫入。如果這台伺服器尚未安裝 Fail2ban,請參閱 Ubuntu 24.04 上的 Fail2ban SSH 指南,其中涵蓋安裝方式及應與本 jail 同時執行的 SSH jail。
限制每個 Webmin 使用者可操作的範圍
並非所有需要使用控制面板的人都需要對所有項目擁有 root 權限。在 Webmin,接著是 Webmin Users 中建立額外的 Webmin 登入帳號,並只授予每個帳號所需的模組。例如,備份操作人員只需使用 cron 和檔案系統模組。編輯使用者時,畫面會列出所有模組的核取方塊;取消勾選某個模組後,該模組會從使用者的選單中移除,並封鎖其底層 URL。這是縱深防禦的一環:即使低權限的 Webmin 工作階段遭竊,當 Users 模組未列入其權限清單時,也無法改寫 /etc/shadow。
讓 Webmin 保持更新
由於您是從 apt repository 安裝,sudo apt update && sudo apt upgrade 會和系統中的其他套件一起取得新版 Webmin。請立即套用修補程式,因為控制面板是常見的攻擊目標。Webmin 也能從 Webmin,接著選擇 Webmin Configuration,再選擇 Upgrade Webmin 自行更新;但在 Ubuntu 上,使用 apt 路徑較簡潔,因為這能讓版本與其他套件管理作業保持一致。請勿將此視為選用項目:過去數個 Webmin CVE 都是遠端程式碼執行漏洞,而伺服器維持「已修補」或遭到「入侵」的差別,只在於管理員執行升級的速度。
故障模式與畫面上會看到的訊息
「您的連線不是私人連線」/ NET::ERR_CERT_AUTHORITY_INVALID。 首次載入時就會顯示。原因是 Webmin 在安裝時產生的自簽憑證沒有受信任的簽發者。這不是攻擊;連線已加密,只是沒有受信任的憑證背書。處理方式:目前先通過警告,之後申請正式的 Let's Encrypt 憑證;如果您是透過 SSH tunnel 存取 Webmin,也可以永久接受此憑證。
「此 Web server 正以 SSL 模式執行。請嘗試 URL https://...」 您輸入了 http://server:10000。miniserv 只在該埠使用 TLS,因此以純文字提示這項資訊。處理方式:將網址列中的 http 改為 https。
頁面逾時、ERR_CONNECTION_TIMED_OUT /「無法連線到此網站」。 請求根本沒有抵達 Webmin。在 Ubuntu 上,幾乎都是 ufw 丟棄了 port 10000 的封包。使用 sudo ufw status 確認;如果清單中沒有 10000,可以使用 sudo ufw allow 10000/tcp 開放該埠,或更好的做法是維持關閉,改用選項 B 的 SSH tunnel。請注意兩者的差異:逾時表示防火牆正在靜默丟棄封包,而 ERR_CONNECTION_REFUSED 表示該埠可連線,但 Webmin 沒有執行,請檢查 sudo systemctl status webmin。
「拒絕存取 <your IP>。」 您已在選項 A 中設定 IP Access Control,但目前的 IP 位址不在允許清單中,可能是動態 IP 已變更,或是輸入錯誤。無法透過瀏覽器重新取得存取權。請從主控台處理:編輯 /etc/webmin/miniserv.conf 中的 allow= 行,修正或刪除該行,然後執行 sudo systemctl restart webmin。
使用確認正確的認證資訊時,仍顯示「登入失敗。請再試一次。」 該帳號沒有 Unix 密碼。這是僅使用金鑰的 cloud image 常見設定。Webmin 會透過 PAM 驗證 Unix 密碼,但該使用者並不存在此密碼。處理方式:在 server 上執行 sudo passwd youruser,然後登入。如果 /var/webmin/miniserv.log 顯示 Non-existent login as ...,表示您輸入的 username 根本不是 Unix account。
如果管理的 server 超過幾台,使用自動化工具會比在每台主機上安裝 control panel 更容易擴充:您的第一個 Ansible playbook 就是從這裡開始。
FAQ
將 Webmin 暴露在公開網際網路上安全嗎?
請將面向網際網路的 Webmin 視為附帶登入頁面的 root shell,因為它實際上就是如此。只有採用多層防護時,安全性才算足夠:使用正式憑證、雙因素驗證、Fail2ban,以及嚴格的 IP allowlist;更好的做法是完全不公開暴露。風險最低的設定是將 Webmin 綁定至 127.0.0.1,再透過 SSH tunnel 連線。如此一來,公開網際網路上的任何人都無法連至 port 10000。
如何移除 Webmin 的憑證警告?
警告(NET::ERR_CERT_AUTHORITY_INVALID)是因為 Webmin 隨附 self-signed certificate。請在 Webmin 的 Webmin Configuration、SSL Encryption、Let's Encrypt 中申請正式憑證。申請時使用指向該伺服器的 DNS 名稱,並讓某個服務提供 port-80 challenge,以供驗證。如果你只會透過 SSH tunnel 連至 localhost 使用 Webmin,這項警告不會造成問題。SSH 已經加密並驗證連線,因此可以安全接受 self-signed certificate。
如何限制 Webmin 只允許我的 IP 位址?
前往 Webmin、Webmin Configuration、IP Access Control,選取 "Only allow from listed addresses",然後輸入來自 curl ifconfig.me 的公開 IP。Webmin 會將此設定儲存在 /etc/webmin/miniserv.conf 的 allow= 行中。請注意家用網路的動態 IP:如果 IP 變更,你會被鎖在系統外,必須從伺服器主控台修正 allow= 行。因此,使用固定位址或 SSH tunnel 方法,在實務上更可靠。
為什麼使用正確密碼仍然無法登入?
Webmin 會透過 PAM 驗證 Unix 密碼。雲端映像檔通常只允許使用 key 登入,預設帳號也通常未設定密碼,因此 PAM 沒有可比對的內容,登入便會遭拒。在伺服器上執行 sudo passwd youruser 設定密碼,然後重新登入。如果 /var/webmin/miniserv.log 中出現 Non-existent login as ... 行,則表示該使用者名稱不是有效的 Unix 帳號。
Webmin 相較於直接使用 SSH 有什麼用途?
Webmin 提供探索與便利性介面。你可以用它瀏覽 log 檔案、管理使用者與 cron、編輯防火牆規則,以及查看磁碟與服務狀態,不必記住每個指令。對偶爾管理系統的人員或技能程度不一的團隊來說,這相當實用。直接使用 SSH 的速度更快、可編寫 script,例行工作所暴露的攻擊面也小得多。許多管理員會同時使用兩者:日常操作使用 SSH,偶爾需要點選介面時,則將 Webmin 綁定至 localhost,再透過 tunnel 連線。如果你真正想比較的是不同管理面板,而不是面板與 shell,建議先評估 Cockpit 與 Webmin 的差異,因為兩者在可修改的系統範圍,以及驗證使用者身分的方式上都有所不同。