Das Protokoll war bisher nur in der Datenbank lesbar. Die Ansicht zeigt es jeder Rolle mit lesbaren Aktionstexten, aufklappbarem Diff, Details und Hashes; ein Test haelt fest, dass jede Aktion im Code einen Text hat. Geblaettert wird ueber die ID statt OFFSET, weil das Protokoll waehrend des Lesens waechst. Die Kettenpruefung liest jede Zeile und laeuft deshalb nur auf Knopfdruck, mit 5 Minuten Zwischenspeicher; ein Bruch wird selbst protokolliert. Der CSV-Export streamt in Stapeln, entschaerft Formeln und steht selbst im Protokoll. protokollieren() reicht jeden Eintrag nach dem Schreiben an Syslog weiter, ohne Details und Diff. Kein Weg aendert oder loescht Eintraege; ein struktureller Test sichert das ab, zusaetzlich zum Trigger. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4.1 KiB
4.1 KiB
#027 Protokollansicht, CSV-Export, Syslog
Status: erledigt Meilenstein: v0.5.0 Labels: ui, backend Geschätzt: 2 h Tatsächlich: 0 h 20 min
Ziel
Filterbare Ansicht, CSV, optionale Weiterleitung an Syslog.
Aufgaben
/protokollstatt Platzhalter, jede Rolle liest: Tabelle mit Zeitpunkt (TT.MM.JJJJ HH:MM:SS), Aktion (lesbar, farbig), Akteur, Host, Zielbenutzer, Fingerprint (gekürzt), Ergebnis; untermdKarten- Zeile aufklappbar: Diff im Diff-Box-Stil, Details als Liste (Werte als JSON), Hash und Vorgänger-Hash
- Lesbare Texte für alle Aktionen in
src/lib/protokoll-aktionen.ts, gruppiert (Anmeldung, Host-Key, Ausrollen, Schlüssel, Widerruf/Rotation, Zielkonto, Abgleich, Hosts, Personen und Vorlagen, Protokoll) - Filter per GET: Zeitraum (Berliner Kalendertage), Aktionsgruppe, Akteur, Host, Ergebnis, Freitext (Fingerprint/Host/Benutzer)
- 50 je Seite, „Ältere laden“ hängt per Server Action an; Cursor über
id, keinOFFSET;?vor=<id>als Einstieg - Kopfzeile mit Anzahl und Syslog-Ziel; „Kette prüfen“ (Server Action) mit Ergebnis-Zwischenspeicher für 5 Minuten, Warnung mit Link auf die erste fehlerhafte ID
- CSV-Export
/api/protokoll.csv: eigene Rechteprüfung, gleiche Filter, gestreamt in Stapeln zu 500, Formel-Entschärfung übersrc/lib/csv.ts, Export selbst alsprotokoll.exportiertprotokolliert - Kein Lösch-/Bearbeitungsweg; struktureller Test gegen
protokoll.update/delete…undUPDATE/DELETE/TRUNCATE "Protokoll"insrc/ - Syslog nach RFC 5424 (
src/lib/syslog.ts, UDP oder TCP mit Oktettzählung, ohne neue Abhängigkeit), eingehängt inprotokollieren()nach dem Schreiben .env.exampleunddocker-compose.yml(web und worker) umSSHKV_SYSLOG_*- Tests: Query/Cursor/Filter, CSV-Route, Kettenprüfung, Syslog (Format, Escaping, Länge, UDP-/TCP-Empfänger), Aktionstexte, Struktur; E2E
tests/e2e/protokoll.spec.ts - Screenshots
protokoll-desktop.pngundprotokoll-mobil.png
Akzeptanzkriterien
- Jede
aktion: "…"im Quellcode hat einen lesbaren Text (Test) - Filter und „Ältere laden“ liefern weder Lücken noch Doppelte, auch wenn zwischendurch Einträge dazukommen
- CSV ohne Sitzung → 403; Kopfzeile
id;zeitpunkt;akteur;aktion;…;hash; große Protokolle werden in Stapeln gelesen - Manipulierte Zeile → Warnung mit ID; unversehrte Kette → „Hash-Kette unversehrt“
- Ausgefallener Syslog-Server verhindert keine Aktion; Fehler höchstens einmal je Minute im Log
- 1440 und 390 px ohne Querscrollen
Abhängigkeiten
#005
Notizen / Entscheidungen
- Kettenprüfung nur auf Knopfdruck, 5 Minuten zwischengespeichert (je Prozess).
protokoll_kette_pruefen()rechnet SHA-256 über jede Zeile und wächst linear mit dem Protokoll; beim bloßen Seitenaufruf wäre das bei 100 000 Einträgen spürbar. Gleichzeitige Klicks teilen sich eine laufende Prüfung. Ein Bruch wird selbst alsprotokoll.kette_beschaedigt(FEHLER) protokolliert, damit er auch beim Syslog ankommt. - CSV gestreamt über einen
ReadableStreammitpull: je Stapel 500 Zeilen (Cursor überid), der nächste Stapel erst, wenn der Client den vorigen abgenommen hat. Der Exporteintrag wird vor dem ersten Byte geschrieben – scheitert er, gibt es keinen Export. - IDs sind nicht lückenlos (Spalten-Default und Trigger ziehen beide aus der Sequenz); Cursor und Tests verlassen sich nur auf die Ordnung.
- Syslog: RFC 5424, SD-ID
sshkv@32473, Parameter id/akteur/aktion/ergebnis/host/zielbenutzer/fingerprint/hash (escaped nach §6.3.3, Steuerzeichen ersetzt, je Wert ≤ 120 Byte, Zeile ≤ 2048 Byte), MSGID = Aktion, Severity ERFOLG=notice, VERWEIGERT=warning, FEHLER=err, Facility standardmäßigauthpriv(SSHKV_SYSLOG_FACILITY). Diff und Details gehen nie hinaus. Fire-and-forget nach demcreate; innerhalb einer Transaktion kann ein späterer Rollback eine Syslog-Zeile ohne Gegenstück hinterlassen – das ist die harmlosere Richtung (ihr Hash fehlt dann in der Kette). --oknur für erfolgreiche Aktionen, die etwas ändern; Anmeldungen, Abrufe und Export bleiben neutral, Fehler/Verweigert immer--danger.