import prisma from '../lib/prisma.js'; /** * Prueft beim Start, ob die gesetzlich gebundenen Rechte ueberhaupt jemand * ausueben kann (Pentest R189-01). * * Hintergrund: `gdpr:export`, `gdpr:delete` und `gdpr:admin` haengen an den * Rollen DSGVO und Developer – nicht an der Admin-Rolle. Nach einem frischen * Seed war keine der beiden einem Konto zugewiesen. Ergebnis: Eine Auskunft * nach Art. 15 oder eine Loeschung nach Art. 17 konnte NIEMAND ausfuehren, * obwohl mehrere „Admin"-Konten existierten. Ein Ausfall mit Fristwirkung, * ausgeloest durch nichts weiter als eine Neuinstallation. * * Der Seed weist das Recht jetzt zu – aber nur bei NEUINSTALLATION. Auf einer * laufenden Datenbank aendert er nichts, und niemand merkt es, bis es darauf * ankommt. Deshalb diese Wache: Sie erkennt die ABWESENHEIT einer Faehigkeit, * so wie der Heartbeat das Ausbleiben eines Dienstkontos erkennt. * * Bewusst nur eine Meldung, keine automatische Vergabe: Rechte zu verteilen, * ohne dass ein Mensch es veranlasst hat, waere der groessere Fehler. */ /** Rechte, deren Fehlen ein rechtliches und kein technisches Problem ist. */ const PFLICHTRECHTE: Array<{ resource: string; action: string; wofuer: string }> = [ { resource: 'gdpr', action: 'export', wofuer: 'Auskunft nach Art. 15 DSGVO' }, { resource: 'gdpr', action: 'delete', wofuer: 'Löschung nach Art. 17 DSGVO' }, { resource: 'audit', action: 'read', wofuer: 'Prüfung des Audit-Protokolls' }, ]; export async function pruefePflichtrechte(): Promise { try { const fehlend: string[] = []; for (const recht of PFLICHTRECHTE) { const traeger = await prisma.user.count({ where: { isActive: true, roles: { some: { role: { permissions: { some: { permission: { resource: recht.resource, action: recht.action }, }, }, }, }, }, }, }); if (traeger === 0) { fehlend.push(`${recht.resource}:${recht.action} (${recht.wofuer})`); } } if (fehlend.length === 0) return; console.warn( '\n' + '========================================================================\n' + ' ACHTUNG: Für folgende Rechte gibt es KEIN aktives Konto:\n' + fehlend.map((f) => ` – ${f}\n`).join('') + '\n' + ' Das ist kein Fehler der Anwendung, sondern eine Lücke in der\n' + ' Rechtevergabe – und sie fällt erst auf, wenn eine Frist läuft.\n' + '\n' + ' Beheben: In der Benutzerverwaltung bei einem verantwortlichen Konto\n' + ' den Haken „DSGVO-Zugriff" setzen (Audit-Protokoll lesen und\n' + ' Datenschutz-Verwaltung). Für Eingriffe am Protokoll – versiegeln,\n' + ' aufräumen, Aufbewahrung ändern – zusätzlich „Audit-Betrieb".\n' + '========================================================================\n', ); } catch (err) { // Eine Wache darf den Start nicht verhindern. Aber schweigen darf sie // auch nicht: „nicht geprüft" ist nicht dasselbe wie „nichts gefunden". console.warn( '[Pflichtrechte] Prüfung nicht möglich – der Zustand der Rechtevergabe ist ' + 'damit UNBEKANNT, nicht in Ordnung:', err instanceof Error ? err.message : err, ); } }