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

3.7 KiB
Raw Blame History

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.