Files
Lageplan/docs/legal/technical-organizational-measures.md
Pepe Ziberi 15dd78c848 feat(ops): Automatisches Backup (DB + Dateien, 30 Tage) (v1.8.11)
Schliesst den offenen Punkt: die Datenschutzerklärung nannte "bis zu 30 Tage", real fehlte ein Backup.

- Neuer backup-Container (postgres:16-alpine) in docker-compose.yml und deploy/portainer-stack.yml:
  täglich pg_dump (custom/komprimiert) + tar der MinIO-Dateien, Prune > 30 Tage, im Volume backups_data
- Konfigurierbar: BACKUP_RETENTION_DAYS, BACKUP_INTERVAL_HOURS (.env.example ergänzt)
- scripts/restore.sh + docs/BACKUP.md (Einrichtung, Off-Site-Hinweis, Restore DB+Dateien, Restore-Test-Tabelle)
- TOM-Doku aktualisiert (Backup vorhanden)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 22:39:03 +02:00

63 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Technische und organisatorische Massnahmen (TOM) — Lageplan
Stand: 2026-07-23 · sorgfältiger Entwurf. Ist-Zustand aus dem Code; offene Punkte klar markiert.
Legende: ✅ vorhanden · ⚠️ teilweise / zu bestätigen · ❌ offen / nicht umgesetzt.
## Zugriff & Berechtigungen
- ✅ Mandantentrennung je Organisation (Tenant), `getProjectWithTenantCheck`.
- ✅ Rollenkonzept: SERVER_ADMIN, TENANT_ADMIN, OPERATOR, VIEWER.
- ✅ MFA/Zwei-Faktor verfügbar: TOTP (Authenticator-App) + WebAuthn (YubiKey/Passkeys), freiwillig
pro Benutzer; Admin kann MFA zurücksetzen. Backup-Codes als Fallback. (SMS bewusst nicht umgesetzt.)
- ✅ Admin-APIs serverseitig mit `isAdmin`/`isServerAdmin` geschützt.
## Authentifizierung & Sessions
- ✅ Passwort-Hashing: bcrypt (cost 12), nie Klartext.
- ✅ JWT-Session (jose, HS256), Cookie `auth-token` httpOnly, secure (prod), sameSite=lax, 24 h/14 Tage.
- ✅ Passwort-Reset mit kryptographischem Token (32 Bytes), Ablauf.
- ✅ E-Mail-Verifizierung.
## Transport & Web-Härtung
- ✅ HTTPS/TLS; HSTS (max-age 2 Jahre, preload).
- ✅ Sicherheits-Header: CSP (mit `frame-ancestors 'self'`), X-Content-Type-Options nosniff,
Referrer-Policy, Permissions-Policy, COOP, X-XSS-Protection.
- ⚠️ CSP enthält `unsafe-inline`/`unsafe-eval` (für MapLibre gelockert) → langfristig verschärfen.
- ✅ Private Routen (/app,/admin,/settings,/konto): `X-Robots-Tag: noindex` + `Cache-Control: no-store` (Middleware).
- ⚠️ Socket.io-Server (`server-custom.js`): CORS `origin:'*'`**einschränken empfohlen**.
## Eingaben & Uploads
- ✅ Rate-Limiting: Login, Registrierung, Passwort-Reset, Verifizierung, Kontakt, Konto-Löschung, Share-PIN.
- ⚠️ Rate-Limiter ist In-Memory (pro Instanz) → bei Mehr-Instanz-Betrieb geteilten Store nutzen.
- ⚠️ Upload-Validierung (MIME/Grösse): vorhanden für Icons/Logos/Planbilder → **Umfang bestätigen**.
- ✅ Zugriffsschutz auf Dateien (serve-Routen mit Tenant-Check).
## Speicherung & Verschlüsselung
- ✅ Übertragung verschlüsselt (TLS).
- ⚠️ Verschlüsselung ruhender Daten (DB/MinIO/Backups): `[ZU BESTÄTIGEN]`.
- ⚠️ Secrets-Verwaltung: ENV (`NEXTAUTH_SECRET`, MinIO) + DB (`SystemSetting`: SMTP/Stripe) → **Absicherung der DB-Secrets bestätigen**.
## Backup & Wiederherstellung
- ✅ Automatisches Backup (eigener `backup`-Container): täglich Postgres-Dump + MinIO-Dateien,
30 Tage Aufbewahrung (`docker-compose.yml` / `deploy/portainer-stack.yml`, Anleitung `docs/BACKUP.md`).
- ⚠️ Off-Site-Kopie: empfohlen (Backups zusätzlich an einen zweiten Ort spiegeln) — siehe `docs/BACKUP.md`.
- ⚠️ Restore-Test: mindestens 1× durchführen und in `docs/BACKUP.md` protokollieren.
## Logging & Monitoring
- ✅ Server-Logs (console). ⚠️ Vermeidung sensibler Daten in Logs → **Review empfohlen**.
- ❌ Zentrales Monitoring/Alerting: `[OFFEN]`.
## Betrieb & Prozesse
- ✅ Idempotente Migrationen (`prisma/migrate.js`) beim Container-Start.
- ⚠️ Dependency-/Patch-Management: `[PROZESS DOKUMENTIEREN]`.
- ⚠️ Trennung Entwicklung/Test/Produktion: `[BESTÄTIGEN]`; Umgang mit Testdaten `[BESTÄTIGEN]`.
- ✅ Löschkonzept/Datenexport: siehe `retention-and-deletion.md`; Betroffenenrechte via `/konto/datenschutz`.
- ✅ Berechtigungsentzug: Benutzer sperren (`isActive`), aus Organisation entfernen.
## Direkt umgesetzte risikoarme Verbesserungen (dieses Update)
- Private Routen auf `noindex`/`no-store` gesetzt.
- Rechtliche Prüf-Hinweise in Exporten und Berechnungen.
- Revisionssichere Zustimmungsprotokollierung ohne roh-IP.
## Empfohlene, noch offene Massnahmen
- MFA für Admins; CSP verschärfen; Socket.io-CORS einschränken; geteilter Rate-Limit-Store;
Verschlüsselung ruhender Daten + Backups bestätigen; Restore-Tests; Monitoring.