Server-Sicherheit und Audit¶
Uebersicht¶
Der FEGH Matrix-Server ist mit mehreren Sicherheitsschichten geschuetzt. Diese Seite dokumentiert alle Massnahmen, wie Einbruchsversuche erkannt werden, und wie Audit-Logs fuer Datenschutzpruefungen bereitstehen.
fail2ban -- Brute-Force-Schutz¶
Was ist fail2ban?¶
fail2ban ist ein Dienst der Server-Logdateien ueberwacht und IP-Adressen automatisch sperrt, wenn sie zu oft fehlschlagen. Bei unserem Server ueberwacht fail2ban SSH-Loginversuche.
Konfiguration¶
| Parameter | Wert | Beschreibung |
|---|---|---|
| Ueberwachter Dienst | SSH (Port 22) | Alle SSH-Loginversuche |
| Maximale Versuche | 3 | Nach 3 fehlgeschlagenen Logins wird gesperrt |
| Sperrdauer | 3600 Sekunden (1 Stunde) | IP ist danach wieder frei |
| Backend | systemd (journald) | Liest aus dem System-Journal |
Einbruchsversuche einsehen¶
Per SSH auf dem Server:
# Aktueller Status: Gesperrte IPs und Statistik
fail2ban-client status sshd
Beispiel-Ausgabe:
Status for the jail: sshd
|- Filter
| |- Currently failed: 5
| |- Total failed: 20
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 4
|- Total banned: 4
`- Banned IP list: 186.68.83.104 189.231.243.175 103.170.173.26 87.251.64.145
Bedeutung:
- Currently failed: Aktuelle fehlgeschlagene Versuche (noch nicht gesperrt)
- Total failed: Gesamtzahl aller fehlgeschlagenen Versuche seit Start
- Currently banned: Aktuell gesperrte IP-Adressen
- Total banned: Gesamtzahl aller jemals gesperrten IPs
- Banned IP list: Die konkreten gesperrten Adressen
Weitere fail2ban Befehle¶
# Alle Jails (ueberwachte Dienste) anzeigen
fail2ban-client status
# Eine IP manuell entsperren
fail2ban-client set sshd unbanip 192.168.1.100
# Eine IP manuell sperren
fail2ban-client set sshd banip 192.168.1.100
# fail2ban Log einsehen
journalctl -u fail2ban --since today
# Detailliertes Log aller Aktionen
fail2ban-client get sshd bantime
Wo werden Einbruchsversuche protokolliert?¶
| Log | Pfad / Befehl | Inhalt |
|---|---|---|
| fail2ban Aktionen | journalctl -u fail2ban |
Alle Bans und Unbans mit Zeitstempel |
| SSH-Versuche | journalctl -u sshd |
Alle SSH-Login-Versuche (erfolgreich + fehlgeschlagen) |
| Nginx Zugriffe | /var/log/nginx/access.log |
Alle HTTP/HTTPS-Anfragen an den Server |
| Nginx Fehler | /var/log/nginx/error.log |
Fehlerhafte Anfragen |
Firewall (UFW)¶
Aktive Regeln¶
| Port | Protokoll | Dienst | Zugriff |
|---|---|---|---|
| 22 | TCP | SSH | Nur mit Public-Key |
| 80 | TCP | HTTP | Weiterleitung auf HTTPS |
| 443 | TCP | HTTPS | Matrix-API + Well-Known |
| Alles andere | -- | -- | Blockiert (deny incoming) |
Firewall-Status pruefen¶
ufw status verbose
Regeln aendern¶
# Port oeffnen
ufw allow 8080/tcp
# Port schliessen
ufw deny 8080/tcp
# Bestimmte IP erlauben
ufw allow from 192.168.1.0/24 to any port 22
SSH-Haertung¶
| Massnahme | Status | Konfiguration |
|---|---|---|
| Passwort-Login | Deaktiviert | PasswordAuthentication no |
| Root-Login | Nur mit Key | PermitRootLogin prohibit-password |
| Authentifizierung | Nur Public-Key (Ed25519) | /root/.ssh/authorized_keys |
SSH-Zugriffslog pruefen¶
# Alle SSH-Logins heute
journalctl -u sshd --since today
# Nur erfolgreiche Logins
journalctl -u sshd | grep "Accepted"
# Nur fehlgeschlagene Logins
journalctl -u sshd | grep "Failed\|Invalid"
# Letzte 50 Eintraege
journalctl -u sshd -n 50
Automatische Sicherheitsupdates¶
Der Server installiert Sicherheitsupdates automatisch ueber unattended-upgrades:
# Status pruefen
systemctl status unattended-upgrades
# Log der installierten Updates
cat /var/log/unattended-upgrades/unattended-upgrades.log
# Manuell Updates pruefen
apt-get update && apt-get upgrade --dry-run
SSL/TLS-Zertifikat¶
| Eigenschaft | Wert |
|---|---|
| Anbieter | Let's Encrypt |
| Domain | Eigene Domain |
| Algorithmus | ECDSA |
| Erneuerung | Automatisch (certbot Timer, alle 90 Tage) |
Zertifikat pruefen¶
certbot certificates
Manuelle Erneuerung erzwingen¶
certbot renew --force-renewal
Backup¶
Automatisches Backup¶
| Eigenschaft | Wert |
|---|---|
| Zeitplan | Taeglich um 02:00 Uhr |
| Speicherort | /var/backups/conduit/ |
| Aufbewahrung | 30 Tage (aeltere werden automatisch geloescht) |
| Inhalt | Conduit-Datenbank + Konfiguration (tar.gz) |
Backup pruefen¶
# Vorhandene Backups anzeigen
ls -lh /var/backups/conduit/
# Manuelles Backup erstellen
/opt/conduit/backup.sh
Backup wiederherstellen¶
# Conduit stoppen
cd /opt/conduit && docker-compose down
# Daten loeschen
rm -rf /opt/conduit/data/*
# Backup entpacken
tar xzf /var/backups/conduit/conduit-YYYYMMDD.tar.gz -C /opt/conduit/
# Conduit starten
docker-compose up -d
Audit-Protokoll fuer Datenschutzpruefung¶
Bei einer Datenschutzpruefung muessen folgende Nachweise erbracht werden:
1. Zugriffskontrolle¶
# Wer hat Zugang zum Server?
cat /root/.ssh/authorized_keys
# Welche User existieren?
cat /etc/passwd | grep -v nologin | grep -v false
2. Einbruchsversuche¶
# fail2ban Statistik
fail2ban-client status sshd
# Alle gesperrten IPs der letzten 30 Tage
journalctl -u fail2ban --since "30 days ago" | grep "Ban"
# Fehlgeschlagene SSH-Logins der letzten 30 Tage
journalctl -u sshd --since "30 days ago" | grep "Failed" | wc -l
3. Verschluesselung¶
# SSL-Zertifikat gueltig?
certbot certificates
# Matrix E2E aktiv? (Raeume mit Encryption)
curl -s https://DEINE-DOMAIN.de/_matrix/client/versions | python3 -m json.tool
4. Updates¶
# Letztes Update
cat /var/log/unattended-upgrades/unattended-upgrades.log | tail -10
# Offene Updates
apt-get update && apt-get upgrade --dry-run 2>&1 | tail -5
5. Backup-Nachweis¶
# Backups vorhanden und aktuell?
ls -lh /var/backups/conduit/
# Backup-Log
cat /var/log/conduit-backup.log | tail -10
6. Matrix-User-Verwaltung¶
# Registrierung geschlossen?
grep registration /opt/conduit/conduit.toml
# Federation deaktiviert?
grep federation /opt/conduit/conduit.toml
Checkliste fuer regelmaessige Pruefung¶
Empfohlen: monatlich durchfuehren.
- [ ]
fail2ban-client status sshd-- Einbruchsversuche pruefen - [ ]
ufw status-- Firewall-Regeln unveraendert? - [ ]
certbot certificates-- SSL-Zertifikat gueltig? - [ ]
docker ps-- Conduit laeuft? - [ ]
ls -lh /var/backups/conduit/-- Backups aktuell? - [ ]
df -h /-- Festplatte nicht voll? - [ ]
free -h-- RAM ausreichend? - [ ]
journalctl -u sshd --since "30 days ago" | grep "Accepted"-- Nur bekannte Zugriffe? - [ ]
grep registration /opt/conduit/conduit.toml-- Registrierung noch geschlossen?