Doku: fremde Laufzeiten und Egress-Proxy - Umsetzung, Befunde, Einrichtung (#712)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-25 23:18:19 +02:00
co-authored by Claude Opus 5.5
parent d37fe91b37
commit 036d56ff04
3 changed files with 136 additions and 0 deletions
+56
View File
@@ -828,6 +828,62 @@ verbraucht.
beide Anmeldewege gebaut, Abo und API-Schlüssel, und die Entscheidung bleibt eine
Frage der Konfiguration statt eine des Umbaus.
### Umsetzung (2026-09-25, #712)
Gebaut sind `native`, `claude-code` und `command`. `codex` und `http` sind nicht gebaut
(„nach Bedarf“); die Einstellung lehnt sie ab, statt sie still als native laufen zu lassen.
Ein Agent bekommt seine Laufzeit in der Agentenansicht (Karte „Laufzeit“) oder als
`runtime` in `AgentSettings.json`. Das Claude-Code-Konto gilt für die ganze Instanz
(`claudeCode` in `instance.json`, Schlüssel verschlüsselt wie der OpenRouter-Schlüssel).
- **Ohne Sandbox kein Lauf.** Ein fremder Lauf fällt nie auf die native Engine zurück,
auch nicht ohne Runner. Deren Modell und Kosten wären nicht die konfigurierten.
- **Eigener Arbeitsplatz ist eine Kopie.** Der Lauf arbeitet auf einer Kopie des
Arbeitsbereichs, höchstens 20 000 Dateien und 512 MB. Was sich darin ändert, wird zum
Vorschlag unter `proposals/<lauf>/`: `proposal.json` und die geänderten Dateien.
Übernommen wird nichts; das ist die Sache der Lieferkette (#695). Gelesen werden nur
reguläre Dateien. Ein symbolischer Link, den der Lauf hinterlässt, könnte außerhalb der
Sandbox auf einen Schlüssel zeigen, eine benannte Pipe würde den Leser für immer
blockieren. Beide werden nur als „ignoriert“ genannt.
- **Netz nur über den Proxy.** Die Sandbox behält ihr eigenes Netz ohne alles außer
Loopback. Claude Code erreicht `api.anthropic.com` über einen HTTPS-Proxy im
Hauptprozess, dazu die Hosts, die der Agent einträgt. Der Proxy ist gleich mit gebaut
(#655, Security-Konzept 5.2). Updates und Telemetrie von Claude Code sind abgeschaltet.
- **Nur unsere Einstellungen gelten.** `--setting-sources user` liest nur die Einstellungen,
die vor jedem Lauf ins Home der Laufzeit geschrieben werden, `--strict-mcp-config` nur
unseren MCP-Server. Eine `.claude/settings.json` oder `.mcp.json` in der Kopie gewährt
also nichts. Hooks sind aus. Was ein Lauf im Home hinterlässt und den nächsten anweisen
könnte (Agents, Commands, Skills, `CLAUDE.md`), wird vor dem Start entfernt.
Anmeldestand und Verlauf bleiben.
- **Freigabelisten:** `--allowedTools` (Voreinstellung: Read, Edit, Write, Glob, Grep und
`mcp__clawd`) und `--max-turns`. WebFetch und WebSearch sind immer verboten: Das Web
läuft über unsere Werkzeuge, nicht an ihnen vorbei. `--dangerously-skip-permissions`
gibt es nicht, auch nicht als Werkzeugname verkleidet.
- **Der Rückweg:** Die Anwendung selbst ist in der Sandbox die MCP-Brücke
(`--mcp-bridge --socket /run/mcp.sock`). Der MCP-Socket ist eingebunden, das
Lauf-Token liegt in einer 0600-Datei und endet mit dem Lauf.
- **Schlüssel nie auf der Befehlszeile.** Die Anwendung ist in der Sandbox auch der Starter
(`--sandbox-launch`). Er liest den Schlüssel aus einer eingebundenen Datei und setzt ihn
in die Umgebung des Programms. Er leitet außerdem den Proxy-Port der Sandbox an den
Proxy-Socket weiter.
- **Verbrauch:** `RunUsage` hat die Spalten `Runtime` und `OnSubscription`. Ein Lauf auf
dem Abo kostet 0 $ und trägt seine Token; mit API-Schlüssel gilt der gemeldete Betrag
(`total_cost_usd`). Die Anzeige als Kontingentverbrauch ist Sache von #699.
- **Chat:** Eine fremde Laufzeit hat keinen Gesprächsverlauf, der weitergeführt würde. Jede
Nachricht ist ein eigener Lauf; der Chat zeigt trotzdem beide Seiten.
Geprüft unter Linux auf der Test-VM, in der echten Sandbox: Schlüssel stehen in keiner
Befehlszeile, ein gelisteter Host ist erreichbar, ein anderer nicht, am Proxy vorbei gibt
es kein Netz, der Loopback der Instanz ist nicht der der Sandbox. Ein Programm in der
Sandbox erreicht den MCP-Server als sein Agent. Der ganze Claude-Code-Weg ist mit einem
Stellvertreter für `claude` geprüft, weil das echte Claude Code auf der Test-VM nicht
laufen darf. **Offen:** der Lauf mit dem echten Claude Code und einem echten Schlüssel.
Das macht der Mensch einmal von Hand.
Nicht gebaut: eine Speichergrenze für fremde Laufzeiten. Eine JavaScript-Laufzeit
reserviert Adressraum in Gigabyte-Blöcken und startet unter keiner sinnvollen `ulimit -v`.
Eine echte Grenze bräuchte cgroups.
---
## 8 — Kontrolle: eine Leitung delegiert nicht nur