Für LiNotes, LiChat, LiDio und jeden eigenen Server

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.

1 · Katas­trophal
2 · Kritisch
3 · Gering
4 · Vernach­lässig­bar
A · Häufig
Hoch
Hoch
Ernst
Mittel
B · Wahr­schein­lich
Hoch
Hoch
Ernst
Mittel
C · Gelegent­lich
Hoch
Ernst
Mittel
Niedrig
D · Selten
Ernst
Mittel
Mittel
Niedrig
E · Unwahr­schein­lich
Mittel
Mittel
Mittel
Niedrig

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.

Prüfsumme (SHA-256) von haerten.sh 1.1:
feb071563810198c9d7f30d8e7360a96742ad0791d03d7e5b405b150e17da724
Der Befehl lädt das Skript, prüft die Prüfsumme und öffnet es zum Lesen. Meldet er nicht „OK“: abbrechen. Gestartet wird danach von Hand mit sudo bash haerten.sh.

Terminal
$ 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.

Terminal
$ 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.

Terminal (dein Rechner)
$ 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.

Terminal
$ 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.

Terminal
$ 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

Terminal
$ 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

Terminal
$ 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.

watchdog.conf · fernwaechter.sh

🚨

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.

Teil A (ESP32-C6) · Teil B (WLAN)

Wächter 3: Der Ablauf im Ernstfall

🚪
T + 0 sTür, Erschütterung oder Sabotage
⏳
bis 30 sVoralarm: mit Schlüssel entschärfen
📣
AlarmSirene, Meldung an Teil B
🌐
+ wenige sDNS: Homepage zeigt auf GitHub Pages
⚡
+ 20 sZigbee: Strom des Servers aus
Türkontakt (Reed)GPIO 4 · Ruhekontakt ErschütterungGPIO 5 · SW-420 Sabotage (Gehäuse)GPIO 6 SchlüsselschalterGPIO 7 · scharf/unscharf Sirene 12 VGPIO 10 → MOSFET ESP32-C6Teil A · AlarmzentraleZigbee-Coordinator eigene USV / Akkuverschlossenes Gehäuse Zigbee: Ein/Aus Zigbee-Steckdosezertifiziert, 230 Voder Relais an 5/12 V DC ServerLUKS-PlatteStrom aus =Daten sicher UART „ALARM“ ESP32 mit WLANTeil B · UmleitungToken nur für 1 EintragTLS mit Wurzelzertifikat DNS: www → GitHub Pageskurze TTL (60–300 s)

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.

Terminal
$ 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-url einen 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.

StandardWorum es gehtPrüfen mit
DISA STIGHärtungsregeln des US-Verteidigungsministeriums, CAT I (kritisch) bis CAT IIISTIGs und STIG Viewer · OpenSCAP mit STIG-Profil · NIST National Checklist Program
CIS BenchmarksKonsens-Härtung für Linux, Docker, nginxLynis (frei, lokal) · CIS-CAT
NIST SP 800-53Katalog der Schutzmaßnahmen (AC, SC, CP …)Katalog · OpenSCAP · NVD für bekannte Lücken
TLS: BSI TR-02102-2 · NIST SP 800-52r2Verschlüsselung der Verbindung, Zertifikat, Protokolletestssl.sh (lokal) · SSL Labs („Do not show the results“ ankreuzen) · internet.nl
OWASP Secure Headers · ASVSSicherheits-Header und WebanwendungMozilla HTTP Observatory · securityheaders.com · OWASP ZAP
BSI IT-GrundschutzDeutscher Standard für InformationssicherheitKompendium und Checklisten · internet.nl (Web und Mail)
CVE / bekannte LückenGibt es für meine Pakete bekannte Schwachstellen?Debian Security Tracker · Ubuntu Security Notices · CVE.org
Angriffsfläche von außenWas sieht das Internet von meinem Server?Shodan · Censys · nmap von einem fremden Netz
DNSDNSSEC und EinträgeDNSViz
MIL-STD-882ESicherheit als System: Gefahren finden, bewerten, verringernKein Scanner – die Risikomatrix oben, mit allen Befunden der anderen Werkzeuge