Deze handleiding bevat enkele tips en adviezen om je Linux-server veiliger te maken. Omdat servers van buitenaf bereikbaar moeten zijn, is een basisbescherming tegen ongewenste toegang zeker aan te raden en mag niet worden verwaarloosd.
Houd er rekening mee dat deze instructies niet volledig zijn en dat je meer gedetailleerde informatie kunt vinden in andere delen van de ZAP-documentatie. (bijv. 2FA (SSH))
De eenvoudigste manier om je server te beschermen is altijd hetzelfde, ongeacht welke server: gebruik sterke wachtwoorden, update je services regelmatig en let er in het algemeen 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 zie je in de tabel hierboven). Wanneer een externe aanvaller probeert je SSH-service via brute force te kraken, moet hij eerst weten welke poort voor SSH wordt gebruikt. Als je deze poorten niet wijzigt, zijn poorten 22 en 21 meestal de doelwitten om direct commando's op de server uit te voeren of bestanden via FTP te benaderen.
Om dit te voorkomen raden we aan om de poorten van de standaardservices aan te passen naar gebruikersspecifieke poorten. In het volgende gedeelte lees je hoe dat werkt:
Je gewenste poort moet tussen 1024 en 65535 liggen en mag geen reeds gebruikte poort zijn!
Met cat /etc/services kun je enkele standaardpoorten bekijken, zodat je geen reeds bezette poort kiest.
Om de SSH-poort te wijzigen, moet je het configuratiebestand aanpassen. Dit bevindt zich meestal onder /etc/ssh/sshd_config. Als dat niet zo is, kun je het zoeken met het volgende commando:
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 je gewenste poort toe achter Port. Als Port is uitgecommentarieerd (bijv. #Port 22), verwijder dan het "#" en vervang 22 door je gewenste poort. Sla het bestand op (in Nano met Ctrl + o) en sluit het (Nano: Ctrl + x).
De SSH-service moet nu opnieuw worden gestart om de wijzigingen door te voeren.
# Bijvoorbeeld onder Ubuntu/Debian/CentOS
sudo systemctl restart sshd
Als je een FTP-service zoals proFTPd hebt geïnstalleerd, kun je de poort ook eenvoudig wijzigen via het configuratiebestand. De procedure is vergelijkbaar met die van SSH.
Zoek het configuratiebestand proftpd.conf
find / -name "proftpd.conf" 2>/dev/null
Het bestand bevindt zich meestal onder /etc/proftpd.conf (CentOS) of /etc/proftpd/proftpd.conf (Ubuntu, Debian).
Open het bestand met nano, verwijder het "#" voor port en vul je gewenste poort in. Let op de bovenstaande aanwijzingen om geen ongeldige poort te kiezen.
Gebruik Ctrl + W om in nano te zoeken.
nano /etc/proftpd/proftpd.conf
Fail2Ban is een service die IP-adressen blokkeert die waarschijnlijk kwaadaardige bedoelingen hebben bij het aanmelden op de server. Fail2Ban bewaakt logbestanden op verdachte activiteiten en beveiligt je systeem zo relatief eenvoudig en effectief.
Na installatie brengt Fail2Ban al vooraf geconfigureerde instellingen mee voor enkele veelgebruikte services, waaronder:
- apache
- lighttpd
- sshd
- qmail
- postfix
- Courier Mail Server Andere services kunnen eenvoudig worden toegevoegd met reguliere expressies (RegEx) en door het opgeven van het gewenste logbestand.
/var/log/auth.log. Dit bestand bevat alle SSH-inlogpogingen, zowel succesvolle 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 bewaakt het op mislukte authenticaties. Omdat het logbestand direct het IP-adres van de aanvaller bevat, kan Fail2Ban dit IP na enkele mislukte pogingen blokkeren.
Log eerst in op je Linux-server. Als je hulp nodig hebt, volg dan onze Eerste toegang (SSH) handleiding. Je moet de commando's als root of met sudo uitvoeren.
sudo apt update && sudo apt upgrade -y
sudo apt install fail2ban
Na installatie kun je de status direct controleren met systemctl: (Met Ctrl+C verlaat je systemctl)
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 momenteel de volgende bestanden moeten liggen:
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 een bestand genaamd jail.local worden aangemaakt. Kopieer gewoon 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 in het jail.local bestand aanpassen, inclusief de te bewaken services.
Bekijk alleen het gedeelte na [Default]. Het Default-gedeelte is voor algemene basisinstellingen.
Scroll iets verder naar beneden tot je dit gedeelte vindt en pas het bijvoorbeeld zo aan:
| Attribuut | Uitleg | Waarde |
|---|---|---|
| ignoreip | IP-adressen die niet geblokkeerd mogen worden | 127.0.0.1/8 |
| ignorecommand | Niet relevant. | |
| bantime | Hoe lang een IP-adres geblokkeerd blijft | 1h |
| findtime | Periode waarin mislukte logins worden meegeteld | 10m |
| maxretry | Aantal mislukte pogingen voordat een blokkade volgt | 5 |
# kan met spaties (en/of komma's) worden gescheiden.
#ignoreip = 127.0.0.1/8 ::1
# ignorecommand = /path/to/command <ip>
ignorecommand =
# "bantime" is het aantal seconden dat een host geblokkeerd is.
bantime = 1h
# Een host wordt geblokkeerd als hij "maxretry" fouten binnen de laatste "findtime"
# seconden heeft gemaakt.
findtime = 10m
# "maxretry" is het aantal fouten voordat een host wordt geblokkeerd.
maxretry = 5
Hiermee heb je de basisinstellingen voltooid. Om bijvoorbeeld de SSH-service te bewaken, scroll je verder naar het [sshd]-label. Als je je poort hebt gewijzigd, moet je die onder port invullen.
Het [sshd]-label ziet er dan zo uit:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
Zoals je ziet, kun je ook individuele instellingen per service aanpassen (hier bijvoorbeeld maxretry, dat lager is dan de standaardwaarde). Hoewel je de algemene instellingen al hebt gedaan, kun je de meeste instellingen per service overschrijven. Als je dat niet doet, wordt de algemene instelling gebruikt.
Nu hoef je alleen nog Fail2Ban opnieuw te starten zodat de bewaking start.
sudo systemctl restart fail2ban.service
Als je toegang hebt tot een VPN of een tweede server, kun je testen of Fail2Ban werkt door jezelf te blokkeren. Met een VPN of hotspot via je telefoon zou je een ander IP moeten krijgen waarmee je Fail2Ban kunt testen.
Test dit niet in je normale netwerk, want je eigen IP-adres kan worden geblokkeerd en dan sluit je jezelf uit.
Probeer een SSH-verbinding met je server te maken (met een ander IP!) en voer telkens het verkeerde wachtwoord in. Het resultaat zou er 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 met je Fail2Ban-beschermde server nu geweigerd (Connection refused in plaats van Permission denied).
Bekijk nu de status van Fail2Ban. Hier zie je dat 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 weer wilt vrijgeven, kun je dat doen met het volgende commando: fail2ban-client set sshd unbanip {jouw IP}.
Als je ongewoon veel IP-blokkades hebt, is het aan te raden de blokkeringstijd met elke mislukte poging te verlengen om het aantal mogelijke inlogpogingen te verminderen.
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
bantime = 1h
# Bantime zou met elke blokkade van dit IP moeten toenemen
bantime.increment = true
# Schaalfactor van 24 uur (1u,24u,48u,3d,4d....)
bantime.factor = 24
# Maximale blokkeringstijd = 5 weken
bantime.maxtime = 5w
