8 Min. Lesezeit

Verschlüsselte Audit-Logs: Was die Offline-Prüfung beweist

Verschlüsselte Audit-Logs können die Kontinuität von Ciphertext offline belegen. Erfahren Sie, was Hash-Ketten, vertrauenswürdige Checkpoints, Zeitstempel und Prüfer zeigen können und was nicht.

Verschlüsselte Audit-Logs: Was die Offline-Prüfung beweist

Ein verschlüsseltes Audit-Log kann einem externen Prüfer nützliche Belege liefern, ohne ihm den Inhalt auch nur eines Datensatzes zu zeigen. Der Prüfer kann testen, ob die Ciphertext-Datensätze noch die erwartete Reihenfolge bilden, ob ein früherer Datensatz verändert wurde und an welcher Stelle ein Export erstmals nicht mehr zu seiner angegebenen Historie passt.

Diese Belege haben klare Grenzen. Ein sauberes Prüfergebnis beweist nicht, dass jede protokollierte Aussage wahr ist, dass das Archiv beim ersten Ereignis beginnt oder dass ein Zeitstempel die tatsächliche Zeit wiedergibt. Teams schwächen ihre eigene Audit-Aussage, wenn sie all das pauschal als «Integrität» bezeichnen. Es handelt sich um unterschiedliche Behauptungen, für die ein Auditor jeweils andere Nachweise verlangen sollte.

Ciphertext kann eine Integritätsspur tragen

Verschlüsselte Audit-Logs eignen sich für Offline-Prüfungen, weil der Prüfer einen Datensatz nicht verstehen muss, um seine gespeicherten Bytes zu hashen. Er braucht lediglich ein eindeutiges Datensatzformat und eine Regel, die jeden Datensatz an den vorherigen bindet.

Eine einfache konzeptionelle Kette sieht so aus:

record_1 = Encrypt(event_1)
link_1   = H(record_1)

record_2 = Encrypt(event_2)
link_2   = H(link_1 || record_2)

record_3 = Encrypt(event_3)
link_3   = H(link_2 || record_3)

H ist eine kryptografische Hash-Funktion. Das Symbol || steht für die Verkettung von Bytes, nicht für das Zusammenfügen von Text. Ein Produktionsformat muss die exakten Bytes, ihre Reihenfolge und ihre Längenkodierung festlegen. Wenn eine Implementierung einen Zeilenumbruch hasht, den eine andere weglässt, erhalten sie aus banalen Formatierungsgründen unterschiedliche Ergebnisse, nicht wegen unterschiedlicher Beweislagen.

Der Prüfer liest die exportierten Ciphertext-Datensätze in ihrer Reihenfolge. Für jeden Datensatz berechnet er aus der zuvor akzeptierten Verknüpfung und den aktuellen Ciphertext-Bytes die erwartete nächste Verknüpfung. Anschließend vergleicht er diesen Wert mit der im aktuellen oder im folgenden Datensatz gespeicherten Verknüpfung, je nach Format. Eine Abweichung bedeutet, dass die gelieferte Sequenz nicht zur Kettenregel passt.

Verschlüsselung und Verkettung lösen unterschiedliche Probleme. Die Verschlüsselung verhindert, dass der Prüfer, ein Backup-Operator oder eine Person mit Zugriff auf den Export URLs von Anfragen, Befehlsargumente, Antwortinhalte, Namen oder andere vertrauliche Details aus den Datensätzen liest. Die Kette erkennt Änderungen an den geschützten Bytes. Ein verschlüsseltes Log ohne Kette schützt zwar die Vertraulichkeit, lässt einen Prüfer aber nicht unterscheiden, ob ein Archiv unverändert ist oder ob still ein Datensatz entfernt wurde. Das Hashen von Klartext vor der Verschlüsselung kann manche Änderungen erkennen, führt aber oft zu vermeidbaren Formatproblemen und gibt dem Prüfer nicht automatisch eine durchgehende Sequenz, die er testen kann.

Ein Auditor, der nur Ciphertext sieht, kann deshalb eine präzise Aussage treffen: «Nach dieser Kettenregel und mit diesem Anker wurden diese verschlüsselten Datensätze innerhalb der gelieferten Sequenz nicht verändert oder verschoben.» Diese Aussage ist wertvoll. Sie darf nicht zu einer Behauptung über die Bedeutung der verborgenen Datensätze aufgebläht werden.

Eine gültige Kette beweist Kontinuität, nicht Wahrheit

Eine Hash-Kette beweist eine eng begrenzte Integritätseigenschaft: Spätere Verknüpfungen hängen von früher gespeicherten Bytes ab. Sie beweist nicht, dass die Software eine Aktion korrekt aufgezeichnet, jede Aktion erfasst oder dass ein Mitarbeiter keine saubere, aber irreführende Historie erstellt hat.

Nehmen wir einen Build-Agenten, der eine Deployment-Anfrage sendet. Ein Logger kann die Anfrage vor dem Netzwerkaufruf, danach oder erst nach einer erfolgreichen Antwort aufzeichnen. Alle drei Varianten können eine perfekte Kette ergeben. Sie beantworten jedoch unterschiedliche Fragen:

  • Ein Datensatz vor dem Aufruf zeigt eine versuchte Aktion.
  • Ein Datensatz nach dem Aufruf kann zeigen, dass die Anwendung ihren eigenen Abschlusspunkt erreicht hat.
  • Eine Bestätigung des Anbieters kann zeigen, dass der entfernte Dienst die Anfrage angenommen hat.
  • Ein Netzwerk-Mitschnitt kann den Datenverkehr zeigen, aber möglicherweise nicht die Absicht des Benutzers dahinter erkennen.

Eine Kette kann diese inhaltliche Lücke nicht schließen. Die Anwendung entscheidet, was jeder Datensatz behauptet. Das Audit-Design muss diese Bedeutung klar benennen. Dazu gehört auch die Frage, ob Fehler, Ablehnungen, Wiederholungen, Abbrüche und Teilantworten jeweils eigene Datensätze erhalten.

Dieser Unterschied ist nach einem Vorfall besonders wichtig. Jemand wird fragen: «Hat der Agent das Repository gelöscht?» Ein entschlüsselter lokaler Datensatz kann sagen, dass das Action-Gateway eine Löschanfrage gesendet hat. Er kann allein jedoch nicht beweisen, dass der Anbieter die Anfrage ausgeführt hat. Ein Ereignisdatensatz des Anbieters kann die spätere Frage beantworten. Umgekehrt kann ein Anbieterereignis eine erfolgte Löschung beweisen, aber nicht zeigen, welcher lokale Prozess sie angefordert hat. Ermittler müssen Belege miteinander verknüpfen, statt ein einzelnes Log als vollständige Geschichte zu behandeln.

Dasselbe Problem gibt es bei der Identität eines Agenten. Ein Datensatz kann einen Prozess, eine Code-Signing-Autorität, eine Session oder eine Benutzerfreigabe identifizieren. Diese Identitäten beschreiben unterschiedliche Akteure. Wenn im Datensatz «agent session 42» steht, sollte ein Auditor daraus nicht «Alice hat es getan» machen, solange keine separaten Datensätze Alices Freigabe an diese Session binden. Die Kette bewahrt die Bytes. Sie korrigiert keine zu weit gehende Interpretation dieser Bytes.

Der erste vertrauenswürdige Anker bestimmt die Reichweite des Nachweises

Eine Kette hat keinen aussagekräftigen Anfang, solange der Auditor keinen Anker besitzt, den der Log-Schreiber nicht zusammen mit dem Archiv ändern kann. Das initiale Glied, ein Checkpoint-Digest oder eine signierte Zusage können diese Rolle übernehmen. Ohne einen solchen Anker kann ein Angreifer mit Kontrolle über den Speicher das gesamte Log löschen, ab einem neuen ersten Datensatz eine frische Kette erzeugen und eine vollständig konsistente Ersatzversion übergeben.

Das ist der häufigste Fehler bei internen Designs. Teams führen einen Prüfer über eine Datei aus und schließen daraus, dass die Datei vollständig ist. Der Prüfer hat nur festgestellt, dass die Datei in sich konsistent ist. Vollständigkeit setzt eine frühere Festlegung auf einen erwarteten Punkt in der Historie voraus.

Ein praktischer Checkpoint enthält genügend Informationen, damit ein späterer Prüfer die Behauptung zuordnen kann. Mindestens sollten Sie Folgendes aufbewahren:

log identity: agent-actions-prod
checkpoint sequence: 18427
checkpoint digest: 7f...c2
record format version: 3
hash algorithm: SHA-256
checkpoint captured by: release-control process
checkpoint captured at: 2025-03-08T18:20:00Z

Der Digest oben dient nur als Beispiel. Ein echter Beleg braucht den vollständigen Digest, die exakte Byte-Kodierung und eine dauerhafte Kopie außerhalb des Log-Speichers. Bewahren Sie den Checkpoint in einem System mit einer anderen Fehler- und Zugriffsgrenze auf. Ein Commit in der Quellcodeverwaltung, ein Ticket-Anhang mit eingeschränktem Zugriff, ein signiertes Release-Artefakt, ein Append-only-Speicher oder ein Datensatz bei einem externen Auditor können helfen, sofern die Personen, die das Log ändern können, nicht unbemerkt auch jeden Checkpoint umschreiben können.

Checkpoints ermöglichen es außerdem, ein Intervall statt eines gesamten Archivs zu prüfen. Wenn der Auditor dem Checkpoint bei Sequenz 18.427 vertraut und Datensätze bis Sequenz 19.100 erhält, kann der Prüfer testen, ob der spätere Abschnitt von diesem vertrauenswürdigen Checkpoint abstammt. Dadurch wird die Beweisaussage auf ein klar benanntes Zeitfenster begrenzt. Das ist besser, als eine lückenlose Historie seit der Installation vorzutäuschen.

Ein Checkpoint muss keine Datensatzinhalte offenlegen. Die Zusage kann nur einen Digest, eine Sequenznummer, eine Formatversion und eine Log-Identität enthalten. So lässt sich eine externe Verankerung mit verschlüsselten Datensätzen verbinden. Außerdem vermeidet das eine schlechte Gewohnheit: vertrauliche Audit-Details nur deshalb zu exportieren, damit ein anderes Team bestätigen kann, dass das Archiv existiert hat.

Zeitfelder sind Behauptungen, bis eine unabhängige Stelle sie bindet

Ein Zeitstempel in einem verschlüsselten Datensatz kann Ereignisse nach der Uhr des Schreibers ordnen. Er beweist jedoch nicht allein, wann ein Ereignis in der Außenwelt stattgefunden hat. Wer die Maschinenzeit, den Prozess oder das Log-Format kontrolliert, kann eine gültige Kette mit falschen Zeitwerten erzeugen.

Teams verwechseln häufig Sequenz und Zeit. Eine Kette kann feststellen, dass Datensatz 108 nach Datensatz 107 gemäß der Kettenregel folgt. Sie kann nicht feststellen, dass Datensatz 108 um 09:17 UTC passiert ist, nur weil dieser Text im Datensatz steht. Auch monotone Zähler haben Grenzen: Sie zeigen die Reihenfolge in einem Log, sagen aber nicht, wie viel reale Zeit zwischen den Einträgen vergangen ist.

Wenn ein Audit verlässliche Zeitangaben braucht, sollten Sie Checkpoints an eine Quelle außerhalb der Kontrolle des Schreibers binden. Eine unabhängige Zeitstempelstelle, eine Bestätigung eines entfernten Dienstes oder ein separat verwalteter Ereignissammler kann zusätzliche Belege liefern. Jede Option stellt eine andere Vertrauensbehauptung auf. Ein unabhängiger Zeitstempel sagt, dass jemand anderes eine Zusage spätestens zu einem bestimmten Zeitpunkt gesehen hat. Eine Bestätigung eines entfernten Dienstes sagt, dass dieser Dienst eine Anfrage oder ein Ergebnis beobachtet hat. Keine der beiden Varianten macht den lokalen Ereignistext auf magische Weise wahr.

RFC 3161 beschreibt ein Zeitstempelprotokoll, bei dem eine Zeitstempelstelle ein signiertes Token über einen Nachrichtenabdruck, meist einen Hash, zurückgibt. Für verschlüsselte Logs ist der Nachrichtenabdruck besonders nützlich. Die Stelle kann einen Checkpoint-Digest mit einem Zeitstempel versehen, ohne die verschlüsselten Datensätze oder ihre Entschlüsselungsschlüssel zu erhalten. Die Einschränkung ist ebenso wichtig: Das Token bindet einen Digest an die von der Stelle angegebene Zeit. Es prüft weder die verborgenen Datensätze noch ihre Bedeutung und beweist auch nicht, dass der eingereichte Digest ein vollständiges Archiv repräsentiert.

Uhrenprobleme können auch zu harmlosen Prüfkonflikten führen. Eine Workstation kann die falsche Zeitzone haben, ein Prozess kann lokale Zeit statt UTC schreiben oder ein Operator kann Dateien in einer anderen Reihenfolge exportieren als der Ereignisreihenfolge. Speichern Sie eine eindeutige Zeitdarstellung, halten Sie die Sequenznummer der Kette aber von jeder Zeitbehauptung getrennt. Fragen Sie bei der Prüfung, welche Aussage Sie brauchen: Reihenfolge, ungefähre Betriebszeit oder unabhängig bezeugte Zeit.

Bei der Offline-Prüfung müssen die ursprünglichen Beweisbytes erhalten bleiben

API-Schlüssel von Agenten fernhalten
API-Schlüssel bleiben in Sallyports verschlüsseltem Tresor und gelangen nie zu dem Agenten, der die Aktion angefordert hat.

Ein Offline-Prüfer prüft Bytes, keine benutzerfreundliche Darstellung dieser Bytes. Ein Audit-Team kann gültige Beweise beschädigen, indem es einen Export in einem Editor öffnet, Zeilenenden umwandelt, JSON neu serialisiert, eine Datei während des Kopierens abschneidet oder Abschnitte in der falschen Reihenfolge zusammenfügt.

Behandeln Sie den empfangenen Export als Beweisobjekt. Kopieren Sie ihn Bit für Bit in einen kontrollierten Speicher, bevor ihn jemand untersucht. Dokumentieren Sie Herkunft, Empfangszeitpunkt, bearbeitende Personen und den Digest der empfangenen Datei. Diese Dokumentation macht eine fehlerhafte Quelle nicht vertrauenswürdig, verhindert aber, dass der Prüfprozess selbst zusätzliche Unklarheiten erzeugt.

Der Prüfablauf sollte Erfassung, Integritätsprüfung und Inhaltszugriff voneinander trennen:

  1. Bewahren Sie den verschlüsselten Export auf und berechnen Sie für das Beweisregister einen Datei-Digest.
  2. Beschaffen Sie den relevanten vertrauenswürdigen Checkpoint über den dokumentierten unabhängigen Kanal, nicht aus einer Notiz im selben Export.
  3. Führen Sie den Prüfer gegen eine unveränderte Arbeitskopie aus und bewahren Sie Exit-Status und Ausgabe auf.
  4. Wenn die Prüfung erfolgreich ist, entscheiden Sie, ob die Untersuchung eine Entschlüsselung braucht. Falls ja, gewähren Sie diesen Zugriff über einen getrennten Prozess.
  5. Wenn die Prüfung fehlschlägt, beenden Sie jede Bearbeitung und bewahren Sie sowohl die fehlerhafte Kopie als auch den angegebenen Checkpoint auf.

Im dritten Schritt spielt ein Befund aus der Kommandozeile eine wichtige Rolle. Auf einer Maschine mit installierten Sallyport-Kommandozeilenwerkzeugen kann ein Auditor Folgendes ausführen:

sp audit verify

Der Befehl prüft die verschlüsselte Hash-Kette offline und benötigt keinen Tresorschlüssel. Bewahren Sie die Tool-Version, die exakte Befehlsausführung, die Identität der Eingabedatei, sofern das Tool einen Exportpfad akzeptiert, sowie die resultierende Terminalausgabe zusammen mit dem Fallprotokoll auf. Ein Screenshot allein ist ein schwacher Nachweis, weil er Programm, Argumente und Herkunft der Eingabe verbirgt.

Diese Prüfung sollte vor jedem Entschlüsselungsantrag erfolgen. Wenn die Kette fehlschlägt, kann das Öffnen der Datensätze bei der Ursachenanalyse helfen, aber es macht das fehlerhafte Archiv nicht zu intakten Beweisen. Wenn die Kette erfolgreich ist, kann das Prüfungsteam häufig eine vorläufige Frage beantworten, etwa ob sich die exportierte Historie nach der Erfassung verändert hat, während operative Geheimnisse versiegelt bleiben.

Eine beschädigte Verknüpfung zeigt, wo untersucht werden muss, nicht wer dafür verantwortlich ist

Wenn die Prüfung an einer Abweichung endet, bedeutet das, dass der Prüfer die gespeicherte Verknüpfung nicht aus dem gelieferten Vorgänger und dem Ciphertext ableiten konnte. Die Abweichung identifiziert nicht den Akteur, der sie verursacht hat. Beschädigung beim Transport, ein unvollständiger Export, ein Parserfehler, eine inkompatible Formatversion und absichtliche Manipulation können dasselbe erste Symptom erzeugen.

Arbeiten Sie sich von der ersten fehlgeschlagenen Beziehung rückwärts vor. Bewahren Sie den letzten akzeptierten Datensatz, den ersten abgelehnten Datensatz, ihre gespeicherten Verknüpfungen und den erwarteten Checkpoint auf. Vergleichen Sie anschließend die Beweiskopien an jeder Übergabestelle. Wenn sich der Datei-Digest zwischen dem erzeugenden Host und dem Beweisspeicher geändert hat, untersuchen Sie zuerst Transport oder Erfassung. Wenn er stabil geblieben ist, die Kette bei einem neuen Export aber weiterhin fehlschlägt, untersuchen Sie die erzeugende Anwendung und ihre Formatannahmen.

Ein Fehlermuster kann die Möglichkeiten eingrenzen:

  • Eine Abweichung beim ersten gelieferten Datensatz deutet oft auf den falschen Checkpoint, einen fehlenden früheren Abschnitt oder einen Export hin, der nach der vorgesehenen Grenze beginnt.
  • Eine Abweichung nahe dem Ende deutet häufig auf eine Kürzung beim Kopieren oder einen unvollständigen Schreibvorgang hin, der zu früh exportiert wurde.
  • Fehler bei jedem Datensatz sprechen meist für inkompatible Formatversionen oder einen Prüfer, der eine andere Byte-Kodierung berechnet.
  • Eine einzelne Abweichung mit späteren Datensätzen, die ansonsten verknüpft werden könnten, kann auf einen geänderten, beschädigten oder ausgelassenen Datensatz hindeuten.

Reparieren Sie die Datei nicht, um zu sehen, ob die übrigen Datensätze geprüft werden können. Das kann Entwicklern bei der Fehlersuche an einem Parser helfen, zerstört aber die für eine Audit-Feststellung nötige Disziplin. Bewahren Sie eine forensische Kopie unverändert auf. Erstellen Sie diagnostische Ableitungen getrennt, dokumentieren Sie jede Änderung und ersetzen Sie damit niemals den ursprünglichen Beweis.

Ein gut konzipierter Prüfer sollte genügend Details für diese Untersuchung melden, ohne verschlüsselte Inhalte offenzulegen. Eine Sequenznummer, ein Datensatz-Offset, der erwartete Digest, der beobachtete Digest und die Formatversion reichen meist aus. Die Ausgabe sollte keinen Ciphertext ausschütten, wenn sie über Ticketsysteme oder Chatprotokolle weitergegeben wird. Ciphertext mag ohne Schlüssel unlesbar sein, verdient aber trotzdem kontrollierte Behandlung und kann sensibel werden, wenn Schlüssel später bekannt werden.

Löschung und Kürzung brauchen unterschiedliche Schutzmaßnahmen

Vor sensiblen Schlüsseln erneut fragen
Legen Sie fest, dass ein Schlüssel für jeden Aufruf eine Freigabe benötigt. Sallyport fragt dann vor jeder Nutzung nach.

Eine Kette erkennt einen geänderten Datensatz in der Mitte, weil spätere Verknüpfungen nicht mehr passen. Sie kann auch einen entfernten mittleren Datensatz sichtbar machen, wenn der nächste verbliebene Datensatz auf einen Vorgänger verweist, den der Prüfer nicht erhalten hat. Eine einfache Kette erkennt jedoch eine Kürzung am Ende nicht immer.

Stellen Sie sich ein Archiv mit den Datensätzen 1 bis 500 vor. Ein Angreifer entfernt die Datensätze 451 bis 500 und übergibt dem Auditor die Datensätze 1 bis 450. Die ersten 450 Datensätze können vollständig erfolgreich geprüft werden. Der Kette fehlt ein späterer Datensatz, der auf 451 verweist, und der Prüfer braucht eine externe Erwartung, dass die Historie weitergehen sollte.

Diese Erwartung kann aus einem Checkpoint bei 500, einer signierten Tagesanzahl, einem externen System mit Kenntnis der letzten Sequenznummer oder einem Aufbewahrungsprozess stammen, der abgeschlossene Exportbereiche dokumentiert. Die nützliche Aussage lautet konkret: «Das Archiv enthält jeden Datensatz bis Sequenz 500.» Eine Kette allein unterstützt nur: «Das gelieferte Archiv ist bis Sequenz 450 konsistent.»

Eine Löschung vor dem ersten gelieferten Datensatz hat dasselbe Problem. Wenn ein Prüfer eine Kette erhält, die bei Datensatz 200 beginnt, kann er nicht schließen, ob die Datensätze 1 bis 199 jemals existiert haben. Das Exportformat sollte angeben, ob es sich um ein vollständiges Archiv vom Ursprung bis zum aktuellen Stand oder um einen begrenzten Abschnitt handelt. Begrenzte Abschnitte brauchen ihren Start-Checkpoint. Vollständige Archive benötigen weiterhin einen vertrauenswürdigen Ursprungswert oder eine externe Zusage, wenn ein Angreifer die gesamte Datei ersetzen könnte.

Datensatzanzahlen helfen, versehentliche Verluste zu erkennen, reichen aber allein nicht aus. Eine Datei kann nach dem Austausch eines verschlüsselten Datensatzes weiterhin 500 Datensätze enthalten, ohne dass die Anzahl dies erkennt. Verwenden Sie Zählungen als ergänzende Belege neben Kette und Checkpoint, nicht als Ersatz dafür.

Hier unterscheidet sich eine manipulationssichtbare Spur von einer Zusage für einmal beschreibbaren Speicher. Eine Spur liefert Belege, mit denen ein Prüfer bestimmte Änderungen erkennen kann. Ein Write-once-Speicher versucht, Änderungen durch Zugriffskontrollen oder das Verhalten des Speichers zu verhindern. Starke Audit-Programme verwenden beides und testen beides. Wer das eine als Beweis für das andere behandelt, lässt eine Lücke, durch die eine Vorfallprüfung leicht hindurchfällt.

Der Prüfer muss das Format kennen, statt es zu erraten

Kryptografische Algorithmen retten kein mehrdeutiges Datensatzformat. Ein Prüfer braucht eine exakte Spezifikation dafür, wie der Schreiber ein Ereignis in Ciphertext umwandelt und wie er Metadaten, frühere Verknüpfungen und Ciphertext für den nächsten Hash kombiniert.

Vermeiden Sie Hash-Eingaben, die von praktischen Darstellungsformaten abhängen. Reihenfolge von JSON-Objektfeldern, Leerzeichen, Unicode-Normalisierung und optionale Felder können sich zwischen Implementierungen unterscheiden, obwohl dasselbe sichtbare Objekt gemeint ist. Wenn die Kette serialisiertes JSON abdeckt, definieren Sie eine kanonische Serialisierung und testen Sie sie über verschiedene Sprachimplementierungen hinweg. Noch besser ist ein binärer Umschlag mit expliziten Feldlängen und Versionsbytes.

Ein minimaler Umschlag kann eine Log-ID, eine monoton steigende Sequenz, den Digest der vorherigen Verknüpfung, die Kennung des Verschlüsselungsalgorithmus, den Ciphertext, den Authentifizierungs-Tag und eine Formatversion enthalten. Der Schreiber sollte genügend Rahmung einbauen, damit der Prüfer einen Datensatz aus einem anderen Log ablehnen kann, statt ihn zu akzeptieren, weil die Bytes zufällig eine gültige Verknüpfung bilden.

Bei Versionen ist Vorsicht nötig. Wenn Version 2 den Datensatzumschlag ändert, sollte der Prüfer angeben, dass er am Übergang die Regeln von Version 2 angewendet hat. Lassen Sie einen Prüfer nicht stillschweigend auf einen anderen Parser zurückfallen. Eine stille Ersatzinterpretation macht aus einer Kompatibilitätsfunktion einen Weg, fehlerhafte Beweise fälschlich zu akzeptieren.

Die Veröffentlichung FIPS 180-4 des National Institute of Standards and Technology spezifiziert die SHA-2-Familie und definiert die Hash-Funktion über eine Bitfolge, nicht über die Absicht einer Anwendung. Dieses trockene Detail enthält eine praktische Warnung. Die Integritätseigenschaft gilt exakt für die Eingabebytes. Teams, die sagen «wir hashen das Ereignis», haben oft noch nicht entschieden, ob sie eine UTF-8-Zeichenfolge, eine Datenbankzeile, ein komprimiertes Objekt oder einen verschlüsselten Umschlag hashen. Solange diese Entscheidung fehlt, gibt es keine reproduzierbare Audit-Prüfung.

Testen Sie das Format mit bewusst schwierigen Fällen: leeren Feldern, Nicht-ASCII-Text, großen Ciphertexts, unterbrochenen Schreibvorgängen, einem Datensatz an einer Versionsgrenze und Datensätzen, die zwischen unterstützten Architekturen kopiert wurden. Testen Sie auch Änderungen. Ändern Sie ein Byte im Ciphertext, vertauschen Sie zwei benachbarte Datensätze, entfernen Sie einen Datensatz aus der Mitte und kürzen Sie die Datei. Der Prüfer sollte vorhersehbar fehlschlagen und die früheste Stelle nennen, an der seine erwartete Beziehung nicht mehr stimmt.

Agenten-Logs brauchen zwei Beweisebenen

Einen Lauf sofort widerrufen
Über das Sessions-Journal können Sie einen autorisierten Agentenlauf sofort widerrufen, sobald die Beweislage es verlangt.

Autonome Agenten führen zu zwei verwandten Audit-Fragen: Welcher Lauf erhielt die Berechtigung und welche Aktion nutzte diese Berechtigung? Eine gemeinsame Zeitleiste kann beides enthalten, doch Prüfer sollten die Behauptungen getrennt halten.

Ein Session-Datensatz beantwortet Fragen zum Prozess, der sich mit dem Action-Gateway verbunden hat, zur Code-Signing-Autorität dieses Prozesses, zur Freigabe des Laufs durch einen Menschen und zum Zeitpunkt, an dem ein Operator ihn widerrufen hat. Ein Aktionsdatensatz beantwortet Fragen zu einer bestimmten HTTP- oder SSH-Anfrage, die das Gateway ausgeführt hat. Ein Lauf kann eine Autorisierung und viele Aktionsdatensätze haben. Wer nur die Session-Spur sieht, kann nicht jede externe Wirkung ableiten. Wer nur Aktionsdatensätze sieht, übersieht möglicherweise, warum dieser Prozess die Berechtigung hatte.

Sallyport führt ein Sessions-Journal und ein Activity-Journal, die aus einem schreibblinden, verschlüsselten und durch Hashes verketteten Audit-Log projiziert werden. Dadurch erhält ein Auditor zwei Ansichten derselben geschützten Historie und kann trotzdem eine einzige Integritätsspur prüfen.

Der Begriff «schreibblind» braucht eine genaue Bedeutung. Er besagt, dass die Komponente, die Audit-Belege anhängt, im normalen Betrieb keinen bequemen Weg haben sollte, alte Datensätze zu lesen und neu zu schreiben. Er bedeutet nicht, dass der Log-Schreiber keine falschen Aussagen erzeugen kann. Ein kompromittierter Agent kann schädliche Aktionen anfordern. Ein kompromittiertes Gateway kann falsche Daten aufzeichnen und dabei eine mathematisch gültige Kette bewahren. Das Design reduziert eine Klasse von Umschreibungsrisiken, ersetzt aber weder Softwareintegrität noch Session-Freigaben, gegebenenfalls Aktionsfreigaben oder den Vergleich mit Belegen des entfernten Systems.

Bei HTTP-Aktionen sollten Sie genügend geschützte Metadaten bewahren, um Ziel, Methode, Verweis auf die Berechtigung, Freigabekontext, Ergebnisklasse und Korrelationskennung zu unterscheiden, ohne geheime Materialien im Datensatz abzulegen. Bei SSH-Aktionen sollten Zielhost, Befehlsgrenze, Session-Kontext und Ergebnis unterscheidbar sein. Der verschlüsselte Datensatz kann diese Details für autorisierte Ermittler enthalten. Der Offline-Prüfer muss sie nicht sehen, um eine veränderte Sequenz zu erkennen.

Diese Trennung ermöglicht es Teams, einem Sicherheitsprüfer ohne dauerhafte Berechtigung für Produktionsgeheimnisse ein Integritätspaket zu senden. Sie macht auch die Arbeit an Vorfällen übersichtlicher. Stellen Sie zuerst fest, ob die gelieferten Beweise intakt sind. Gewähren Sie danach den kleinstmöglichen Entschlüsselungszugriff, der zur Interpretation der Ereignisse nötig ist.

Eine Audit-Aussage sollte zu den vorzeigbaren Belegen passen

Ein brauchbarer Audit-Bericht beschreibt seinen Umfang in klarer Sprache. Er nennt den exportierten Abschnitt, das Kettenformat, die Version des Prüfers, die Quelle des Checkpoints, das Prüfergebnis und die verbleibenden Grenzen. Das klingt vielleicht weniger eindrucksvoll als «die Logs sind unveränderlich», hält aber einer technischen Prüfung stand.

Verwenden Sie Formulierungen wie: «Der Prüfer hat die Datensätze 18.428 bis 19.100 als durchgehende Ciphertext-Kette akzeptiert, die im Checkpoint 18.427 verankert ist, den der Release-Control-Prozess separat aufbewahrt hat.» Diese Aussage beschreibt, was die Belege tragen. Wenn das Team zusätzlich einen signierten externen Zeitstempel besitzt, nennen Sie das getrennt. Wenn es ausgewählte Aktionen mit Ereignisdatensätzen eines Anbieters verglichen hat, nennen Sie auch das getrennt.

Vermeiden Sie Formulierungen wie «Es wurde nichts gelöscht», solange nicht ein verankerter End-Checkpoint oder eine andere unabhängige Quelle diese Aussage stützt. Vermeiden Sie «Der Agent hat das getan», wenn die Belege nur einen lokalen Prozess identifizieren. Vermeiden Sie «zu diesem exakten Zeitpunkt», wenn die einzige Uhr dem untersuchten Host gehörte. Das sind keine juristischen Spitzfindigkeiten. Sie entscheiden darüber, ob ein anderer Ingenieur Ihre Schlussfolgerung reproduzieren kann, wenn der Vorfall unübersichtlich ist und alle eine einfache Antwort wollen.

Der erste praktische Test ist einfach: Exportieren Sie ein Beispiel aus einer Nicht-Produktionsumgebung, bewahren Sie einen Checkpoint außerhalb des Exportorts auf, führen Sie den Offline-Prüfer aus, entfernen Sie anschließend in einer Kopie einen Datensatz und führen Sie den Prüfer erneut aus. Wenn das Team beide Ergebnisse und ihre jeweiligen Grenzen nicht erklären kann, besitzt es zwar Verschlüsselung und Hashes, aber noch keine Audit-Praxis, die standhält, wenn der Zugriff auf den Klartext zum Streitpunkt wird.

FAQ

Was kann ein verschlüsseltes Audit-Log ohne Entschlüsselung beweisen?

Sie kann belegen, dass die verknüpfte Struktur der Logdatei seit der letzten erfolgreichen Prüfung unverändert ist, und die erste beschädigte oder fehlende Verknüpfung lokalisieren. Den Text verschlüsselter Datensätze kann sie nicht offenlegen. Ebenso kann sie nicht entscheiden, ob eine Aktion angemessen war, oder ohne weitere Belege beweisen, dass ein bestimmtes Ereignis in der realen Welt stattgefunden hat.

Kann man eine Hash-Kette prüfen, wenn alle Audit-Datensätze verschlüsselt sind?

Ja. Der Prüfer berechnet jede Verknüpfung aus dem Ciphertext und vergleicht sie mit dem nächsten gespeicherten Digest. Die Verschlüsselung verbirgt den Inhalt der Datensätze, während die Hash-Kette erkennen lässt, ob geschützte Datensätze nach ihrer Erstellung geändert, entfernt oder umsortiert wurden.

Beweist eine gültige Hash-Kette, dass keine Audit-Datensätze gelöscht wurden?

Nein. Eine gültige Kette zeigt, dass die Datensätze ab dem gewählten Anker intern konsistent sind. Wenn ein Angreifer das gesamte Archiv samt erstem Anker ersetzen kann, erkennt die Kette diesen Austausch nicht. Bewahren Sie vertrauenswürdige Ankerwerte außerhalb des Systems auf, in dem das Log gespeichert wird.

Was sollte ein Auditor tun, wenn die Offline-Prüfung fehlschlägt?

Ein Kettenprüfer meldet normalerweise den ersten Datensatz, dessen gespeicherter Vorgänger-Digest nicht mit dem von ihm berechneten Digest übereinstimmt. Der Auditor sollte die Originaldatei sichern, die Version des Prüfers und den verwendeten Befehl dokumentieren und anschließend einen neuen Export anfordern, statt die Beweiskopie zu bearbeiten.

Kann ein verschlüsseltes lokales Audit-Log den genauen Zeitpunkt einer Aktion beweisen?

Nicht zuverlässig. Ein lokaler Zeitstempel kann bei der Reihenfolge der Datensätze helfen. Die Maschine, die ihn schreibt, kann jedoch eine falsche oder veränderte Uhr haben. Unabhängige Zeitstempel oder externe Checkpoints sind nötig, wenn eine Zeitangabe gegenüber jemandem bewiesen werden muss, der dem Schreiber nicht vertraut.

Kann eine Offline-Prüfung Datensätze erkennen, die nie in einen Export aufgenommen wurden?

Nein. Eine Offline-Prüfung untersucht nur die bereitgestellten Bytes und den Vertrauensanker, über den der Auditor bereits verfügt. Sie kann keine Datensätze entdecken, die nie exportiert wurden. Deshalb muss die Beweiserhebung festlegen, woher Exporte stammen und wie die empfangende Partei sie bewahrt.

Kann eine kompromittierte Anwendung eine gültige, aber falsche Audit-Spur erzeugen?

Nein. Hash-Ketten liefern Integritätsnachweise, aber keine Unabhängigkeit des Schreibers. Ein bösartiger oder kompromittierter Schreiber kann für falsche Aussagen eine mathematisch gültige Kette erzeugen. Deshalb bleiben Zugriffskontrollen, separate Telemetrie, signierte Software und externe Anker wichtig.

Welche Informationen müssen einem Audit-Log-Export beiliegen?

Zu jedem Export gehören eine Versionskennung, eine eindeutige Datensatzkodierung, der Hash-Algorithmus, die Regel zur Berechnung der Verknüpfungen sowie der vertrauenswürdige Anker oder Checkpoint, gegen den der Auditor prüfen soll. Ohne diese Angaben kann eine andere Partei die Prüfung nicht wiederholen oder einen Fehler einheitlich interpretieren.

Reicht ein Backup verschlüsselter Logs als Audit-Nachweis aus?

Nein. Ein Backup stellt die Verfügbarkeit sicher, während eine Hash-Kette die Integrität prüft. Bewahren Sie Backups auf, denn ein gültiges, aber nicht verfügbares Log ist nutzlos. Bezeichnen Sie ein kopiertes Archiv jedoch erst dann als manipulationssicher, wenn Sie seine Verknüpfungen gegen einen an anderer Stelle verwahrten Anker prüfen können.

Wie funktioniert `sp audit verify` ohne Zugriff auf Geheimnisse?

Der Befehl prüft das verschlüsselte, durch Hashes verkettete Audit-Log, ohne den Tresorschlüssel zu benötigen. So erhält ein Auditor eine Offline-Integritätsprüfung, während die Inhalte versiegelt bleiben. Der Auditor braucht weiterhin eine vertrauenswürdige Kopie des erwarteten Ankers oder einen dokumentierten Weg, diesen zu erhalten.

Sallyport

Sallyport führt API-Aufrufe und SSH-Befehle für Ihren KI-Agenten aus. Die Schlüssel bleiben in einem lokalen Tresor auf Ihrem Mac; Sie geben jeden Lauf frei, und jede Aktion landet in einem versiegelten Journal.

© 2026 Sallyport · Open Source unter Apache-2.0 · Oleg Sotnikov