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>
63 lines
3.7 KiB
Markdown
63 lines
3.7 KiB
Markdown
# 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.
|