Checklist voor SSH-hardening: zo beveilig je een Linux VPS
SSH beveiligen op een nieuwe VPS met Ubuntu 24.04, stap voor stap: sleutels, sshd-instellingen, UFW en Fail2ban, met een test per stap, zodat je toegang houdt.
Met deze checklist beveilig je SSH op een nieuwe VPS met Ubuntu 24.04 LTS: je logt niet langer als root met een wachtwoord in, maar alleen nog met een sleutel via één persoonlijk account, en de server staat achter een firewall en Fail2ban. Bij elke riskante stap hoort een test die je uitvoert terwijl je huidige sessie openblijft, en waar Debian 12 afwijkt, staat dat erbij. Draait je server op Windows? Dan lees je in onze tips voor het beveiligen van Remote Desktop hoe je hetzelfde doet voor RDP.
SSH beveiligen: de checklist in één oogopslag
SSH op een nieuwe server beveiligen doe je in elf stappen, en de volgorde is belangrijk: zorg dat een sudo-gebruiker met een sleutel kan inloggen voordat je root-login en inloggen met een wachtwoord uitschakelt, en sta SSH toe voordat je de firewall aanzet.
| Stap | Risico op buitensluiten |
|---|---|
| 1. Automatische beveiligingsupdates | Geen |
| 2. Een sudo-gebruiker | Geen |
| 3–4. Inloggen met een SSH-sleutel | Geen |
| 5–7. Geen root-login, geen wachtwoorden | Ja: test met een tweede login |
| 8. Een nieuwe SSH-poort (optioneel) | Ja |
| 9. Firewall met UFW | Ja |
| 10. Fail2ban | Kan je eigen adres blokkeren |
| 11. Ongebruikte diensten uitschakelen | Geen |
De server voorbereiden: updates en een sudo-gebruiker
Werk je als root, dan kun je sudo in de eerste twee stappen weglaten. Vervang overal deploy door je eigen gebruikersnaam en 203.0.113.10 door het IP-adres van je server.
1. Werk het systeem bij en zet automatische beveiligingsupdates aan
Installeer eerst de openstaande updates: apt update werkt de pakketlijsten bij en apt upgrade installeert de nieuwe versies. [1]
sudo apt update
sudo apt upgradeOp Ubuntu worden beveiligingsupdates automatisch geïnstalleerd door het pakket unattended-upgrades, dat standaard aanwezig is en één keer per dag draait. Beide waarden in /etc/apt/apt.conf.d/20auto-upgrades moeten “1” zijn, en een proefdraai (dry run) laat zien wat er geïnstalleerd zou worden. [1]
cat /etc/apt/apt.conf.d/20auto-upgrades
sudo unattended-upgrade --dry-run -vAPT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";De server wordt daarbij niet vanzelf herstart, want Unattended-Upgrade::Automatic-Reboot staat standaard op false. Herstart dus zelf als een update dat vereist. [1] Ontbreekt op Debian 12 het pakket of het bestand, installeer dan unattended-upgrades en maak het bestand aan met de twee regels hierboven.
2. Maak een gewone gebruiker met sudo-rechten aan
Werk als een gebruiker met een eigen naam en gebruik sudo voor beheertaken; sudo vraagt om het wachtwoord van die gebruiker zelf, niet om dat van root. Leden van de groep sudo krijgen daarmee volledige root-toegang. [2]
sudo adduser deploy
sudo adduser deploy sudoadduser vraagt om een wachtwoord en een paar optionele gegevens. [2] Kies een lang wachtwoord: SSH gaat straks met sleutels werken, maar sudo blijft om dit wachtwoord vragen. Controleer daarna het account; sudo whoami hoort root te tonen.
su - deploy
sudo whoamiOntbreekt op Debian 12 het commando sudo, installeer het dan eerst als root met apt install sudo.
Inloggen met een SSH-sleutel instellen
3. Genereer op je eigen computer een ed25519-sleutel
Maak het sleutelpaar aan op je eigen computer, niet op de server. Ubuntu raadt het type ed25519 aan, omdat die sleutels korter zijn en minder rekenkracht kosten. ssh-keygen vraagt om een wachtwoordzin die de privésleutel beschermt. [3]
ssh-keygen -t ed25519Laat de standaardbestandsnaam staan. De privésleutel is ~/.ssh/id_ed25519; de publieke sleutel, die je naar servers kopieert, is ~/.ssh/id_ed25519.pub. [3]
Op Windows voer je hetzelfde commando uit in PowerShell; het sleutelpaar komt dan in de map .ssh van je gebruikersprofiel. Microsoft raadt een lege wachtwoordzin af en waarschuwt dat iedereen die de privésleutel in handen krijgt, onder jouw naam kan inloggen. [4]
ssh-keygen -t ed255194. Kopieer de publieke sleutel naar de server
Op Linux en macOS voegt ssh-copy-id je publieke sleutel toe aan ~/.ssh/authorized_keys van de gebruiker op de server. [3]
ssh-copy-id deploy@203.0.113.10Microsoft gebruikt in zijn handleiding in plaats daarvan PowerShell of scp om sleutels te kopiëren. [4] Voor een Linux-server voegt dit commando je sleutel toe en geeft het alleen jou schrijfrechten op de map en het bestand:
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"Voordat sshd een login accepteert, controleert de daemon deze rechten via de optie StrictModes, die standaard aan staat. [5] Voer daarna in een nieuwe terminal ssh deploy@203.0.113.10 uit: je moet nu kunnen inloggen zonder het wachtwoord van het account. Lukt dat niet, volg dan het SSH-log van de server terwijl je het opnieuw probeert: [3]
sudo journalctl -fu ssh.servicesshd-instellingen aanscherpen: root-login, wachtwoorden en gebruikers
In de volgende stappen schakel je root-login en inloggen met een wachtwoord uit. Begin pas wanneer je met je sleutel als de nieuwe gebruiker kunt inloggen, en houd die sessie open tot een tweede login is gelukt.
5. Zet je instellingen in een drop-in-bestand
Op Ubuntu begint /etc/ssh/sshd_config met Include /etc/ssh/sshd_config.d/*.conf, en OpenSSH houdt voor de meeste instellingen de eerste waarde aan die het leest. Bestanden in die map hebben dus voorrang op het hoofdbestand. [3] Bestanden die via Include worden ingelezen, komen in lexicografische volgorde aan de beurt, en per optie geldt de eerste waarde die sshd tegenkomt, [5] dus noem je eigen bestand 00-hardening.conf.
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
AllowUsers deployVolgens de manpage van sshd_config:
- PermitRootLogin no voorkomt dat root via SSH inlogt. De standaardwaarde, prohibit-password, weigert wachtwoorden voor root, maar accepteert nog wel sleutels. [5]
- PasswordAuthentication no schakelt inloggen met een wachtwoord uit; dat is standaard toegestaan. [5]
- KbdInteractiveAuthentication no schakelt keyboard-interactive-authenticatie uit, een aparte methode die ook standaard aan staat; de oude naam van deze optie is ChallengeResponseAuthentication. [5]
- AllowUsers deploy (optioneel) laat alleen de genoemde gebruikers inloggen. Anders dan bij de meeste opties vult elke AllowUsers-regel de lijst aan. [5] Let op de exacte spelling van de naam, anders komt niemand meer binnen.
Behandel het sudo-account vanaf nu als root: volgens de toelichting bij het openssh-pakket van Ubuntu is elk account van waaruit je root kunt worden, voor aanvallers van buitenaf gelijkwaardig aan root. [6] Controleer op Debian 12 eerst met grep -n Include /etc/ssh/sshd_config of de Include-regel er staat.
6. Zoek bestanden die wachtwoorden weer aanzetten
Omdat de eerste waarde wint, heeft elk bestand dat in de sortering vóór het jouwe staat, voorrang. Doorzoek de map:
ls /etc/ssh/sshd_config.d/
sudo grep -riE 'passwordauthentication|kbdinteractive|permitrootlogin|allowusers' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/Op cloudimages schrijft cloud-init de SSH-instellingen die het beheert naar /etc/ssh/sshd_config.d/50-cloud-init.conf, als sshd_config die map inleest. [7] Staat in dat bestand PasswordAuthentication yes, dan wint het van alle bestanden die later in de sortering staan; daarom begint de naam van jouw bestand met 00. Zet de optie daar ook op no, zodat de bestanden met elkaar overeenkomen.
7. Test de configuratie en herstart SSH
Test de bestanden voordat je herstart: een foute instelling kan ervoor zorgen dat sshd niet start, en SSH is misschien je enige toegang tot de server. [3]
sudo sshd -t
sudo systemctl restart ssh.serviceLos eerst alles op wat sshd -t meldt. Houd na de herstart je sessie open en test vanuit een tweede terminal:
ssh deploy@203.0.113.10
ssh root@203.0.113.10De eerste login moet lukken en de tweede moet worden geweigerd. Mislukt je login, draai de wijziging dan terug in de sessie die nog open is en bekijk het SSH-log uit stap 4. [3]
Moet je de SSH-poort wijzigen?
Alleen als je minder ruis in je logs wilt. Met een nieuwe poort luistert SSH niet meer op de standaardpoort 22, [5] zodat bots die alleen poort 22 proberen, SSH mislopen, maar een scan van alle poorten vindt het nog steeds. De echte bescherming komt van sleutels en het uitschakelen van inloggen met een wachtwoord.
8. Wijzig de poort op Ubuntu 24.04 (optioneel)
Is UFW of een andere firewall al actief, sta dan eerst de nieuwe poort toe. Houd je sessie open tot inloggen via de nieuwe poort werkt.
Op Ubuntu 24.04 luistert ssh.socket via socketactivering van systemd op poort 22. Een generator zet de Port-regels in sshd_config en de bijbehorende drop-in-bestanden om in socketinstellingen. Na een poortwijziging laad je systemd daarom opnieuw en herstart je ssh.socket. [6]
sshd accepteert meer dan één Port-regel, [5] dus laat 22 staan terwijl je de nieuwe poort test:
Port 22
Port 2222sudo sshd -t
sudo systemctl daemon-reload
sudo systemctl restart ssh.socketTest de nieuwe poort vanuit een tweede terminal. Verwijder daarna Port 22, voer de drie commando’s opnieuw uit en gebruik in stap 9 en 10 poort 2222.
ssh -p 2222 deploy@203.0.113.10Controleer op Debian 12 eerst of de socket in gebruik is. Is die niet actief, dan is een herstart van de dienst genoeg om de wijziging toe te passen.
systemctl is-active ssh.socket
sudo systemctl restart ssh.serviceFirewall, Fail2ban en open poorten
9. Sta SSH toe in UFW en schakel UFW daarna in
Het inschakelen van UFW kan je SSH-sessie verbreken, en vanaf dat moment blokkeert UFW elke poort die je niet hebt toegestaan. Voeg de SSH-regel toe voordat je ufw enable uitvoert.
UFW staat na de installatie uit en weigert, eenmaal ingeschakeld, standaard binnenkomend verkeer. De manpage waarschuwt dat ufw enable SSH-verbindingen kan verbreken, dus voeg eerst de SSH-regel toe. [8]
Gebruik voor SSH limit in plaats van allow. Een limit-regel laat verbindingen nog steeds toe, maar weigert een adres dat binnen 30 seconden 6 of meer verbindingen probeert te openen. Voeg niet beide regels toe, want UFW past de eerste regel toe die overeenkomt. [8]
sudo ufw limit 22/tcp
sudo ufw enable
sudo ufw status verboseAls je UFW via SSH inschakelt, vraagt UFW om een bevestiging. [8] Heb je SSH naar een andere poort verplaatst, pas limit dan toe op 2222/tcp. Ontbreekt op Debian 12 het commando, installeer UFW dan eerst. Wil je SSH helemaal van het openbare internet halen, maak het dan alleen bereikbaar via een privénetwerk met WireGuard. Voor bescherming die al vóór je server begint, lees je onze checklist voor DDoS-bescherming van een VPS.
10. Voeg Fail2ban toe met de sshd-jail
Fail2ban kan je eigen IP-adres blokkeren na herhaalde mislukte inlogpogingen. Heb je een vast IP-adres, zet het dan in ignoreip, en houd je sessie open terwijl je test.
Op Ubuntu 24.04 levert het pakket /etc/fail2ban/jail.d/defaults-debian.conf mee. Dat bestand schakelt de sshd-jail in, stelt backend = systemd in en laat blokkades via nftables lopen. [9] De systemd-backend leest het systemd-journal, dus de jail heeft geen apart logbestand nodig. [10]
sudo apt install fail2ban
cat /etc/fail2ban/jail.d/defaults-debian.confVolgens de eigen jail.conf van Fail2ban wordt een adres 10 minuten geblokkeerd zodra vanaf dat adres binnen 10 minuten 5 inlogpogingen mislukken. In datzelfde bestand staat dat je het niet moet bewerken: zet je wijzigingen in jail.local. [10]
[sshd]
enabled = true
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
ignoreip = 127.0.0.1/8 ::1 198.51.100.7Vervang 198.51.100.7 door je eigen vaste adres, of haal het weg. De standaard-jail gebruikt port = ssh; heb je SSH verplaatst, voeg dan port = 2222 toe. [10] Laat op Debian 12 backend = systemd hier staan en installeer python3-systemd, de Python-bibliotheek voor systemd die deze backend gebruikt. [10] Herstart daarna Fail2ban en controleer of het draait:
sudo systemctl restart fail2ban
sudo systemctl status fail2ban11. Controleer wat er verder nog luistert
Elke open poort is een extra weg naar binnen. UFW kan een overzicht van luisterende poorten tonen: elke luisterende TCP-poort en open UDP-poort, met het adres (* betekent alle interfaces), het programma erachter en de regels die van toepassing zijn. [8]
sudo ufw show listeningEen dienst die aan 127.0.0.1 gebonden is, is alleen vanaf de server zelf bereikbaar. Openbaar bereikbare diensten die je niet nodig hebt, schakel je uit met systemctl disable --now, zoals de toelichting bij het openssh-pakket van Ubuntu dat voor ssh.socket doet. [6]
sudo systemctl disable --now SERVICE_NAMEAls je jezelf buitensluit
Meestal sluit je jezelf buiten doordat je de laatste werkende sessie te vroeg hebt afgesloten. Sta je toch buiten? Dan heb je deze mogelijkheden:
- Gebruik een sessie die nog open is om de laatste wijziging terug te draaien, voer
sshd -tuit en herstart SSH. - Wacht even als UFW je weigert: de limit-regel telt pogingen over een periode van 30 seconden. [8]
- Wacht een blokkade door Fail2ban af; die duurt
bantimelang, in dejail.localhierboven een uur. [10] Je kunt ook verbinding maken vanaf een ander netwerk, zoals de hotspot van je telefoon. - Herinstalleer de server als laatste redmiddel. Bij StealthRDP legt het Helpcentrum uit hoe je een server herinstalleert vanuit de klantomgeving: kies het besturingssysteem, wacht 3 tot 5 minuten en maak verbinding via SSH. Na een herinstallatie heb je een schoon systeem, dus je data zet je terug vanuit een back-up; met onze gids voor automatische back-ups van een VPS richt je die op tijd in.
Twijfel je? De support van StealthRDP is 24/7 bereikbaar via Telegram, tickets in de klantomgeving en info@stealthrdp.com.
Veelgestelde vragen
Wat is SSH-hardening?
SSH-hardening betekent dat je de instellingen van de SSH-server zo aanpast dat er minder accounts en inlogmethoden zijn waarmee iemand binnen kan komen: sleutels in plaats van wachtwoorden, geen root-login en desgewenst alleen gebruikers die je bij naam toestaat. OpenSSH accepteert standaard inloggen met een wachtwoord en via keyboard-interactive-authenticatie, dus die twee pak je als eerste aan. [5]
Waarom werkt PasswordAuthentication no niet op Ubuntu?
Waarschijnlijk stelt een ander bestand de optie eerder in. De sshd_config van Ubuntu leest helemaal bovenaan /etc/ssh/sshd_config.d/ in, en OpenSSH houdt de eerste waarde aan die het vindt. [3] Controleer op cloudimages het bestand 50-cloud-init.conf in die map; daarin schrijft cloud-init zijn SSH-instellingen. [7]
Wordt SSH veiliger als je de poort wijzigt?
Een beetje, meer niet. Met een andere poort luistert SSH niet meer op de standaardpoort 22, zodat bots die alleen die poort proberen, SSH mislopen, maar een volledige poortscan vindt het nog steeds. [5] Sleutels en het uitschakelen van inloggen met een wachtwoord doen veel meer.
Moet ik root-login via SSH uitschakelen?
Ja, zodra een sudo-gebruiker met een sleutel kan inloggen. PermitRootLogin no weigert root volledig, terwijl de standaardwaarde, prohibit-password, sleutels voor root nog wel accepteert. [5] De toelichting bij het openssh-pakket van Ubuntu voegt eraan toe dat je je sudo-account net zo goed moet beschermen als root. [6]
Heb ik Fail2ban nodig als SSH alleen sleutels accepteert?
Het is optioneel, maar wel nuttig: Fail2ban blokkeert adressen waarvan het inloggen steeds mislukt, standaard na 5 mislukte pogingen binnen 10 minuten. [10] Op Ubuntu 24.04 schakelt het pakket de sshd-jail standaard in. [9]
Staat UFW op Ubuntu standaard aan?
Nee. UFW staat na de installatie uit en weigert na het inschakelen binnenkomende verbindingen die door geen enkele regel worden toegestaan. [8] Voeg een regel voor SSH toe voordat je ufw enable uitvoert.
Bronnen en referenties
- Automatic updates — Ubuntu Server documentation (geraadpleegd op 2026-11-03)
- User management — Ubuntu Server documentation (geraadpleegd op 2026-11-03)
- OpenSSH server — Ubuntu Server documentation (geraadpleegd op 2026-11-03)
- Key-based authentication in OpenSSH for Windows — Microsoft Learn (geraadpleegd op 2026-11-03)
- sshd_config(5): OpenSSH daemon configuration file — OpenBSD manual pages (geraadpleegd op 2026-11-03)
- openssh: debian/README.Debian (ubuntu/noble-updates) — Ubuntu (Launchpad) (geraadpleegd op 2026-11-03)
- cloudinit/ssh_util.py — GitHub (canonical/cloud-init) (geraadpleegd op 2026-11-03)
- ufw - program for managing a netfilter firewall — Ubuntu Manpages (geraadpleegd op 2026-11-03)
- fail2ban: debian/debian-files/jail.d_defaults-debian.conf (ubuntu/noble-updates) — Ubuntu (Launchpad) (geraadpleegd op 2026-11-03)
- fail2ban 1.0.2: config/jail.conf — GitHub (fail2ban/fail2ban) (geraadpleegd op 2026-11-03)
Lees verder
Windows of Linux VPS: welke past het best bij je bedrijf?
Windows of Linux VPS? Vergelijk licenties, resourcegebruik, ondersteunde software, beheer en beveiliging, en ontdek snel wat bij je toepassing past.
Alleen Cloudflare-IP’s toestaan op nginx, Apache en IIS
Alleen Cloudflare-IP’s toestaan op poort 80 en 443 met UFW, nginx, Apache en IIS, de lijst actueel houden en directe verzoeken aan je origin-IP tegenhouden.
Domeinnaam koppelen aan je VPS en gratis HTTPS instellen
Koppel een domeinnaam aan je VPS met A-records, controleer de DNS met dig of nslookup, open poort 80 en 443 en regel gratis HTTPS met Let's Encrypt en Certbot.
