Dein Server.
Deine Festung.
Wer seinen eigenen Server betreibt, entscheidet selbst über seine Daten.
Hier steht, wie du ihn gegen fremden Zugriff absicherst, Schicht für Schicht.
Verteidigung in Schichten
Kein einzelner Schutz hält alles ab. Darum bauen Fachleute für Sicherheit ihre Systeme in Schichten: Hardware, Netz, Betriebssystem, Dienste, Daten. Fällt eine Schicht, hält die nächste. Wir übertragen dieses Prinzip auf den Server zu Hause.
Diese Anleitung lehnt sich an öffentlich einsehbare Standards an: MIL-STD-882E (Risiken bewerten), die DISA STIGs des US-Verteidigungsministeriums (Härtungsregeln, Kategorien CAT I bis III), NIST SP 800-53, die CIS Benchmarks und das IT-Grundschutz-Kompendium des BSI. Sie ersetzt keine Prüfung und ist keine Zertifizierung.
1 · Risiko bewerten
Was zuerst drankommt
MIL-STD-882E bewertet jede Gefahr nach zwei Fragen: Wie schlimm wäre es? Und wie wahrscheinlich ist es? Was rot ist, kommt zuerst dran.
Hoch: offener Zugang
Anmeldung per Passwort aus dem Internet, root darf sich anmelden, keine Updates. Katastrophal und häufig versucht – zuerst schließen.
Ernst: zu viel sichtbar
Datenbank oder Verwaltungsseite offen im Netz, Versionsnummern in jeder Antwort. Wer sucht, findet es.
Mittel: Diebstahl
Selten, aber dann kritisch: Der Rechner verschwindet samt Platte. Dagegen helfen Verschlüsselung und Wächter 3.
2 · Die Ein-Knopf-Lösung
Ein Skript für alles
Für Debian, Ubuntu und Raspberry Pi OS. Es zeigt erst, was fehlt, fragt dann nach und sichert jede Datei, bevor es sie ändert. Es sperrt dich nicht aus: Passwörter bleiben erlaubt, solange kein SSH-Schlüssel hinterlegt ist.
$ sudo bash haerten.shBestandsaufnahme (Debian GNU/Linux 12) ✘ automatische Sicherheitsupdates aus ✘ keine aktive Firewall (ufw) ✘ SSH: Passwort-Anmeldung erlaubt ✔ SSH-Schlüssel für benutzer hinterlegtFortfahren? [j/N] j1 · Automatische Sicherheitsupdates ✔2 · Firewall: SSH (begrenzt), 80, 443 ✔3 · SSH: nur Schlüssel, kein root ✔4 · fail2ban ✔5 · Kernel ✔6 · nginx: Version verborgen ✔! Zweites Terminal öffnen und neu anmelden.
Was es tut
- Updates: Sicherheitsupdates kommen von selbst. STIG CAT II
- Firewall: eingehend alles zu, außer SSH (begrenzt), 80 und 443. NIST SC-7
- SSH: kein root, nur Schlüssel, weniger Versuche. STIG CAT I
- fail2ban: wer zu oft falsch rät, ist eine Stunde draußen, Wiederholer eine Woche. NIST AC-7
- Kernel: keine Umleitungen, keine Adresslecks, geschützte Links. CIS 3.x
- nginx: keine Versionsnummer, Baustein für Sicherheits-Header. OWASP
Nur nachsehen, ohne etwas zu ändern: sudo bash haerten.sh --pruefen. Einen Schritt auslassen: --ohne firewall. Weitere Ports: --port 8448. Die Meldungen des Skripts sind auf Deutsch.
Erst lesen, dann ausführen. Ein Skript aus dem Internet mit sudo ist Vertrauenssache. Darum führt auch der Knopf oben nichts aus: Er lädt das Skript, prüft die Prüfsumme und zeigt es dir. Starten tust du es selbst. Es ist kurz und kommentiert. Der Quelltext steht auch auf dieser Seite.
3 · Schritt für Schritt
Lieber selbst im Terminal
Dieselben Schritte von Hand. So weißt du bei jeder Zeile, was sie tut.
Sicherheitsupdates automatisch STIG CAT II
Die meisten Einbrüche nutzen Lücken, für die es längst ein Update gibt.
$ sudo apt update && sudo apt install -y unattended-upgrades $ sudo dpkg-reconfigure -plow unattended-upgrades
SSH-Schlüssel statt Passwort STIG CAT I
Auf deinem eigenen Rechner einen Schlüssel erzeugen und auf den Server kopieren. Danach in einem zweiten Fenster testen, ob die Anmeldung ohne Passwort klappt.
$ ssh-keygen -t ed25519 $ ssh-copy-id benutzer@dein-server
SSH abdichten STIG CAT I
Erst wenn die Schlüssel-Anmeldung klappt: root aussperren, Passwörter abschalten, Versuche begrenzen.
$ printf 'PermitRootLogin no\nPasswordAuthentication no\n…' \ | sudo tee /etc/ssh/sshd_config.d/10-haerten.conf $ sudo sshd -t && sudo systemctl reload ssh
Firewall: nur was gebraucht wird NIST SC-7
Alles zu, dann gezielt öffnen. Vorher den SSH-Port prüfen: sudo sshd -T | grep ^port. Steht dort nicht 22, die Zahl unten ersetzen, sonst sperrst du dich aus. Achtung bei Docker: Veröffentlichte Container-Ports umgehen ufw. Binde Container deshalb an 127.0.0.1 und lass nur nginx nach außen.
$ sudo apt install -y ufw $ sudo ufw default deny incoming $ sudo ufw limit 22/tcp && sudo ufw allow 80,443/tcp $ sudo ufw enable
Fehlversuche aussperren NIST AC-7
$ sudo apt install -y fail2ban $ printf '[sshd]\nenabled = true\nbackend = systemd\n…' \ | sudo tee /etc/fail2ban/jail.d/haerten.local $ sudo systemctl restart fail2ban
Platte verschlüsseln NIST SC-28
Am besten schon bei der Installation: „Verschlüsseltes LVM“ (LUKS) wählen. Dann kann ein Dieb ohne Schlüssel die Daten nicht lesen. Für einen Server ohne Bildschirm hilft ein Entsperren per SSH beim Start (Paket dropbear-initramfs).
Webserver: Header und keine Versionsnummer OWASP ASVS
$ echo 'server_tokens off;' | sudo tee /etc/nginx/conf.d/server-tokens.conf $ sudo nginx -t && sudo systemctl reload nginx
Dazu in jeden HTTPS-Block: Strict-Transport-Security, Content-Security-Policy, X-Content-Type-Options nosniff, Referrer-Policy no-referrer, Permissions-Policy. Vorsicht: Eine strenge Content-Security-Policy sperrt Inline-Skripte und fremde Quellen, erst testen. includeSubDomains bei HSTS nur, wenn jede Subdomain HTTPS hat. Und ein add_header in einem location-Block hebt dort alle geerbten Header auf.
Sicherung, getrennt aufbewahrt NIST CP-9
3-2-1: drei Kopien, zwei Medien, eine außer Haus, verschlüsselt (zum Beispiel mit restic oder borg). Und einmal im Vierteljahr eine Wiederherstellung üben. Erst die Probe zeigt, ob die Sicherung vollständig ist.
4 · Die drei Wächter
Wer passt auf, wenn du schläfst?
Absichern ist der Anfang. Wächter merken, wenn trotzdem etwas passiert, und handeln: von der Software über die Hardware bis zur Alarmanlage am Serverschrank.
Wächter 1 · Software
Ein kleines Skript auf dem Server, alle zwei Minuten per systemd-Timer:
- Dienste und Container laufen, sonst Neustart
- Webseite antwortet
- Zertifikat noch 14 Tage gültig
- Platte unter 90 %, Temperatur unter 80 °C
- Meldung an deinen eigenen ntfy-Server oder per Mail, höchstens einmal pro Stunde
waechter.sh · .service · .timer · Einstellungen · alarm-ntfy.sh
Wächter 2 · Hardware und Fernwächter
Was passiert, wenn der Server selbst hängt? Der Hardware-Watchdog im Chip startet ihn neu, wenn das System 15 Sekunden nicht reagiert.
Und wenn er ganz ausfällt, merkt es nur ein Fernwächter auf einem zweiten Gerät: Er prüft von außen Erreichbarkeit, DNS und offene Ports und meldet Unerwartetes.
Wächter 3 · Einbruchschutz
Eine Alarmzentrale mit ESP32-C6 und Zigbee: Türkontakt, Erschütterungs- und Sabotagesensor am Serverschrank.
Bei Alarm schaltet sie den Strom des Servers ab, damit die verschlüsselte Platte nutzlos wird. Sie lenkt deine Homepage auf eine Kopie bei GitHub um, damit deine Seite erreichbar bleibt, und schlägt auf deinem Handy Alarm.
Wächter 3: Der Ablauf im Ernstfall
Warum zwei ESP32?
Der ESP32-C6 spricht Zigbee und behält die Sensoren im Blick. Ein zweiter ESP32 mit WLAN stellt im Alarm den DNS-Eintrag um. So stört WLAN nie den Funk zur Steckdose, und fällt ein Teil aus, arbeitet der andere weiter.
Sicher bauen
- Keine Bastelei an 230 V: eine zertifizierte Zigbee-Steckdose nehmen oder ein Relais nur im Kleinspannungs-Stromkreis (5/12 V).
- Eigene Stromversorgung für die Zentrale (USV oder Akku), damit der Einbrecher sie nicht einfach ausstecken kann.
- Token mit minimalen Rechten: darf nur den einen DNS-Eintrag ändern. Flash-Verschlüsselung am ESP32 einschalten.
- Platte verschlüsseln (LUKS): Erst dadurch macht „Strom aus“ die Daten für den Dieb wertlos.
- Fehlalarm einplanen: „Strom aus“ ist für den Server ein Stromausfall. Ein Dateisystem mit Journal (ext4), Datenbanken mit Transaktionslog und eine tägliche Sicherung fangen das ab.
- Rückfallebene vorbereiten: eine Kopie der Homepage als GitHub Pages im öffentlichen Repository, DNS-TTL kurz halten.
Ehrlich gesagt: Die Programme für Wächter 3 übersetzen fehlerfrei (arduino-esp32 3.3.12), wir haben sie aber nicht auf echter Hardware im Dauerbetrieb geprüft. Teste die Schaltung, bevor du dich auf sie verlässt. Ein gestörter Zigbee-Funk kann das Abschalten verhindern. Darum gilt: Die Verschlüsselung der Platte ist der eigentliche Schutz, der Wächter ist die zweite Schicht.
Alarm aufs Handy
Laut, ausdauernd und auch bei „Nicht stören“, ähnlich wie eine Warnmeldung. Das schafft ntfy mit der höchsten Stufe. Wächter 3 sendet den Alarm direkt vom ESP32, denn der Server hat dann keinen Strom mehr. Die Wächter 1 und 2 nehmen dafür das Skript.
$ curl -fsSLo alarm-ntfy \ https://lisoftware.de/sicherheit/waechter/alarm-ntfy.sh $ echo '3aa63d7fe351ea39795a9d21a7bad644a5e94ab8ae9c9843ad076e99cedfae3d alarm-ntfy' | sha256sum -c $ sudo install -m 755 alarm-ntfy /usr/local/bin/ $ sudoedit /etc/default/alarm-ntfy # NTFY_URL, NTFY_TOKEN $ sudo alarm-ntfy --test $ sudo alarm-ntfy "Tür am Serverschrank offen"
Am Handy einstellen
- ntfy-App installieren (F-Droid, Google Play oder App Store), deinen ntfy-Server eintragen und das Topic abonnieren. Unter Android beim Abo „Sofortige Zustellung“ einschalten.
- Eigener Server mit Token: Auf dem öffentlichen ntfy.sh kann jeder, der den Topic-Namen kennt, mitlesen und falschen Alarm schicken. Darum ein eigener ntfy-Server mit Zugangstoken und ein langes, zufälliges Topic.
- Android: Systemeinstellungen → Benachrichtigungen → ntfy → Kanal für die höchste Priorität: „Nicht stören“ überschreiben erlauben. In der App die Einstellung für dauerhaften Alarm bei höchster Priorität einschalten.
- iPhone: ntfy unter Fokus → „Nicht stören“ als erlaubte App eintragen. Ehrlich gesagt: Mit eigenem Server kommen sofortige Mitteilungen nur an, wenn er per
upstream-base-urleinen Weckruf über ntfy.sh und Apple schickt. Der enthält keinen Text, wohl aber eine Prüfsumme des Topics. Ob du diesen Dienst nutzt, entscheidest du. - Probealarm mit
sudo alarm-ntfy --test, danach einmal im Monat.
Eine echte amtliche Warnung (Cell Broadcast) kann keine App auslösen. Ein ntfy-Alarm mit höchster Stufe kommt ihr am nächsten.
5 · Prüfen lassen
Den eigenen Server prüfen
Die bekanntesten Werkzeuge und Seiten, um deinen Server gegen die Standards zu testen. Online-Prüfer sehen deine Adresse. Wer das nicht möchte, nimmt die Werkzeuge für den eigenen Rechner.
| Standard | Worum es geht | Prüfen mit |
|---|---|---|
| DISA STIG | Härtungsregeln des US-Verteidigungsministeriums, CAT I (kritisch) bis CAT III | STIGs und STIG Viewer · OpenSCAP mit STIG-Profil · NIST National Checklist Program |
| CIS Benchmarks | Konsens-Härtung für Linux, Docker, nginx | Lynis (frei, lokal) · CIS-CAT |
| NIST SP 800-53 | Katalog der Schutzmaßnahmen (AC, SC, CP …) | Katalog · OpenSCAP · NVD für bekannte Lücken |
| TLS: BSI TR-02102-2 · NIST SP 800-52r2 | Verschlüsselung der Verbindung, Zertifikat, Protokolle | testssl.sh (lokal) · SSL Labs („Do not show the results“ ankreuzen) · internet.nl |
| OWASP Secure Headers · ASVS | Sicherheits-Header und Webanwendung | Mozilla HTTP Observatory · securityheaders.com · OWASP ZAP |
| BSI IT-Grundschutz | Deutscher Standard für Informationssicherheit | Kompendium und Checklisten · internet.nl (Web und Mail) |
| CVE / bekannte Lücken | Gibt es für meine Pakete bekannte Schwachstellen? | Debian Security Tracker · Ubuntu Security Notices · CVE.org |
| Angriffsfläche von außen | Was sieht das Internet von meinem Server? | Shodan · Censys · nmap von einem fremden Netz |
| DNS | DNSSEC und Einträge | DNSViz |
| MIL-STD-882E | Sicherheit als System: Gefahren finden, bewerten, verringern | Kein Scanner – die Risikomatrix oben, mit allen Befunden der anderen Werkzeuge |