8 Min. Lesezeit

Secret Manager für KI-Agenten: Speicherung ist keine Aktionskontrolle

Ein Secret Manager für KI-Agenten schützt die Speicherung. Genehmigte HTTP- und SSH-Aktionen halten Credentials aus dem Agentenkontext heraus und protokollieren jede Aktion.

Secret Manager für KI-Agenten: Speicherung ist keine Aktionskontrolle

Ein Secret Manager für KI-Agenten ist notwendig, löst aber nicht den gefährlichsten Teil: Was passiert, nachdem ein Agent ein Credential anfordert? Wenn der Manager den Klartext an den Agentenprozess zurückgibt, hat das Geheimnis die Grenze, die du schützen wolltest, bereits überschritten.

Diese Unterscheidung klingt kleinlich, bis ein Agent einer manipulierten Anweisung folgt, ein unerwartetes Tool aufruft, eine Diagnose-Datei schreibt oder den falschen Host kontaktiert. Ein Tresor kann ein Token jahrelang verschlüsselt halten und einen großen Teil dieser Arbeit mit einem einzigen Abruf wieder zunichtemachen. Bei Agenten ist es sicherer, das Credential in einer vertrauenswürdigen Ausführungskomponente zu belassen und den Agenten stattdessen eine authentifizierte Aktion anfordern zu lassen.

Ein Tresor schützt die Speicherung, nicht die Nutzung eines Credentials

Ein herkömmlicher Secret Manager beantwortet eine Speicherfrage: Wer darf diesen Wert abrufen? Autonome Agenten schaffen zusätzlich eine Nutzungsfrage: Darf dieser Prozess genau diese Aktion mit diesem Wert jetzt und gegen dieses Ziel ausführen?

Die meisten Teams begannen mit sinnvollen Gewohnheiten. Sie entfernten Tokens aus Repositorys, verschlüsselten sie im Ruhezustand, tauschten sie nach einem versehentlichen Commit aus und fügten sie in eine Build-Umgebung ein. Für die gewöhnliche Anwendungsbereitstellung sind diese Maßnahmen gut geeignet. Ein Build-Job hat meist ein festes Skript, eine begrenzte Laufzeit und eine bekannte Menge von Endpunkten. Seine Umgebung kann trotzdem zu weit gefasst sein, aber ein Mensch hat die Befehle vor dem Start des Jobs geschrieben.

Ein Agent funktioniert anders. Er erzeugt Befehle, wählt Tools aus, folgt Aufgabentexten, liest Dateien anderer Personen und kann seinen eigenen Plan ändern. Wenn du ihm DEPLOY_TOKEN als Umgebungsvariable gibst, kann jeder von ihm gestartete Unterprozess das Token lesen. Dasselbe gilt für einen Shell-Befehl, der die Umgebung ausgibt, einen Debugger, einen Installations-Hook eines Pakets oder ein nicht vertrauenswürdiges Tool, das der Agent auswählt, weil ein Dokument es dazu auffordert.

Ein Secret Manager ist in dieser Situation nicht gescheitert. Er hat genau getan, wofür er konfiguriert war: Er hat ein Geheimnis an einen autorisierten Workload geliefert. Das Berechtigungsmodell war für einen Akteur, der seine nächste Operation selbst wählen kann, einfach zu grob.

Halte diese beiden Berechtigungen getrennt:

  • Die Berechtigung, ein Credential über eine stabile Referenz zu identifizieren.
  • Die Berechtigung, dieses Credential für eine beschriebene ausgehende Aktion zu verwenden.

Die erste Berechtigung kann für einen Agenten sicher sein. Die zweite braucht Einschränkungen, die zur Aktion passen. Eine Anfrage wie POST https://deploy.example.internal/releases kann ein Prüfer bewerten. Eine Anfrage wie read production token übergibt dagegen ein Gut, dessen spätere Verwendung zum Zeitpunkt des Abrufs nicht mehr beurteilt werden kann.

Das korrigiert auch eine verbreitete, aber wenig hilfreiche Behauptung: «Der Agent kann ohnehin Code ausführen, also ändert das Verbergen des Geheimnisses nichts.» Codeausführung auf einem Entwicklerrechner ist bereits problematisch. Ein von dort kopiertes Bearer-Token schafft jedoch ein zweites Problem: Es kann den Rechner verlassen, nach dem Ende der Sitzung weiterbestehen und von einem völlig anderen Computer aus funktionieren. Das Geheimnis aus dem Prozess herauszuhalten beseitigt nicht jedes Risiko. Es entfernt eine portable und dauerhafte Zugriffsform, die Angreifer besonders attraktiv finden.

RFC 6750 macht das für OAuth-Bearer-Tokens deutlich. Die Definition besagt, dass jede Partei, die ein Bearer-Token besitzt, es verwenden kann. Das Protokoll fragt nicht, ob diese Partei dein genehmigter Agent, ein bösartiges Plugin oder jemand ist, der eine Logdatei gefunden hat. Bearer-Tokens wie gewöhnliche Tool-Ausgaben zu behandeln, ignoriert ihre entscheidende Eigenschaft.

Lesezugriff macht Anweisungsfehler zu Credential-Leaks

Ein Agent mit Zugriff auf Geheimnisse im Klartext kann ein Credential auch dann leaken, wenn er es nicht absichtlich exfiltrieren will. Der gefährliche Weg wirkt oft ganz normal, bis zum letzten Schritt.

Stell dir vor, ein Agent soll untersuchen, warum eine Deployment-API eine Veröffentlichung abgelehnt hat. Er liest ein Repository-Dokument, das zum Erstellen eines Support-Bundles auffordert. Das Bundle-Skript führt env aus, kopiert Konfigurationsdateien und archiviert die Ausgabe. Der Agent erstellt das Archiv korrekt und hängt es an ein Ticket an oder lädt es in ein Chat-System hoch. Das Token wurde nie im Terminal angezeigt, gelangte aber durch die Umgebung, das Archiv und das Ticket in jedes Backup- oder Benachrichtigungssystem, das an dieses Ticket gekoppelt ist.

Das ist nicht bloß Prompt Injection. Prompt Injection ist ein möglicher Weg zur schädlichen Aktion, aber ein kopiertes Credential erzeugt auch nach dem Verschwinden der ursprünglichen Anweisung einen eigenen Schadensradius. Ein späterer Leser des Tickets kann es herunterladen. Ein automatischer Scanner kann es indexieren. Ein Empfänger kann es lange nach Ende des Agentenlaufs wiederverwenden.

Dasselbe Problem tritt in unauffälligeren Formen auf:

  • Ein ausführlicher HTTP-Client gibt bei einem erneuten Versuch einen Authorization-Header aus.
  • Eine Shell-History-Datei speichert ein Token, das als Kommandozeilenargument übergeben wurde.
  • Ein Test-Fixture zeichnet einen Request-Header auf und wird committed.
  • Ein Unterprozess übernimmt eine Umgebungsvariable, die er nie benötigt hat.
  • Ein Modell nimmt ein Geheimnis in seine Erklärung auf, weil es in einer Tool-Ausgabe auftauchte.

Die verbreitete Antwort lautet Redaction, also das nachträgliche Schwärzen. Das hilft nach einem Fehler, kann aber nicht beweisen, dass jeder Ausgabeweg, jedes Archivformat, jeder Trace, jeder Unterprozess und jeder entfernte Dienst den Wert korrekt behandelt hat. Bei unbekannten Geheimnisformaten und über mehrere Felder verteilten Tokens versagt dieser Ansatz ebenfalls. Mache Redaction nicht zur primären Schutzmauer für Credentials, die ein Agent niemals lesen sollte.

Eine bessere Anordnung beschränkt die Eingaben des Agenten. Der Agent übermittelt eine Absicht ohne Credential-Material: HTTP-Methode, erlaubte URL, Request-Body und Credential-Referenz. Eine vertrauenswürdige Komponente prüft die Anfrage, fügt intern die Authentifizierungsdaten hinzu, sendet die Anfrage und gibt eine Antwort zurück, aus der sensible Header entfernt wurden.

Diese Grenze liefert auch für die Reaktion auf Vorfälle eine bessere Grundlage. Wenn sich ein Agent schlecht verhält, widerrufst du seine Sitzung oder verweigerst nachfolgende Aktionen. Wenn du nach dem Lauf eine bösartige Anweisung entdeckst, musst du nicht zunächst annehmen, dass jedes Transkript, jede temporäre Datei und jedes entfernte Artefakt jetzt ein Produktions-Token enthält.

Aktionsausführung ist eine andere Schnittstelle als Credential-Abruf

Eine Ausführungsgrenze sollte eine Operation akzeptieren. Sie sollte dem Agenten nicht einen undurchsichtigen Wert übergeben und hoffen, dass er vorsichtig damit umgeht. Genau diese Unterscheidung wird am häufigsten verwischt. Wenn sie falsch umgesetzt wird, wird der Tresor zu einem Automaten für Credentials.

Für HTTP muss der Agent möglicherweise eine Anfrage wie diese formulieren:

{
  "credential": "release-api",
  "method": "POST",
  "url": "https://deploy.example.internal/releases",
  "headers": {
    "Content-Type": "application/json"
  },
  "body": {
    "version": "2025.03.8",
    "environment": "staging"
  }
}

Der Executor löst release-api in seinem geschützten Tresor auf, fügt das passende Authentifizierungsschema ein und sendet die Anfrage. Der Agent kann ein Ergebnis in dieser Form erhalten:

{
  "status": 201,
  "headers": {
    "content-type": "application/json"
  },
  "body": {
    "release_id": "rel_4821",
    "state": "queued"
  }
}

Die Antwort sollte weder den eingefügten Authorization-Header noch einen kopierten Credential-Wert oder Transportdiagnosen enthalten, die ihn offenlegen. Das klingt selbstverständlich, doch Grenzdesigns scheitern, wenn Entwickler Request- und Response-Logging als harmlose Infrastruktur behandeln.

Bei SSH sollte der Agent Host, Konto, Befehl und gegebenenfalls eine Credential-Referenz übermitteln. Der Executor verwendet den privaten Schlüssel während des SSH-Authentifizierungsaustauschs und gibt Standardausgabe, Standardfehler und Exit-Status zurück. Der Agent erhält weder einen PEM-Block noch einen Agent-Socket, den er an anderer Stelle wiederverwenden kann.

Verwechsle das nicht mit einem allgemeinen Proxy. Ein Proxy leitet beliebigen Datenverkehr weiter und kann ihn prüfen oder verändern. Ein Aktions-Executor hat eine engere Aufgabe: Er besitzt die Credentials, führt benannte HTTP- und SSH-Operationen aus, protokolliert die Entscheidung und gibt ein begrenztes Ergebnis zurück. Diese Beschränkung ist ein Vorteil. Jede zusätzliche Funktion, die ein weiteres Protokoll oder einen allgemeinen Bypass akzeptiert, gibt dem Agenten mehr Möglichkeiten, Berechtigungen in eine nicht überprüfbare Anfrage zu verwandeln.

Auch die Anfrage-Schnittstelle braucht klare Grenzen. Eine Credential-Referenz allein reicht nicht. Wenn release-api sich bei vielen Hosts authentifizieren oder eine beliebige URL akzeptieren kann, kann der Agent ein gültiges Credential an ein vom Angreifer kontrolliertes Ziel oder einen weniger geschützten internen Dienst richten. Binde Credentials an das vorgesehene Authentifizierungsschema und an bestimmte Ziele. Lehne URL-Tricks ab, etwa unerwartete Userinfo-Abschnitte, Weiterleitungen zu neuen Hosts oder Hosts, die dem genehmigten nur ähneln.

Der Executor muss außerdem entscheiden, was er zurückgibt. Eine vollständige API-Antwort kann Nutzerdaten, von einem nachgelagerten Dienst ausgestellte Zugriffstokens oder Konfigurationsdetails enthalten, die nicht erneut in den Modellkontext gelangen sollten. Wenn du nur die für die nächste Operation benötigten Felder zurückgibst, wird der Agent oft zuverlässiger und sicherer.

SSH braucht Befehlskontrolle, nicht nur den Schutz privater Schlüssel

Einen privaten SSH-Schlüssel zu verbergen hilft, macht beliebige entfernte Befehle aber nicht sicher. Die Authentifizierung teilt einem Server mit, wer sich verbindet. Sie beschränkt nicht, was dieses Konto nach dem Start der Shell tun darf.

RFC 4252 beschreibt die Public-Key-Authentifizierung von SSH als Signatur über Austauschdaten. Der private Schlüssel bleibt während dieses Austauschs geheim. Deshalb gilt SSH oft als sicherer als ein API-Token in einer Umgebungsvariable. In einem engen Sinn stimmt das: Der Client weist den Besitz nach, statt den privaten Schlüssel über das Netzwerk zu senden. Ein Prozess, der einen SSH-Agenten zum Signieren auffordern kann, erhält jedoch weiterhin Zugang zu Systemen, die diesem Schlüssel vertrauen.

SSH-Agent-Weiterleitung verdient eine klare Einordnung. Sie erlaubt einem entfernten Server, während der Verbindung deinen lokalen Authentifizierungsagenten zu verwenden. Der Server erhält zwar nicht die Datei mit dem privaten Schlüssel, kann über den weitergeleiteten Socket aber Signaturen anfordern. Das ist nur dann vertretbar, wenn du diesem entfernten Rechner praktisch die Möglichkeit anvertraust, sich während der Weiterleitung als du zu authentifizieren. Für einen autonomen Agenten, der selbst entscheiden kann, wohin er sich verbindet und welchen Einrichtungsvorgang er startet, ist das keine saubere Grenze.

Eine sicherere SSH-Aktionsschnittstelle benennt Ziel und Befehl ausdrücklich. Beides sollte protokolliert werden, denn ssh deploy@host "./deploy staging" und ssh deploy@host "cat /etc/shadow" lösen zwar dasselbe Authentifizierungsereignis aus, haben aber völlig unterschiedliche Folgen.

Kontrollen auf der entfernten Seite bleiben notwendig. Verwende getrennte Konten für getrennte Aufgaben. Gib einem Deployment-Konto Zugriff auf Deployment-Verzeichnisse statt Administratorrechte. Wenn der Server es unterstützt, richte für Automatisierungs-Credentials erzwungene Befehle oder eingeschränkte Befehls-Wrapper ein. Verwende nicht einfach einen persönlichen gemeinsamen Administratorschlüssel für Agentenaufgaben, nur weil er bereits auf einem Arbeitsplatz vorhanden ist.

Eine praktische SSH-Anfrage kann so klein sein:

{
  "credential": "staging-deployer",
  "host": "staging-runner.internal",
  "user": "deploy",
  "command": "./release apply 2025.03.8",
  "timeout_seconds": 120
}

Diese Anfrage gibt einem Prüfer etwas Konkretes zur Genehmigung. Später liefert sie außerdem eine konkrete Grundlage für das Audit. Wenn der Agent eine interaktive Shell benötigt, halte inne und frage nach dem Grund. Interaktive Shells sind nützlich, wenn Menschen ein System reparieren. Für einen Agenten sind sie ein schlechter Standard, weil aus einer begrenzten Aktion eine offene Sitzung wird, in der jeder weitere Befehl dieselbe Berechtigung erbt.

Auch die Host-Prüfung ist wichtig. Ein Executor sollte bekannte Hosts überprüfen, statt jeden präsentierten Host-Schlüssel zu akzeptieren, nur weil ein Modell aufgefordert wurde, eine Verbindung herzustellen. Kann der Agent die Host-Prüfung unterdrücken, kann ein Angreifer im Netzwerk Befehle empfangen, Ausgaben beobachten und möglicherweise Daten abfangen, die der Agent nach der Anmeldung sendet.

Eine Genehmigung sollte Prozess und Aktionsumfang nennen

Läufe und Aufrufe sehen
Sitzungen und Aktivitätsprotokolle zeigen Agentenläufe und einzelne Aufrufe in einem gemeinsamen Audit-Log.

Ein Genehmigungsbutton ist schwach, wenn er dir nur sagt, dass «ein Agent» Zugriff angefordert hat. Du musst wissen, welcher lokale Prozess die Anfrage gestellt hat, welche signierte Autorität ihn gestartet hat und ob die Genehmigung für diesen Lauf oder für jeden künftigen Lauf gilt.

Genehmigungen pro Aufruf klingen am sichersten, deshalb beginnen Teams oft damit. Dann führt der Agent eine lange Folge harmloser Lesevorgänge, Statusprüfungen und Folgeaufrufe aus. Die beobachtende Person sieht eine Wand nahezu identischer Dialoge und beginnt, im Rhythmus zu bestätigen. Das ist verständlich und macht die geplante Kontrolle wirkungslos.

Eine Sitzungsgenehmigung funktioniert bei gewöhnlichen Aufgaben besser, wenn sie eine Genehmigung an die Lebensdauer eines einzelnen Agentenprozesses bindet. Die Person genehmigt einen bestimmten Lauf, nachdem sie seine Identität gesehen hat. Der Agent kann die erwartete Folge ausführen, bis er beendet wird. Ein neuer Prozess erhält eine neue Entscheidung. So wird die Wirkung eines neu gestarteten oder ersetzten Prozesses begrenzt, der zufällig dasselbe Projektverzeichnis verwendet.

Genehmigungen pro Aufruf solltest du für Credentials reservieren, deren Verwendung irreversible oder teure Folgen hat. Produktions-Release-Credentials, Tokens zum Löschen von Konten oder eine SSH-Identität mit Zugriff auf sensible Systeme gehören dazu. Nur lesende Statusabfragen normalerweise nicht.

Der Umfang einer Genehmigung sollte vier Fragen in einfacher Sprache beantworten:

  1. Welche Code-Signaturautorität oder welche ausführbare Datei hat diese Anfrage ausgelöst?
  2. Welche Credential-Referenz wird verwendet?
  3. Welches Ziel oder welcher Host erhält die Aktion?
  4. Erlischt die Entscheidung beim Beenden dieses Prozesses, oder braucht dieser Aufruf eine eigene Bestätigung?

Vermeide eine Richtliniensprache, wenn du nicht über Mitarbeitende verfügst, die sie pflegen, und Tests hast, die ihre Wirkung belegen. Richtlinien-Engines wirken auf Entwickler attraktiv, weil sie für jede Situation eine präzise Antwort versprechen. In der Praxis wird ein Stapel von Regeln zu einem undokumentierten Autorisierungsprogramm. Sobald es die Arbeit blockiert, gewähren Teams eine weitreichende Ausnahme. Eine kleine, sichtbare Gruppe von Sperren ist leichter zu prüfen und schwerer versehentlich zu schwächen.

Sallyport verwendet eine feste Entscheidungskette: Ein gesperrter Tresor verweigert alle Aktionen, ein neuer Agentenprozess benötigt standardmäßig eine Sitzungsgenehmigung und ausgewählte Credentials können eine Genehmigung bei jeder Nutzung verlangen. Das Modell bleibt absichtlich klein, weil eine Grenze für Agenten-Credentials den Genehmigungsstatus sichtbar machen sollte, statt Administratoren dazu zu zwingen, eine Autorisierungssyntax zu debuggen.

Ein Audit-Trail muss die Frage nach dem Lauf beantworten

Tokens aus Agenten heraushalten
Sallyport führt HTTP-Anfragen aus seinem verschlüsselten Tresor aus und gibt Ergebnisse zurück, ohne API-Schlüssel offenzulegen.

Du brauchst zwei Ansichten der Agentenaktivität: eine für den Lauf und eine für jeden Aufruf mit Credentials. Ein Sitzungseintrag beantwortet, wer den Agenten ausgeführt hat und wann seine Berechtigung endete. Ein Aktionseintrag beantwortet, welches Ziel, welche Methode oder welcher Befehl, welche Credential-Referenz, welche Entscheidung und welches Ergebnis vorlagen.

Teams protokollieren oft nur ein Terminal-Transkript. Das reicht nicht. Ein Transkript zeigt, was der Agent ausgegeben hat, nicht unbedingt, was ein Executor gesendet hat. Hintergrundaufrufe können fehlen, Ausgaben können verändert sein oder Geheimnisse enthalten, wenn der Agent Zugriff auf sie hatte. Umgekehrt kann ein rohes Paket- oder Request-Log zu viele sensible Daten speichern, um sicher aufbewahrt werden zu können.

Protokolliere den Entscheidungspunkt, nicht jedes Byte. Erfasse bei HTTP normalisierte Methode, Host, Pfad, Credential-Referenz, Antwortstatus, Zeitpunkt, Sitzungsidentität und Genehmigungsergebnis. Wenn du eine Zuordnung brauchst, ohne Kundendaten zu behalten, speichere einen Digest des Request-Bodys oder eine knappe Zusammenfassung. Bei SSH gehören verifizierter Host, entfernter Benutzer, Befehl, Exit-Status und dieselben Sitzungs- und Genehmigungsfelder ins Protokoll.

Ein Eintrag sollte folgende Frage beantworten können: «Welcher autorisierte Prozess hat das Deployment-Credential für welche Operation verwendet, und hat ein Mensch diese Nutzung genehmigt?» Kann er das nicht, hilft er vielleicht beim Debugging, nach einem Vorfall aber kaum.

Manipulationsnachweise erhöhen den Wert dieses Eintrags. Eine gewöhnliche Logdatei auf demselben Rechner kann von einem Prozess mit ausreichendem lokalem Zugriff verändert werden. Eine Hash-Kette verknüpft jedes Ereignis mit dem vorherigen. Wird ein früherer Eintrag entfernt oder verändert, schlägt die spätere Prüfung fehl. Verschlüsselung schützt den Inhalt, während die Verkettung zeigt, ob sich die Reihenfolge verändert hat.

Sallyport legt Sitzungs- und Aktionsprotokolle in einem verschlüsselten, hashverketteten Audit-Log ab. sp audit verify kann die Kette offline über dem Chiffretext prüfen, ohne einen Tresorschlüssel zu benötigen. Diese Trennung ist bei Untersuchungen wichtig: Ein Prüfer kann die Integrität des Logs testen, ohne Zugriff auf die vom Tresor geschützten Credentials oder Anfrageinhalte zu erhalten.

Eine Kette macht einen kompromittierten Endpunkt nicht magisch vertrauenswürdig. Ein Angreifer, der die laufende Anwendung kontrolliert, kann weiterhin Aktionen starten, bevor du reagierst. Wer schon vor dem Schreiben eines Logeintrags Kontrolle hatte, kann außerdem beeinflussen, was aufgezeichnet wird. Die Kette liefert starke Belege über die gespeicherte Historie. Kombiniere sie mit schnellem Widerruf, geschütztem lokalem Speicher und Logs auf der entfernten Seite, wenn du ein vollständigeres Bild des Vorfalls brauchst.

Das Problem beginnt, wenn der Agent einen bequemen Bypass erhält

Die gefährlichsten Designs beginnen meist mit einer verständlichen Ausnahme. Jemand sagt, das Gateway sei für eine Integration zu restriktiv, also erhält der Agent einen allgemeinen Shell-Befehl mit einem Token in seiner Umgebung. Oder ein Deployment-Tool braucht SSH, weshalb das Team Weiterleitung aktiviert, statt eine konkrete SSH-Aktion zu definieren. Oder ein Entwickler fügt einen Debug-Endpunkt hinzu, der Header zurückgibt, weil das Testen dadurch einfacher wird.

Jede Ausnahme löst ein lokales Problem und öffnet den Credential-Abruf unter einem anderen Namen erneut.

Betrachte einen typischen Ablauf. Ein Coding-Agent hat ein Service-Token in seiner Umgebung, damit er einen Release-Befehl ausführen kann. Der Agent liest einen Kommentar zu einem Pull Request, der eine Untersuchung eines fehlgeschlagenen Releases verlangt. Ein Hilfsskript im Repository ruft einen Diagnosebefehl auf. Dieser exportiert Umgebungsvariablen in ein Support-Archiv. Der Agent lädt das Archiv in ein Ticket-System eines Drittanbieters hoch, weil der Kommentar um ein Ticket gebeten hat.

Kein Angreifer musste den Tokenwert vorher kennen. Es reichte, Text zu beeinflussen, den der Agent als Anweisung behandelt, und ihn auf einen Tool-Pfad zu lenken, der geerbten Zustand offenlegt. Der Widerruf der Agentensitzung nach der Entdeckung entfernt das Archiv nicht. Ein Austausch des Tokens wird zwingend, und das Team muss nun herausfinden, wohin das Archiv überall gelangt ist.

Ein kontrollierter Executor verändert diese Abfolge. Das Hilfsskript kann weiterhin laufen, und der Agent kann den Release-Status weiterhin über eine genehmigte API-Aktion abrufen. Er kann das Token jedoch nicht aus seiner Umgebung lesen, weil es dort nie abgelegt wurde. Versucht das Skript, einen neuen authentifizierten Aufruf zu starten, protokolliert der Executor ihn und wendet die Sitzungs- oder Aufrufentscheidung an. Im Support-Archiv gibt es weniger zu stehlen.

Gewähre keinen Bypass, nur weil ein Agent behauptet, ein Tool für die Aufgabe zu benötigen. Frage nach der kleinsten Operation, die das Tool braucht. Muss es einen einzelnen API-Endpunkt aufrufen, stelle genau diese Operation bereit. Benötigt es einen Deployment-Befehl, stelle genau diesen Befehl bereit. Ist der Bedarf tatsächlich weit gefasst, behandle die Anfrage als weitreichende Berechtigung und verlange, dass ein Mensch einen separaten, bewusst gestarteten Ablauf verwendet.

Baue die Grenze um relevante Aktionen herum

SSH ohne Schlüsselweitergabe ausführen
Der mitgelieferte Helfer sp-ssh authentifiziert sich mit im Tresor gespeicherten SSH-Schlüsseln, statt die Schlüssel an Agenten zu übergeben.

Beginne mit den Credentials, deren Verlust eine dringende Rotation erzwingen oder eine bedeutende Änderung in der Produktion ermöglichen würde. Du musst nicht am ersten Tag jedes Entwicklungs-Token verschieben. Eine teilweise Grenze um die gefährlichsten Credentials ist besser als eine vollständige Migration, die niemand beendet.

Erfasse zuerst, wie Agenten heute Berechtigungen erhalten. Durchsuche Startskripte für Agenten, Shell-Konfigurationen, Dateien zur Übergabe aus CI-Systemen, Tool-Konfigurationen, lokale .env-Dateien und Befehls-Wrapper. Markiere jede Stelle, die einem Agenten ein Token, Passwort, einen privaten Schlüssel, eine Cloud-Sitzung oder einen weitergeleiteten Authentifizierungssocket gibt. Diese Bestandsaufnahme zeigt oft, dass der Agent durch geerbte Entwicklereinstellungen mehr Berechtigungen besitzt als beabsichtigt.

Ersetze anschließend die Klartextübergabe durch Aktionsanfragen. Definiere Credential-Referenzen nach ihrem Zweck, nicht nach einer Person oder einer vagen Umgebungsbezeichnung. staging-deployer erklärt mehr als shared-key-2. Erstelle getrennte Referenzen, wenn zwei Verwendungen unterschiedliche Genehmigungsanforderungen oder Ziele haben.

Lege für jede Referenz fest, bevor du sie automatisierst:

  • Welche HTTP-Hosts, Methoden und Pfade oder welche SSH-Hosts, Benutzer und Befehle passen zu ihrem Zweck?
  • Braucht ein neuer Agentenprozess eine ausdrückliche Genehmigung, bevor er sie verwenden darf?
  • Muss jede Nutzung bestätigt werden, weil die Aktion zerstörerisch oder schwer umkehrbar ist?
  • Welche Ergebnisfelder braucht der Agent, um weiterzuarbeiten?
  • Welche Einträge erlauben später eine Erklärung der Aktion, ohne Geheimnismaterial zu speichern?

Teste Ablehnungen genauso sorgfältig wie den Erfolgsfall. Starte einen Agentenprozess ohne Genehmigung und bestätige, dass er nicht handeln kann. Versuche einen ähnlich aussehenden Hostnamen, eine Weiterleitung zu einem anderen Host, einen Befehl außerhalb des erwarteten Deployment-Pfads und den Versuch, die Credential-Referenz so auszugeben, als wäre sie ein Wert. Prüfe, dass eine widerrufene Sitzung keine weiteren Anfragen ausführen kann.

Teste auch die menschliche Seite. Wenn Genehmigungen so häufig eintreffen, dass du sie nicht mehr liest, sind die Umfänge falsch. Wenn ein Dialog nicht zeigt, welcher Prozess die Anfrage gestellt hat, ist deine Prozessidentität zu schwach. Wenn der Agent normale Aufgaben nicht erledigen kann, ohne wiederholt nach einem allgemeinen Bypass zu fragen, braucht die Aktionsschnittstelle eine weitere sorgfältig begrenzte Operation, keine Geheimnisausgabe.

Der Maßstab für Erfolg ist einfach: Ein Agent kann genehmigte Aufgaben erledigen, aber ein Transkript, Unterprozess, Plugin oder eine manipulierte Anweisung kann diese Arbeit nicht in den Besitz eines wiederverwendbaren Credentials verwandeln. Arbeite auf diesen Maßstab hin, bevor das nächste dringende Deployment eine bequeme Ausnahme harmlos erscheinen lässt.

FAQ

Warum kann ich meinem KI-Agenten nicht einfach Lesezugriff auf einen Secret Manager geben?

Ein Secret Manager schützt Anmeldedaten im Ruhezustand und steuert, wer sie abrufen darf. Das reicht nicht mehr aus, sobald der Agent den Klartextwert abrufen kann. Dann kann der Prozess den Wert an ein anderes Tool weitergeben, ausgeben, in eine Datei schreiben oder an einen unerwünschten Host senden. Für autonome Aufgaben ist eine Grenze besser, die die genehmigte Anfrage ausführt, ohne die Anmeldedaten preiszugeben.

Was bedeutet Credential Injection für KI-Agenten?

Credential Injection bedeutet, dass eine vertrauenswürdige lokale Komponente die nötigen Authentifizierungsdaten erst nach der Genehmigung einer Aktion in eine Anfrage einfügt. Der Agent liefert Methode, Ziel und Anfrageangaben, erhält aber weder Bearer-Token noch Passwort, privaten Schlüssel oder benutzerdefinierten Authentifizierungs-Header. So gibt es weniger Orte, an denen ein kopiertes Geheimnis nach außen gelangen kann.

Ist es sicher, einen Agenten API-Aufrufe mit eingefügten Anmeldedaten ausführen zu lassen?

Das kann sicher sein, wenn die genehmigende Komponente vor dem Verbindungsaufbau das genaue Ziel, die Authentifizierungsmethode und die Form der Anfrage prüft. Ein Gateway, bei dem der Agent lediglich einen Anmeldenamen nennen darf, lässt weiterhin Verwechslungen bei Hosts und zu weit gefasste Aufrufe zu. Das Genehmigungsprotokoll sollte zeigen, wohin die Anfrage ging und welche Berechtigung der Prozess verwendet hat.

Schützt SSH-Agent-Weiterleitung private Schlüssel vor KI-Agenten?

SSH-Agent-Weiterleitung löst ein anderes Problem: Ein entfernter Host darf deinen lokalen Agenten auffordern, Authentifizierungsanfragen zu signieren. Ist dieser Host kompromittiert oder nicht vertrauenswürdig, kann er den weitergeleiteten Agenten nutzen, solange die Verbindung besteht. Behandle die Weiterleitung nicht als allgemeine Genehmigungsmechanik für autonome Agenten.

Sind API-Schlüssel und SSH-Schlüssel unterschiedliche Sicherheitsprobleme?

Ein API-Token ist oft ein Bearer-Credential. Sein Besitz reicht also zur Nutzung aus. Ein privater SSH-Schlüssel weist den Besitz normalerweise durch Signaturen nach, doch ein Prozess mit Zugriff auf den Schlüssel kann sich weiterhin bei erlaubten oder unerlaubten Zielen als du authentifizieren. Die Formate unterscheiden sich, die Notwendigkeit, jede Aktion zu kontrollieren, bleibt bestehen.

Muss jeder Tool-Aufruf eines KI-Agenten von einem Menschen genehmigt werden?

Genehmige die Identität des Agentenprozesses und den Umfang seiner Sitzung. Für Anmeldedaten, die erheblichen Schaden verursachen können, verlangst du zusätzlich eine Bestätigung. Wiederholte Abfragen für harmlose Anfragen führen dazu, dass Menschen nur noch klicken. Eine dauerhafte Genehmigung für eine vage Agentenidentität gibt dagegen zu viel Macht frei.

Was sollte ich protokollieren, wenn ein KI-Agent Anmeldedaten verwendet?

Ein brauchbarer Audit-Eintrag enthält den Agentenlauf, die Identität des Betriebssystemprozesses, Ziel, Aktionstyp, Credential-Referenz, Ergebnis, Zeitpunkt und Genehmigungsentscheidung. Geheimniswerte und sensible Request-Bodies sollten standardmäßig nicht gespeichert werden. Manipulationsnachweise sind wichtig, weil eine einfache lokale Textdatei einen späteren Streit nicht klären kann.

Kann ein Agent ein Credential verwenden, ohne es jemals zu sehen?

Nein. Ein Gateway muss genug wissen, um eine korrekte Verbindung herzustellen. Das ist etwas anderes, als das Geheimnis dem Agenten offenzulegen. Das Gateway kann Token oder privaten Schlüssel in einem geschützten Speicher behalten, ihn in eine ausgehende HTTP-Anfrage einfügen oder damit eine SSH-Authentifizierungsanfrage signieren und nur das Ergebnis des Befehls zurückgeben.

Wie begrenze ich, was ein KI-Agent über SSH tun kann?

Ein Befehl, der beliebige Argumente akzeptiert, kann nach erfolgreicher Authentifizierung weiterhin Schaden anrichten. Begrenze erreichbare Hosts und Konten, trenne Deployment-Credentials von Administratorkonten und nutze, wo passend, serverseitige Kontrollen wie erzwungene Befehle oder eingeschränkte Konten. Die Credential-Grenze ergänzt diese Kontrollen, sie ersetzt sie nicht.

Was ist der erste praktische Schritt, damit Agenten keine Geheimnisse mehr lesen?

Verschiebe zuerst die Anmeldedaten, die Agenten am häufigsten verwenden, in ein Aktions-Gateway. Dazu gehören besonders Deployment- und Ticket-System-Token sowie SSH-Schlüssel für produktionsnahe Systeme. Halte die Umgebung des Agenten frei von Geheimniswerten, verlange eine Genehmigung für jeden neuen Prozess und prüfe in der ersten Woche die Aktionsprotokolle auf unerwartete Ziele oder Befehle. Wenn du etwas findest, schränke den Geltungsbereich des Credentials ein, bevor du weitere Aufgaben automatisierst.

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