Audit-Logs erfassen jede zustandsändernde Aktion in Ihrer Organisation — Rollenzuweisungen, Änderungen an Engines, die Ausgabe von API-Schlüsseln, Abrechnungsänderungen — und zeigen sie in einer durchsuchbaren, filterbaren Zeitleiste an. Verfügbar im Enterprise-Tarif zusammen mit Rollen & Berechtigungen.
Das Protokoll ist auf Datenbankebene append-only: Die Verbindung der Anwendung kann Audit-Zeilen weder aktualisieren noch löschen oder kürzen. Was einmal geschrieben wurde, bleibt bestehen.
Was erfasst wird#
Jedes Ereignis erfasst Akteur, Aktion, Ziel und den HTTP-Kontext, über den die Anfrage eingegangen ist.
| Feld | Hinweise |
|---|---|
| Akteur | Der Benutzer oder API-Schlüssel, der die Aktion ausgeführt hat |
| Aktion | Ein typisierter Wert wie engine.created oder member.role_changed |
| Ziel | Die Entität, die betroffen war (z. B. eine Engine, eine Rolle oder ein Glossareintrag) |
| Metadaten | IDs verknüpfter Entitäten — niemals Namen, E-Mail-Adressen oder Inhaltsausschnitte |
| Anfragekontext | request_id, IP-Adresse, User-Agent — erfasst, als der Aufruf per HTTP einging |
| Zeitstempel | UTC sowie eine monotone Sequenznummer zur Erkennung von Lücken |
Absichtlich nur IDs
Die Metadatenspalte speichert IDs, keine menschenlesbaren Werte. Die UI verknüpft diese beim Lesen mit den aktuellen Namen, sodass das Umbenennen einer Engine oder eines Benutzers die Historie nicht umschreibt. Gleichzeitig vermeidet das Konflikte mit dem GDPR-Recht auf Löschung — es gibt keine Inhalte, die geschwärzt werden müssten.
Abgedeckte Aktionen#
Ereignisse sind in Kategorien gruppiert, die dem Filter im Dashboard entsprechen.
| Kategorie | Derzeit angebundene Aktionen |
|---|---|
| Organisation | org.created, org.settings_updated, org.ownership_transferred, org.deleted |
| Mitglieder | member.invited, member.removed, member.role_changed |
| Rollen | role.created, role.updated, role.deleted |
| Engines | engine.created, engine.updated, engine.deleted |
| API-Schlüssel | api_key.created, api_key.revoked |
| Inhalte | glossary_item.*, instruction.*, brand_voice.* (nur Einzeloperationen) |
Zugriff auf das Protokoll#
Der Eintrag Audit-Logs erscheint nur in der Organisations-Seitenleiste, wenn die Berechtigung für Ihre Organisation aktiviert ist. Darin finden Sie:
- Filterbare Liste — grenzen Sie nach Akteur, Aktionskategorie, Zieltyp und Datumsbereich ein. Zukünftige Daten sind blockiert, und die obere Grenze ist immer ≥ der unteren Grenze.
- Infinite Scroll — die neuesten Ereignisse zuerst; ältere werden beim Scrollen nachgeladen.
- Detailansicht — klicken Sie auf eine beliebige Zeile, um vollständige Metadaten, Request-ID, IP und User-Agent zu sehen.
- Aktualisieren — lädt die neuesten Ereignisse, ohne Ihre Filterauswahl zu verlieren. Filter und das geöffnete Ereignis werden in der URL abgebildet, sodass jede Ansicht geteilt werden kann.
Wer es sehen kann#
Zwei Voraussetzungen steuern den Zugriff auf die Seite:
- Berechtigung — die Funktion audit-logs muss für die Organisation aktiviert sein (Enterprise-Tarif).
- Berechtigung — die Rolle des Betrachters muss
org:view_audit_logsenthalten. Die standardmäßig angelegte Rolle Vollzugriff enthält sie bereits; Eigentümer haben sie immer.
Mitglieder ohne diese Berechtigung sehen statt der Zeitleiste eine „Kein Zugriff“-Seite. Mitglieder einer Organisation ohne diese Berechtigung sehen eine Paywall.
Wenn Ihr Enterprise-Tarif ausläuft
Audit-Logs sind Teil derselben RBAC-Tier-Berechtigung. Vergangene Ereignisse bleiben in der Datenbank, aber die Seite wird ausgeblendet und die Leseendpunkte geben 403 zurück, bis der Tarif wieder aktiviert ist.
Manipulationssicherheit#
Audit-Logs sind nicht nur ein Protokoll — sie lassen sich nachträglich bewusst schwer verändern.
- Append-only auf Datenbankebene. Die Migration, die die Tabelle anlegt, führt
REVOKE UPDATE, DELETE, TRUNCATEfür die API-Rolle aus. Jeder spätere Codepfad — Bug, neuer Endpunkt, selbst SQL-Injection — wird von Postgres abgewiesen, bevor eine Zeile geändert werden kann. - Monotone Sequenz. Jede Zeile trägt eine streng ansteigende
seq-Spalte. Ein Prüfer, der die Sequenz durchgeht, kann Löschungen anhand von Lücken erkennen.
Das reicht für Kontrollen im Stil von SOC 2 aus. Es schützt jedoch nicht vor einem Angreifer mit direkten Zugangsdaten zur Produktionsdatenbank — stärkere Maßnahmen (separate Owner-Rolle, WORM-Spiegel) sind auf Anfrage verfügbar.
Aufbewahrung#
Audit-Ereignisse werden standardmäßig unbegrenzt aufbewahrt. Benutzerdefinierte Aufbewahrungsfristen — typischerweise 1, 3 oder 7 Jahre — sind im Enterprise-Tarif verfügbar. Melden Sie sich, wenn Sie eine bestimmte Aufbewahrungsrichtlinie für Compliance- oder Sicherheitsfragebögen benötigen.
Was nicht abgedeckt ist#
Einige bewusst gesetzte Grenzen von v1, die Sie kennen sollten:
- Best-Effort-Erfassung, nicht transaktional. Eine transaktionale Erfassung steht kurzfristig auf der Roadmap. Das Audit-Ereignis wird nach der beschriebenen Aktion geschrieben — nicht innerhalb derselben Datenbanktransaktion. In seltenen Fehlerszenarien (wenn eine Aktion erfolgreich ist und danach das Einfügen des Audit-Eintrags fehlschlägt) kann die Aktion ohne entsprechendes Ereignis stattfinden.
- Einige Aktionstypen sind noch nicht angebunden. Änderungen an der Engine-Mitgliedschaft, Integration connect / update / disconnect, Änderungen an der Modellkonfiguration, Änderungen an Abonnement und Abrechnung sowie Bulk-Inhaltsoperationen (CSV-Upload,
createMany/updateMany/deleteMany) erzeugen derzeit noch keine Ereignisse. Das Aktionsvokabular ist bereits reserviert, sodass sie nach der Anbindung unter den bestehenden Filterkategorien erscheinen. - Lesevorgänge werden nicht auditiert. Das Anzeigen des Audit-Logs selbst, das Durchsuchen von Engine-Request-Logs oder das Herunterladen eines Glossars erzeugt keine Ereignisse. Nur zustandsändernde Aktionen tun das.
- Noch keine Exporte. Audit-Daten werden über das Dashboard bereitgestellt. CSV-Export, SIEM-Webhook und S3-Spiegel stehen auf der Roadmap — sagen Sie uns Bescheid, wenn Sie sie brauchen.
- Keine Engine-spezifische Ansicht. Alle Audit-Ereignisse der Organisation erscheinen in einer einzigen Zeitleiste. Filtern Sie nach Zieltyp oder Ziel-ID, um den Umfang einzugrenzen.
- Kein Live-Tail. Die Liste wird bei Bedarf oder per Klick auf Aktualisieren aktualisiert — es gibt keinen WebSocket-Stream.
