Autorisierung von Agentenprozessen: Zugriff von Forks widerrufen
Die Autorisierung von Agentenprozessen braucht eine Grenze, die Forks übersteht. Erfahre, wie du Kinder prüfst, Zugriff widerrufst, Prozessgruppen stoppst und Nachweise sicherst.

Autonome Agenten beenden sich selten so sauber, wie ihre Aufgabenprotokolle vermuten lassen. Ein Agent kann eine Programmieraufgabe abschließen, eine fröhliche Fertigmeldung ausgeben und dabei einen Formatter, Test-Runner, Tunnel, eine Shell oder einen Hilfsprozess zurücklassen, der weiterläuft. Wenn dieser zurückgebliebene Prozess weiterhin Produktions-APIs aufrufen oder SSH-Sitzungen öffnen kann, endete die Aufgabe nicht dort, wo es deine Oberfläche anzeigt.
Die Lösung besteht nicht darin, Prozesse zwanghaft zu beenden. Prozessbereinigung ist notwendig, aber kein Autorisierungssystem. Definiere die Lebensdauer einer Berechtigung unabhängig von der Lebensdauer von Unix-Prozessen, mache die Grenze sichtbar und widerrufe den Zugriff, bevor du Nachkommen suchst. Ich habe erlebt, dass Teams eine Parent-PID als Beweis für die Eingrenzung behandelten. Sobald ein Agent eine Shell aufrufen kann, beweist sie kaum noch etwas.
Ein Prozessbaum definiert keine Autorisierungsgrenze
Eine Eltern-Kind-Beziehung zeigt, wer einen Prozess erstellt hat. Sie sagt nicht, ob dieser Prozess seine Berechtigung behalten sollte, nachdem der Elternprozess beendet wurde. Das sind verschiedene Fragen. Wer sie vermischt, erhält den bekannten Fehler: Jemand bricht eine Agentenaufgabe ab, sieht den Elternprozess verschwinden und stellt fünf Minuten später fest, dass ein Kind weiterhin Anfragen sendet.
Unix bietet Prozessen mehrere Möglichkeiten, die erwartete Struktur zu verlassen. Ein Kind kann erneut forken. Mit setsid kann es eine neue Sitzung erstellen. Es kann einen Dienstmanager bitten, es zu überwachen. Es kann in einer Shell-Pipeline weiterlaufen, in der nur ein Mitglied das Signal erhält. Oder es bleibt schlicht bestehen, weil der Elternprozess überhaupt kein Signal gesendet hat.
Ein Prozess trägt außerdem mehr als nur seine Befehlszeile. Er kann Umgebungsvariablen, das aktuelle Arbeitsverzeichnis, geöffnete Dateien, Pipes, Sockets und Dateideskriptoren erben. Wenn ein Elternprozess ein Bearer-Token in einer Umgebungsvariablen hält, besitzt jedes Kind mit geerbter Umgebung dieses Token. Wenn du das Kind später beendest, gelangt das Geheimnis nicht zurück in den Tresor und bereits ausgeführte Anfragen werden nicht rückgängig gemacht.
Darum sollte eine Autorisierungsgrenze eine eng gefasste Frage beantworten: Welcher laufende Prozess darf bis wann privilegierte Aktionen anfordern, und wie verweigern wir sie sofort? Die Antwort sollte nicht lauten: «Alles, was vom Terminal abstammt, das die Aufgabe gestartet hat.» Das ist eine zufällige Eigenschaft der Prozessstruktur, keine Sicherheitsentscheidung.
Wenn ein Agent HTTP- oder SSH-Zugriff benötigt, halte die Zugangsdaten außerhalb des Agentenprozesses. Eine Komponente, die die Zugangsdaten besitzt, führt die Aktion aus, nachdem sie den anfragenden Prozess als genehmigt erkannt hat. Dadurch wird die Bereinigung von einem verzweifelten Versuch, durchgesickerte Berechtigungen zu löschen, zu routinemäßiger Betriebspflege.
Definiere die Lebensdauer vor dem Start der Aufgabe
Ein Agentenlauf braucht eine festgelegte Start-, End- und Widerrufsbedingung. Schreibe diese Bedingungen auf, bevor du entscheidest, ob ein Klick in der Oberfläche, eine Prozessgruppe oder ein Shell-Wrapper als Kontrolle gilt.
Bei interaktiver Arbeit ist eine Genehmigung für genau einen Root-Agentenprozess meist der sinnvolle Standard. Die Genehmigung beginnt, wenn du diesen konkreten Lauf freigibst, und endet, wenn der Root-Prozess beendet wird oder du sie widerrufst. Ein neuer Agentenaufruf erhält eine neue Entscheidung, auch wenn er dieselbe Binärdatei aus demselben Verzeichnis ausführt.
Bei unbeaufsichtigten Aufgaben solltest du die Genehmigung nicht stillschweigend über den ganzen Tag ausdehnen, nur weil wiederholte Rückfragen lästig sind. Gib der Aufgabe einen benannten Verantwortlichen, eine begrenzte Laufzeit, eine eingeschränkte Zielmenge und einen Abbruchweg, den jemand während der Laufzeit verwenden kann. Muss die Aufgabe nach dem Ende ihres Elternprozesses weiterlaufen, behandle sie als separate Aufgabe und verlange eine eigene Berechtigung.
Drei Fragen machen unklare Entwürfe schnell sichtbar:
- Welche ausführbare Datei und welche Prozessinstanz hat der Benutzer genehmigt?
- Welches Ereignis beendet die Berechtigung, wenn der Prozess nie ein sauberes Abschlusssignal sendet?
- Kann ein Nachkomme nach diesem Ereignis eine neue privilegierte Aktion erhalten?
Wenn die letzte Antwort «ja» lautet, weil der Nachkomme ein Token geerbt hat, hast du Berechtigungen delegiert, ohne diese Delegation zu protokollieren. Lautet die Antwort «ja», weil das Gateway weiterhin jeden Nachkommen als vertrauenswürdig betrachtet, hast du die Prozessherkunft zu deiner Richtliniensprache gemacht. Beide Entscheidungen lassen sich während eines Vorfalls nur schwer erklären.
Verwechsle Bequemlichkeit nicht mit einer Grenze. Ein Terminal-Tab, ein Projektverzeichnis, ein Agentenkonto und eine Code-Signing-Identität liefern nützlichen Kontext. Keines davon identifiziert allein einen einzelnen Lauf. Eine Code-Signing-Identität zeigt, wer eine ausführbare Datei signiert hat. Sie sagt nicht, ob die Datei den erwarteten Hilfsprozess, eine veraltete Kopie davon oder ein Kind gestartet hat, das sich nach dem Abbruch abgesetzt hat.
Prüfe den laufenden Baum, bevor du etwas beendest
Beginne unter macOS mit den Prozessinformationen, die der Kernel bereitstellt, statt aus einem Aufgabenlabel zu raten. Im Handbuch von ps sind pid, ppid, pgid und sid als getrennte Felder dokumentiert. Sie zeigen Prozessherkunft, Prozessgruppenzugehörigkeit und Sitzungszugehörigkeit. Du brauchst alle vier, wenn ein Agent Shells und Werkzeuge aufrufen darf.
Führe bei der Untersuchung eines Laufs diesen Befehl aus und speichere die Ausgabe:
ps -axo pid,ppid,pgid,sid,stat,etime,command
Die relevante Struktur sieht so aus:
PID PPID PGID SID STAT ELAPSED COMMAND
48102 47790 48102 48102 S 00:18:04 agent-cli run build
48131 48102 48102 48102 S 00:17:59 /bin/sh -c make test
48144 48131 48102 48102 S 00:17:56 test-runner --watch
48209 1 48209 48209 S 00:16:02 helper --upload-results
Die ersten drei Prozesse teilen sich Gruppe und Sitzung. Der letzte Prozess hat PPID 1 sowie eine andere Gruppe und Sitzung. Er könnte sich abgesetzt haben oder nun einem Launcher gehören. In jedem Fall wird ein Signal nur an PID 48102 ihn nicht beenden.
Für direkte Kinder einer bekannten Root-PID verwende:
pgrep -P 48102 -alf
Dieser Befehl findet nur eine Generation. Wiederhole ihn für jedes Kind, wenn du schnell manuell durch den Baum gehen musst. Für einen Vorfallsbericht solltest du die ps-Ausgabe vor und nach dem Widerruf erfassen und anschließend die genaue Root-PID, Startzeit, den Befehl, die Prozessgruppe und die Sitzung festhalten. Ein bloßer Prozessname ist ein schlechter Nachweis, weil Namen mehrfach vorkommen und sich Befehlszeilen ändern.
Prüfe offene Netzwerkverbindungen, wenn externe Aufrufe das Risiko darstellen. Unter macOS kann lsof die Netzwerkdateien eines Prozesses anzeigen:
lsof -nP -p 48209 -i
Ein lauschender Socket, eine bestehende ausgehende Verbindung oder ein langlebiger SSH-Transport verändert die Dringlichkeit. Das beweist kein bösartiges Verhalten. Es zeigt, dass ein Prozess, den du für beendet hieltest, weiterhin einen Kanal besitzt, den du verstehen solltest.
Baue keine Sicherheitskontrolle, die in der Produktion von der Auswertung menschenlesbarer ps-Ausgabe abhängt. Verwende sie für Untersuchungen und Tests. Ein echter Launcher sollte Kennungen beim Start erfassen und am Autorisierungsgateway einen direkten Widerrufsgriff bereithalten.
Prozessgruppen helfen, aber abgelöste Kinder entgehen ihnen
Eine eigene Prozessgruppe bietet einem Launcher eine praktische Möglichkeit, einen normalen Aufgabenbaum abzubrechen. Erstelle die Gruppe, bevor der Agent startet, lasse den Root-Prozess Gruppenleiter bleiben und sende Signale an die Gruppe statt nur an den Root-Prozess. Damit erfasst du den häufigen Fall von Shells, Compilern, Test-Runnern und Pipelines, die in derselben Gruppe bleiben.
Auf Systemen mit der üblichen Signalsyntax zielt eine negative Gruppen-ID auf eine Prozessgruppe:
kill -TERM -48102
sleep 3
kill -KILL -48102 2>/dev/null || true
Das Signal TERM gibt normalen Werkzeugen die Möglichkeit, Dateien zu schließen und den Abbruch zu melden. Das spätere Signal KILL kümmert sich um Prozesse, die sich weigern zu enden oder nicht beendet werden können. Übernimm dies erst in eine Automatisierung, wenn du geprüft hast, dass 48102 die beabsichtigte Prozessgruppe ist. Eine falsche Gruppen-ID kann deine eigene Shell oder unabhängige Arbeit beenden.
Diese Methode hat Grenzen. Ein Kind kann setsid aufrufen und damit eine neue Sitzung sowie meist eine neue Prozessgruppe erstellen. Eine Aufgabe kann Arbeit an einen lokalen Dienst, ein entferntes Build-System oder eine Warteschlange übergeben. Eine Shell kann einen Hintergrundprozess außerhalb der Gruppe starten. Danach ist das Beenden der Gruppe nur noch Bereinigung, keine Eingrenzung.
Unter Linux kann ein Dienstmanager eine Aufgabe in einer eigenen cgroup platzieren und die cgroup als Einheit beenden. Das ist meist stärker als die Bereinigung über Prozessgruppen, weil der Kernel die Zugehörigkeit auch jenseits der normalen Elternbeziehungen verfolgt. Behaupte nicht, dass eine macOS-Menüleistenanwendung dieselbe Kontrolle besitzt. macOS und Linux haben unterschiedliche Modelle für die Prozessüberwachung. Ein portables Agentendesign sollte diesen Unterschied nicht verschleiern.
Die Empfehlung «Beende einfach den Prozessbaum» bleibt beliebt, weil sie in Demos funktioniert. Sie versagt unter genau den Bedingungen, die Agentenzugriff riskant machen: lange Aufgaben, Hintergrundhelfer, Wrapper und unvollständige Abbrüche. Verwende Prozessgruppen, weil sie zurückbleibende Prozesse reduzieren. Verwende sie nicht als einzigen Widerrufsmechanismus.
Halte Geheimnisse vollständig aus dem Baum heraus
Der sicherste Kindprozess ist weiterhin einer, der keine Zugangsdaten lesen kann. Wenn du ein Token über eine Umgebungsvariable weitergibst, ist es für jeden Nachkommen verfügbar, der die Umgebung erbt. Außerdem kann es in Diagnosen, Absturzberichten oder unvorsichtigen Protokollen auftauchen. Eine temporäre Datei ist nur geringfügig besser, wenn das Kind sie vor dem Löschen kopieren kann.
Vermeide diese Muster bei von Agenten gestarteten Befehlen:
export DEPLOY_TOKEN='token-value'
agent-cli run deploy
agent-cli run deploy --token "$(cat ~/.config/deploy-token)"
Beide Beispiele legen die eigentliche Berechtigung in der Ausführungsumgebung des Agenten ab. Das zweite Beispiel kann sie zusätzlich in Prozessargumente, die Shell-Historie oder Protokolle bringen. Nach einem Problem kann eine Rotation des Tokens nötig sein. Sie ist aber eine Wiederherstellungsmaßnahme und kein normaler Abbruchweg.
Verwende stattdessen ein lokales Aktionsgateway. Der Agent sollte eine Operation anfordern, etwa eine HTTP-Anfrage an einen genehmigten Endpunkt oder einen SSH-Befehl, ohne jemals die Zugangsdaten selbst zu erhalten. Das Gateway fügt die passende Berechtigung ein, führt die Aktion aus und gibt das Ergebnis zurück. So kannst du den nächsten Aufruf verweigern, auch wenn ein verirrtes Kind weiterläuft.
Sallyport verfolgt diesen Ansatz für HTTP-APIs und SSH: Sein verschlüsselter Tresor bleibt in der Anwendung, während sich der Agent über den sp mcp-Shim verbindet und Aktionsergebnisse statt Geheimnisse erhält. Das ist wichtiger als jedes raffinierte Skript zum Beenden von Prozessen, denn ein Kind kann kein Token erben, das es nie besessen hat.
Übertreibe diesen Vorteil nicht. Ein Prozess mit einer genehmigten Gateway-Sitzung kann weiterhin Aktionen anfordern, bis die Sitzung endet oder du sie widerrufst. Wenn du Geheimnisse aus dem Prozessbaum heraushältst, begrenzt du den Diebstahl von Zugangsdaten. Einen genehmigten Agenten macht das nicht harmlos.
Genehmigungen sollten an einen Lauf gebunden sein, nicht an einen Familiennamen
Eine Autorisierung, die nur auf dem Namen einer ausführbaren Datei beruht, ist schwach. Jeder kann eine Binärdatei an einen anderen Ort kopieren, sie in ein Shell-Skript verpacken oder später eine weitere Instanz starten. Eine Autorisierung allein anhand des Signierers ist für die Zuordnung besser, aber immer noch zu weit gefasst, wenn sie stillschweigend jeden künftigen Lauf derselben Partei genehmigt.
Eine brauchbare Genehmigungskarte sollte den anfragenden Prozess so beschreiben, dass ein Mensch ihn prüfen kann: seine Code-Signing-Instanz, den Pfad der ausführbaren Datei, die Root-PID und die Startzeit. Die Entscheidung sollte für genau diesen Prozesslauf gelten. Ein Kindprozess sollte kein unbegrenztes Handlungsrecht erhalten, nur weil irgendwo in seiner Vergangenheit ein genehmigter Vorfahr existiert.
Für Nachkommen gibt es zwei sinnvolle Modelle. Das strengere Modell verlangt für jeden eigenen Anfragenden eine Genehmigung. Das praktische Modell erlaubt Aufrufe während eines genehmigten Root-Laufs und weist danach alle neuen Aufrufe zurück. Das zweite Modell funktioniert gut für Agenten, die berechtigterweise kurzlebige Werkzeuge starten, sofern das Gateway erkennen kann, dass der Root-Lauf beendet ist, und die Genehmigung nicht an einen späteren Prozess mit demselben Namen angehängt werden kann.
Sallyport verwendet standardmäßig eine sitzungsbezogene Autorisierung: Beim ersten Aufruf eines neuen Agentenprozesses zeigt eine Genehmigungskarte zuerst die Code-Signing-Instanz des Prozesses, und die Genehmigung gilt, bis dieser Lauf endet. Das Tresortor verweigert jede Aktion, solange es gesperrt ist. Eine Einstellung pro Aufruf kann zusätzlich verlangen, dass eine bestimmte Berechtigung bei jeder Verwendung genehmigt wird. Das sind bewusst kleine Kontrollen. Ein Berg von Richtlinien würde nur die Frage verbergen, wer was genehmigt hat.
Eine Genehmigung pro Aufruf passt zu Zugangsdaten, bei denen jede Aktion eine bewusste Prüfung verdient, etwa zu einem Konto für Produktionsbereitstellungen oder einer destruktiven Administrations-API. Für jede schreibgeschützte Anfrage ist sie nicht geeignet. Menschen genehmigen irgendwann alles automatisch, wenn jede harmlose Aktion Aufmerksamkeit verlangt. Setze Reibung dort ein, wo die Folgen sie rechtfertigen, und halte die Sitzungsgrenze an anderer Stelle kurz und klar.
Widerrufe die Autorisierung, bevor du den Prozess suchst
Wenn eine übergeordnete Aufgabe unerwartet endet, widerrufe zuerst ihre Fähigkeit, neue privilegierte Aufrufe auszuführen. Beende danach die Root-Gruppe, prüfe die Überlebenden und räume auf, was entkommen ist. Die umgekehrte Reihenfolge erzeugt eine Lücke: Das Kind, das du noch nicht gefunden hast, kann weiter nach außen kommunizieren, während du Prozesstabellen untersuchst.
Eine sinnvolle Reaktionsfolge sieht so aus:
- Widerrufe die Sitzung oder sperre den Tresor am Aktionsgateway.
- Bewahre die Root-PID, Prozessinformationen, aktuelle Aktionsprotokolle und den Zeitpunkt des Abbruchs auf.
- Sende
TERMan die bekannte Prozessgruppe und prüfe die verbleibenden Prozesse. - Verwende
KILLnur für Prozesse, die weiterhin zur Aufgabe gehören und sich nicht beenden lassen. - Prüfe, ob abgelöste lokale Prozesse oder entfernte Aufgaben einen eigenen Abbruch benötigen.
Die erste Aktion muss funktionieren, selbst wenn die Root-PID bereits verschwunden ist. Sie muss auch funktionieren, wenn ein Agent absichtlich versucht, einen Helfer am Leben zu halten. Ein Gateway, das für den Widerruf verlangt, dass der Aufrufer noch vorhanden ist, setzt die Prioritäten falsch.
Ein sofortiger Widerruf sollte zukünftige Anfragen blockieren, nicht die Vergangenheit umschreiben. Bewahre die Nachweise der früheren Autorisierung und der Aufrufe auf. Wenn ein Gateway nur erfolgreiche Aktionen protokolliert, fehlen bei einer Untersuchung wichtige Informationen. Abgelehnte Aufrufe nach dem Widerruf zeigen, dass etwas weiterhin versucht hat zu handeln.
Die Tresorsperre ist die Notbremse für jede aktive Sitzung. Das ist angemessen, wenn du den betroffenen Lauf nicht schnell identifizieren kannst. Die Sitzungswiderrufung ist die engere Reaktion, wenn du ihn identifizieren kannst. Halte beide Vorgänge getrennt, damit ein Operator nicht zwischen Untätigkeit und der Unterbrechung der Arbeit aller Entwickler wählen muss.
Ein Audit-Trail muss die Prozessnachweise ergänzen
Ein Aktivitätsdatensatz ohne Prozesskontext beantwortet nur die Hälfte der Frage. Er kann zeigen, dass eine HTTP-Anfrage stattgefunden hat, aber nicht, welcher genehmigte Lauf sie ausgelöst hat. Ein Sitzungsdatensatz ohne einzelne Aufrufe hat das umgekehrte Problem. Du brauchst beide Perspektiven und eine Möglichkeit zu prüfen, dass niemand sie nach einem Vorfall unbemerkt verändert hat.
Halte mindestens das Autorisierungsereignis, die Identität des anfragenden Prozesses, Beginn und Ende der Sitzung, jede privilegierte Aktion, den Widerruf und jede Ablehnung nach dem Widerruf fest. Füge Zeitstempel und stabile Korrelationskennungen hinzu. Protokolliere keine Geheimnisse im Klartext. Auch eine Befehlszeile solltest du nicht automatisch speichern, denn sie enthält oft Werte, die niemals dort hätten übergeben werden dürfen.
Sallyport erzeugt seine Sitzungs- und Aktivitätsprotokolle aus einem einzigen verschlüsselten, hashverketteten Audit-Log. Der Befehl sp audit verify prüft die Kette offline über Ciphertext, ohne einen Tresorschlüssel zu benötigen. Das ist hilfreich, wenn du einen exportierten Datensatz an jemanden weitergeben musst, der seine Integrität bestätigen, gespeicherte Zugangsdaten aber nicht lesen darf.
Eine Hashkette macht ein unvollständiges Protokoll nicht vollständig. Wenn dein Launcher die Root-PID nie gespeichert hat, kann das Audit-Log sie später nicht rekonstruieren. Wenn eine entfernte Aufgabe eine API-Anfrage erhalten hat und auf einem anderen Rechner weiterlief, zeigen lokale Prozessnachweise den entfernten Prozess nicht. Protokolliere die Anfrage, die die entfernte Arbeit gestartet hat, und verlange anschließend vom entfernten System eigene Abbruch- und Ereignisprotokolle.
Ein bekannter Fehler braucht zwei getrennte Lösungen
Stell dir einen Programmieragenten vor, der Integrationstests ausführen und einen Bericht veröffentlichen soll. Er startet eine Shell, diese startet den Test-Runner, und der Test-Runner startet einen Helfer zum Hochladen der Ergebnisse. Der Benutzer sieht einen Testfehler und bricht den Agenten ab. Der Agentenprozess endet. Die Shell ist verschwunden. Der Helfer hat sich bereits abgesetzt, behält eine ausgehende Verbindung und sendet nach dem Abbruch einen Bericht.
Wenn die Upload-Berechtigung in einer Umgebungsvariablen lag, kann der Helfer sie auch nach dem Widerruf der lokalen Genehmigung besitzen. Dann brauchst du eine Rotation der Zugangsdaten, eine Protokollprüfung und möglicherweise eine Reaktion auf einen Sicherheitsvorfall. Die Prozessbereinigung kam zu spät, weil die Berechtigung bereits auf das Kind übergegangen war.
Wenn der Helfer den Upload über ein Gateway anfordert, stoppt der Widerruf der übergeordneten Sitzung einen neuen Upload-Aufruf. Falls der Upload bereits begonnen hatte, zeigt das Audit-Log diese Tatsache. Du beendest den Helfer weiterhin, verlässt dich aber nicht mehr darauf, dass die Beendigung das einzige Kontrollmittel ist.
Unangenehm wird es bei einem Helfer, der absichtlich länger als der Agent laufen muss, etwa einem lokalen Vorschau-Server oder einer eingereihten Release-Aufgabe. Nenne ihn nicht einfach ein Kind und vererbe ihm die Berechtigung für immer. Gib ihm einen ausdrücklichen Verantwortlichen, einen eigenen Autorisierungsdatensatz, ein festgelegtes Ablaufdatum und eine sichtbare Stopptaste. Sobald Arbeit länger lebt als die Aufgabe, die sie gestartet hat, ist sie zu einem eigenen Betriebsobjekt geworden.
Teste den Abbruch mit einem hartnäckigen Nachkommen
Eine Kontrolle, die du nie testest, wird auf die unpraktischste Weise versagen. Baue einen harmlosen Testagenten, der ein Kind startet, das schläft, eine harmlose lokale Verbindung öffnet und nach dem Ende des Elternprozesses eine Gateway-Aktion versucht. Brich den Elternprozess an mehreren Stellen ab: bevor das Kind startet, während es läuft, nachdem es sich abgesetzt hat und während eine Aktion ausgeführt wird.
Das erwartete Ergebnis sollte konkret sein. Das normale Kind endet mit der Prozessgruppe. Ein abgelöstes Kind kann sichtbar bleiben. Das zeigt, warum du weiterhin prüfen musst. Nach dem Widerruf erhält jede neue privilegierte Anfrage eine Ablehnung. Der Sitzungsdatensatz zeigt Genehmigung und Widerruf, während der Aktivitätsdatensatz Aufrufe vor und nach der Grenze zeigt.
Lass einen bestandenen Test nicht nur bedeuten, dass die Oberfläche ihren Zustand geändert hat. Prüfe den Prozesszustand des Betriebssystems, die Entscheidung des Gateways und den Audit-Datensatz. Das sind drei unterschiedliche Beobachtungen. Eine Abbruchschaltfläche, die nur eine Aufgabenkarte ausblendet, ist Theater.
Die erste praktische Änderung ist einfach: Erfasse bei jeder Genehmigung eines Agenten die Identität des Root-Prozesses und lasse die Autorisierung unabhängig davon ablaufen, wenn dieser Lauf endet. Führe anschließend den Test mit dem hartnäckigen Kindprozess durch, bevor du einer Abbruchfunktion Zugangsdaten anvertraust, die Produktionssysteme verändern können.
FAQ
Was ist ein Fork eines KI-Agentenprozesses?
Ein Fork eines Agentenprozesses ist ein Kindprozess, den ein Agent oder eines seiner Werkzeuge erzeugt. Er kann weiterlaufen, nachdem die übergeordnete Aufgabe ihre Fertigmeldung ausgegeben hat, und offene Netzwerkverbindungen, geerbte Dateideskriptoren, Umgebungsvariablen oder den Zugriff auf einen Zugangsdaten-Broker behalten.
Wird ein Kindprozess eines Agenten beendet, wenn sein Elternprozess endet?
Nein. Wenn der Elternprozess endet, ändert sich zwar die Prozesshierarchie, aber die Nachkommen werden dadurch nicht zuverlässig beendet. Ein Kind kann eine ordentliche Beendigung ignorieren, sich in eine andere Sitzung absetzen oder vom Dienstmanager des Betriebssystems übernommen werden.
Wie finde ich von einem Agenten gestartete Kindprozesse?
Verwende ps, um PID, PPID, Prozessgruppe, Sitzung, Laufzeit und Befehl zu prüfen, und anschließend pgrep -P für direkte Kinder. Unter macOS liefert ps -axo pid,ppid,pgid,sid,stat,etime,command bessere Nachweise als eine grafische Aktivitätsanzeige.
Kann ich eine ganze Prozessgruppe sicher beenden?
Eine Prozessgruppe ist hilfreich, wenn der Task-Launcher sie vor dem Start des Agenten anlegt. Du kannst ein Signal an die negative Prozessgruppen-ID senden. Das funktioniert jedoch nur, wenn die Kinder in dieser Gruppe geblieben sind und nicht absichtlich eine neue Sitzung erstellt haben.
Sollte ich den Agentenzugriff widerrufen, bevor ich seine Prozesse beende?
Sie lösen unterschiedliche Probleme. Das Beenden eines Prozesses stoppt die weitere Arbeit, kann aber ein kurzes Zeitfenster offenlassen und erklärt nicht, was passiert ist. Der Widerruf der Berechtigung blockiert neue privilegierte Aktionen am Gateway. Das ist der sicherere erste Schritt, wenn ein Prozess noch laufen könnte.
Reicht Code-Signing zur Autorisierung eines autonomen Agenten aus?
Code-Signing zeigt, wer eine ausführbare Datei signiert hat, nicht, was jeder von ihr gestartete Prozess tun wird. Nutze es als hilfreiche Information auf dem Genehmigungsbildschirm. Binde die Genehmigung anschließend an genau einen beobachteten Prozesslauf und definiere sein Ende eindeutig.
Kann ein Kindprozess API-Zugangsdaten vom Elternprozess erben?
Shell-Variablen, exportierte Tokens, Konfigurationsdateien, temporäre Dateien, offene Sockets und geerbte Deskriptoren können Berechtigungen weitertragen als vorgesehen. Übergib dem Agentenprozess möglichst nie Geheimnisse im Klartext, denn die Prozessbereinigung kann Daten, die bereits gelesen wurden, nicht zuverlässig zurückholen.
Wie lange sollte eine Agentengenehmigung gelten?
Genehmigungen sollten enden, sobald der autorisierte Prozesslauf endet, auch wenn ein Nachkomme weiterlebt. Ein Kind, das weiterhin Zugriff benötigt, sollte ihn über eine eigene, ausdrücklich definierte Grenze anfordern, statt die Genehmigung des Elternprozesses stillschweigend zu übernehmen.
Verhindert ein Audit-Log, dass ein nicht vertrauenswürdiger Agent handelt?
Ein manipulationssicheres Audit-Log kann nachweisen, dass Datensätze nicht unbemerkt verändert wurden. Es verhindert jedoch keinen unerwünschten Aufruf. Dafür brauchst du weiterhin eine Tresorsperre, eine Genehmigungsgrenze und eine Möglichkeit, einen laufenden Prozess abzuschalten.
Welche Kontrolle sollte ich bei lang laufenden Agentenaufgaben zuerst einführen?
Starte damit, jede Agentenaufgabe in einer eigenen Prozessgruppe auszuführen, ihre Root-PID und Startzeit zu speichern und den Abbruch mit einem absichtlich hartnäckigen Kindprozess zu testen. Mache den Widerruf anschließend unabhängig von der Prozessbereinigung, denn diese wird irgendwann genau dann versagen, wenn du sie am dringendsten brauchst.