Ein frischer Webserver wird wenige Minuten nach dem Start im Netz gescannt. Der Großteil dieses Datenverkehrs ist automatisiert und harmlos, wenn Sie die Grundlagen erledigt haben. Diese Anleitung geht einen Schritt über die Härtung in 15 Minuten hinaus und behandelt eine Firewall, Brute-Force-Schutz mit fail2ban und ein sichereres Nginx-Setup.
Schritt 1: Eine Firewall mit Default-Deny und UFW
Erlauben Sie nur, was Sie brauchen, und blockieren Sie den Rest. Fügen Sie zuerst SSH hinzu, damit Sie sich nicht aussperren.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
Wenn Sie einen nicht standardmäßigen SSH-Port verwenden, erlauben Sie diesen Port statt OpenSSH.
Schritt 2: fail2ban bei wiederholten Fehlversuchen
fail2ban überwacht Logs und sperrt IP-Adressen, die immer wieder bei der Anmeldung scheitern.
sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.local > /dev/null <<'CONF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
CONF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Verwenden Sie SSH-Schlüssel und schalten Sie auch die Passwortanmeldung ab. Siehe SSH-Schlüssel erklärt.
Schritt 3: Die Nginx-Version verbergen und sichere Header hinzufügen
In /etc/nginx/nginx.conf, innerhalb des Blocks http:
server_tokens off;
In dem Block server Ihrer Website:
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Fügen Sie den HSTS-Header erst hinzu, wenn HTTPS für Ihre Domain und alle von Ihnen genutzten Subdomains funktioniert.
Schritt 4: Missbräuchliche Anfragen begrenzen
Rate Limiting bremst Brute-Force-Versuche auf Anmeldeseiten:
# in the http block
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
# in your server block
location = /wp-login.php {
limit_req zone=login burst=5 nodelay;
# ...your usual PHP handling
}
Testen und anwenden mit sudo nginx -t && sudo systemctl reload nginx.
Schritt 5: Aktuell halten
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
Automatische Sicherheitsupdates schließen bekannte Lücken, ohne dass Sie etwas tun müssen.
Worauf Sie achten sollten
- Prüfen Sie Sperren mit
sudo fail2ban-client status sshd. - Sehen Sie sich
/var/log/nginx/error.loggelegentlich an. - Wenn Sie hinter einem Proxy oder CDN stehen, stellen Sie sicher, dass fail2ban die echte Client-IP liest, sonst sperren Sie möglicherweise Ihren eigenen Proxy.