Autorisierungsnachweise: Belegen, dass Aktionen von KI-Agenten abgeschlossen wurden
Autorisierungsnachweise für KI-Agenten müssen menschliche Genehmigung und das daraus resultierende API- oder SSH-Ergebnis dokumentieren, einschließlich Timeouts und unbekannter Zustände.

Ein Genehmigungseintrag zeigt, dass eine Person einem Agenten erlaubt hat, etwas zu versuchen. Er zeigt nicht, ob die Anfrage den Dienst erreicht hat, ob der entfernte Host den Befehl angenommen hat oder ob die beabsichtigte Änderung tatsächlich eingetreten ist. Wer eine Genehmigung als Beleg für den Abschluss behandelt, erstellt Audit-Trails, die bis zu dem Moment beruhigend wirken, in dem ein Prüfer fragt: «Was ist tatsächlich passiert?»
Bei KI-Agenten ist diese Unterscheidung besonders wichtig. Sie können während einer gewöhnlichen Entwicklungsaufgabe viele reale Aktionen ausführen. Eine Person genehmigt vielleicht einmal den Agentenprozess, woraufhin dieser ein Ticket erstellt, eine Deployment-Einstellung ändert, eine Produktions-API abfragt oder einen Remote-Befehl ausführt. Jede Aktion braucht Nachweise mit einer eigenen Bedeutung. Die menschliche Entscheidung und das daraus entstandene Ergebnis gehören in dieselbe Untersuchung, sind aber nicht austauschbar.
Eine Genehmigung dokumentiert Berechtigung, nicht Abschluss
Autorisierungsnachweise beantworten, ob eine anerkannte entscheidungsbefugte Person eine definierte Aktion zu einem bestimmten Zeitpunkt erlaubt hat. Ausführungsnachweise beantworten, was das Aktions-Gateway versucht hat und was das Ziel zurückmeldete. Ein Audit-Konzept, das nur die erste Frage beantwortet, lässt eine große Lücke.
Stellen Sie sich einen Agenten vor, der die Genehmigung erhält, eine API zum Erstellen eines Zugriffstokens aufzurufen. Das Gateway sendet die Anfrage, aber die Verbindung bricht ab, nachdem der Dienst sie verarbeitet hat und bevor der Aufrufer eine Antwort erhält. Die Genehmigung bleibt gültig. Ein Log mit dem Eintrag «genehmigt» sagt dem Prüfer nicht, ob das Token existiert. Noch problematischer ist ein Log, das «abgeschlossen» behauptet, weil das Gateway Bytes gesendet hat. Es macht aus Unsicherheit eine falsche Tatsache.
Der gleiche Fehler tritt bei SSH auf. Eine Person genehmigt deploy.sh. Der SSH-Client authentifiziert sich, die entfernte Shell startet und die Netzwerkverbindung bricht während der Skriptausführung ab. Ist das Skript fertig geworden? Hat es ein System teilweise verändert? Der Verbindungsdatensatz kann diese Fragen nicht beantworten. Sie brauchen den Exit-Status auf der Gegenseite, sofern der Client ihn erhalten hat, und einen klaren Eintrag zum unbekannten Ergebnis, falls nicht.
Halten Sie diese Fragen getrennt:
- Hat ein Mensch oder eine genehmigte Kontrolle diesen Agentenprozess autorisiert?
- Welche genaue Fähigkeit deckte die Autorisierung ab?
- Hat das Gateway die Aktion an das Ziel gesendet?
- Welches Ergebnis gab das Ziel oder der Transport zurück?
- Können spätere Prüfer feststellen, dass niemand die Historie verändert hat?
Viele Teams pressen alle fünf Fragen in ein einziges Ereignis namens agent_action. Für ein Dashboard ist das bequem, bei voneinander abweichenden Fakten aber nutzlos. Speichern Sie zusammengehörige Ereignisse und zeigen Sie sie anschließend gemeinsam in der Oberfläche an.
Die NIST Special Publication 800-53 Rev. 5 stellt in der Kontrolle AU-3 eine ähnliche praktische Forderung. Zu den Inhalten eines Audit-Eintrags gehören demnach, was, wann und wo passiert ist, die Quelle, das Ergebnis und die mit dem Ereignis verbundene Identität. Entscheidend ist nicht die Sprache der Checkliste, sondern die Forderung, dass das Ergebnis im Eintrag enthalten sein muss. Eine Berechtigungsentscheidung kann dieses Feld nicht ausfüllen.
Die beiden Einträge brauchen unterschiedliche Felder
Ein sauberes Audit-Modell verwendet für eine angeforderte Aktion einen Autorisierungseintrag und einen oder mehrere Ausführungseinträge. Sie teilen sich eine Korrelationskennung, behalten aber jeweils die Felder, die ihre eigene Aussage stützen.
Der Autorisierungseintrag sollte die Anfrage identifizieren, bevor die Ausführung beginnt. Erfassen Sie die Identität des aufrufenden Prozesses, die menschliche Entscheidung, die Referenz auf die Zugangsdaten, den vorgesehenen Kanal, das Ziel und den angeforderten Vorgang. Beschreiben Sie den Umfang der Autorisierung so präzise, dass ein Prüfer erkennen kann, ob der spätere Aufruf innerhalb dieses Umfangs blieb.
Eine mögliche Struktur sieht so aus:
{
"event_type": "authorization.granted",
"action_id": "act_01JX7K8N4Q",
"session_id": "ses_01JX7JYQ2M",
"time": "2025-03-08T14:21:18Z",
"agent_process": {
"pid": 4812,
"code_signing_authority": "Example Development Team"
},
"human_decision": {
"method": "local_confirmation",
"actor": "local_user"
},
"requested_action": {
"channel": "http",
"credential_ref": "billing-api-prod",
"method": "POST",
"destination": "api.internal.example",
"path": "/v1/refunds"
}
}
Dieser Eintrag sollte standardmäßig weder das API-Geheimnis noch den privaten SSH-Schlüssel, den Autorisierungs-Header oder den vollständigen Anfragekörper enthalten. Ein Audit-Speicher voller Zugangsdaten wird zu einem zweiten Angriffsweg. Wenn Prüfer Anfragen mit privaten Inhalten unterscheiden müssen, bewahren Sie einen kryptografischen Hash des geschützten Teils und eine kurze, redigierte Zusammenfassung nach dokumentierten Regeln auf.
Der Ausführungseintrag beginnt, sobald das Gateway die Aktion versucht. Er muss angeben, ob die Aktion eine Protokollgrenze erreicht hat und was zurückkam. Für HTTP erfassen Sie Methode, Ziel, Antwortstatus, Transportfehler, Antwortgröße und eine begrenzte Klassifizierung der Antwort. Für SSH erfassen Sie Konto, Hostidentität, Darstellung des Befehls, Exit-Status, gegebenenfalls Signal und das clientseitige Verbindungsergebnis.
{
"event_type": "execution.finished",
"action_id": "act_01JX7K8N4Q",
"time": "2025-03-08T14:21:20Z",
"channel": "http",
"attempt": 1,
"delivery": "response_received",
"result": {
"http_status": 201,
"response_bytes": 428,
"response_digest": "sha256:..."
}
}
Schreiben Sie nicht einfach success: true als einziges Ergebnisfeld. Erfolg hat je nach Protokoll und Produkt eine andere Bedeutung. HTTP 201 bedeutet, dass der Server eine erstellte Ressource meldet. HTTP 202 bedeutet, dass er Arbeit zur späteren Verarbeitung angenommen hat. Der SSH-Exit-Status 0 bedeutet, dass der entfernte Befehl Erfolg gemeldet hat. Ein Skript kann dabei trotzdem einen internen Fehler ignoriert haben. Ein typisiertes Ergebnis liefert Prüfern Fakten statt eines vagen grünen Labels.
Die vertrauenswürdige Aktionsgrenze muss die Korrelation erzeugen
Die Komponente, die Zugangsdaten hält und die Aktion ausführt, sollte die Aktionskennung erzeugen. Der Agent darf Arbeit anfordern, aber nicht die maßgebliche Quelle dafür sein, was er tun durfte oder was das Gateway gesendet hat.
Das ist wichtig, wenn ein Agentenprozess fehlerhaft, kompromittiert oder durch eine lange Tool-Unterhaltung einfach verwirrt ist. Erzeugt er seine eigenen Kennungen, kann er ein späteres Ergebnis an eine frühere Anfrage hängen, unbequeme Aufrufe auslassen oder einen erfundenen Status melden. Auch ein gutartiger Agent kann nach einem Neustart den Kontext verlieren. Die Aktionsgrenze sieht Anfrage, Auswahl der Zugangsdaten, ausgehenden Versuch und zurückgegebenes Ergebnis an einer Stelle.
Verwenden Sie eine Kennung ohne geschäftliche Bedeutung und vergeben Sie sie nie erneut. Eine zufällige oder zeitlich sortierbare eindeutige ID eignet sich dafür. Fügen Sie sie jedem lokalen Eintrag hinzu. Wo das Protokoll es erlaubt, übertragen Sie sie auch als Anfragekennung nach außen. So können Betreiber ihre Logs mit dem Gateway-Eintrag verbinden, ohne Zugangsdaten offenzulegen.
Verwenden Sie bei einer HTTP-Anfrage einen eigenen Header, den das Zielsystem zu protokollieren bereit ist, etwa X-Action-ID. Verwechseln Sie diesen Header nicht mit einem Idempotenzschlüssel. Eine Aktionskennung erleichtert die Untersuchung. Ein Idempotenzschlüssel weist einen unterstützenden Server an, eine doppelte Zustandsänderung zu erkennen. Ein Wert kann manchmal beide Aufgaben erfüllen, aber nur, wenn der Dienstverantwortliche die Bedeutung und Aufbewahrungsdauer bestätigt.
Authorization: action_id=act_01JX7K8N4Q
Outbound request: POST /v1/refunds
Request header: X-Action-ID: act_01JX7K8N4Q
Response: 201 Created
Execution record: action_id=act_01JX7K8N4Q, delivery=response_received
Verlassen Sie sich zur Korrelation von Einträgen nicht allein auf Zeitstempel. Uhren gehen auseinander, Anfragen überschneiden sich und Agenten können in derselben Sekunde identische Aufrufe durchführen. Zeitstempel helfen, die Reihenfolge zu rekonstruieren. Sie beweisen keine Zugehörigkeit.
Auch eine Sitzungskennung ist wichtig, beantwortet aber eine umfassendere Frage: Welcher Lauf eines Agentenprozesses hat diese Anfrage gestellt? Bewahren Sie beide Kennungen auf. Die Sitzung zeigt, welcher Prozess eine dauerhafte Berechtigung erhalten hat. Die Aktionskennung zeigt, welcher konkrete Vorgang welches konkrete Ergebnis erhalten hat.
HTTP-Statuscodes sind Nachweise mit Grenzen
Eine HTTP-Antwort liefert stärkere Ausführungsnachweise als eine lokale Genehmigung, muss aber weiterhin interpretiert werden. Protokollieren Sie den endgültigen Status und genügend Kontext, um ihn zu erklären. Behandeln Sie nicht jeden Status außerhalb des Bereichs 200 automatisch als Fehler.
200 OK oder 201 Created ist eine ausdrückliche Meldung des Servers. 204 No Content steht häufig für einen erfolgreichen Vorgang ohne Antwortkörper. 202 Accepted ist etwas anderes: Das Ziel hat die Anfrage zur asynchronen Verarbeitung angenommen, die spätere Arbeit kann aber noch fehlschlagen. Ihr Ausführungseintrag sollte accepted_for_async_processing angeben und, wenn der Dienst dieses Muster unterstützt, eine spätere Statusabfrage oder einen Callback mit derselben Aktion verknüpfen.
Bei Weiterleitungen ist Vorsicht nötig. Wenn ein Gateway Weiterleitungen verfolgt, protokollieren Sie ursprüngliches und endgültiges Ziel sowie die Frage, ob die Regel zum Einfügen von Zugangsdaten bei jedem Sprung angewendet wurde. Einen Autorisierungs-Header an einen unerwarteten Host weiterzuleiten ist ein Verlust von Zugangsdaten, keine gewöhnliche Weiterleitung. Lehnen Sie hostübergreifende Weiterleitungen in der Praxis ab, sofern ein Betreiber die Zielbeziehung nicht ausdrücklich konfiguriert hat.
Auch Client- und Serverfehler liefern nützliche Fakten. Ein 403 belegt, dass der Dienst die Anfrage abgewiesen hat. Ein 409 kann zeigen, dass bereits ein doppelter oder widersprüchlicher Zustand besteht. Ein 429 bedeutet, dass das Ziel die Arbeit vorerst verweigert. Ein 500 sagt, dass der Server einen Fehler gemeldet hat, nicht, dass keine Änderung erfolgt ist. Der Antwortkörper kann das Ergebnis klären, sollte aber nur nach Redigierung und mit Größenbegrenzung gespeichert werden. Fehlermeldungen enthalten oft mehr operative Details als Erfolgsmeldungen.
Transportfehler brauchen eigene Ergebniswerte. Unterscheiden Sie etwa dns_failure, tls_validation_failure, connect_timeout, write_interrupted, response_timeout und connection_reset. Diese Ergebnisse zeigen einem Prüfer, wo die Gewissheit endet.
Besonders gefährlich ist eine unterbrochene Anfrage, nachdem das Gateway mit dem Schreiben begonnen hat. Der Dienst könnte gehandelt haben. Kennzeichnen Sie den Zustand als unknown_remote_outcome. Nennen Sie ihn nicht fehlgeschlagen, nur weil der Client keine Antwort besitzt. Wenn der Aufruf den Zustand verändert, sollte der Agent pausieren und eine sichere Abgleichmethode verwenden. Dazu kann eine Abfrage über einen Idempotenzschlüssel, das Lesen einer Ressource anhand einer Anfragekennung oder die Prüfung durch einen Menschen gehören.
SSH braucht Nachweise des entfernten Prozesses
SSH-Audit-Einträge enden oft bei «mit Host verbunden». Das belegt nur, dass ein Client eine SSH-Sitzung aufgebaut hat. Über das Ergebnis des Befehls sagt es nichts aus. Ohne Protokollierung der Hostschlüsselprüfung muss es nicht einmal den genauen Host identifizieren, der geantwortet hat.
Erfassen Sie für jede SSH-Aktion den Ziel-Hostnamen, soweit verfügbar die aufgelöste Adresse, den verifizierten Fingerabdruck des Hostschlüssels, das angeforderte Konto, die Referenz auf die Authentifizierungsmethode, den normalisierten Befehl und das endgültige Ergebnis des Clients. Wenn der Remote-Befehl startet, erfassen Sie Exit-Status und beendendes Signal. Behandeln Sie Standardausgabe und Standardfehler als sensible Betriebsdaten und nicht automatisch als Protokollmaterial.
Ein normalisierter Befehl erhält den Prüfwert und verringert zugleich die Offenlegung. Anstatt einen Befehl mit einem geheimen Argument vollständig zu speichern, können Sie ausführbares Programm, feste Optionen, Positionen sensibler Argumente und einen Hash geschützter Werte aufbewahren.
requested_command: /usr/local/bin/rotate-service-token --project payments --token [redacted]
command_digest: sha256:...
remote_exit_status: 0
remote_signal: null
connection_result: clean_close
Exit-Status 0 ist ein Nachweis des entfernten Befehls, aber kein Beleg dafür, dass jede fachliche Wirkung eingetreten ist. Ein schlecht geschriebenes Shell-Skript kann curl ausführen, den Fehler ignorieren und trotzdem mit 0 enden. Wenn Sie das Skript kontrollieren, lassen Sie es bei einem Fehler eines erforderlichen Vorgangs deutlich fehlschlagen und einen Wert ungleich null zurückgeben. Wenn Sie es nicht kontrollieren, protokollieren Sie das Ergebnis korrekt und behaupten Sie nicht mehr.
Interaktive SSH-Sitzungen verdienen Skepsis. Zwischen «Berechtigung erteilt» und «Befehle ausgeführt» entsteht dabei eine enorme Lücke. Ein begrenzter Remote-Befehl liefert bessere Nachweise als ein allgemeiner interaktiver Shell-Zugriff für einen Agenten. Wenn eine Aufgabe mehrere Befehle braucht, verwenden Sie ein geprüftes Skript mit eindeutigen Exit-Statuswerten oder erstellen Sie für jeden Befehl einen eigenen Aktionseintrag. Das ist weniger spektakulär, als einen Agenten frei in einem Terminal tippen zu lassen. Es lässt sich aber deutlich leichter untersuchen.
Die Hostprüfung muss aktiviert bleiben. Ein Eintrag, der besagt, ein Agent habe einen Befehl auf build-01 ausgeführt, bedeutet wenig, wenn der Client während eines Netzwerkangriffs oder nach einem versehentlichen Hostaustausch einen unverifizierten Host akzeptiert hat. Bewahren Sie den verifizierten Fingerabdruck des Hostschlüssels im Ausführungsereignis auf. So können Prüfer die Bezeichnung des Hostnamens von der kryptografischen Identität unterscheiden.
Ein Timeout muss in Unsicherheit enden, nicht in einer Wiederholungsschleife
Der Fehler, der Teams besonders häufig überrascht, beginnt mit einem zustandsverändernden API-Aufruf und endet in einem Timeout. Der Agent hatte die Genehmigung. Das Gateway öffnete eine Verbindung und sendete die Anfrage. Das Ziel führte die Änderung durch, aber die Antwort verschwand, oder das Ziel erhielt die letzten Bytes nie. Für den Aufrufer sehen beide Wege ähnlich aus.
Stellen Sie sich vor, ein Agent erstellt über eine API ein Ticket für einen Produktionsvorfall. Er sendet:
POST /v1/incidents
Idempotency-Key: inc_72f9c
X-Action-ID: act_01JX7K8N4Q
Der Client wartet und protokolliert anschließend response_timeout. Ein Audit-Trail, der nur Genehmigungen enthält, sagt, dass die Person ein Ticket genehmigt hat. Ein einfaches Aktionslog behauptet, die Ticketerstellung sei fehlgeschlagen. Keine der beiden Aussagen ist sicher.
Der korrekte Ausführungseintrag sagt, dass das Gateway die Anfrage versucht und keine Antwort erhalten hat. Er sollte Aktionskennung und Referenz auf den Idempotenzschlüssel bewahren. Anschließend fragt der Agent den Dienst nach dem mit inc_72f9c verbundenen Zustand, sofern der Dienst diese Abfrage anbietet. Meldet der Dienst ein vorhandenes Ticket, wird ein Abgleichereignis protokolliert, das auf die ursprüngliche Aktion verweist. Meldet er keinen Eintrag und erlaubt der Idempotenzvertrag eine Wiederholung, wird genau einmal mit demselben Idempotenzschlüssel erneut versucht, nicht mit einem neuen.
Die Abfolge enthält drei getrennte Fakten:
- Eine Person genehmigte die ursprüngliche Anfrage.
- Das Gateway konnte das ursprüngliche Ergebnis nicht bestätigen.
- Eine spätere Abfrage oder idempotente Wiederholung stellte den endgültigen Zustand fest.
Löschen Sie das Timeout nach dem Abgleich nicht. Es erklärt, warum die spätere Aktion stattfand. Außerdem zeigt es, ob ein wiederkehrendes Transportproblem vorliegt, das eine makellose Erfolgsquote verbergen würde.
Bei SSH gibt es einen entsprechenden Fehler. Ein Remote-Befehl kann weiterlaufen, nachdem der lokale Client seine Sitzung verloren hat. Vermeiden Sie automatische Wiederholungen, sofern der Befehl nicht nachweislich idempotent ist. Bevorzugen Sie eine ID für den Remote-Vorgang, eine Statusdatei mit kontrollierten Berechtigungen oder eine Ziel-API, die den Zustand meldet. Gibt es nichts davon, protokollieren Sie das unbekannte Ergebnis und verlangen Sie eine menschliche Prüfung. Doppelte Deployment-Befehle haben bereits genug Schaden verursacht, ohne dass ein Agent sie mit Maschinengeschwindigkeit wiederholt.
Sitzungs- und Einzelgenehmigungen adressieren unterschiedliche Risiken
Eine Sitzungsautorisierung stellt fest, dass ein bestimmter Agentenprozess während seines Laufs genehmigte Aktionskanäle verwenden darf. Sie verringert Genehmigungsmüdigkeit, wenn eine Person eine kurze, begrenzte Folge von Aktionen mit geringer Auswirkung erwartet. Spätere Aufrufe werden dadurch nicht zu einzeln geprüften Entscheidungen.
Eine Einzelgenehmigung dokumentiert für jede Verwendung ausgewählter Zugangsdaten eine menschliche Entscheidung. Nutzen Sie sie für Vorgänge, bei denen jedes Ziel, jede Änderung oder jeder Remote-Befehl eine neue Prüfung verdient. Auch dann bleibt der Ausführungseintrag notwendig. Eine Person kann einen destruktiven API-Aufruf genehmigen, den der Dienst anschließend ablehnt, teilweise verarbeitet oder mit einem Timeout beendet.
Der Unterschied wird deutlich, wenn Prüfer fragen: «Wer hat diese Änderung genehmigt?» Ein Sitzungseintrag kann antworten: «Dieser signierte Agentenprozess durfte diesen Kanal aufrufen.» Ein Einzelgenehmigungseintrag kann antworten: «Eine Person genehmigte diese konkrete Anfrage zu diesem Zeitpunkt.» Keine der beiden Aussagen beantwortet: «Ist es passiert?» Nur die daraus entstandenen Ausführungsnachweise können diese Frage klären.
Genehmigungsdialoge sollten genug Informationen zeigen, damit ein Mensch sinnvoll entscheiden kann: Identität des aufrufenden Prozesses, Referenz auf die Zugangsdaten, Ziel, Methode oder Befehl und die Information, ob die Anfrage den Zustand verändert. Ein Dialog, der nur «Agentenzugriff erlauben?» sagt, dokumentiert zwar einen Klick, aber kaum eine verwertbare Absicht.
Versuchen Sie nicht, dieses Problem mit einer riesigen Richtliniensprache zu lösen, bevor Sie kohärente Nachweise erzeugen können. Teams greifen oft zu Regeln, weil sie weniger Eingabeaufforderungen wollen. Regeln können Aktionen begrenzen, ersetzen aber kein Audit-Modell, das Genehmigung, Versuch, Antwort und unbekanntes Ergebnis unterscheidet. Machen Sie zuerst die Fakten verständlich. Entscheiden Sie anschließend, wo Automatisierung sicher ist.
Hashketten schützen die Historie, nicht die Wahrheit einer Aussage
Ein unveränderbares, hashverkettetes Log macht nachträgliche Manipulationen erkennbar. Jedes Ereignis enthält einen Hash oder trägt zu einem Hash bei, der von früheren Einträgen abhängt. Wenn jemand eine alte Genehmigung ändert, eine fehlgeschlagene Anfrage entfernt oder eine Reihenfolge umstellt, schlägt die Prüfung fehl, sofern die Person nicht ab dem veränderten Punkt die gesamte Kette neu schreibt und den vertrauenswürdigen Kettenkopf ersetzt.
Diese Eigenschaft ist bei Agentenaktivitäten wichtig, weil gerade die peinlichsten Einträge häufig entfernt werden sollen: eine abgelehnte Aktion, ein fehlgeschlagenes Deployment, eine Anfrage an den falschen Dienst oder eine länger als erwartet laufende Sitzung. Ein Log, das Administratoren unbemerkt ändern können, wird einer ernsthaften Prüfung nicht standhalten.
Eine Hashkette macht einen falschen Eintrag jedoch nicht wahr. Wenn ein nicht vertrauenswürdiger Agent «HTTP 201» liefert und das Log diese Lüge korrekt verkettet, beweist die Kette nur, dass die Lüge erhalten blieb. Der Collector muss das Ereignis an der Aktionsgrenze beobachten. Das Gateway sollte das Ausführungsergebnis erstellen, nachdem es die Antwort erhalten oder den Transportfehler erkannt hat.
NIST SP 800-92, der Guide to Computer Security Log Management, warnt, dass Logs während Erzeugung, Übertragung, Speicherung, Analyse und Löschung geschützt werden müssen. Die praktische Lehre geht über das Zentralisieren von Textdateien hinaus. Bewahren Sie die ursprüngliche Ereignisquelle auf, schützen Sie die Reihenfolge, kontrollieren Sie, wer Einträge ändern kann, und ermöglichen Sie die Prüfung, ohne breiten Zugriff auf die von den Aktionen verwendeten Geheimnisse zu gewähren.
Sallyport protokolliert Agentenläufe und einzelne Aufrufe in einem schreibgeschützten, verschlüsselten und hashverketteten Audit-Log. Der Befehl sp audit verify prüft die Kette offline über dem Chiffretext, ohne den Tresorschlüssel zu benötigen. Dadurch kann ein Prüfer die Integrität der Historie kontrollieren, ohne dass ein Prozess Zugriff auf Produktionszugangsdaten erhält.
Ein Prüfkommando sollte ein eindeutiges Ergebnis liefern und den geprüften Bereich nennen. Zum Beispiel:
$ sp audit verify
verified: 1847 records
chain: valid
first_record: 2025-03-01T08:15:02Z
last_record: 2025-03-08T14:21:20Z
Eine gültige Kette klärt nicht, ob eine externe API ihr Versprechen erfüllt hat. Sie stellt aber fest, dass die bewahrte Darstellung des Gateways von Genehmigung und erhaltenem Ergebnis nicht unbemerkt verändert wurde.
Prüfen Sie Verknüpfungen, nicht isolierte Ereigniszahlen
Audit-Prüfungen scheitern, wenn Teams Genehmigungen, erfolgreiche Aufrufe und abgelehnte Aufrufe in getrennten Diagrammen zählen, aber die Verbindungen zwischen ihnen nie untersuchen. Die sinnvolle Prüfeinheit ist eine Aktionszeitleiste: Anfrage, Autorisierungsentscheidung, Ausführungsversuche, Ergebnis und jeder Abgleich.
Beginnen Sie mit Einträgen ohne passenden Partner. Eine Genehmigung ohne Ausführungseintrag kann auf eine abgebrochene Anfrage, einen Absturz des Gateways oder einen Protokollierungsfehler hindeuten. Ein Ausführungseintrag ohne vorherige Genehmigung kann einen Umgehungsweg offenlegen. Ein unbekanntes Remote-Ergebnis ohne Abgleich ist unerledigte Betriebsarbeit und kein abgeschlossener Fehler.
Verwenden Sie einige wenige Abfragen oder Berichte, die diese Fragen erzwingen:
- Welche genehmigten zustandsverändernden Aktionen endeten mit einem unbekannten Ergebnis auf der Gegenseite?
- Welche Aufrufe erhielten eine Antwort außerhalb des Autorisierungsumfangs?
- Welche SSH-Befehle endeten ohne Exit-Status?
- Welche Sitzungsautorisierungen erzeugten noch Aktionen, nachdem die erwartete Aufgabe beendet war?
- Welche Aktionskennungen erscheinen in lokalen Einträgen, aber nicht in den Logs des Zieldienstes?
Die letzte Abfrage erfordert Zurückhaltung. Das Fehlen einer Anfragekennung im Ziel-Log kann bedeuten, dass das Ziel sie nicht aufbewahrt hat, das Zeitfenster falsch ist oder ein anderes Team die Logs besitzt. Markieren Sie es als Untersuchungsindikator, nicht als Beweis eines Fehlverhaltens.
Sallyports Sitzungs- und Aktivitätsjournal machen diese Trennung praktikabel: Eine Ansicht zeigt den Agentenlauf und seinen Widerrufsstatus, die andere einzelne Aufrufe. Prüfer sollten über Sitzungs- und Aktionskennungen zwischen beiden Ansichten wechseln, statt eines der Journale für die gesamte Geschichte zu halten.
Verwenden Sie ein eindeutiges Vokabular für Gewissheit. authorized, attempted, response_received, remote_exit_received, denied, failed_before_send und unknown_remote_outcome lassen sich leichter verteidigen als ein einzelnes Erfolgsflag. Wenn ein Team diese Begriffe einheitlich verwendet, verschwinden schwierige Fälle nicht mehr in freundlichen grünen Dashboards.
Erzeugen Sie Nachweise, bevor Sie Agenten breiteren Zugriff geben
Sie brauchen dafür keine komplexe Kontrollplattform. Stellen Sie die Nutzung von Zugangsdaten hinter eine vertrauenswürdige Aktionsgrenze, erzeugen Sie dort die Aktionskennung, protokollieren Sie menschliche Entscheidung und Ergebnis getrennt und bewahren Sie unbekannte Ergebnisse auf, ohne sie nachträglich als Fehler umzuschreiben. So erhalten Incident-Responder eine Abfolge, die sie mit Dienst- und Hostaufzeichnungen abgleichen können.
Testen Sie den Eintrag anschließend unter Fehlerbedingungen und nicht nur im Erfolgsfall. Genehmigen Sie eine Anfrage und unterbrechen Sie die Verbindung nach dem Senden. Führen Sie einen SSH-Befehl aus, der einen Exit-Status ungleich null zurückgibt. Erzwingen Sie einen DNS-Fehler. Widerrufen Sie eine Agentensitzung und prüfen Sie, ob spätere Aufrufe Ablehnungseinträge erhalten. Stellen Sie fest, ob ein Prüfer jedes Ereignis erklären kann, ohne eine Quelldatei zu öffnen oder den Agenten fragen zu müssen, was er gemeint hat.
Ein Agent darf handeln, ohne eine Zugangsdatenart zu besitzen. Er darf jedoch nicht bestimmen, was passiert ist. Bewahren Sie den Entscheidungseintrag und das Ausführungsergebnis auf. Lassen Sie Unsicherheit sichtbar, wenn das Netzwerk nicht mitspielt.
FAQ
Belegt ein Genehmigungsprotokoll, dass ein KI-Agent eine Aktion abgeschlossen hat?
Nein. Eine Genehmigung belegt, dass eine Person eine versuchte Aktion unter festgelegten Bedingungen erlaubt hat. Für den Abschluss braucht es separate Ausführungsnachweise, etwa einen Antwortstatus, einen SSH-Exit-Code, ein Ergebnis des Remote-Befehls und einen Zeitstempel, die alle derselben Aktion zugeordnet sind.
Was sollte ein Audit-Eintrag für die Autorisierung eines KI-Agenten enthalten?
Erfassen Sie den anfragenden Agentenprozess, die menschliche Entscheidung, die Referenz auf die Zugangsdaten, das Ziel, den angeforderten Vorgang und eine Korrelationskennung. Erfassen Sie das Ergebnis anschließend separat: Status, Antwortmetadaten, Exit-Code, Timeout, Transportfehler sowie einen Hash oder einen begrenzten Ausschnitt der zurückgegebenen Daten.
Wie verknüpfe ich eine Genehmigung mit einer API-Antwort oder einem SSH-Ergebnis?
Verwenden Sie eine Aktionskennung, die vom vertrauenswürdigen Aktions-Gateway erzeugt wird, und übernehmen Sie sie in beide Einträge. Der Agent darf die Kennung nicht selbst erfinden, da ein kompromittierter Prozess Kennungen wiederverwenden oder fälschen kann, sodass unabhängige Ereignisse verbunden erscheinen.
Belegt eine erfolgreiche Netzwerkverbindung, dass eine API- oder SSH-Aktion erfolgreich war?
Meistens nein. Eine erfolgreiche TCP- oder TLS-Verbindung belegt nur, dass der Client etwas erreicht hat, das die Verbindung angenommen hat. Bei HTTP sollten Sie den endgültigen Antwortstatus und das Ergebnis der Anfrage erfassen. Bei SSH gehören der Exit-Status des Remote-Befehls sowie Verbindungs- oder Authentifizierungsfehler ins Protokoll.
Was sollte ich protokollieren, wenn eine Agentenaktion in einem Timeout endet?
Der Eintrag sollte festhalten, dass das System kein Ergebnis erhalten hat, und den Grund bewahren: Timeout, Verbindungsabbruch, Prozessbeendigung oder eine lokal unterbrochene Aktion. Behandeln Sie den Zustand auf der Gegenseite als unbekannt, sofern das Ziel keine sichere Abfrage oder einen Idempotenzmechanismus anbietet.
Kann ein KI-Agent eine fehlgeschlagene API-Anfrage sicher wiederholen?
Nur dann, wenn das Ziel eine sichere und authentifizierte Möglichkeit bietet, den resultierenden Zustand zu prüfen. Das erneute Senden einer zustandsverändernden Anfrage nach einem Timeout kann doppelte Tickets, Zahlungen, Deployments oder Benutzeränderungen erzeugen. Idempotenzschlüssel und Prüfungen nach dem Schreiben sind sicherer als blinde Wiederholungen.
Sollten SSH-Audit-Logs den vollständigen Befehl enthalten?
Protokollieren Sie den vollständigen Befehl nur, wenn seine Argumente keine Geheimnisse oder privaten Inhalte offenlegen. Andernfalls speichern Sie eine normalisierte Form des Befehls, eine Liste zulässiger Argumente, einen Hash sensibler Parameter, den Host, das Konto und das Ausführungsergebnis. Ein brauchbarer Audit-Trail muss keine zweite Geheimnisdatenbank werden.
Was ist der Unterschied zwischen manipulationssicherer und vertrauenswürdiger Protokollierung?
Manipulationsnachweis bedeutet, dass ein Prüfer geänderte, entfernte oder neu geordnete Einträge erkennen kann. Es bedeutet nicht, dass jede aufgezeichnete Aussage wahr ist. Eine Hashkette schützt die Historie nach der Erfassung. Vertrauenswürdige Erfassungspunkte und authentifizierte Identitäten entscheiden, ob die Einträge echte Ereignisse beschreiben.
Wann sollte ich für jede Agentenaktion eine Genehmigung verlangen?
Eine Sitzungsgenehmigung entscheidet, ob ein bestimmter Agentenprozess während seines Laufs einen Berechtigungssatz verwenden darf. Eine Einzelgenehmigung verlangt für jede Verwendung einer ausgewählten Zugangsdatenart oder Aktion eine menschliche Entscheidung. Nutzen Sie diese zweite Variante für Aktionen, deren Auswirkungen eine Person jedes Mal neu prüfen soll.
Wie kann ein Aktions-Gateway die Audit-Trails von KI-Agenten verbessern?
Ein Gateway kann Zugangsdaten vom Agenten fernhalten, den aufrufenden Prozess identifizieren, eine menschliche Genehmigung anfordern, die HTTP- oder SSH-Aktion ausführen und das Ergebnis dort protokollieren, wo es entsteht. So entstehen belastbarere Nachweise, als wenn ein Agent erst im Nachhinein berichtet, was er getan hat.