SSD Nodes Learn Hosting plans →
Gidsen Matt ConnorDoor Matt Connor · Bijgewerkt 2026-08-13

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-opdrachten Webmin ophalen zoals elk ander pakket. Hierdoor ontvangt u 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.sh

Het script toont wat het gaat uitvoeren en vraagt om Setup repository? (y/N); antwoord met y. Zodra het proces is voltooid, installeert u het pakket. De --install-recommends-vlag haalt de algemene Perl- en SSL-module-afhankelijkheden op, zodat individuele modules later niet falen door ontbrekende bibliotheken.

sudo apt-get install --install-recommends webmin

Webmin heeft dit script in het verleden hernoemd; oudere handleidingen verwijzen naar setup-repos.sh. Als de directe URL een 404-foutmelding geeft, haal dan de actuele one-liner direct op via 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 in /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 10000

U dient 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 tunnelmethode 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 webmin

Het 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.1

Herstart 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_IP

Laat 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

Als u Webmin blootstelt via een hostnaam onder Optie A, kunt u de browserwaarschuwing verwijderen met een geldig Let's Encrypt-certificaat. U heeft een DNS-naam nodig, bijvoorbeeld panel.example.com, met een A-record dat naar de server wijst, en een proces dat reageert op de HTTP-challenge op poort 80 tijdens de validatie.

Webmin heeft hiervoor een ingebouwde functie: Webmin, vervolgens Webmin Configuration, dan SSL Encryption en daarna het tabblad Let's Encrypt. Voer de hostnaam in, verwijs de "website root directory" naar een pad dat voor dat domein op poort 80 wordt geserveerd, 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 struikelblok: de eigen server van Webmin draait op 10000, niet op 80. De http-01 challenge vereist daarom een echte webserver, zoals Apache of nginx, die reageert voor panel.example.com op poort 80, of een DNS-gebaseerde validatie. Op een server die alleen Webmin draait en niets op poort 80 heeft, mislukt het verzoek met een validatiefout totdat u Let's Encrypt een manier geeft om het challenge-bestand te bereiken. De werking, DNS-records, de poort 80-challenge en de vernieuwing zijn identiek aan het uitgeven van een certificaat voor elke andere website. Als u meer achtergrondinformatie wilt, doorloopt de handleiding voor Let's Encrypt TLS-certificaten met Certbot en nginx het validatieproces en de DNS-configuratie in detail. Als u de route via een SSH-tunnel 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 niet-overeenkomende naam 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  = 1h

Herlaad met sudo systemctl restart fail2ban en bevestig daarna dat de jail actief is:

sudo fail2ban-client status webmin-auth

U 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 het eerste 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 geldig 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 verloopt (timeout), ERR_CONNECTION_TIMED_OUT / "This site can't be reached". Het verzoek bereikt Webmin niet. Op Ubuntu wordt dit bijna altijd veroorzaakt doordat ufw poort 10000 blokkeert. Controleer dit met sudo ufw status; als 10000 niet in de lijst staat, open deze dan met sudo ufw allow 10000/tcp of, beter nog, laat de poort 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 in dat geval 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, of uw dynamische IP-adres is gewijzigd, of er is sprake van een typefout. Er is geen weg terug via de browser. Oplossing vanaf 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 kloppen. 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 in het geheel geen Unix-account is.

Voor meer dan een paar servers schaalt automatisering beter dan een configuratiescherm op elke afzonderlijke machine: uw eerste Ansible playbook is waar dat begint.

FAQ

Is het veilig om Webmin bloot te stellen aan het openbare internet?

Beschouw een Webmin-installatie die direct bereikbaar is vanaf het internet als een root-shell met een inlogpagina, want dat is precies wat het is. Het is alleen voldoende veilig als u werkt met meerdere beveiligingslagen: 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 open 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, met gebruik van een DNS-naam die naar de server wijst en waarbij iets de port-80 challenge voor validatie afhandelt. 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 vanaf curl ifconfig.me. Webmin slaat dit op in de regel allow= van /etc/webmin/miniserv.conf. Pas op met een dynamisch IP-adres thuis: als dit verandert, wordt u buitengesloten en moet u de regel allow= 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 op basis van uw Unix-wachtwoord. Cloud-images zijn doorgaans geconfigureerd voor inloggen met alleen een sleutel, zonder wachtwoord voor het standaardaccount; er is dus niets voor PAM om te matchen en de inlogpoging wordt afgewezen. Voer sudo passwd youruser uit op de server om een wachtwoord in te stellen en log daarna in. Een regel Non-existent login as ... in /var/webmin/miniserv.log betekent daarentegen dat de gebruikersnaam zelf geen geldig Unix-account is.

Waarvoor is Webmin nuttig 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 dat u elk commando uit uw hoofd hoeft te kennen; dit is handig voor incidentele beheerders of teams met uiteenlopende vaardigheden. Standaard SSH is sneller, scriptbaar en biedt een veel kleiner aanvalsoppervlak voor routinewerkzaamheden. Veel beheerders gebruiken beide: SSH voor dagelijks gebruik en Webmin gebonden aan localhost achter een tunnel voor incidentele taken waarvoor 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 vergelijken, aangezien de twee verschillen in de mate waarin ze het systeem kunnen wijzigen en in de manier waarop ze u authentiseren.