Ein Agent ist kein Benutzer mit geliehenem Passwort
Der häufigste Konstruktionsfehler in Agenten-Projekten: Der Agent handelt unter dem Konto eines Administrators. Damit entspricht sein Schadensradius dessen Rechten — dauerhaft, unbegrenzt und im Log nicht unterscheidbar. Ein Agent braucht eine eigene Identität.
Agent Identity bedeutet: Der Agent ist ein eigenständiger Principal mit eigener Kennung, eigenen Rechten und eigener Spur im Audit-Log. Er erhält kurzlebige, auf eine Ressource begrenzte Credentials nach OAuth 2.1 mit Resource Indicators — nicht das Token eines Menschen und keinen dauerhaften API-Schlüssel.
Der Agent als eigener Principal
Sobald ein Agent handelt statt nur zu antworten, wird er zu einem Akteur im System. Alles, was für menschliche Konten gilt, gilt dann auch für ihn: eindeutige Identität, minimale Rechte, befristete Credentials, nachvollziehbare Spur. Nur die Kontrollen unterscheiden sich — ein Agent kann keine MFA-Abfrage beantworten, dafür lässt sich seine Rechteliste maschinell erzwingen.
- Agent Identity
- Eigenständige, maschinenlesbare Identität eines KI-Agenten mit eigener Kennung, eigenem Rechteumfang und eigener Spur im Audit-Log — getrennt von der Identität des Menschen, der den Lauf ausgelöst hat.
- Resource Indicator
- Angabe des Zielsystems bei der Ausstellung eines Tokens (RFC 8707). Das ausgestellte Token gilt nur für genau diese Zielgruppe und ist bei einem anderen Dienst wertlos — auch wenn es dort abgefangen wird.
- Blast Radius
- Der maximale Schaden, den ein kompromittierter oder fehlgeleiteter Agent anrichten kann. Er ergibt sich aus Scopes, Betragsgrenzen, Egress-Regeln und Laufzeit der Credentials — nicht aus der Formulierung des Prompts.
Die Policy Engine entscheidet, nicht der Prompt
Eine Regel im Prompt ist eine Bitte. Eine Regel in der Policy Engine ist eine Bedingung. Der Unterschied wird sichtbar, sobald ein manipuliertes Dokument dem Modell eine andere Anweisung gibt — die Bitte kann es ignorieren, die Bedingung nicht.
# Standardentscheidung ist deny. Jede Erlaubnis ist explizit.
default decision = "deny"
# Lesende Abfragen: erlaubt, solange der Agent den Scope hat
# und das Ergebnis eine sinnvolle Groesse nicht ueberschreitet.
allow {
input.tool == "postgres.query"
input.agent.scopes[_] == "read:orders"
input.params.max_rows <= 500
}
# Geld bewegen: nur unterhalb der Grenze, nur in EUR, nur wenn
# der Vorgang zum aktuellen Lauf gehoert. Der Idempotenz-Key
# verhindert, dass derselbe Refund zweimal genehmigt wird.
allow {
input.tool == "stripe.refund"
input.agent.scopes[_] == "write:refund"
input.params.amount <= 250
input.params.currency == "EUR"
input.params.order_id == input.run.context.order_id
}
# Darueber entscheidet ein Mensch. Kein Selbstfreigabe-Pfad.
require_approval {
input.tool == "stripe.refund"
input.params.amount > 250
}
# Sub-Agenten duerfen nie mehr Rechte anfordern als der Eltern-Lauf.
deny {
input.agent.parent
not subset(input.agent.scopes, input.agent.parent.scopes)
}
Sandboxing, Egress und Prompt Injection
Sicherheitsstandards adressieren inzwischen ausdrücklich die Protokollebene: Isolation der Ausführungsumgebung von MCP-Servern, Authentifizierung des Aufrufers über Modell-API, MCP und A2A hinweg, Protokollierung mit Werkzeug-Metadaten. Praktisch heißt das bei uns:
- Isolierte Ausführung. Jeder nicht selbst gebaute MCP-Server läuft in einem eigenen Container ohne Zugriff auf das Dateisystem des Hosts, ohne Zugangsdaten anderer Werkzeuge, mit begrenztem Speicher und begrenzter Laufzeit.
- Egress-Allowlist. Ausgehende Verbindungen sind grundsätzlich blockiert. Erlaubt sind nur namentlich gelistete Ziele mit Port. Datenabfluss über einen kompromittierten Konnektor wird damit zur Konfigurationsänderung, nicht zum stillen Vorfall.
- Daten sind keine Anweisungen. Rückgaben von Werkzeugen werden als untrusted markiert und in einen separaten Kontextbereich gelegt. Was dort steht, kann Verhalten nicht umdefinieren — die Grenzen kommen aus Policy und Scopes, nicht aus dem Prompt.
- Gepinnte Versionen. Externe MCP-Server werden auf eine geprüfte Version festgelegt. Ein Update ist eine bewusste Entscheidung mit erneuter Prüfung, kein automatischer Vorgang.
| Bedrohung | Maßnahme | Restrisiko |
|---|---|---|
| Prompt Injection über Tool-Rückgabe | Getrennter Kontextbereich, Ausgabe-Schema-Validierung, Grenzen in der Policy statt im Prompt | Fachlich falsche, aber formal erlaubte Aktionen bleiben möglich |
| Kompromittierter MCP-Server | Container-Isolation, Egress-Allowlist, gepinnte Version, keine geteilten Zugangsdaten | Daten, die das Werkzeug legitim sieht, sieht auch der Angreifer |
| Gestohlenes Agenten-Token | Lebensdauer 10 Minuten, Bindung an Zielsystem, Bindung an Lauf-ID | Kurzes Zeitfenster für Missbrauch innerhalb desselben Scopes |
| Rechteausweitung über Sub-Agenten | Scopes sind Teilmenge des Eltern-Laufs, Prüfung in der Policy Engine | Fehlerhafte Modellierung des Eltern-Laufs wirkt nach unten durch |
| Gefälschte Agent Card (A2A) | Signaturprüfung verpflichtend, Registry-Eintrag mit Betreiberzuordnung | Signatur belegt Identität, nicht Qualität oder Absicht |
| Kostenexplosion durch Schleife | Budget-Cap je Lauf, Rate-Limit je Werkzeug, Versuchszähler | Bis zum Cap entstehen reale Kosten |
Was das nicht löst
Prompt Injection ist nicht gelöst — weder bei uns noch anderswo. Wir können den Schaden begrenzen, indem wir Rechte klein halten, Beträge deckeln und irreversible Schritte an Menschen binden. Wir können nicht garantieren, dass ein Modell einen manipulierten Text nie befolgt. Wer diese Garantie braucht, darf dem Agenten an dieser Stelle keine Aktionsrechte geben — das ist eine Architekturentscheidung, keine Konfiguration.
Security im Detail
Warum reicht ein Service-Account nicht aus?
Ein Service-Account ist statisch: dauerhaftes Geheimnis, fester Rechteumfang, keine Bindung an einen konkreten Vorgang. Ein Agenten-Credential wird je Lauf ausgestellt, ist an Zielsystem und Lauf-ID gebunden und verfällt nach Minuten. Der Unterschied zeigt sich im Schadensfall.
Wie greift das in unser bestehendes Identity-Management?
Wer sieht, was ein Agent getan hat?
Jede Aktion steht mit Agenten-Identität, Werkzeug, sanitisierten Parametern und Policy-Entscheidung im Audit-Log. Die Auswertung erfolgt in Ihrem eigenen Stack oder in unserem — auf Wunsch mit Weiterleitung an ein SIEM wie Wazuh. Details unter Observability.
Was passiert, wenn ein Agent auffällig wird?
Agenten lassen sich einzeln stilllegen — Credential widerrufen, laufende Runs anhalten, Werkzeugfreigaben entziehen. Weil jede Identität einzeln existiert, trifft das nur den betroffenen Agenten und nicht den gesamten Betrieb.
Sind Agenten mit Aktionsrechten mit der DSGVO vereinbar?
Ja, unter Bedingungen: dokumentierte Zweckbindung, Verarbeitung auf Grundlage eines AVV, nachvollziehbare Protokollierung und keine automatisierte Einzelentscheidung mit rechtlicher Wirkung ohne menschliche Beteiligung. Genau dafür gibt es die Freigabeschwellen. Einordnung auf der Trust-Seite.
Prüfen Sie fremde MCP-Server auf Schwachstellen?
Wir prüfen Herkunft, Signatur, Schema-Qualität und Egress-Verhalten und pinnen die Version. Ein vollständiges Code-Audit fremder Server leisten wir nicht — wo das nötig ist, bauen wir den Konnektor selbst. Siehe Agentic Supply Chain.
Weiter in der Plattform
Security-Review vor dem ersten Produktivlauf
Wir gehen Ihr geplantes Agenten-Design entlang der sechs Bedrohungen oben durch und schreiben auf, welcher Scope, welches Limit und welche Freigabeschwelle jeweils nötig sind. Ergebnis ist ein Dokument, das auch ein Auditor lesen kann.