Deze handleiding bevat enkele tips en adviezen om je Linux-server beter te beveiligen. Omdat (virtuele) servers van buitenaf bereikbaar moeten zijn, is basisbescherming tegen ongewenste toegang zeker aan te raden en mag je deze niet verwaarlozen.
Houd er rekening mee dat deze instructies niet volledig zijn. Meer gedetailleerde informatie vind je in andere onderdelen van de ZAP-documentatie. (bijv. 2FA (SSH))
De eenvoudigste manier om je server te beschermen is altijd hetzelfde, ongeacht het type server: gebruik sterke wachtwoorden, werk je services regelmatig bij en let in het algemeen goed op welke services je installeert en welke handleidingen je volgt.
| Service | Poort |
|---|---|
| SSH | 22 |
| FTP | 21 |
| 25 | |
| DNS | 53 |
| HTTP | 80 |
| HTTPS | 443 |
Services zoals SSH of FTP gebruiken standaard altijd dezelfde poorten (een aantal daarvan staat in de tabel hierboven). Als een externe aanvaller je SSH-service met brute force probeert aan te vallen, moet die eerst weten welke poort voor SSH wordt gebruikt. Als je deze poorten niet anders configureert, zijn poort 22 en 21 meestal de eerste opties om rechtstreeks opdrachten op de server uit te voeren of via FTP toegang te krijgen tot bestanden.
Om dit te voorkomen, raden we aan om aangepaste poorten in te stellen voor standaardservices. In het volgende gedeelte lees je hoe:
De gewenste poort moet tussen 1024 en 65535 liggen en mag niet al in gebruik zijn!
Met cat /etc/services kun je een aantal standaardpoorten weergeven, zodat je geen poort kiest die al bezet is.
Om de SSH-poort te wijzigen, moet je het configuratiebestand aanpassen. Dit staat meestal in /etc/ssh/sshd_config. Als dat niet het geval is, kun je het met de volgende opdracht zoeken:
find / -name "sshd_config" 2>/dev/null
Open het bestand nu met nano (als root of met sudo).
sudo nano /etc/ssh/sshd_config
Voeg de gewenste poort toe na Port. Als Port is uitgecommentarieerd (dus #Port 22), verwijder dan de "#" en vervang 22 door de gewenste poort. Sla het bestand op (in Nano met Ctrl + o) en sluit het (Nano: Ctrl + x).
Start de SSH-service nu opnieuw op om de wijzigingen toe te passen.
# Bijvoorbeeld op Ubuntu/Debian/CentOS
sudo systemctl restart sshd
Als je een FTP-service zoals proFTPd hebt geïnstalleerd, kun je de poort ook eenvoudig wijzigen door het configuratiebestand aan te passen. De werkwijze is vergelijkbaar met die voor de SSH-service.
Zoek het configuratiebestand proftpd.conf.
find / -name "proftpd.conf" 2>/dev/null
Het bestand staat meestal in /etc/proftpd.conf (CentOS) of /etc/proftpd/proftpd.conf (Ubuntu, Debian).
Open het bestand met nano, verwijder de "#" vóór port en voer de gewenste poort erachter in. Houd rekening met de bovenstaande aanwijzingen, zodat je geen ongeldige poort invoert.
Gebruik Ctrl + W om in nano te zoeken.
nano /etc/proftpd/proftpd.conf
Fail2Ban is een service die IP-adressen blokkeert waarmee waarschijnlijk kwaadwillende pogingen worden gedaan om in te loggen op de server. Fail2Ban controleert logbestanden op verdachte activiteiten en beveiligt je systeem op een relatief eenvoudige en effectieve manier.
Na de installatie bevat Fail2Ban al vooraf geconfigureerde instellingen voor een aantal veelgebruikte services, waaronder:
- apache
- lighttpd
- sshd
- qmail
- postfix
- Courier Mail Server Je kunt eenvoudig andere services toevoegen met een reguliere expressie (RegEx) en het pad naar het gewenste logbestand.
/var/log/auth.log. Dit bestand bevat alle SSH-aanmeldpogingen, zowel geslaagde als mislukte.
Hier zie je de vermelding:
Dec 2 12:59:19 vps-zap515723-2 sshd[364126]: Failed password for root from 92.117.xxx.xxx port 52504 ssh2
Fail2Ban gebruikt dit logbestand en controleert het op mislukte verificaties. Omdat het logbestand het IP-adres van de aanvaller rechtstreeks bevat, kan Fail2Ban dat IP-adres na enkele mislukte pogingen blokkeren.
Meld je eerst aan op je Linux-server. Heb je hulp nodig? Volg dan onze handleiding Eerste toegang (SSH). Voer de opdrachten uit als root of met sudo.
sudo apt update && sudo apt upgrade -y
sudo apt install fail2ban
Na de installatie kun je de status direct controleren met systemctl: (Druk op Ctrl+C om systemctl af te sluiten)
systemctl status fail2ban.service
* fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor pres>
Active: active (running) since Sat 2023-12-02 13:10:33 UTC; 24s ago
Docs: man:fail2ban(1)
Process: 23988 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, statu>
Main PID: 23989 (fail2ban-server)
CPU: 409ms
CGroup: /system.slice/fail2ban.service
`-23989 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Dec 02 13:10:33 vps-zap515723-1 systemd[1]: Starting Fail2Ban Service...
Dec 02 13:10:33 vps-zap515723-1 systemd[1]: Started Fail2Ban Service.
Dec 02 13:10:34 vps-zap515723-1 fail2ban-server[23989]: Server ready
Fail2Ban is nu geïnstalleerd, maar nog niet actief of geconfigureerd. Bekijk /etc/fail2ban; daar zouden nu de volgende bestanden moeten staan:
action.d fail2ban.d jail.conf paths-arch.conf paths-debian.conf
fail2ban.conf filter.d jail.d paths-common.conf paths-opensuse.conf
Om een actieve "Jail" te maken, moet je een bestand met de naam jail.local aanmaken. Kopieer de inhoud van jail.conf naar het nieuwe bestand en open het:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Je kunt nu alle instellingen aanpassen in het bestand jail.local, waaronder de services die moeten worden gecontroleerd.
Richt je alleen op het gedeelte na [Default]. Het gedeelte Default bevat algemene basisinstellingen.
Scroll omlaag tot je dit gedeelte ziet en pas het bijvoorbeeld als volgt aan:
| Attribuut | Uitleg | Waarde |
|---|---|---|
| ignoreip | IP-adressen die niet geblokkeerd mogen worden | 127.0.0.1/8 |
| ignorecommand | Niet relevant. | |
| bantime | Hoelang een IP-adres geblokkeerd blijft | 1h |
| findtime | Periode waarin mislukte aanmeldingen worden geteld | 10m |
| maxretry | Aantal mislukte pogingen dat tot een blokkering leidt | 5 |
# kan worden gescheiden door spaties (en/of komma's).
#ignoreip = 127.0.0.1/8 ::1
# ignorecommand = /path/to/command <ip>
ignorecommand =
# "bantime" is het aantal seconden dat een host wordt geblokkeerd.
bantime = 1h
# Een host wordt geblokkeerd als deze binnen "findtime" "maxretry" fouten
# heeft veroorzaakt.
findtime = 10m
# "maxretry" is het aantal fouten voordat een host wordt geblokkeerd.
maxretry = 5
Je hebt nu de basisinstellingen voltooid. Als je bijvoorbeeld de SSH-service wilt controleren, scroll je verder omlaag naar de sectie [sshd]. Als je de poort hebt gewijzigd, moet je deze invullen bij port.
De sectie [sshd] ziet er dan als volgt uit:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
Zoals je ziet, kun je ook afzonderlijke instellingen voor specifieke services opgeven (hier bijvoorbeeld maxretry, dat lager is dan de standaardinstelling). Hoewel je eerder algemene instellingen hebt ingesteld, kun je de meeste instellingen voor elke service afzonderlijk configureren. Als je dat niet doet, wordt de algemene instelling gebruikt.
Start Fail2Ban nu opnieuw op om de controle te starten.
sudo systemctl restart fail2ban.service
Als je toegang hebt tot een VPN of een tweede server, kun je proberen jezelf door Fail2Ban te laten blokkeren om te testen of de service werkt. Met een VPN of een hotspot op je telefoon krijg je normaal gesproken een ander IP-adres waarmee je Fail2Ban kunt testen.
Test dit niet op je gewone netwerk, want je eigen IP-adres kan worden geblokkeerd en je kunt jezelf buitensluiten.
Probeer verbinding te maken met je server via SSH (met een ander IP-adres!) en voer telkens een verkeerd wachtwoord in. Het resultaat zou er ongeveer zo uit moeten zien:
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
root@185.223.29.xxx: Permission denied (publickey,password).
root@vps-zap515723-2:/var/log# ssh root@185.223.29.179
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
^C
root@vps-zap515723-2:/var/log# ssh root@185.223.29.xxx
ssh: connect to host 185.223.29.xxx port 22: Connection refused
Zoals je ziet, wordt de verbinding door je met Fail2Ban beveiligde server nu geweigerd (Connection refused in plaats van Permission denied).
Toon nu de status van Fail2Ban. Je ziet dat er een IP-adres is geblokkeerd.
fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 4
| |- Total failed: 8
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: xxx
Als je het IP-adres weer wilt vrijgeven, gebruik je de volgende opdracht: fail2ban-client set sshd unbanip {deine IP}.
Als er ongewoon veel IP-adressen worden geblokkeerd, kun je de blokkeringsduur bij elke mislukte poging verlengen om het aantal mogelijke aanmeldpogingen te verminderen.
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
bantime = 1h
# Bantime zou bij elke blokkering van dit IP-adres moeten toenemen
bantime.increment = true
# Schaalfactor van 24 uur (1h,24h,48h,3d,4d....)
bantime.factor = 24
# Maximale blokkeringsduur = 5 weken
bantime.maxtime = 5w
