SSD Nodes Learn 🎉 VPS vanaf $5.50/mnd
Gidsen Matt ConnorDoor Matt Connor · Bijgewerkt 2026-08-13

Cockpit of Webmin voor serverbeheer: wat is beter?

Kies tussen Cockpit en Webmin voor uw Ubuntu VPS. Ontdek welke tool configuratiebestanden wijzigt, hoe ze inloggen en waarom u deze panelen nooit aan een publieke poort koppelt.

Cockpit versus Webmin: het korte antwoord

Cockpit en Webmin zijn beide webpanelen voor het beheer van een Linux-server via een browser, maar ze dienen verschillende doelen. Cockpit wordt meegeleverd in de repository van uw distributie en leest de machine uit via systemd, journald, polkit en udisks. Hierdoor toont het een server die u nog steeds via SSH beheert. Webmin is ouder en veel uitgebreider: het schrijft configuratiebestanden voor Apache, BIND, Postfix, MariaDB en tientallen andere services waar Cockpit niet aan komt. Om dit te doen, draait Webmin zijn eigen webserver als root.

Installeer Cockpit wanneer u een live overzicht van één machine, een log-lezer en een noodterminal nodig heeft. Installeer Webmin wanneer u een op formulieren gebaseerde editor nodig heeft voor een service die u niet handmatig wilt configureren. Stel geen van beide bloot aan een publieke poort met een wachtwoordlogin. Als u al meer dan twee of drie servers beheert, is het eerlijke antwoord vaak geen van beide; de combinatie van SSH en Ansible schaalt beter dan welk paneel dan ook.

Wat elk paneel daadwerkelijk kan wijzigen

De basisinstallatie van Cockpit is klein en de meeste onderdelen zijn afzonderlijke pakketten die u achterwege kunt laten:

  • systemd-services en timers: starten, stoppen, inschakelen en het unit-bestand lezen
  • het journal, gefilterd op unit en prioriteit, wat journalctl is met een datumkiezer
  • lokale accounts, groepslidmaatschappen en geautoriseerde SSH-keys
  • opslag met cockpit-storaged: partities, LVM-volumegroepen, bestandssystemen en mount-punten
  • containers met cockpit-podman, wat uitsluitend Podman beheert
  • pakketupdates met cockpit-packagekit
  • grafieken van CPU, geheugen, schijf en netwerk met cockpit-pcp
  • een root-terminal in het browsertabblad

Twee onderdelen lijken defect op een Ubuntu VPS, maar dat zijn ze niet. De netwerkpagina van Cockpit is een interface voor NetworkManager, terwijl Ubuntu-serverimages netplan met systemd-networkd gebruiken; daarom ontbreekt de pagina of is deze leeg. Installeer NetworkManager niet op een server op afstand om dit terug te krijgen, omdat het de interface overneemt en een fout daar u ook de SSH-sessie kost. De firewall-instellingen van Cockpit zijn een interface voor firewalld, terwijl Ubuntu ufw gebruikt, waardoor u helemaal geen firewall-bediening krijgt. Blijf sudo ufw status in een terminal gebruiken.

Webmin bestrijkt veel meer terrein, omdat het een verzameling modules per service is in plaats van één programma:

  • Configuratie van Apache, nginx, BIND, Postfix, Dovecot, MariaDB, PostgreSQL en Samba via formulieren
  • Gebruikers, groepen en schijfquota
  • Cron-jobs en de systeemklok
  • Pakketupdates, plus een bestandsbeheerder met upload- en downloadfunctionaliteit
  • Firewall-interfaces, waaronder één voor iptables en één voor firewalld
  • Back-ups van configuratiebestanden en clustermodules die één wijziging naar andere Webmin-servers pushen

Webmin bewerkt de echte bestanden onder /etc. Er zit geen verborgen database achter de formulieren, dus als /etc in versiebeheer staat, laat sudo git -C /etc diff na het opslaan van een formulier precies zien wat de module heeft geschreven. Dat is de snelste manier om te leren wat een Webmin-pagina daadwerkelijk doet. De walkthrough voor de Webmin-installatie en de eerste login doorloopt de moduleboom in detail. Virtualmin en Usermin zijn afzonderlijke producten die op dezelfde engine zijn gebouwd, voor shared hosting en eindgebruikers, en zij erven alles wat hier over blootstelling is gezegd.

Hoe elk systeem authenticeert

Cockpit beschikt niet over een eigen gebruikersdatabase. De inlogpagina voert de PAM (pluggable authentication modules) stack uit in /etc/pam.d/cockpit, waardoor de accounts uw Unix-accounts zijn en de wachtwoorden uw Unix-wachtwoorden. Root wordt standaard geweigerd omdat /etc/cockpit/disallowed-users dit vermeldt. Bevoorrechte acties verlopen via polkit, en de interface vraagt opnieuw om uw wachtwoord voordat er wijzigingen worden doorgevoerd. Dit is de reden waarom de paginakop "Beperkte toegang" kan weergeven totdat u uw rechten escaleert.

Dit ontwerp heeft één consequentie waar men op een beveiligde server tegenaan loopt. Als u de instructies voor SSH-login uitsluitend met sleutels en uitgeschakelde wachtwoordauthenticatie heeft gevolgd, kan het account mogelijk helemaal geen bruikbaar wachtwoord hebben. Hierdoor wordt de Cockpit-login geweigerd, terwijl ssh nog steeds werkt. Controleer dit op de server:

sudo passwd -S deploy

Uitvoer die begint met deploy L betekent dat het wachtwoord is vergrendeld, waardoor PAM niets heeft om te accepteren en geen enkel ingevoerd wachtwoord kan werken. P betekent dat er een bruikbaar wachtwoord is ingesteld. De inlogpagina van Cockpit accepteert zelf geen SSH-sleutels. Sleutels worden alleen gebruikt wanneer Cockpit vanaf de machine waarop u bent ingelogd verbinding maakt met een andere host.

Webmin beheert zijn eigen gebruikers in /etc/webmin/miniserv.users, los van /etc/passwd, en kan ook worden geconfigureerd om te authentiseren tegen Unix-accounts. Een Webmin-gebruiker aan wie alle modules zijn toegewezen, is root op die machine, ongeacht wat de login-shell aangeeft. Webmin levert eigen ondersteuning voor TOTP (time-based one-time password) en blokkeert zelf hosts na herhaaldelijke mislukte inlogpogingen; beide functies kunnen worden ingeschakeld in Webmin Configuration. Cockpit krijgt pas een tweede factor als u deze toevoegt aan PAM, bijvoorbeeld met libpam-google-authenticator.

Hoe elk pakket wordt bijgewerkt

Cockpit wordt door uw distributie verpakt. Op Ubuntu 24.04 is het afkomstig uit het archief, en het upstream-project raadt de backports-pocket aan voor een nieuwere build:

. /etc/os-release
sudo apt update
sudo apt install -t ${VERSION_CODENAME}-backports cockpit
sudo systemctl status cockpit.socket
apt policy cockpit

apt policy toont de geïnstalleerde versie en de repository waar deze vandaan komt. Als backports geen nieuwere build bevat, valt apt terug op de versie uit het archief, wat prima is. cockpit.socket hoort active (listening) te tonen. Beveiligingsupdates komen vervolgens binnen via dezelfde unattended-upgrades-run als uw kernel, afkomstig van een uitgever die u al vertrouwt.

Webmin zit niet in het archief van Ubuntu. De officiële installatie voegt eerst de eigen repository en signing key van Webmin toe:

curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.sh
sudo apt-get install webmin --install-recommends

Lees dat script door voordat u het uitvoert, omdat het als root draait. Vanaf dat moment haalt elke apt upgrade op de server ook updates op uit de repository van Webmin; u heeft dus een tweede uitgever toegevoegd met root-toegang op de server. Dat is de werkelijke prijs van Webmin, en dat verdient een concreet voorbeeld: CVE-2019-15107 was een achterdeur in verschillende 1.9x-pakketten die ongeautoriseerde commando-uitvoering mogelijk maakte. Het bereikte gebruikers omdat de build-host van het project was gecompromitteerd, niet de broncode-repository. Distributie-packaging maakt dit niet onmogelijk. Het voegt echter wel een build- en review-stap toe die u niet zelf hoeft te onderhouden.

Waarom beide niet op een publieke poort thuishoren

Cockpit luistert op TCP 9090 en Webmin op TCP 10000, beide via TLS (transport layer security) met een zelfondertekend certificaat, waardoor u als eerste een browserwaarschuwing ziet. Het aanmaken en vertrouwen van een zelfondertekend certificaat legt uit wat die waarschuwing wel en niet betekent. Beide poorten worden constant gescand en beide panelen bieden toegang tot root, dus een geraden of hergebruikt wachtwoord betekent een volledige inbreuk op de server.

Het veilige patroon is om het paneel aan localhost te binden en het te benaderen via een SSH-tunnel. Voor Cockpit overschrijft u de socket-unit:

sudo systemctl edit cockpit.socket
[Socket]
ListenStream=
ListenStream=127.0.0.1:9090

De lege ListenStream= op een eigen regel is vereist. systemd voegt instellingen toe aan lijsten; zonder deze lege regel behoudt de unit de oorspronkelijke 0.0.0.0:9090 en voegt het nieuwe adres toe, waardoor uw paneel publiek blijft. Pas de override toe en controleer wat er luistert:

sudo systemctl daemon-reload
sudo systemctl restart cockpit.socket
sudo ss -lntp | grep 9090

De uitvoer moet 127.0.0.1:9090 tonen. Een adres van *:9090 of 0.0.0.0:9090 betekent dat de override niet effectief is. Open nu de tunnel vanaf uw eigen machine en navigeer naar https://localhost:9090:

ssh -N -L 9090:127.0.0.1:9090 deploy@203.0.113.10

Houd de lokale poort gelijk aan de externe poort. Cockpit vergelijkt de Origin-header van de browser met het adres waarvan het denkt dat het wordt geserveerd. Een tunnel vanaf lokale poort 9999 laadt de inlogpagina, maar faalt bij het inloggen, en journalctl -u cockpit registreert de geweigerde herkomst. Als u een andere lokale poort nodig heeft, specificeer deze dan in /etc/cockpit/cockpit.conf:

[WebService]
Origins = https://localhost:9999 https://127.0.0.1:9999

Herstart met sudo systemctl restart cockpit.socket om dit door te voeren. Voor Webmin bevindt de equivalente instelling zich in /etc/webmin/miniserv.conf:

bind=127.0.0.1
sudo systemctl restart webmin
sudo ss -lntp | grep 10000
ssh -N -L 10000:127.0.0.1:10000 deploy@203.0.113.10

Webmin controleert ook de Referer-header bij formulierinzendingen en weigert verzoeken die van een andere host lijken te komen; dit is wat een eerste poging met een reverse proxy doorgaans blokkeert. De regel referers= in hetzelfde bestand is waar u de hostnaam van de proxy toestaat, en webprefix= is waar u Webmin vertelt dat het onder een specifiek pad draait.

Een geauthenticeerde reverse proxy is de andere optie: nginx aan de voorzijde, met een Authentik single sign-on laag voor de authenticatie. Dit werkt en is de op één na beste oplossing. Het paneel draait nog steeds als root achter de proxy en u onderhoudt nu twee voordeuren in plaats van één. Een tunnel voegt geen luisterende service toe aan het internet en hergebruikt de SSH-sleutel die u al beveiligt.

Welk paneel op een server die al productieservices draait

Cockpit, om twee redenen die van belang zijn wanneer anderen afhankelijk zijn van de machine. Het is socket-geactiveerd, waardoor cockpit-ws alleen draait terwijl een sessie open is en er geen permanente root-daemon op een poort wacht. Bovendien beheert het niets: verwijder het pakket en elke service blijft exact zoals voorheen draaien, omdat Cockpit geen eigen configuratie opslaat. De miniserv.pl van Webmin blijft resident, ongeacht of er iemand is ingelogd. Controleer wat uw exemplaar verbruikt met systemctl status webmin, wat het resident geheugen van het draaiende proces weergeeft.

Als u de DNS- of mailmodules van Webmin nodig heeft, geef deze dan een eigen server. Een Webmin-server die één taak uitvoert, gebonden aan 127.0.0.1, is een beheersbaar risico. Webmin die een host deelt met uw klantgerichte applicatie is dat niet. Voer het basiswerk uit voordat een van beide panelen wordt geïnstalleerd: de eerste tien minuten op een nieuwe VPS behandelt de niet-rootgebruiker en de firewall waarvan beide panelen aannemen dat deze al aanwezig zijn.

Wanneer het antwoord geen van beide is

Een paneel is per server en handmatig, en het laat geen spoor na van wat er is gewijzigd of waarom. Dat is prima voor één machine. Bij vijf machines herhaalt u uzelf, en bij twintig machines raadt u welke server de wijziging heeft gemist. Cockpit kan andere hosts aan één sessie toevoegen via SSH, maar recente versies schakelen dit standaard uit en vereisen AllowMultiHost=yes in /etc/cockpit/cockpit.conf, en bovendien moet u nog steeds vijf keer dezelfde wijziging doorvoeren.

Het alternatief is standaard SSH met uw configuratie in een git-repository. Het beheren van meerdere Linux-servers vanaf één plek behandelt de vorm van die opzet, en een eerste Ansible playbook past dezelfde firewallregel toe op elke host vanuit één bestand dat u als diff kunt controleren. Containerwerk werkt op dezelfde manier: docker compose up -d via SSH vanuit een bestand in git, zoals in de basisgids voor Docker Compose, is beter dan klikken door welk paneel dan ook, en Cockpit beheert Docker sowieso niet.

Gebruik een paneel voor zaken waar een terminal niet goed in is, zoals het lezen van een metriekengrafiek of het spotten van welke van de veertig units is uitgevallen. Gebruik code voor alles wat u meer dan twee keer gaat doen.

Foutmodi en de meldingen die u zult zien

Cockpit weigert een wachtwoord dat SSH wel accepteert. Het account is ingesteld op alleen-sleutel-authenticatie. sudo passwd -S alice geeft L weer in het tweede veld, waardoor PAM geen wachtwoord heeft om te controleren. Stel er een in met sudo passwd alice, of gebruik dat account uitsluitend voor SSH en log in op Cockpit met een andere gebruiker.

Cockpit weigert root, zelfs met het juiste wachtwoord. /etc/cockpit/disallowed-users vermeldt root. Log in als een normale gebruiker met sudo-rechten. Dit is de beoogde werkwijze, omdat polkit dan registreert welke gebruiker de rechten heeft geëscaleerd.

Cockpit toont geen pagina voor Networking of Firewall. Deze pagina's vereisen NetworkManager en firewalld. Een Ubuntu VPS draait netplan met systemd-networkd en ufw, waardoor de pagina's niet verschijnen. Er is niets defect; de oplossing is om ufw via SSH te blijven gebruiken.

De inlogpagina van Cockpit laadt via de tunnel, maar inloggen mislukt. Uw lokale poort verschilt van de externe poort, waardoor de Origin-controle faalt en journalctl -u cockpit dit aangeeft. Zorg dat de poorten overeenkomen of stel Origins in binnen /etc/cockpit/cockpit.conf.

Webmin-formulieren werken niet nadat u deze achter een proxy heeft geplaatst. De Referer-controle wijst deze af. Voeg de hostnaam van de proxy toe aan referers= in /etc/webmin/miniserv.conf en stel webprefix= in wanneer het paneel onder een specifiek pad wordt geserveerd.

U weet niet zeker of een paneel is blootgesteld. sudo ss -lntp | grep -E '9090|10000' beantwoordt dit vanaf de server zelf, en Webmin schrijft elke inlogpoging naar /var/webmin/miniserv.log. Het is raadzaam dit bestand te controleren nadat u wijzigingen heeft aangebracht in de manier waarop de service luistert.

FAQ

Is Cockpit of Webmin beter voor een enkele Ubuntu VPS?

Voor de meeste gebruikers is Cockpit de beste keuze, omdat het onderdeel is van de officiële Ubuntu-repositories, samen met het systeem wordt bijgewerkt en alleen actief is wanneer er een browsersessie openstaat. Kies voor Webmin wanneer u een formuliergebaseerde editor nodig heeft voor een service die Cockpit niet ondersteunt, zoals BIND of Postfix. Houd er hierbij rekening mee dat de webserver van Webmin continu als root draait en dat updates afkomstig zijn uit de eigen repository van Webmin.

Kan ik Cockpit en Webmin op dezelfde server draaien?

Ja. Ze gebruiken verschillende poorten, 9090 en 10000, en conflicteren niet omdat ze beiden het systeem direct bewerken in plaats van het te beheren als een eigen entiteit. Het blijft echter een onverstandige keuze. Elk paneel biedt een afzonderlijke login met root-rechten op dezelfde machine, waardoor u de blootstelling verdubbelt om slechts enkele klikken te besparen. Als u beide installeert, bind ze dan aan 127.0.0.1 en benader ze via een SSH-tunnel.

Is het veilig om poort 9090 of 10000 open te stellen voor het internet?

Niet met een wachtwoord-login. Beide panelen bieden toegang tot root-rechten en beide poorten worden binnen enkele uren na openstelling gevonden door geautomatiseerde scans. Bind het paneel aan 127.0.0.1, voer vervolgens ssh -N -L 9090:127.0.0.1:9090 user@host uit en navigeer naar https://localhost:9090. Controleer dit met sudo ss -lntp | grep 9090; dit moet 127.0.0.1:9090 tonen in plaats van 0.0.0.0:9090. Een reverse proxy met authenticatie is een acceptabel alternatief.

Waarom mislukt mijn Cockpit-login terwijl SSH met een sleutel wel werkt?

Cockpit authenticeert via PAM met een Unix-wachtwoord en de loginpagina accepteert geen SSH-sleutels. Op een beveiligde server heeft het account vaak geen bruikbaar wachtwoord. Voer sudo passwd -S youruser uit: een L in het tweede veld betekent dat het wachtwoord is vergrendeld, waardoor PAM niets kan accepteren en elke poging wordt afgewezen. Stel een wachtwoord in met sudo passwd youruser of gebruik een ander account voor het paneel.

Beheert Cockpit Docker-containers?

Nee. De container-pagina van Cockpit is afkomstig van cockpit-podman en beheert Podman. De oude Docker-module is jaren geleden verwijderd en zal niet terugkeren. Als uw services onder Docker draaien, beheer deze dan met een compose-bestand in versiebeheer via SSH en laat Cockpit het systeem eromheen beheren, zoals de journal en de schijven.

#cockpit#webmin#server-management#admin-panel#ubuntu