Webmin installeren op Ubuntu 24.04
Leer Webmin installeren op Ubuntu 24.04 en beveilig port 10000 met SSH tunnels, Let's Encrypt certificaten, 2FA en Fail2ban om servercompromis te voorkomen.
Wat u bouwt
Webmin is een web-controlpanel dat een interface in de browser biedt voor een volledige Linux-server — gebruikers, packages, cron jobs, de firewall, Apache, BIND, schijven en honderden andere modules — bereikbaar via HTTPS op port 10000. De installatie bestaat uit drie commands en duurt ongeveer een minuut. De reden dat deze handleiding de meeste ruimte besteedt aan de tweede helft, is dat Webmin inlogt als root en alles kan wat root kan doen. Een onbeveiligde of niet-geauthenticeerde Webmin is geen "risico om te beheren"; het is een volledige servercompromis met een inlogpagina ervoor. Installeer het daarom binnen tien minuten en gebruik de rest van het uur om te garanderen dat alleen u er toegang toe heeft.
Vereisten en een belangrijke waarschuwing
Een schone Ubuntu 24.04 KVM VPS met een root- of sudo-gebruiker. Webmin is geschreven in Perl en is lichtgewicht — 1 GB RAM is ruim voldoende en het verbruik in ruststand is minder dan een kwart gigabyte. Het luistert op TCP 10000 via de ingebouwde webserver (miniserv.pl), niet via Apache of nginx, dus er hoeft vooraf niets anders te worden geïnstalleerd.
U moet twee zaken beslissen voordat u begint. Ten eerste: het account waarmee u inlogt. Webmin authenticeert via PAM tegen Unix-accounts. U logt dus in als root of als een gebruiker in de sudo groep met de Unix-wachtwoord van dat account. Cloud-images hebben meestal alleen een SSH-key en geen wachtwoord voor de standaardgebruiker; Webmin kan niet inloggen op een account zonder wachtwoord. Stel eerst een wachtwoord in met sudo passwd youruser, anders mislukt de login ongeacht wat u typt.
Ten tweede, de waarschuwing: open poort 10000 niet zomaar voor het internet. Beslis nu of u Webmin bereikt via een SSH-tunnel (aanbevolen, niets is blootgesteld) of dat u de toegang beperkt tot uw eigen IP-adres. Deze beslissing bepaalt elke volgende stap, dus lees beide opties voordat u de firewall aanpast.
Webmin installeren vanuit de officiële repository
Webmin biedt een ondertekende apt-repository aan. Het installatiescript voegt de repository en de GPG-sleutel toe. Hierdoor worden toekomstige apt upgrade-uitvoeringen Webmin op dezelfde manier behandeld als andere pakketten. U ontvangt hiermee authentieke updates in plaats van een gedownloade .deb die zichzelf niet kan patchen.
curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.shHet script toont de geplande acties en vraagt om Setup repository? (y/N) — antwoord met y. Installeer het pakket zodra het script is voltooid. De --install-recommends-flag installeert de benodigde Perl- en SSL-modules. Dit voorkomt fouten door ontbrekende bibliotheken bij individuele modules.
sudo apt-get install --install-recommends webminWebmin heeft de naam van dit script eerder gewijzigd — oudere handleidingen verwijzen naar setup-repos.sh. Als de URL een 404-fout geeft, kopieer dan de actuele command-line direct van webmin.com/download. Een correcte installatie eindigt met een regel zoals Webmin install complete. You can now login to https://your-host:10000/ as root. De service is ingeschakeld en actief. De configuratie staat in /etc/webmin, verzoeken worden gelogd in /var/webmin/miniserv.log en mislukte inlogpogingen worden naar syslog gestuurd — op Ubuntu 24.04 naar het systemd journal.
Controleer of de service actief is en luistert voordat u een browser opent:
sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000U heeft een active (running)-status nodig en een regel die aangeeft dat miniserv.pl is gekoppeld aan 0.0.0.0:10000. Dit adres verandert naar 127.0.0.1:10000 zodra u de onderstaande tunnelroute gebruikt. Als ss niets laat zien op poort 10000, is Webmin niet gestart; lees journalctl -u webmin -n 50 voordat u verder gaat.
Eerste login en de certificaatwaarschuwing
Navigeer met uw browser naar https://YOUR_SERVER_IP:10000. Bij een nieuwe installatie gebeuren er twee dingen.
Als ufw actief is — de standaard Ubuntu server image heeft dit standaard uitgeschakeld, maar veel providers hebben dit vooraf ingeschakeld — wordt de pagina niet geladen. Dit wordt beschreven bij de foutmodi hieronder. Als de poort open staat, toont uw browser een volledige blokkade: "Your connection is not private" met de code NET::ERR_CERT_AUTHORITY_INVALID in Chrome, of SEC_ERROR_UNKNOWN_ISSUER / "Warning: Potential Security Risk Ahead" in Firefox. Dit is verwacht gedrag en geen inbraak. Webmin heeft tijdens de installatie een self-signed certificate gegenereerd (/etc/webmin/miniserv.pem). Omdat er geen certificate authority is die dit certificaat bevestigt, weigert de browser dit certificaat stilzwijgend te vertrouwen. De verbinding is nog steeds versleuteld; deze is enkel niet geverifieerd. Klik voor nu door (Advanced, daarna Proceed) — we vervangen dit certificaat later op een correcte wijze.
Log in met root of uw sudo-gebruiker en het bijbehorende Unix-wachtwoord. U komt dan terecht op het System Information dashboard. Een veelvoorkomende fout is het typen van http:// in plaats van https://. miniserv geeft op die poort een HTTP-antwoord met de tekst "This web server is running in SSL mode. Try the URL https://..." — de oplossing is om http te wijzigen naar https in de adresbalk.
De beveiligingsbeslissing: hoe bereikt u Webmin?
Nu het belangrijkste deel. Een paneel met root-rechten mag niet direct via het open internet bereikbaar zijn voor inlogpogingen van alle scanners wereldwijd. U heeft twee verdedigbare opties, in volgorde van voorkeur.
De SSH-tunnel in Optie B is de beste keuze, omdat deze niets blootstelt. De IP-allowlist in Optie A is acceptabel als uw adres statisch is. Het niet toepassen van beide opties is precies de fout die deze handleiding probeert te voorkomen. Als u Webmin liever via een privaat netwerk bereikt, plaats de server dan achter een self-hosted WireGuard VPN en koppel Webmin aan het tunneladres in plaats van aan het publieke adres.
Optie A: beperk Webmin tot uw IP
Open in het paneel Webmin, vervolgens Webmin Configuration, en dan IP Access Control. Kies "Only allow from listed addresses" en voer uw publieke IP in. U kunt dit IP vinden door curl ifconfig.me uit te voeren op uw laptop. Sla de instellingen op. Webmin schrijft dit naar de allow= regel in /etc/webmin/miniserv.conf en start zichzelf opnieuw op.
Het risico: als uw thuis-IP dynamisch is en verandert, of als u een typefout maakt in het adres, wordt u uitgesloten van toegang. De browser toont dan "Access denied for <your IP>" zonder inlogformulier, en er is geen webpad om terug te keren. U herstelt dit via de serverconsole via SSH of de VNC van uw provider:
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 webminHet verwijderen van de allow= regel herstelt de volledige toegang. Gebruik deze methode alleen voor herstel en stel direct daarna een correcte waarde in.
Optie B: binden aan localhost en tunnelen via SSH (aanbevolen)
Het is veiliger om niet op de publieke interface te luisteren dan het gebruik van een allowlist. Stel miniserv zo in dat deze alleen aan loopback bindt. Gebruik vervolgens een versleutelde SSH-tunnel die u al vertrouwt om verbinding te maken.
Wijzig /etc/webmin/miniserv.conf en voeg deze regel toe, of pas deze aan:
bind=127.0.0.1Start opnieuw op met sudo systemctl restart webmin. Webmin is nu niet meer bereikbaar via het internet. Een port scan op poort 10000 vindt niets en de ss check van eerder laat nu zien dat de service gebonden is aan 127.0.0.1:10000. Open een tunnel vanaf uw laptop:
ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IPLaat deze sessie openstaan en navigeer naar https://localhost:10000. Het verkeer loopt via SSH. Omdat SSH al is geauthenticeerd met uw sleutel en versleuteld is, kunt u het zelfgetekende certificaat hier veilig accepteren; de SSH-laag biedt de werkelijke beveiliging. Sluit de SSH-sessie en Webmin is onbereikbaar. Er hoeft niets op een allowlist te staan, niets is blootgesteld en er is geen extra service die beveiligd moet worden.
Als u bind=127.0.0.1 instelt en de tunnel vergeet, stopt de toegang op afstand direct. Dit is de gewenste werking en geen fout. Herstel de toegang op dezelfde manier als bij Optie A: verwijder de bind regel via de console of stel bind=0.0.0.0 in, en start de service opnieuw op. Dit is dezelfde methode die u gebruikt om een remote development box met Claude Code in tmux te bereiken: één SSH-sessie, alles privé en niets dat extra luistert op de publieke interface.
Vervang het zelfgetekende certificaat door een echt certificaat
Als u Webmin blootstelt op een hostname onder Option A, kunt u de waarschuwing in de browser verwijderen met een echt Let's Encrypt-certificaat. U heeft een DNS-naam nodig — bijvoorbeeld panel.example.com — met een A-record dat naar de server verwijst, en een service die de port-80 HTTP-challenge beantwoordt tijdens de validatie.
Webmin heeft dit ingebouwd: Webmin, dan Webmin Configuration, dan SSL Encryption, dan het Let's Encrypt tabblad. Voer de hostname in, wijs de "website root directory" naar een pad dat via port 80 voor dat domein wordt geserveerd, en vraag het certificaat aan. Webmin verkrijgt het certificaat, werkt de certfile= en keyfile= regels in miniserv.conf voor u bij, en vernieuwt het automatisch voordat het verloopt. Herlaad de pagina en het hangslot is correct.
Het enige probleem: de eigen server van Webmin draait op 10000, niet op 80. Daarom is voor de http-01 challenge een echte webserver nodig — Apache of nginx — die panel.example.com beantwoordt op port 80, of een DNS-gebaseerde validatie. Op een systeem met alleen Webmin zonder service op port 80, mislukt de aanvraag met een validatiefout. Dit blijft zo totdat u Let's Encrypt een manier geeft om het challenge-bestand te bereiken. De werking — DNS-records, de port-80 challenge en de vernieuwing — is hetzelfde als bij het uitgeven van een certificaat voor een willekeurige website. Voor meer achtergrondinformatie legt de Let's Encrypt TLS certificates with Certbot and nginx guide het validatieproces en de DNS-instellingen gedetailleerd uit. Als u de SSH-tunnel methode heeft gebruikt, kunt u deze sectie volledig overslaan: het zelfgetekende certificaat is veilig via SSH, en een echt certificaat uitgegeven voor panel.example.com zou alleen een name-mismatch waarschuwing geven wanneer u https://localhost:10000 bezoekt.
Schakel tweestapsverificatie in
Een wachtwoord alleen biedt onvoldoende bescherming voor een root-paneel. Voeg daarom een tweede factor toe. Open Webmin, vervolgens Webmin Configuration, en dan Two-Factor Authentication. Selecteer de Google Authenticator provider — dit is standaard TOTP en werkt met Authy, 1Password of elke andere authenticator-app — en sla de instelling op. Webmin installeert de benodigde Perl-module (Authen::OATH plus een QR-generator) en activeert de functie; deze stap alleen beschermt nog geen enkel account.
Elk account moet vervolgens het eigen apparaat koppelen. Wanneer 2FA is ingeschakeld, opent u Webmin, vervolgens Webmin Users, selecteert u het account en kiest u Enable Two-Factor For User. Webmin toont nu een QR-code; scan deze met de app en voer een gegenereerde code in ter bevestiging. Vanaf dat moment wordt er na het wachtwoord om een zescijferige token gevraagd. Koppel het apparaat voordat u uitlogt — als 2FA is vereist maar u heeft nog nooit een code gescand, kunt u de vereiste via de console verwijderen, maar het is eenvoudiger om eerst de koppeling te voltooien.
Voeg Fail2ban toe om brute-force logins te blokkeren
Zelfs een beperkte login-endpoint moet herhaalde mislukkingen bestraffen. Webmin rapporteert mislukte logins naar syslog in de vorm van webmin[12345]: Invalid login as root from 10.0.0.9, of Non-existent login as ... voor een gebruikersnaam die geen Unix-account is. Op Ubuntu 24.04 verschijnen deze regels in het systemd journal, omdat een standaard image geen /var/log/auth.log bevat. Fail2ban bevat een standaard webmin-auth filter die precies deze twee regels herkent. De onderstaande jail stelt backend = systemd zelf in, dus er is geen aangepaste regex of logpad nodig.
Maak /etc/fail2ban/jail.d/webmin.local aan:
[webmin-auth]
enabled = true
port = 10000
filter = webmin-auth
backend = systemd
maxretry = 4
bantime = 1hHerlaad met sudo systemctl restart fail2ban en controleer of de jail actief is:
sudo fail2ban-client status webmin-authU ziet de jail in de lijst staan met een ban-teller van nul (bij de journal backend is er geen File list: regel). Om de werking te testen, kunt u opzettelijk enkele keren een login laten mislukken vanaf een ander netwerk. Voer daarna het status-commando opnieuw uit en observeer de stijging van Currently banned. Als de teller niet stijgt, controleer dan of u niet test vanaf een adres in de Fail2ban ignoreip. Voer journalctl SYSLOG_IDENTIFIER=webmin uit op de server om te bevestigen dat de Invalid login regels daadwerkelijk worden geschreven. Als Fail2ban nog niet op dit systeem is geïnstalleerd, dan behandelt de Fail2ban op Ubuntu 24.04 voor SSH gids de installatie en de SSH jail die u naast deze jail moet gebruiken.
Beperk de toegang van elke Webmin-gebruiker
Niet iedereen die de panel nodig heeft, heeft root-toegang nodig voor alle functies. Maak onder Webmin, then Webmin Users extra Webmin-accounts aan. Geef elke gebruiker alleen de modules die nodig zijn. Een backup-beheerder heeft bijvoorbeeld alleen de modules cron en filesystem nodig. Wanneer u een gebruiker bewerkt, ziet u een checklist met alle modules. Door een module uit te vinken, wordt deze verwijderd uit het menu van de gebruiker en worden de onderliggende URL's geblokkeerd. Dit is defence in depth: zelfs een gestolen Webmin-sessie met lage privileges kan /etc/shadow niet wijzigen als de Users-module niet in de lijst staat.
Webmin up-to-date houden
Omdat u via het apt-repository heeft geïnstalleerd, haalt sudo apt update && sudo apt upgrade nieuwe Webmin-versies op samen met de rest van het systeem. Installeer patches direct — een control panel is een populair doelwit. Webmin kan zichzelf ook updaten via Webmin, Webmin Configuration, Upgrade Webmin, maar de apt-methode is de voorkeursmethode op Ubuntu omdat versies consistent blijven met uw andere pakketbeheer. Beschouw dit niet als optioneel: verschillende eerdere Webmin CVE's waren bugs voor remote-code-execution. Het enige verschil tussen "gepatcht" en "gecompromitteerd" was de snelheid waarmee de admin de upgrade uitvoerde.
Foutmodi, met de tekst die u zult zien
"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID. Getoond bij de eerste keer laden. Oorzaak: het zelfgetekende certificaat dat Webmin tijdens de installatie heeft gegenereerd, heeft geen vertrouwde uitgever. Het is geen aanval; de verbinding is versleuteld, maar niet geverifieerd. Oplossing: ga voor nu door de waarschuwing heen, vraag daarna een echt Let's Encrypt-certificaat aan, of accepteer de waarschuwing permanent als u Webmin via een SSH-tunnel bereikt.
"This web server is running in SSL mode. Try the URL https://..." U heeft http://server:10000 ingevoerd. miniserv spreekt alleen TLS op die poort en geeft dit in plain text aan. Oplossing: wijzig http naar https in de adresbalk.
Page times out — ERR_CONNECTION_TIMED_OUT / "This site can't be reached". Het verzoek komt nooit aan bij Webmin. Op Ubuntu wordt poort 10000 bijna altijd gedropt door ufw. Controleer dit met sudo ufw status; als 10000 niet in de lijst staat, open de poort dan met sudo ufw allow 10000/tcp of laat deze gesloten en gebruik de SSH-tunnel uit Optie B. Let op het verschil: een timeout betekent dat een firewall pakketten stilzwijgend laat vallen, terwijl ERR_CONNECTION_REFUSED betekent dat de poort bereikbaar is maar Webmin niet draait — controleer sudo systemctl status webmin.
"Access denied for <your IP>." U heeft IP Access Control ingesteld onder Optie A en uw huidige adres staat niet op de toestelingslijst — een dynamisch IP dat is gewijzigd, of een typefout. Er is geen manier om via de browser terug te keren. Oplossing via de console: bewerk de allow= regel in /etc/webmin/miniserv.conf, corrigeer of verwijder deze, en voer sudo systemctl restart webmin uit.
"Login failed. Please try again." met gegevens waarvan u weet dat ze correct zijn. Het account heeft geen Unix-wachtwoord, wat standaard is bij cloud-images die alleen met keys werken. Webmin authenticeert via PAM tegen het Unix-wachtwoord, en dat wachtwoord bestaat niet voor de gebruiker. Oplossing: voer sudo passwd youruser uit op de server en log daarna in. Als /var/webmin/miniserv.log Non-existent login as ... aangeeft, voert u een gebruikersnaam in die geen Unix-account is.
Voor meer dan een paar servers is automatisering schaalbaarder dan een control panel op elke machine: uw eerste Ansible playbook is waar u begint.
FAQ
Is het veilig om Webmin bloot te stellen aan het publieke internet?
Beschouw een Webmin die via het internet bereikbaar is als een root shell met een inlogpagina, want dat is het ook. Het is alleen voldoende veilig via verschillende lagen: een echt certificaat, tweestapsverificatie, Fail2ban, en ofwel een strikte IP-allowlist of, nog beter, geen publieke blootstelling. De configuratie met het laagste risico koppelt Webmin aan 127.0.0.1 en maakt verbinding via een SSH-tunnel, zodat poort 10000 niet reageert op het openbare internet.
Hoe verwijder ik de Webmin-certificaatwaarschuwing?
De waarschuwing (NET::ERR_CERT_AUTHORITY_INVALID) verschijnt omdat Webmin een zelfondertekend certificaat gebruikt. Vraag een echt certificaat aan via Webmin, Webmin Configuration, SSL Encryption, Let's Encrypt, gebruikmakend van een DNS-naam die naar de server wijst met een service die de port-80 challenge voor validatie uitvoert. Als u Webmin alleen via een SSH-tunnel naar localhost bereikt, is de waarschuwing onschadelijk — SSH versleutelt en authenticeert de verbinding al — en kunt u het zelfondertekende certificaat veilig accepteren.
Hoe beperk ik Webmin tot alleen mijn IP-adres?
Ga naar Webmin, Webmin Configuration, IP Access Control, kies "Only allow from listed addresses", en voer uw publieke IP in van curl ifconfig.me. Webmin slaat dit op in de allow= regel van /etc/webmin/miniserv.conf. Let op bij een dynamisch thuis-IP: als dit wijzigt wordt u uitgesloten en moet u de allow= regel repareren via de serverconsole. Een statisch adres of de SSH-tunnelmethode is daarom betrouwbaarder in de praktijk.
Waarom mislukt mijn login, zelfs met het juiste wachtwoord?
Webmin authenticeert via PAM tegen uw Unix-wachtwoord. Cloud-images hebben meestal alleen een SSH-key en geen wachtwoord ingesteld voor het standaardaccount; hierdoor kan PAM niets matchen en wordt de login geweigerd. Voer sudo passwd youruser uit op de server om een wachtwoord in te stellen en log daarna in. Een Non-existent login as ... regel in /var/webmin/miniserv.log betekent dat de gebruikersnaam zelf geen echt Unix-account is.
Wat is het voordeel van Webmin ten opzichte van gewone SSH?
Webmin is een laag voor gebruiksgemak en overzichtelijkheid. Het is nuttig voor het doorzoeken van logbestanden, het beheren van gebruikers en cron, het bewerken van firewall-regels, en het bekijken van de status van schijven en services zonder elke opdracht te hoeven onthouden. Dit is handig voor incidentele beheerders of teams met verschillende vaardigheidsniveaus. Gewone SSH is sneller, scriptbaar en biedt een veel kleiner aanvalsoppervlak voor routinematig werk. Veel beheerders gebruiken beide: SSH voor dagelijks gebruik, en Webmin gekoppeld aan localhost achter een tunnel voor incidentele klik-en-klaar taken.