8 Min. Lesezeit

Wie lokale und Upstream-Genehmigung die Steuerung von Agenten verändert

Vergleichen Sie mit dieser Matrix für lokale und Upstream-Genehmigung Latenz, Kontext, Identität, Ausfälle, Wiederholungen und Audit-Belege für Agentenaktionen.

Wie lokale und Upstream-Genehmigung die Steuerung von Agenten verändert

Eine Genehmigungsschaltfläche ist für sich genommen keine Sicherheitseigenschaft. Ihr Wert hängt davon ab, wo die Entscheidung durchgesetzt wird, was der Prüfer sehen kann, wessen Identität der Dienst erfasst und was nach einer Zeitüberschreitung oder einer unterbrochenen Verbindung geschieht.

Für einen KI-Agenten, der eine API aufruft, beantworten lokale und Upstream-Genehmigung unterschiedliche Fragen. Eine lokale Schranke kann entscheiden, ob dieser Agentenprozess Zugangsdaten verwenden oder eine vorbereitete Anfrage senden darf. Eine Upstream-Schranke kann entscheiden, ob das entfernte System die angeforderte Änderung an seiner eigenen Ressource anwenden soll. Wenn eine API bereits nach einer Bestätigung fragt, lautet das richtige Design selten „Wähle die strengere Variante“. Wählen Sie die Schranke, die den geprüften Sachverhalt besitzt, und verknüpfen Sie ihre Belege mit dem Rest der Aktion.

Der Unterschied zählt, weil ein aufgeräumter Genehmigungsbildschirm eine große Autorisierungslücke verbergen kann. Ein Prüfer genehmigt vielleicht lokal „Release 184 bereitstellen“, während der Upstream-Dienst einen wiederverwendbaren Token und eine andere Nutzlast erhält. Oder der Upstream-Dienst protokolliert eine Deployment-Genehmigung, ohne zu wissen, dass ein nicht vertrauenswürdiger Agentenprozess die Anfrage zusammengestellt hat. Beide Einträge können stimmen und trotzdem die Aktion nicht erklären.

Lokale und Upstream-Schranken autorisieren unterschiedliche Dinge

Eine lokale Genehmigung autorisiert die Nutzung einer Fähigkeit, bevor die Anfrage die Rechnergrenze überschreitet. Eine Upstream-Genehmigung autorisiert einen Ressourcenwechsel innerhalb des Dienstes, dem die Ressource gehört. Wer beides austauschbar behandelt, verliert entweder den Kontext des Aufrufers oder den Kontext der Ressource.

Eine lokale Schranke steht neben Agent, Zugangsdaten-Vault, Befehlsausführer oder Gateway für ausgehende Aktionen. Sie kann die ausführbare Datei, Code-Signatur, übergeordneten Prozess, Sitzungsbeginn, ausgewählte Zugangsdaten, Zielhost, Anfragemethode und vorgeschlagene Argumente prüfen. Sie kann das Geheimnis auch vom Agenten fernhalten und den Aufruf selbst ausführen. Das beantwortet überzeugend die Frage: „Darf dieser lokale Prozess diese Fähigkeit jetzt nutzen?“

Eine Upstream-Schranke sitzt beim API-Anbieter oder in einer daran angebundenen Steuerungsebene. Sie kann die aktuelle Ressourcenversion, Organisationsmitgliedschaft, geschützte Umgebung, Dienstrichtlinie, Konfliktstatus und die entfernte Identität des Prüfers untersuchen. Das beantwortet überzeugend die Frage: „Soll dieser genaue entfernte Wechsel unter dem aktuellen Dienststatus stattfinden?“

NIST Special Publication 800-207 beschreibt einen Richtlinienentscheidungspunkt und einen Richtliniendurchsetzungspunkt und empfiehlt, die Durchsetzung näher an die Ressource zu verlagern, damit die implizite Vertrauenszone klein bleibt. Dieses Prinzip spricht für Upstream-Durchsetzung bei Fakten, die nur der Ressourcenbesitzer kennen kann. Eine lokale Schranke wird dadurch nicht überflüssig. Ein Dienst kann die Identität eines lokalen Prozesses nicht prüfen, wenn der Client sie nicht übermittelt und bindet. Die meisten Aufrufe mit Bearer-Token identifizieren zudem den Token-Inhaber statt des Prozesses, der den Aufruf ausgelöst hat.

OpenSSH macht den lokalen Fall greifbar. Das OpenBSD-Handbuch zu ssh-add erklärt, dass die Option -c eine Bestätigung verlangt, bevor ein Agent eine hinzugefügte Identität verwendet. Der entfernte SSH-Server führt danach weiterhin seine eigene Autorisierung durch. Eine Schranke fragt, ob der lokale Client den Schlüssel nutzen darf. Die andere fragt, ob die daraus entstehende Anmeldung die Serverrichtlinie erfüllt. Wer eine davon als Duplikat bezeichnet, übersieht die Grenze, die jeweils geschützt wird.

Die praktische Regel ist einfach: Die Genehmigung muss von der Komponente durchgesetzt werden, die die beschriebene Aktion verhindern kann. Eine lokale Benachrichtigung, die weder Zugangsdaten noch den Aufruf zurückhalten kann, ist nur Kulisse. Ein Upstream-Kommentar, der nach einer Änderung erfasst wird, ist Überprüfung, keine Autorisierung.

Die Matrix beginnt mit dem geprüften Sachverhalt

Wählen Sie die primäre Schranke danach, was sie wissen und durchsetzen kann, nicht danach, wie viele Abfragen es gibt. Die folgende Tabelle ist die Entscheidungsmatrix, die ich vor jedem Genehmigungsworkflow nutze.

<table> <thead> <tr><th>Kriterium</th><th>Lokale Genehmigung</th><th>Upstream-Genehmigung</th><th>Folge für das Design</th></tr> </thead> <tbody> <tr><td>Latenz</td><td>Meist eine lokale Interaktion plus Aufrufzeit</td><td>Umfasst Netzwerk, Provider-Warteschlange, Benachrichtigung und Prüferzeit</td><td>Bevorzugen Sie lokal bei häufigen, rückgängig zu machenden Aufrufen, wenn der lokale Kontext reicht</td></tr> <tr><td>Agentenkontext</td><td>Kann Prozess, Sitzung, Berechtigung der ausführbaren Datei, Tool-Aufruf und lokalen Benutzer binden</td><td>Sieht meist einen Token, eine App, einen Workload oder ein Dienstkonto</td><td>Behalten Sie eine lokale Schranke, wenn die Prozessherkunft die Entscheidung verändert</td></tr> <tr><td>Ressourcenkontext</td><td>Sieht nur abgerufenen oder bereitgestellten Status, der veralten kann</td><td>Kann aktuelle Version, Schutzregeln, Besitzverhältnisse und Konflikte bewerten</td><td>Nutzen Sie Upstream-Prüfung für Wechsel, deren Sicherheit vom aktuellen Remote-Status abhängt</td></tr> <tr><td>Menschliche Identität</td><td>Kann die am Gerät anwesende Person binden</td><td>Kann ein Organisationskonto, eine Teamrolle oder Funktionstrennung binden</td><td>Nutzen Sie die Identitätsdomäne, der die Verantwortung gehört, oder bewahren Sie beide</td></tr> <tr><td>Offenlegung von Zugangsdaten</td><td>Kann das Geheimnis außerhalb des Agenten halten und nur eine Aktion freigeben</td><td>Beginnt oft erst, nachdem der Client bereits nutzbare Zugangsdaten besitzt</td><td>Lokale Durchsetzung ist nötig, wenn die Verwahrung von Geheimnissen Teil des Bedrohungsmodells ist</td></tr> <tr><td>Dienstausfall</td><td>Kann lokal verweigern und eine ausstehende Absicht behalten</td><td>Kann nicht genehmigen, solange Dienst oder Genehmigungsebene nicht verfügbar sind</td><td>Definieren Sie Ablauf und Abbruch. Deuten Sie einen Ausfall nie als Einwilligung</td></tr> <tr><td>Lokaler Ausfall</td><td>Blockiert abgesicherte Aufrufe auf diesem Gerät</td><td>Kann über einen anderen vertrauenswürdigen Client weiter verfügbar sein</td><td>Entscheiden Sie, ob alternative Clients erlaubt sind oder Umgehungen darstellen</td></tr> <tr><td>Audit-Details</td><td>Kann Abfragen, Ablehnungen, Prozessenden und versuchte Aufrufe erfassen</td><td>Kann angenommene Anfragen und maßgebliche Ressourcenänderungen erfassen</td><td>Verknüpfen Sie beide Einträge mit einer stabilen Aktionskennung</td></tr> <tr><td>Manipulationsgrenze</td><td>Ein kompromittierter Host kann lokale Einträge oder die Oberfläche angreifen</td><td>Der Provider kontrolliert den entfernten Eintrag</td><td>Verlangen Sie nicht von einem Log, Ereignisse außerhalb seiner Vertrauensgrenze zu beweisen</td></tr> <tr><td>Abdeckung</td><td>Kann viele APIs einheitlich umschließen</td><td>Deckt nur Vorgänge ab, die der Provider seiner Schranke zugänglich macht</td><td>Erfassen Sie ungeschützte Wege, bevor Sie sich allein auf Upstream-Genehmigung verlassen</td></tr> </tbody> </table>

Machen Sie aus der Tabelle kein Punktesystem mit einem universellen Gewinner. Manche Zeilen sind Ausschlusskriterien. Darf der Agent niemals einen API-Schlüssel erhalten, löst eine Upstream-Bestätigung die Offenlegung von Zugangsdaten nicht, auch wenn sie beim Ressourcenkontext besser abschneidet. Erfordert ein Produktions-Deployment einen Prüfer aus dem Betriebsteam, erfüllt eine lokale Touch-ID-Abfrage des Entwicklers, der den Agenten gestartet hat, keine Funktionstrennung.

Ordnen Sie die Aktion ein, bevor Sie ein Muster wählen. Leseaufrufe mit geringem Offenlegungsrisiko brauchen vielleicht eine Sitzungsautorisierung, aber keine Abfrage bei jedem Aufruf. Rückgängig zu machende Schreibvorgänge können eine lokale Schranke, eine kurze Ablaufzeit und einen Idempotenzschlüssel nutzen. Unumkehrbare oder regulierte Wechsel brauchen meist Upstream-Prüfung, weil der Dienst den Endstatus und die Organisationsidentität besitzt. Ein Befehl, der Geheimnisse nutzt und zugleich einen unumkehrbaren Wechsel auslöst, kann beide Schranken rechtfertigen, aber nur wenn jede Abfrage klar sagt, was ihre eigene Entscheidung bedeutet.

Latenz umfasst Wartezeit, Ablauf und menschliche Wiederherstellung

Lokale Genehmigung hat meist eine geringere Interaktionslatenz, doch entscheidend ist die Zeit bis zu einem sicheren, eindeutigen Ergebnis. Eine schnelle Abfrage mit anschließender unsicherer Wiederholung ist keine geringe Latenz.

Wenn eine Person einen Agenten auf einem Mac beaufsichtigt, kann eine lokale Karte erscheinen, solange der Anfragetext noch frisch ist. Der Prüfer kann sofort reagieren, und das Gateway sendet den Aufruf ohne eine zweite Benachrichtigungsrunde. Das passt zu Aktionen wie dem Öffnen eines routinemäßigen Pull Requests, dem Abfragen einer geschützten internen API oder dem Ausführen eines bekannten SSH-Befehls in einer begleiteten Sitzung, sofern die Folgen lokal sichtbar sind.

Upstream-Workflows haben mehr Wartestellen. Der Dienst muss ein ausstehendes Objekt erstellen, berechtigte Prüfer wählen, eine Benachrichtigung senden oder anzeigen, auf eine Organisationsidentität warten, die aktuelle Richtlinie erneut prüfen und schließlich den Wechsel anwenden. Diese Verzögerung ist sinnvoll, wenn sie echte Funktionstrennung schafft oder einem Prüfer den maßgeblichen Status zeigt. Sie ist Verschwendung, wenn dieselbe Person dieselbe Nutzlast zweimal ohne neue Information genehmigt.

Die GitHub-Dokumentation zu Umgebungen liefert ein hilfreiches Beispiel. Ein Job, der auf eine Umgebung mit erforderlichen Prüfern verweist, wartet vor dem Start und kann auf die Geheimnisse dieser Umgebung erst nach der Genehmigung zugreifen. GitHub kann außerdem Selbstprüfung in einer Umgebung verhindern. Dadurch wird die Upstream-Verzögerung sinnvoll: Die Schranke steuert sowohl Dienststatus als auch Geheimnisfreigabe und kann einen Prüfer binden, der nicht der Auslöser ist. Eine lokale Genehmigung kann diese Organisationsbeziehung nicht nachbilden, indem sie die E-Mail-Adresse des Prüfers anzeigt.

Messen Sie im Betrieb mindestens vier Zeiträume: von der Erstellung der Absicht bis zur Abfrage, von der Abfrage bis zur menschlichen Entscheidung, von der Entscheidung bis zur Ausführung und von der Ausführung bis zum maßgeblichen Ergebnis. Bewahren Sie Ablehnungen und abgelaufene Anfragen in denselben Daten auf. Eine mittlere Genehmigungszeit, die aufgegebene Anfragen ausblendet, lässt einen defekten Workflow besser aussehen, als er ist.

Auch die Häufigkeit von Abfragen verändert Verhalten. Eine lokale Abfrage bei jedem Aufruf in einer Schleife mit fünfzig ähnlichen Lesevorgängen trainiert Prüfer darauf, ungelesen zu klicken. Alle fünfzig Abfragen nach Upstream zu verlagern, behebt das nicht. Bündeln Sie nur Aktionen mit einer begrenzten Fähigkeit, einer klaren Zielmenge und kurzer Laufzeit. Destruktive Wechsel sollten getrennt bleiben, auch wenn Bündelung schneller wäre.

Setzen Sie eine Ablaufzeit, die widerspiegelt, wie schnell sich die Fakten ändern können. Zehn Minuten können für eine Anfrage, die aus einem sich rasch ändernden Branch-Head gebaut wurde, viel zu lang sein und für eine formelle Produktionsprüfung zu kurz. Erneuern Sie eine Genehmigung nicht stillschweigend. Ändern sich Nutzlast, Zielversion, Zugangsdaten oder Kreis der berechtigten Prüfer, erzeugen Sie eine neue Entscheidung.

Der Kontext entscheidet, ob der Prüfer urteilen kann

Eine hilfreiche Abfrage enthält die kleinste vollständige Menge an Fakten, die für ihre Entscheidung nötig ist. Lokale und Upstream-Systeme sehen unterschiedliche Hälften. Deshalb funktioniert es selten, einen Bildschirm in den anderen zu kopieren.

Die lokale Seite sollte zeigen, wer fragt, und zwar in einer Form, die ein Mensch prüfen kann: Identität der ausführbaren Datei, gegebenenfalls Signaturstelle, übergeordnete Sitzung, Tool-Name, Zugangsdaten-Alias, Ziel, Vorgang und eine lesbare Zusammenfassung der Nutzlast. Sie sollte Daten, die das Gateway beobachtet hat, von Text unterscheiden, den der Agent geliefert hat. Eine Erklärung des Agenten wie „sichere Bereinigung“ ist kein Beleg.

Die Upstream-Seite sollte das maßgebliche Objekt und den vorgeschlagenen Wechsel zeigen: Repository und Umgebung, Konto und Region, Ressourcenversion, Diff, Richtlinienprüfungen, Identität des Auslösers und berechtigte Prüfer. Sie sollte nicht vorgeben, lokale Herkunft zu kennen, wenn sie nur einen Bearer-Token erhalten hat.

Binden Sie die genehmigte Absicht mit einem Digest über kanonische Aktionsfelder an die Ausführung. Der folgende Umschlag ist bewusst klein genug für eine Umsetzung. action_id verknüpft die Systeme, der Digest verhindert, dass eine spätere Nutzlast eine frühere Genehmigung übernimmt.

{
  "action_id": "act_01JQ7M6F4R2K",
  "session_id": "ses_01JQ7KZ9J1AA",
  "caller": {
    "executable": "/usr/local/bin/agent",
    "signing_authority": "Developer ID Application: Example Team"
  },
  "target": {
    "service": "deploy-api",
    "resource": "production/payments",
    "version": "184"
  },
  "request": {
    "method": "POST",
    "operation": "promote",
    "body_sha256": "98b0...e42c"
  },
  "approval": {
    "scope": "single_action",
    "expires_at": "2026-07-24T14:05:00Z"
  }
}

Der Ausführer muss body_sha256 neu berechnen, Ressource und Version vergleichen, die Ablaufzeit bestätigen und eine Genehmigung für eine einzelne Aktion genau einmal verbrauchen. Ändert der Agent nach der Genehmigung ein Argument, muss der Vergleich sicher fehlschlagen. Die Upstream-Anfrage sollte action_id nach Möglichkeit in einem vom Provider unterstützten Metadaten- oder Korrelationsfeld tragen. Schmuggeln Sie sie nicht in ein Feld, das das Geschäftsverhalten verändert.

Ein Screenshot bindet nur schwach. Er kann einem Menschen helfen, eine Anfrage zu verstehen, doch der Code muss die Beziehung zwischen den genehmigten Bytes und den gesendeten Bytes durchsetzen. Ich habe Systeme gesehen, die eine freundliche Zusammenfassung aus einem Objekt anzeigen und ein später zusammengesetztes anderes Objekt ausführen. Prüfen Sie den Serialisierungspfad, nicht nur die Oberfläche.

Eine Aktion hat drei Identitäten, nicht eine

Die lokale Audit-Kette offline prüfen
Sallyport prüft seine verschlüsselte Hash-Kette, ohne den Vault-Schlüssel zu benötigen.

Eine Agentenaktion hat mindestens drei Identitäten: den Prozess, der sie vorgeschlagen hat, den Berechtigungsprinzipal, der sie ausgeführt hat, und die Person, die sie genehmigt hat. Wer sie in ein einziges Akteursfeld presst, erhält ansehnliche Logs, die die falsche Frage beantworten.

Die Prozessidentität kann einen Pfad zur ausführbaren Datei, Hash, Signaturstelle, übergeordneten Prozess, Agentenprotokollsitzung und lokalen Betriebssystembenutzer umfassen. Nichts davon wird automatisch zu einer Remote-Identität. Die API sieht normalerweise einen OAuth-Client, ein Dienstkonto, einen Deployment-Schlüssel, eine Rollensitzung oder einen Benutzertoken.

Auch der genehmigende Mensch lebt in einer Identitätsdomäne. Eine lokale biometrische Bestätigung kann, abhängig vom Betriebssystemmechanismus, nachweisen, dass eine registrierte Person am Gerät anwesend war. Sie weist aber nicht unbedingt nach, welche Organisationsrolle diese Person aktuell innehat. Ein Upstream-Prüferkonto kann Teammitgliedschaft und Trennung vom Auslöser nachweisen, weiß aber möglicherweise nichts darüber, welche lokale Binärdatei die Aktion angefordert hat.

Bewahren Sie alle drei Identitäten auf und nennen Sie die Bindungsmethode.

<table> <thead> <tr><th>Identität</th><th>Beispielbeleg</th><th>Beantwortete Frage</th></tr> </thead> <tbody> <tr><td>Vorschlagender</td><td>Prozesssignatur, Hash der ausführbaren Datei, Sitzungs-ID</td><td>Welcher laufende Code hat gefragt?</td></tr> <tr><td>Ausführer</td><td>API-Prinzipal, Fingerabdruck des öffentlichen SSH-Schlüssels, Rollensitzung</td><td>Welche Berechtigung führte den Aufruf aus?</td></tr> <tr><td>Prüfer</td><td>Lokale Benutzeranwesenheit oder Upstream-Organisationskonto</td><td>Welche Person akzeptierte welches Risiko?</td></tr> </tbody> </table>

Bearer-Zugangsdaten machen das besonders wichtig. Teilen fünf Agentenprozesse einen Token, kann der Upstream-Audit-Trail den Token-Prinzipal korrekt nennen und trotzdem die Prozesse nicht unterscheiden. Ein lokales Gateway kann diese fehlende Herkunft liefern, aber nur wenn seine Sitzungsaufzeichnungen nicht leicht verändert werden können und mit dem Remote-Ereignis korrelieren.

Bezeichnen Sie den Agenten nicht als Prüfer, wenn ein Mensch geklickt hat. Bezeichnen Sie den Menschen nicht als API-Aufrufer, wenn ein Dienstkonto die Anfrage ausgeführt hat. Erfassen Sie Delegation direkt: Vorschlagender P forderte Aktion A an, Prüfer H autorisierte Umfang S, Ausführer E wendete Ergebnis R an.

Funktionstrennung ist eine Upstream-Stärke, wenn der Dienst die Gruppenmitgliedschaft besitzt und Selbstgenehmigung verhindert. Lokale Genehmigung ist stärker bei Benutzeranwesenheit und Prozessherkunft. Wenn die Richtlinie beides verlangt, fordern Sie unterschiedliche Belege statt zweier Klicks derselben Person auf demselben Gerät.

Ein Ausfall muss einen dauerhaften Status hinterlassen

Genehmigungssysteme scheitern schwer, wenn sie Netzwerkfehler als Oberflächenprobleme behandeln. Die Aktion braucht einen dauerhaften Zustandsautomaten, der Prozessenden, verlorene Antworten und die Wiederherstellung des Dienstes übersteht.

Verwenden Sie explizite Zustände wie erstellt, lokal_genehmigt, übermittelt, upstream_ausstehend, wird_ausgeführt, erfolgreich, abgelehnt, abgelaufen und unbekannt. Endzustände müssen Endzustände bleiben. Speichern Sie jeden Übergang mit Aktionsdigest und Zeit. Ein lokaler Neustart kann die Beobachtung einer ausstehenden Upstream-Anfrage wieder aufnehmen, darf aber keine neue Änderung erzeugen, sofern die Wiederholungsregeln das nicht erlauben.

Die sicheren Ausfallregeln sind strikt:

  1. Ist die lokale Schranke nicht verfügbar, verlassen abgesicherte Aktionen den Rechner nicht.
  2. Ist die Upstream-Genehmigungsebene nicht verfügbar, bleiben Aktionen, die sie brauchen, ausstehend oder laufen ab.
  3. War die Genehmigung erfolgreich, der Ausführungsstatus aber unbekannt, fragen Sie vor einer Wiederholung nach Aktion oder Idempotenzkennung ab.
  4. Ändert sich die Ressource während der Genehmigungswartezeit, machen Sie die Entscheidung ungültig oder lassen Sie den Upstream-Dienst sie neu bewerten.
  5. Lehnt ein Prüfer ab oder widerruft er, brechen Sie jede ausstehende Ausführung ab und erfassen Sie, ob der Abbruch den Dienst erreicht hat.

Offen fehlschlagen ist keine Wiederherstellungsstrategie. Teams fügen manchmal eine Notfallumgehung hinzu, weil der Genehmigungsdienst im kritischen Pfad liegt. Eine Umgehung kann legitim sein, ist dann aber ein eigener privilegierter Vorgang mit benannter Person, engem Umfang, kurzer Dauer und eigener dauerhafter Aufzeichnung. Sie hinter „ohne Genehmigung wiederholen“ zu verstecken, zerstört die Kontrolle gerade dann, wenn Vorfälle die Prüfung besonders wichtig machen.

Lokale und Upstream-Ausfälle sind nicht symmetrisch. Eine lokale Schranke kann einen abgelehnten Versuch noch erfassen, während das Netzwerk ausgefallen ist. Der Provider kann keine Anfrage erfassen, die er nie erhalten hat. Umgekehrt kann der Provider eine Aktion abschließen, nachdem der lokale Prozess abgestürzt ist, sodass der lokale Eintrag bei übermittelt stehen bleibt. Der Abgleich muss akzeptieren, dass jede Seite unvollständiges Wissen hat.

Planen Sie den Abbruch vor dem Start. Fragen Sie, ob eine genehmigte, aber wartende Aktion zurückgezogen werden kann, ob eine Genehmigung abläuft, während die Ausführung läuft, und welcher Zustand gilt, wenn Ablehnung und Abschluss gleichzeitig eintreten. Für das Geschehene zählt der Status der Remote-Ressource. Der Genehmigungseintrag erklärt weiterhin, ob es autorisiert war.

Wiederholungen dürfen eine Genehmigung nicht zweimal ausgeben

Aufrufe sperren, solange der Vault gesperrt ist
Die Vault-Sperre blockiert jede Aktion, bis Secure Enclave und Touch ID den Zugriff freigeben.

Genehmigung und Ausführung sind getrennte Vorgänge, daher kann eine Wiederholung beides duplizieren. Das größte Risiko entsteht, wenn ein Client die Genehmigung erhält, eine Änderung sendet, die Antwort verliert und die Änderung erneut sendet.

RFC 9110 definiert eine idempotente Methode über die beabsichtigte Wirkung einer Wiederholung derselben Anfrage. Clients sollten eine nicht idempotente Anfrage nicht automatisch wiederholen, außer sie kennen die Semantik als idempotent oder können feststellen, dass die ursprüngliche Anfrage nicht angewendet wurde. Eine Genehmigung ändert diese Regel nicht. Wer einer Zahlung, einem Deployment oder einer Löschung zustimmt, stimmt nicht einer unbekannten Zahl von Versuchen zu.

Verwenden Sie einen Idempotenzschlüssel, der beim Erstellen der unveränderlichen Absicht erzeugt wird, nicht beim Beginn der Ausführung. Binden Sie ihn an den Nutzlastdigest und bewahren Sie ihn bei sicheren Wiederholungen. Der Upstream-Dienst sollte für einen doppelten Schlüssel das ursprüngliche Ergebnis liefern oder eine Statusabfrage anbieten. Bietet die API beides nicht, sollte das Gateway mehrdeutige Änderungen auf unbekannt setzen und einen Abgleich verlangen, statt zu raten.

Halten Sie Genehmigungskennungen und Idempotenzkennungen getrennt. Eine Genehmigung kann einen Ausführungsversuch, eine begrenzte Zahl identischer Wiederholungen oder eine Sitzungsfähigkeit autorisieren. Ein Idempotenzschlüssel teilt dem Dienst mit, welche Änderung genau eine Wirkung haben soll. Beide Bedeutungen in einem Token zu verbinden, erschwert Ablauf, Widerruf und Untersuchung.

Eine nützliche Testsequenz braucht kein Framework für Fehlerinjektion:

  1. Erstellen Sie eine genehmigte Aktion mit fester action_id, Digest und Idempotenzschlüssel.
  2. Senden Sie sie und trennen Sie dann die Clientverbindung, nachdem der Anfragetext den Client verlassen hat.
  3. Starten Sie den lokalen Agenten neu und lassen Sie die Wiederherstellung den gespeicherten Status prüfen.
  4. Prüfen Sie, dass er vor jeder Wiederholung den Provider abfragt.
  5. Bestätigen Sie genau einen maßgeblichen Ressourcenwechsel und eine verknüpfte Kette von Versuchsaufzeichnungen.

Führen Sie dieselbe Sequenz aus, wenn die Upstream-Genehmigung aussteht und wenn die Genehmigung während der Unterbrechung abläuft. Erzeugt ein Neustart eine zweite Abfrage mit einer neuen Kennung, hat Ihr Wiederherstellungspfad die Beweiskette bereits unterbrochen.

Bei APIs mit einem Bestätigungsendpunkt sollten Sie dessen Semantik prüfen. Ein Zwei-Aufruf-Muster wie vorbereiten und dann bestätigen ist nur sicher, wenn die Bestätigung ein unveränderliches Serverobjekt einmalig verbraucht oder einen Idempotenzschlüssel anwendet. Wiederholt confirm lediglich vom Client gelieferte Felder, kann es ein weiterer Änderungsendpunkt mit beruhigendem Namen sein.

Vollständige Audits verknüpfen Absicht, Entscheidung, Versuch und Ergebnis

Kein einzelnes Log ist vollständig, außer eine Komponente beobachtet die vorgeschlagene Absicht, die Genehmigungsentscheidung, den ausgehenden Versuch, die Annahme durch den Provider und den endgültigen Ressourcenstatus. In den meisten realen Systemen entsteht Vollständigkeit durch verknüpfte Aufzeichnungen über Vertrauensgrenzen hinweg.

Das lokale Audit sollte abgelehnte und abgelaufene Anfragen enthalten, weil sie Upstream nie erscheinen. Es sollte Prozess- und Sitzungsidentität, Version der angezeigten Zusammenfassung, kanonischen Nutzlastdigest, Zugangsdaten-Alias statt Geheimnis, menschliche Entscheidung, ausgehenden Versuch, Antwortcode und jede Unsicherheit erfassen. Das Upstream-Audit sollte maßgeblichen Prinzipal, Genehmigungsobjekt, Prüferidentität, Richtlinienversion, Ressourcenversion, Ausführungsereignis und Endstatus enthalten.

Nutzen Sie überall, wo Sie es steuern können, eine stabile action_id sowie verfügbare Provider-Ereignis-IDs. Verknüpfen Sie nicht nur über Zeitstempel. Uhrabweichungen, Bündelung und parallele Aufrufe erzeugen irgendwann eine falsche Zuordnung.

Diese Ereignisform reicht für eine erste Umsetzung:

{
  "event_id": "evt_01JQ7N2AZ8S4",
  "action_id": "act_01JQ7M6F4R2K",
  "phase": "upstream_result",
  "observed_by": "local_gateway",
  "principal": "service-account:deploy-agent",
  "approver": "org-user:release-reviewer",
  "payload_sha256": "98b0...e42c",
  "provider_event_id": "dep_91358",
  "outcome": "succeeded",
  "recorded_at": "2026-07-24T14:02:18Z"
}

Hash-Verkettung oder nur anhängbarer Speicher kann spätere Änderungen sichtbar machen, beweist aber nicht, dass ein ausgelassenes Ereignis stattgefunden hat. Abdeckungstests müssen die erwarteten Phasen für jede Aktionsklasse vergleichen. Ein Lesevorgang braucht möglicherweise Absicht, lokale Entscheidung, Versuch und Antwort. Ein geschütztes Deployment braucht zusätzlich Upstream ausstehend, Upstream-Entscheidung, Ausführung und endgültige Ressourcenversion.

Die AWS-CloudTrail-Dokumentation veranschaulicht die Provider-Seite von Identitätsbelegen: IAM-Identity-Center-Ereignisse können erkennen lassen, ob eine Anfrage von einem Benutzer, einer Rolle, einem föderierten Benutzer oder einem anderen Dienst stammt, und manche Ereignisse enthalten Identity-Center-Kennungen. Das sind nützliche maßgebliche Belege. Sie zeigen aber weiterhin nicht, welcher lokale Agentenprozess die Anfrage gebildet hat, sofern Sie keine Korrelationsdaten weitergeben und die lokale Aufzeichnung behalten.

Prüfen Sie Umgehungswege genauso streng wie den Hauptweg. Direkte Nutzung von Zugangsdaten, alternative CLI-Profile, ungeschützte API-Endpunkte, Administratorumgehungen und die Wiedergabe eines genehmigten Serverobjekts können ein perfektes Genehmigungslog bedeutungslos machen. Ihre Abdeckungsaussage sollte benennen, welche Kanäle die Schranke steuert, statt ohne Bestandsaufnahme zu behaupten, „alle Aktionen werden genehmigt“.

Zwei Schranken sind nur nützlich, wenn sie unabhängig bleiben

Zugangsdaten vom Agenten fernhalten
Sallyport fügt API- oder SSH-Zugangsdaten ein, während der Agent nur das Ergebnis erhält.

Kombinieren Sie lokale und Upstream-Genehmigung, wenn sie unterschiedliche Fakten oder unterschiedliche Personen steuern. Entfernen Sie eine davon, wenn sie nur dieselbe Entscheidung wiederholt und Ermüdung erzeugt.

Ein starkes mehrschichtiges Deployment könnte so funktionieren. Die lokale Schranke prüft den Agentenprozess und bittet den Entwickler, die Nutzung der Deployment-Fähigkeit für einen unveränderlichen Release-Kandidaten zu autorisieren. Sie übermittelt den Kandidaten, ohne die Zugangsdaten offenzulegen. Die Upstream-Umgebung bittet dann einen berechtigten Betriebsprüfer, die Beförderung auf Grundlage aktueller Prüfungen und des geschützten Umgebungsstatus zu genehmigen. Das endgültige Log verbindet beide Entscheidungen mit einer Aktion und einer bereitgestellten Version.

Ein schwaches mehrschichtiges Verfahren zeigt lokal „In Produktion bereitstellen?“, dann Upstream dieselben Worte derselben Person. Keine Abfrage enthält einen Digest oder eine Version, beide Genehmigungen gelten unbegrenzt und der Agent besitzt währenddessen den Token. Der zweite Klick erhöht die Latenz, ohne eine Vertrauensgrenze hinzuzufügen.

Die verbreitete Empfehlung „Immer so nah wie möglich an der Ressource genehmigen“ ist unvollständig. Sie folgt einem sinnvollen Durchsetzungsprinzip, ignoriert aber die Verwahrung von Fähigkeiten und die Identität lokaler Prozesse. Nutzen Sie Upstream-Genehmigung für die Wahrheit über die Ressource. Behalten Sie lokale Durchsetzung, wenn Sie steuern müssen, welcher Prozess eine Fähigkeit aufrufen darf, oder verhindern müssen, dass der Prozess das Geheimnis sieht.

Sallyport nimmt diese lokale Rolle bei HTTP-API- und SSH-Aktionen ein: Der Agent verbindet sich über seinen MCP-Shim, während Geheimnisse im verschlüsselten Vault bleiben und die App die Aktion ausführt. Seine Autorisierung pro Sitzung und die optionale Genehmigung bei jeder Nutzung ersetzen weder die geschützte Umgebung eines API-Providers noch einen Organisationsprüfer. Sie ergänzen die lokale Seite um Belege zur Prozess- und Zugangsdatenverwendung.

Bevor Sie zwei Schranken ausliefern, schreiben Sie für jede einen Satz: „Diese Schranke verhindert X, weil nur sie Y beobachtet und Z durchsetzt.“ Nennen die Sätze dasselbe X, Y und Z, fassen Sie zusammen. Kann eine Komponente die beschriebene Aktion nicht wirklich stoppen, beheben Sie den Durchsetzungspunkt, bevor Sie ihre Abfrage verschönern.

Ein Deployment-Ablauf zeigt die fehlenden Verknüpfungen

Betrachten Sie einen autonomen Programmieragenten, der Release 184 in eine Produktionsumgebung überführt, deren API bereits eine Prüfung verlangt. Der sichere Ablauf bewahrt eine Absicht über lokale Genehmigung, Upstream-Wartezeit, Ausführung und Abgleich hinweg.

Der Agent schlägt zunächst eine kanonische Anfrage vor, die Umgebung, Release-Version, erwartete aktuelle Version und Idempotenzschlüssel enthält. Das lokale Gateway vergibt action_id, erfasst Prozesssitzung und Nutzlastdigest und entscheidet, ob eine lokale Genehmigung nötig ist. Die Genehmigung autorisiert nur diesen Digest bis zu einer kurzen Ablaufzeit. Das Gateway fügt dann die Zugangsdaten ein und sendet die vorbereitete Anfrage.

Der Provider erstellt ein ausstehendes Deployment-Objekt. Sein Prüfer sieht aktuelle Prüfungen, die geschützte Umgebung, das genaue Release und die Organisationsidentität, die den Vorgang gestartet hat. Die Genehmigung verbraucht dieses ausstehende Objekt. Hat sich die Produktion gegenüber der erwarteten Version weiterentwickelt, lehnt der Provider ab oder eröffnet die Prüfung erneut, statt veraltete Einwilligung anzuwenden.

Unterbrechen Sie nun die Verbindung nach der Upstream-Genehmigung. Die lokale Seite darf keinen Erfolg melden und nicht sofort eine weitere Beförderung senden. Sie speichert unbekannt, fragt den Provider mit der ausstehenden Deployment-ID oder dem Idempotenzschlüssel ab und erfasst das maßgebliche Ergebnis. Meldet der Provider Erfolg, schließt das lokale Journal die bestehende Aktion ab. Hat der Provider keinen Eintrag, darf das Gateway unter dem ursprünglichen Idempotenzvertrag wiederholen, sofern die Genehmigung noch gültig ist.

Dieser Ablauf deckt Fragen auf, die Oberflächenprüfungen übersehen. Kann der Agent das Release nach dem lokalen Klick ändern? Kann ein anderer Client das ausstehende Deployment bestätigen? Widerruft eine Upstream-Ablehnung die lokale Autorisierung? Taucht eine Provider-Administratorumgehung im verknüpften Eintrag auf? Können Ermittler nachweisen, welcher Prozess das Release vorgeschlagen hat, ohne einer vom Agenten geschriebenen Bezeichnung zu vertrauen?

Wählen Sie die Architektur anhand dieser Antworten. Nutzen Sie nur lokale Genehmigung, wenn die lokale Nutzung einer Fähigkeit das gesamte Risiko ausmacht und die Remote-Aktion routinemäßig, begrenzt und wiederherstellbar ist. Nutzen Sie nur Upstream-Genehmigung, wenn vertrauenswürdige Clients bereits akzeptable Zugangsdaten besitzen und nur aktueller Ressourcenstatus oder Organisationsrolle entscheiden kann. Nutzen Sie beides, wenn die Verwahrung von Geheimnissen oder Prozessherkunft lokal wichtig ist und eine maßgebliche Prüfung des Remote-Wechsels wichtig ist.

Versprechen Sie nicht, dass zwei Genehmigungen eine Aktion sicher machen. Sie machen zwei Entscheidungen sichtbar. Sicherheit entsteht, indem jede Entscheidung an eine unveränderliche Absicht gebunden, an der Grenze durchgesetzt wird, die den Sachverhalt besitzt, Unsicherheit ohne doppelte Wirkungen behandelt wird und genügend verknüpfte Belege erhalten bleiben, um das Ergebnis zu rekonstruieren, wenn sich niemand mehr an die Abfrage erinnert.

FAQ

Ist eine Upstream-Genehmigung immer sicherer als eine lokale Genehmigung?

Nein. Die Upstream-Genehmigung kennt den Ressourcenstatus besser, kann aber erst beginnen, nachdem ein Agent bereits wiederverwendbare Zugangsdaten besitzt. Lokale Durchsetzung ist stärker, wenn es um Prozessidentität, Anwesenheit einer Person oder darum geht, Geheimnisse vom Agenten fernzuhalten.

Brauche ich zwei Genehmigungen, wenn eine API bereits nach einer Bestätigung fragt?

Nur wenn beide Genehmigungen unterschiedliche Dinge entscheiden. Behalten Sie beide bei, wenn die lokale Schranke die Nutzung einer Fähigkeit steuert und die Upstream-Schranke einen maßgeblichen Ressourcenwechsel oder einen separaten Organisationsprüfer steuert.

Was sollte eine lokale Genehmigungsabfrage anzeigen?

Zeigen Sie die beobachtete Prozessidentität, Sitzung, Ziel, Vorgang, Zugangsdaten-Alias, Zielressource, Nutzlastzusammenfassung, Umfang und Ablaufzeit. Kennzeichnen Sie Erklärungen des Agenten als Behauptungen, nicht als vertrauenswürdige Fakten.

Was sollte passieren, wenn der Upstream-Genehmigungsdienst nicht verfügbar ist?

Die Aktion sollte ausstehen oder ablaufen. Machen Sie aus einem Ausfall nie eine Genehmigung. Falls das Geschäft es verlangt, nutzen Sie einen separat autorisierten und vollständig protokollierten Notfallweg.

Kann ich eine Genehmigung für API-Wiederholungen verwenden?

Ja, aber nur innerhalb eines klar definierten Umfangs, der dieselbe unveränderliche Nutzlast und denselben Idempotenzschlüssel bindet. Ist der Ausführungsstatus unbekannt, fragen Sie vor einem erneuten Änderungsversuch beim Provider nach.

Wie lange sollte eine Genehmigung gültig bleiben?

Richten Sie die Ablaufzeit danach aus, wie schnell sich die geprüften Fakten ändern und wie lange ein berechtigter Prüfer tatsächlich braucht. Jede Änderung an Nutzlast, Zielversion, Zugangsdaten oder Prüferberechtigung sollte die alte Entscheidung ungültig machen.

Wie verknüpfe ich lokale und Upstream-Audit-Logs?

Erstellen Sie vor der Genehmigung eine stabile Aktionskennung und übermitteln Sie sie, wenn möglich, über vom Provider unterstützte Metadaten. Speichern Sie Provider-Ereignis-IDs und Nutzlasthashes lokal. Zeitstempel allein sind keine verlässliche Verknüpfung.

Identifiziert eine biometrische Bestätigung den Upstream-Prüfer?

Sie bestätigt die lokale Anwesenheit einer Person entsprechend dem Gerätemechanismus, nicht deren Organisationsrolle beim API-Provider. Erfassen Sie lokale und Upstream-Identitäten getrennt, statt eine als Beleg für die andere zu behandeln.

Sollten schreibgeschützte API-Aufrufe eine Genehmigung erfordern?

Manche Lesezugriffe legen sensible Daten offen. Deshalb entscheidet das HTTP-Verb allein nicht. Nutzen Sie Datenklassifizierung, Umfang der Zugangsdaten, Herkunft des Aufrufers und Menge, um Sitzungsfreigabe, Freigabe pro Nutzung oder keine menschliche Abfrage zu wählen.

Wie lässt sich ein Genehmigungsdesign am schnellsten testen?

Trennen Sie den Client, nachdem er eine genehmigte Änderung gesendet hat, aber bevor er die Antwort erhält. Starten Sie ihn neu und prüfen Sie, dass die Wiederherstellung den maßgeblichen Status abfragt, die ursprünglichen Kennungen bewahrt und nur eine Ressourcenänderung erzeugt.

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