Webmin installeren op Ubuntu 24.04 en beveiligen
Installeer Webmin op Ubuntu 24.04 en beveilig uw server direct. Leer hoe u poort 10000 afschermt met een IP-whitelist, tweefactorauthenticatie, Let's Encrypt en Fail2ban instelt.
Wat u gaat bouwen
Webmin is een webgebaseerd configuratiescherm dat een browserinterface biedt voor een volledige Linux-server, gebruikers, pakketten, cron-taken, de firewall, Apache, BIND, schijven en honderden andere modules, bereikbaar via HTTPS op poort 10000. De installatie zelf bestaat uit drie commando's en duurt ongeveer een minuut. De reden dat deze handleiding het grootste deel van de tijd besteedt aan de tweede helft, is dat Webmin inlogt als root en alles kan uitvoeren wat root kan doen. Een wijd openstaande of niet-geauthenticeerde Webmin is niet "een risico om te beheren"; het is een volledige serverbreach met een inlogpagina ervoor. Installeer het dus in tien minuten en besteed de rest van het uur aan het waarborgen dat alleen u er toegang toe heeft.
Vereisten en een eerlijke waarschuwing
Een verse Ubuntu 24.04 KVM VPS met root-toegang of een gebruiker met sudo-rechten. Webmin is gebaseerd op Perl en is lichtgewicht; 1 GB RAM is ruim voldoende en het verbruik in ruststand ligt ruim onder een kwart gigabyte. Het luistert op TCP 10000 via zijn eigen ingebouwde webserver (miniserv.pl), niet via Apache of nginx, dus er hoeft vooraf niets anders geïnstalleerd te worden.
Er zijn twee zaken om te beslissen voordat u begint. Ten eerste het account waarmee u inlogt: Webmin authenticeert tegen Unix-accounts via PAM, dus u logt in als root of als een gebruiker in de sudo-groep met het Unix-wachtwoord van dat account. Cloud-images zijn doorgaans alleen toegankelijk via sleutels en hebben geen wachtwoord ingesteld voor de standaardgebruiker; Webmin kan niet inloggen op een account zonder wachtwoord. Stel eerst een wachtwoord in met sudo passwd youruser, anders zal de aanmelding altijd mislukken, ongeacht wat u invoert.
Ten tweede, en dit is de waarschuwing: open poort 10000 niet zomaar naar het internet om er vervolgens niet meer naar om te kijken. Bepaal nu of u Webmin via een SSH-tunnel wilt benaderen (aanbevolen, niets wordt blootgesteld) of dat u de toegang wilt beperken tot uw eigen IP-adres. Deze ene beslissing bepaalt elke onderstaande stap, dus lees beide opties door voordat u de firewall aanpast.
Webmin installeren vanuit de officiële repository
Webmin publiceert een ondertekende apt-repository. Het installatiescript voegt de repository en de bijbehorende GPG-ondertekeningssleutel toe, zodat toekomstige apt upgrade-runs Webmin ophalen zoals elk ander pakket. U ontvangt hiermee geauthenticeerde updates in plaats van een gedownload .deb-bestand dat zichzelf nooit bijwerkt.
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 uit te voeren acties en vraagt om bevestiging via Setup Webmin stable repository? (y/N); antwoord met y. Installeer het pakket zodra het script is voltooid. De --install-recommends-vlag haalt de algemene Perl- en SSL-moduleafhankelijkheden op, zodat individuele modules later niet falen door ontbrekende bibliotheken.
sudo apt-get install --install-recommends webminWebmin heeft dit script in het verleden hernoemd; oudere handleidingen verwijzen naar setup-repos.sh. Als de raw URL een 404-foutmelding geeft, haal dan de actuele one-liner direct op van webmin.com/download in plaats van een specifieke bestandsnaam vast te pinnen. 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 bevindt zich in /etc/webmin, verzoeken worden gelogd naar /var/webmin/miniserv.log en mislukte inlogpogingen worden naar syslog geschreven (op Ubuntu 24.04 is dit de systemd journal).
Controleer of de service daadwerkelijk actief is en luistert voordat u een browser opent:
sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000U hoort een active (running)-status te zien en een regel die aangeeft dat miniserv.pl is gebonden aan 0.0.0.0:10000. Dat adres verandert in 127.0.0.1:10000 zodra u de onderstaande tunnelroute gebruikt. Als ss niets toont op poort 10000, is Webmin niet gestart; lees journalctl -u webmin -n 50 voordat u verdergaat.
Eerste aanmelding en de certificaatwaarschuwing
Navigeer met uw browser naar https://YOUR_SERVER_IP:10000. Op een nieuwe server gebeuren er twee dingen.
Als ufw actief is (de standaard Ubuntu-serverimage levert deze inactief uit, maar veel providers schakelen deze vooraf in), zal de pagina helemaal niet laden; dit wordt behandeld in de foutmodi hieronder. Als de poort open is, toont uw browser een paginagrote blokkering: "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 zelfondertekend certificaat gegenereerd (/etc/webmin/miniserv.pem), en omdat geen enkele certificaatautoriteit hiervoor instaat, weigert de browser deze stilletjes te vertrouwen. De verbinding is nog steeds versleuteld; het certificaat is simpelweg niet geverifieerd. Klik voor nu door (kies Geavanceerd en vervolgens Doorgaan); we vervangen dit certificaat later in de handleiding door een correct exemplaar.
Meld u aan met root of uw sudo-gebruiker en het bijbehorende Unix-wachtwoord. U komt vervolgens terecht op het dashboard met systeeminformatie. Een veelgemaakte fout is het typen van http:// in plaats van https://. miniserv reageert op die poort met platte HTTP en de tekst "This web server is running in SSL mode. Try the URL https://...". De oplossing is simpelweg het wijzigen van http naar https in de adresbalk.
De beveiligingsbeslissing: hoe bereikt u Webmin?
Nu het belangrijkste onderdeel. Een paneel met root-rechten mag niet open en bloot op het internet staan, waar het inlogpogingen van elke scanner ter wereld ontvangt. U heeft twee verdedigbare opties, in volgorde van voorkeur. Elk zelfgehost beheervlak stuit op deze vraag; daarom hangt of Vaultwarden veilig is af van het beheer-eindpunt en het back-upbestand, en niet van de encryptie zelf.
De SSH-tunnel in Optie B is de beste keuze, omdat deze niets blootstelt aan het internet. De IP-toegangslijst in Optie A is acceptabel als uw adres statisch is. Geen van beide doen is precies de fout die deze handleiding probeert te voorkomen. Als u Webmin liever via een privénetwerk bereikt dan via een van deze opties, plaats de server dan achter een zelfgehoste WireGuard VPN en bind Webmin aan het tunneladres in plaats van aan het publieke adres.
Optie A: Webmin beperken tot uw IP-adres
Open in het paneel Webmin, vervolgens Webmin Configuration en daarna IP Access Control. Kies "Only allow from listed addresses" en voer uw publieke IP-adres in; dit kunt u achterhalen door curl ifconfig.me uit te voeren op uw laptop. Sla de wijzigingen op. Webmin schrijft dit naar de regel allow= in /etc/webmin/miniserv.conf en start zichzelf opnieuw op.
Het risico: als uw thuis-IP dynamisch is en wijzigt, of als u het adres verkeerd invoert, sluit u uzelf buiten. De browser toont dan "Access denied for <your IP>" zonder inlogformulier, en er is geen web-gebaseerde weg terug. U herstelt dit vanaf de serverconsole via SSH of de VNC-console 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 regel allow= herstelt de volledig open toegang. Doe dit daarom alleen voor herstel en stel direct daarna een correcte waarde in.
Optie B: binden aan localhost en tunnelen via SSH (aanbevolen)
Beter dan een allowlist is om de service helemaal niet op de publieke interface te laten luisteren. Configureer miniserv zo dat deze alleen aan de loopback-interface bindt en benader de service vervolgens via een versleutelde SSH-tunnel die u al vertrouwt.
Bewerk /etc/webmin/miniserv.conf en voeg de volgende regel toe, of pas deze aan:
bind=127.0.0.1Herstart met sudo systemctl restart webmin. Webmin is nu onbereikbaar vanaf het internet, een poortscan van 10000 levert niets op en de ss-controle van eerder toont nu aan dat de service is gebonden aan 127.0.0.1:10000. Open vanaf uw laptop een tunnel:
ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IPLaat die sessie openstaan en navigeer naar https://localhost:10000. Het verkeer verloopt via SSH, dat al is beveiligd met uw sleutel en versleuteling. U kunt het zelfondertekende certificaat hier veilig accepteren; de SSH-laag biedt de feitelijke beveiliging. Sluit de SSH-sessie en Webmin is weer onbereikbaar. Er is niets om op een allowlist te zetten, niets staat blootgesteld en er hoeft geen extra service te worden gehard.
Als u bind=127.0.0.1 heeft ingesteld en de tunnel vergeet, stopt de toegang op afstand simpelweg; dit is de functie die naar behoren werkt, geen fout. Herstel de toegang op dezelfde manier als bij Optie A: verwijder vanaf de console de regel bind of stel bind=0.0.0.0 in en herstart vervolgens. Dit is dezelfde tunnelmethode die u zou gebruiken om een externe ontwikkelomgeving met Claude Code in tmux te bereiken: één SSH-sessie, alles privé en niets extra's dat luistert op de publieke interface.
Vervang het zelfondertekende certificaat door een geldig exemplaar
Indien u Webmin blootstelt via Optie A, kunt u de browserwaarschuwing verwijderen met een geldig Let's Encrypt-certificaat. U heeft een naam voor het certificaat nodig en een methode voor Let's Encrypt om poort 80 te bereiken tijdens de validatie. De naam is doorgaans een DNS-naam, bijvoorbeeld panel.example.com, met een A-record dat naar de server wijst. Sinds Webmin 2.650 (uitgebracht op 25 juni 2026) kan dit ook het publieke IP-adres van de server zijn, mits Certbot 5.3 of nieuwer is geïnstalleerd. Let's Encrypt geeft IP-certificaten alleen uit via een profiel met een korte levensduur van ongeveer zes dagen. Stel daarom het interval voor automatische vernieuwing in Webmin in op dagen; Webmin accepteert geen langer interval voor een IP-certificaat.
Webmin heeft dit ingebouwd: Webmin, vervolgens Webmin Configuration, dan SSL Encryption en daarna het tabblad Let's Encrypt. Voer de hostnaam of het IP-adres in, kies een validatiemethode en dien het verzoek in. Webmin verkrijgt het certificaat, werkt de regels certfile= en keyfile= in miniserv.conf voor u bij en vernieuwt het automatisch voordat het verloopt. Ververs de pagina en het hangslotje is correct.
Het enige reële knelpunt: de eigen server van Webmin draait op 10000, niet op 80, dus er moet iets reageren op de http-01 challenge op poort 80. U heeft hiervoor drie opties. Als Apache of nginx de naam al bedient op poort 80, wijst u de validatie naar de document-directory van die site (voor een IP-adres is hiervoor Certbot 5.4 of nieuwer vereist). Als er niets op poort 80 draait, kiest u de ingebouwde webserver van Certbot, de standalone-modus die Webmin in versie 2.110 heeft toegevoegd: Certbot draait kortstondig zijn eigen webserver op poort 80. Certbot moet hiervoor geïnstalleerd zijn en poort 80 moet vrij en open zijn in uw firewall. U kunt ook DNS-validatie gebruiken; dit werkt voor hostnamen, maar niet voor IP-adressen. Het eigen certbot-pakket van Ubuntu 24.04 is versie 2.9, wat volstaat voor standalone-validatie van een hostnaam, maar te oud is voor IP-certificaten. Installeer voor die gevallen een actuele Certbot, zoals de snap, die in oktober 2026 bij versie 5.8 was. Zonder een van deze methoden mislukt het verzoek met een validatiefout. De werking, DNS-records, de poort 80-challenge en de vernieuwing zijn gelijk aan het uitgeven van een certificaat voor elke andere website. Voor meer achtergrondinformatie doorloopt de handleiding voor Let's Encrypt TLS-certificaten met Certbot en nginx het validatieproces en de DNS-configuratie in detail. Als u de SSH-tunnelroute heeft gekozen, kunt u deze sectie volledig overslaan: het zelfondertekende certificaat volstaat achter SSH, en een geldig certificaat uitgegeven voor panel.example.com zou bij een bezoek aan https://localhost:10000 enkel een waarschuwing over een naam-mismatch genereren.
Tweefactorauthenticatie inschakelen
Een wachtwoord alleen biedt onvoldoende bescherming voor een root-paneel, voeg daarom een tweede factor toe. Open Webmin, vervolgens Webmin Configuration en daarna Two-Factor Authentication. Selecteer de Google Authenticator-provider; dit is de standaard TOTP-methode, waardoor deze werkt met Authy, 1Password of elke andere authenticator-app. Sla de instellingen op. Webmin installeert de benodigde kleine Perl-module (Authen::OATH plus een QR-generator) en schakelt de functie in; deze stap op zichzelf beschermt nog geen enkel account.
Elk account moet vervolgens het eigen apparaat aanmelden. Zodra 2FA is ingeschakeld, opent u Webmin, vervolgens Webmin Users, kiest u het account en selecteert u Enable Two-Factor For User. Webmin toont nu een QR-code; scan deze met de app en voer een gegenereerde code in om te bevestigen. Vanaf dat moment vraagt het inlogproces na het wachtwoord om het zescijferige token. Meld u aan voordat u uitlogt. Als 2FA verplicht is maar uw account nog geen code heeft gescand, kunt u de vereiste nog wel via de console verwijderen, maar het is aanzienlijk eenvoudiger om de aanmelding eerst te voltooien.
Fail2ban toevoegen om brute-force inlogpogingen te blokkeren
Zelfs een beperkt inlogpunt moet herhaaldelijke mislukte pogingen bestraffen. Webmin rapporteert mislukte inlogpogingen aan syslog in de vorm webmin[12345]: Invalid login as root from 10.0.0.9, of Non-existent login as ... voor een gebruikersnaam die niet eens een Unix-account is. Op Ubuntu 24.04 komen deze regels in de systemd journal terecht, aangezien een standaard image geen /var/log/auth.log heeft. Fail2ban levert standaard een webmin-auth filter dat exact deze twee regels matcht, en de onderstaande jail stelt backend = systemd zelf in, waardoor er geen aangepaste regex of logpad nodig is.
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 bevestig daarna dat de jail actief is:
sudo fail2ban-client status webmin-authU hoort de jail in de lijst te zien met een ban-teller die op nul begint (op de journal-backend is er geen File list: regel). Om de werking volledig te verifiëren, voert u vanaf een ander netwerk bewust een paar keer een mislukte inlogpoging uit. Voer daarna het statuscommando opnieuw uit en kijk of Currently banned oploopt. Als dit niet gebeurt, controleer dan of u niet test vanaf een adres in de ignoreip van Fail2ban, en 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 deze machine is geïnstalleerd, behandelt de Fail2ban op Ubuntu 24.04 voor SSH handleiding de installatie en de SSH-jail die u direct naast deze zou moeten draaien.
Beperk de toegang per Webmin-gebruiker
Niet iedereen die toegang tot het paneel nodig heeft, vereist root-rechten voor het gehele systeem. Maak onder Webmin, then Webmin Users aanvullende Webmin-accounts aan en verleen elke gebruiker alleen toegang tot de modules die noodzakelijk zijn; bijvoorbeeld een back-upbeheerder die alleen de cron- en filesystem-modules ziet. Bij het bewerken van een gebruiker verschijnt een checklist met alle beschikbare modules; het uitschakelen van een module verwijdert deze uit het menu van de gebruiker en blokkeert de onderliggende URL's. Dit is een vorm van gelaagde beveiliging (defence in depth): zelfs een gecompromitteerde Webmin-sessie met beperkte rechten kan /etc/shadow niet herschrijven wanneer de Users-module niet in de lijst van die gebruiker voorkomt.
Webmin up-to-date houden
Omdat u de installatie via de apt-repository heeft uitgevoerd, haalt sudo apt update && sudo apt upgrade nieuwe Webmin-releases op samen met de rest van het systeem. Installeer patches direct; een configuratiescherm is een geliefd doelwit. Webmin kan zichzelf ook bijwerken via Webmin, dan Webmin Configuration, dan Upgrade Webmin, maar de apt-methode is schoner op Ubuntu omdat deze de versies consistent houdt met uw overige pakketbeheer. Beschouw dit niet als optioneel: diverse eerdere Webmin CVE's waren bugs voor remote-code-execution, en het enige verschil tussen "gepatcht" en "gecompromitteerd" was hoe snel de beheerder de upgrade uitvoerde.
Foutmodi en de bijbehorende meldingen
"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID. Verschijnt bij de eerste keer laden. Oorzaak: het zelfondertekende certificaat dat Webmin tijdens de installatie heeft gegenereerd, heeft geen vertrouwde uitgever. Dit is geen aanval; het kanaal is versleuteld, maar niet geverifieerd. Oplossing: ga voor nu door de waarschuwing heen en vraag daarna een echt Let's Encrypt-certificaat aan, of accepteer het permanent als u Webmin via een SSH-tunnel benadert.
"This web server is running in SSL mode. Try the URL https://..." U heeft http://server:10000 ingevoerd. miniserv spreekt op die poort alleen TLS en meldt dit in platte tekst. Oplossing: wijzig http naar https in de adresbalk.
Pagina geeft een time-out, ERR_CONNECTION_TIMED_OUT / "This site can't be reached". Het verzoek bereikt Webmin niet. Op Ubuntu blokkeert ufw vaak poort 10000, maar controleer dit voordat u aannames doet. Voer sudo ufw status uit. Als de status Status: inactive is, blokkeert ufw niets (Ubuntu levert ufw uitgeschakeld uit, en het toevoegen van een allow-regel schakelt het niet in). Zoek in dat geval verder stroomopwaarts, bijvoorbeeld bij een firewall in het configuratiescherm van uw provider. Als de status Status: active is, voer dan sudo ufw status verbose uit om het standaard inkomende beleid en eventuele bredere regels te bekijken. Als inkomend verkeer wordt geweigerd en poort 10000 niet in de lijst staat, open deze dan met sudo ufw allow 10000/tcp of, beter nog, laat deze gesloten en gebruik de SSH-tunnel uit Optie B. Let op het verschil: een timeout betekent dat een firewall pakketten stilletjes negeert, terwijl ERR_CONNECTION_REFUSED betekent dat de poort wel 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 toegestane lijst, uw dynamische IP is gewijzigd, of er is sprake van een typefout. Er is geen browserpad terug naar binnen. Oplossing via de console: bewerk de regel allow= in /etc/webmin/miniserv.conf, corrigeer of verwijder deze, en voer sudo systemctl restart webmin uit.
"Login failed. Please try again." bij inloggegevens waarvan u zeker weet dat ze correct zijn. Het account heeft geen Unix-wachtwoord, wat standaard is bij cloud-images die alleen met sleutels 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 de melding Non-existent login as ... geeft, voert u een gebruikersnaam in die geen Unix-account is.
Voor meer dan een paar servers schaalt automatisering beter dan een configuratiescherm op elke machine: uw eerste Ansible playbook is het startpunt daarvoor.
FAQ
Is het veilig om Webmin bloot te stellen aan het openbare internet?
Beschouw een Webmin-installatie die direct verbonden is met het internet als een root-shell met een inlogpagina, want dat is precies wat het is. Het is alleen voldoende veilig in lagen: een geldig certificaat, tweefactorauthenticatie, Fail2ban en ofwel een strikte IP-whitelist of, nog beter, helemaal geen blootstelling aan het openbare internet. De opstelling met het laagste risico bindt Webmin aan 127.0.0.1 en benadert het via een SSH-tunnel, zodat poort 10000 niet reageert op verzoeken vanaf het openbare internet.
Hoe kom ik van de certificaatwaarschuwing van Webmin af?
De waarschuwing (NET::ERR_CERT_AUTHORITY_INVALID) verschijnt omdat Webmin wordt geleverd met een zelfondertekend certificaat. Vraag een geldig certificaat aan via Webmin, Webmin Configuration, SSL Encryption, Let's Encrypt. Gebruik een DNS-naam die naar de server verwijst, of het openbare IP-adres van de server als Certbot 5.3 of nieuwer is geïnstalleerd. Poort 80 moet bereikbaar zijn voor de challenge; deze wordt beantwoord door een bestaande webserver of door de eigen standalone server van Certbot. Als u Webmin uitsluitend via een SSH-tunnel naar localhost benadert, is de waarschuwing ongevaarlijk; SSH versleutelt en authenticeert de verbinding al, en u kunt 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 openbare IP-adres in vanuit curl ifconfig.me. Webmin slaat dit op in de allow=-regel van /etc/webmin/miniserv.conf. Pas op met een dynamisch IP-adres thuis: als dit verandert, wordt u buitengesloten en moet u de allow=-regel herstellen via de serverconsole. Een statisch adres of de SSH-tunnelmethode is in de praktijk betrouwbaarder.
Waarom mislukt mijn inlogpoging, zelfs met het juiste wachtwoord?
Webmin authenticeert via PAM tegen uw Unix-wachtwoord. Cloud-images zijn meestal geconfigureerd voor alleen sleutelauthenticatie zonder wachtwoord voor het standaardaccount, waardoor er geen match is voor PAM en de inlogpoging wordt 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 daarentegen dat de gebruikersnaam zelf geen geldig Unix-account is.
Waar is Webmin nuttig voor in vergelijking met standaard SSH?
Webmin is een laag voor vindbaarheid en gebruiksgemak. Het is oprecht nuttig voor het inzien van logbestanden, het beheren van gebruikers en cron-taken, het bewerken van firewallregels en het bekijken van de status van schijven en services zonder elk commando uit het hoofd te hoeven leren. Dit is handig voor incidentele beheerders of teams met uiteenlopende vaardigheden. Standaard SSH is sneller, scriptbaar en stelt voor routinewerk een veel kleiner aanvalsoppervlak bloot. Veel beheerders gebruiken beide: SSH voor dagelijks beheer en Webmin gebonden aan localhost achter een tunnel voor incidentele taken waarbij een grafische interface gewenst is. Als uw eigenlijke vraag is welk paneel u moet kiezen in plaats van paneel versus shell, is het de moeite waard om eerst Cockpit versus Webmin te overwegen, aangezien de twee verschillen in de mate waarin ze het systeem kunnen wijzigen en in de manier waarop ze u authentiseren.