# Backend nutzt seit v1.1 die zentrale Root-.env im Projektverzeichnis. # → siehe ../.env.example für alle Variablen # # Diese Datei bleibt als Legacy-Fallback: wenn /.env nicht existiert, # liest das Backend backend/.env (z.B. für isolierte Backend-Tests). # Database DATABASE_URL="mysql://user:password@localhost:3306/opencrm" # JWT JWT_SECRET="your-super-secret-jwt-key-change-in-production" # Access kurz (XSS-Schutz, nur JS-Memory). Refresh lang im httpOnly-Cookie. JWT_EXPIRES_IN="15m" JWT_REFRESH_EXPIRES_IN="7d" # Encryption (for portal credentials) ENCRYPTION_KEY="32-byte-hex-key-for-aes-256-gcm" # Server PORT=3001 NODE_ENV=development # ==================== AUDIT-SIEGEL ==================== # Was ist das Audit-Log? # OpenCRM protokolliert luekenlos, wer wann welche Daten gesehen oder # geaendert hat. Das ist die Beweisspur, wenn es Streit gibt oder der # Datenschutz nachfragt. # # Wogegen schuetzt dieser Schluessel? # Ohne ihn koennte jemand mit Zugriff auf die Datenbank einen Eintrag # nachtraeglich umschreiben - zum Beispiel einen fehlgeschlagenen # Login-Versuch in einen erfolgreichen verwandeln - und die Faelschung so # glattziehen, dass die Pruefung sie fuer echt haelt. # Mit dem Schluessel bekommt jeder Eintrag ein Siegel, das sich nur mit # diesem Schluessel erzeugen laesst. Wer ihn nicht hat, kann nichts # faelschen, ohne dass es auffliegt. Bildlich: Der Schluessel ist der # Stempel des Notars - die Akte liegt zwar im Schrank, aber den Stempel # hat nur der Notar. # # Wie einrichten? # Einmalig einen Schluessel erzeugen und hier eintragen: # openssl rand -hex 32 # Pro Umgebung ein EIGENER Schluessel (Entwicklung, Test, Produktion). # # Was passiert, wenn ich ihn weglasse? # Nichts faellt aus. Das Audit-Log laeuft normal weiter, nur eben ohne # dieses zusaetzliche Siegel. # # Was passiert, wenn ich ihn verliere? # Die damit gesiegelten Eintraege lassen sich nicht mehr pruefen. Sie # gelten dann als "nicht pruefbar" - NICHT als gefaelscht. Es gibt also # keinen Fehlalarm, aber der Nachweis fuer diesen Zeitraum ist weg. # Deshalb: Schluessel sichern, so wie ein Passwort. AUDIT_HMAC_KEY= # Nur voruebergehend beim Schluesselwechsel setzen. # Moechtest du den Schluessel oben austauschen (z. B. weil du vermutest, # dass er in falsche Haende geraten ist), trage den ALTEN Schluessel hier # ein und den NEUEN oben. Dann bleiben die bisherigen Eintraege pruefbar, # waehrend neue schon mit dem neuen Schluessel gesiegelt werden. # Nach ein paar Wochen kann dieses Feld wieder geleert werden - danach # sind die alten Eintraege allerdings nicht mehr pruefbar. AUDIT_HMAC_KEY_OLD= # --- Technisch (fuer Entwickler/Admins) --------------------------------- # Verfahren : HMAC-SHA256 ueber alle Inhaltsspalten eines Audit-Eintrags, # inkl. previousHash (Verkettung). Entspricht Hash-Version 3. # Abdeckung : Version 1 = 7 Felder (Altbestand), Version 2 = alle 24 # Inhaltsspalten (SHA-256, unsigniert), Version 3 = wie 2, aber # HMAC-signiert. Die erwartete Version wird aus der Kette # abgeleitet (Version-Floor), nicht aus der Selbstauskunft der # Zeile - sonst liesse sich per Downgrade die schwaechere # Pruefung erzwingen. # Fail-safe : Ohne Schluessel schreibt der Dienst weiter Version 2. Bereits # signierte Zeilen landen dann in `unverifiableEntries`, # ausdruecklich NICHT in `tamperedEntries`. # Rotation : AUDIT_HMAC_KEY_OLD wird bei der Pruefung zusaetzlich # akzeptiert - Wechsel ohne Rehash. Ein Rehash waere ohnehin zu # vermeiden, er wuerde die Beweiskraft der Vergangenheit # ueberschreiben. # Grenze : Schuetzt gegen DB-Schreibzugriff ohne Schluessel. Wer Schluessel # UND Datenbank hat, kann die Kette konsistent neu rechnen. # Erzeugung : openssl rand -hex 32 (256 Bit)