OffshoreVps
Sicherheit27 Sept. 20266 Min. LesezeitVon dem OffshoreVps-Team

Webserver härten: UFW, fail2ban und Nginx-Einstellungen

Eine Firewall mit Default-Deny, fail2ban-Jails, sicherere Nginx-Header, Rate Limiting und automatische Updates für einen VPS, auf dem eine Website läuft.

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.

Terminalfenster auf einem VPS mit den Befehlen zum Härten eines Webservers mit UFW, fail2ban und Nginx, beginnend mit „sudo ufw default deny incoming“
Die Art von Befehlen, die Sie in dieser Anleitung auf Ihrem Server ausführen.

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.

Die Schritte dieser Anleitung in der Reihenfolge: 1. Eine Firewall mit Default-Deny und UFW; 2. fail2ban bei wiederholten Fehlversuchen; 3. Die Nginx-Version verbergen und sichere Header hinzufügen; 4. Missbräuchliche Anfragen begrenzen; 5. Aktuell halten; 6. Worauf Sie achten sollten
Die Schritte dieser Anleitung in der Reihenfolge.

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.log gelegentlich 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.