Published on

Claude-Agenten mit Werkzeugausführung im eigenen Netz

Authors

Werkzeugausführung im eigenen Netz: die selbst betriebene Sandbox

TL;DR

Bei Managed Agents läuft normalerweise beides bei Anthropic — die Agentenschleife und der Container, in dem Werkzeuge ausgeführt werden. Mit einer selbst betriebenen Umgebung verschiebt sich der zweite Teil in Ihre Infrastruktur: Dateiinhalte und Befehlsausgaben verlassen Ihre Umgebung nicht. Die Verbindung ist ausschließlich ausgehend.


Der Zielkonflikt, den das löst

Ein Agent, der etwas Nützliches tut, muss Dateien lesen, Befehle ausführen und Ergebnisse prüfen. Das heißt in der Standardkonfiguration: Ihre Dateien liegen in einem Container bei Anthropic.

Für viele Häuser ist das mit einem Auftragsverarbeitungsvertrag geklärt. Für drei Konstellationen nicht:

  • Produktionsnetze, die vom Büronetz getrennt sind und keinen freien ausgehenden Verkehr haben
  • Kritische Infrastruktur mit Netzbereichen, aus denen nichts abfließen darf
  • Auftragsarbeit unter Geheimhaltungsklausel, bei der Quellcode oder Konstruktionsdaten das Haus nicht verlassen dürfen

Die bisherige Antwort war: dann eben kein Agent, oder ein vollständig selbst betriebenes Modell mit dem bekannten Qualitätsabstand. Die selbst betriebene Sandbox ist der Mittelweg.

Wie es funktioniert

Anthropic                              Ihre Infrastruktur
─────────────────                      ──────────────────────
Agentenschleife    ◄── ausgehende ───  Arbeiterprozess
(Modell, Planung)      Verbindung      └─ führt Werkzeuge aus:
                                          bash, Dateien, Code

Ihr Arbeiterprozess fragt die Arbeitswarteschlange bei Anthropic aktiv ab. Anthropic wählt sich nie in Ihr Netz ein — es gibt keinen eingehenden Port, keine Firewall-Freigabe nach innen, keine öffentlich erreichbare Adresse auf Ihrer Seite.

Was das praktisch bedeutet: Prompt und Planung laufen weiterhin bei Anthropic. Was nicht dorthin gelangt, sind die Dateiinhalte, die Befehlsausgaben und alles, was der Agent in Ihrer Umgebung sieht — außer, er nimmt es ausdrücklich in seine Antwort auf.

Die Einrichtung

Schritt 1: Umgebung anlegen. Die gesamte Konfiguration ist ein Feld:

umgebung = client.beta.environments.create(
    name="self-hosted",
    config={"type": "self_hosted"},
)

Es gibt hier keine Netzwerk- oder Paketkonfiguration — die kontrollieren Sie ohnehin selbst.

Schritt 2: Umgebungsschlüssel erzeugen. In der Konsole auf der Seite der Umgebung. Der Schlüssel hat das Präfix sk-ant-oat01- und gilt für die Arbeitswarteschlange genau dieser einen Umgebung — nicht für Ihre Organisation. Legen Sie ihn in einen Geheimnisspeicher und rotieren Sie ihn bei Verdacht.

Schritt 3: Arbeiterprozess starten.

import asyncio, os
from anthropic import AsyncAnthropic
from anthropic.lib.environments import EnvironmentWorker

async def main() -> None:
    schluessel = os.environ["ANTHROPIC_ENVIRONMENT_KEY"]
    umgebung_id = os.environ["ANTHROPIC_ENVIRONMENT_ID"]
    async with AsyncAnthropic(auth_token=schluessel) as client:
        await EnvironmentWorker(
            client,
            environment_id=umgebung_id,
            environment_key=schluessel,
            workdir="/workspace",
        ).run()

asyncio.run(main())

workdir ist das Verzeichnis, in dem die Werkzeuge arbeiten — Werkzeugaufrufe sind darauf beschränkt.

Auf der Kommandozeile geht es ohne Skript:

export ANTHROPIC_ENVIRONMENT_KEY=sk-ant-oat01-...
ant beta:worker poll --environment-id env_... --workdir /workspace

Der Prozess beendet sich bei SIGTERM sauber, nachdem laufende Arbeit abgeschlossen ist. Die CLI-Variante hat einen festen Werkzeugsatz; für eigene Werkzeuge nehmen Sie den SDK-Weg.

Schritt 4: Sitzungen wie gewohnt. Der Rest ändert sich nicht — Sie verweisen beim Anlegen einer Sitzung auf die Umgebungs-ID.

Was Sie dabei übernehmen

Die Verantwortung verschiebt sich mit, und das sollte man vor der Entscheidung wissen:

Härtung des Containers. Nicht als Wurzelbenutzer laufen lassen, Dateisystem schreibgeschützt wo möglich, Fähigkeiten entziehen. Der Agent führt Befehle aus, die ein Modell erzeugt hat — behandeln Sie sie wie fremde Eingaben.

Ausgehende Verbindungen. Es gibt keine Voreinstellung. Was Ihre Firewall zulässt, kann der Agent erreichen. Bei der verwalteten Variante gäbe es eine Netzwerkrichtlinie; hier ist es Ihre Aufgabe.

Verwahrung des Schlüssels. Der Umgebungsschlüssel liegt auf dem Arbeiterrechner. Setzen Sie dort keinen Anthropic-API-Schlüssel — der wäre organisationsweit gültig und läge in Reichweite der Werkzeugausführung. Überwachungsabfragen führen Sie von außerhalb des Arbeiterrechners aus.

Trennung nach Vertrauensbereich. Ein Arbeitsbereich und eine Umgebung je Vertrauensbereich, wenn nicht vertrauenswürdiger Code läuft.

Was in dieser Betriebsart nicht geht

Vier Einschränkungen, die vor der Entscheidung zu klären sind:

VerwaltetSelbst betrieben
Dateien und Repositories einhängenAnthropic übernimmt esSie — Verweise über Sitzungs-Metadaten übergeben und selbst bereitstellen
Speicherbereiche (memory_store)unterstütztnoch nicht
Zugangsdaten als Umgebungsvariable aus dem Tresorunterstütztnoch nicht — Ausgang ist Ihrer, es gibt keine Stelle zum Einsetzen
Claude Platform on AWSunterstütztnicht verfügbar

Für Zugangsdaten bleibt der Weg über ein eigenes Werkzeug: Der Agent meldet einen Werkzeugaufruf, Ihr Orchestrierer führt den authentifizierten Aufruf mit seinen eigenen Zugangsdaten aus und liefert das Ergebnis zurück. Das Geheimnis sieht der Container nie.

Und: Die Arbeiter-Hilfsklassen gibt es in Python, TypeScript und Go. Für Java, Ruby, PHP und C# nehmen Sie die CLI-Variante.

Der sparsame Betrieb

Ein Dauerprozess, der die Warteschlange abfragt, ist der einfachste Weg und nicht der einzige. Alternativ registrieren Sie einen Webhook auf den Start einer Sitzung und arbeiten dann genau ein Arbeitspaket ab:

async def handle(rohdaten: bytes, headers: dict[str, str]) -> dict:
    event = client.beta.webhooks.unwrap(rohdaten.decode(), headers=headers)
    if event.data.type != "session.status_run_started":
        return {"status": "ignoriert"}
    await EnvironmentWorker(
        client, environment_id=UMGEBUNG_ID,
        environment_key=SCHLUESSEL, workdir="/workspace",
    ).run_one()
    return {"status": "ok"}

Das spart einen dauerhaft laufenden Prozess. Für Umgebungen, in denen Sie je Sitzung einen frischen Container hochfahren wollen, gibt es zusätzlich einen Abfrage-Mechanismus auf mittlerer Ebene, der je Arbeitspaket einen Startbefehl auslöst.

Häufig gestellte Fragen

Verlassen meine Dateien bei einer selbst betriebenen Sandbox das Haus?

Nein. Dateizugriffe, Shell-Befehle und Code-Ausführung laufen in Ihrer Infrastruktur; die Inhalte bleiben dort. Was weiterhin bei Anthropic verarbeitet wird, sind Prompt und Planung der Agentenschleife — sowie das, was der Agent ausdrücklich in seine Antwort aufnimmt.

Muss ich eine Firewall-Freigabe nach innen einrichten?

Nein, und das ist der wesentliche Punkt. Ihr Arbeiterprozess fragt die Arbeitswarteschlange bei Anthropic aktiv ab — die Verbindung ist ausschließlich ausgehend. Es gibt keinen eingehenden Port, keine öffentlich erreichbare Adresse und keine Einwahl von außen in Ihr Netz.

Was fehlt gegenüber der verwalteten Variante?

Vier Dinge: Das Einhängen von Dateien und Repositories übernehmen Sie selbst, Speicherbereiche werden noch nicht unterstützt, Zugangsdaten als Umgebungsvariable aus dem Tresor ebenfalls nicht, und auf Claude Platform on AWS steht die Betriebsart nicht zur Verfügung. Die Arbeiter-Hilfsklassen gibt es zudem nur für Python, TypeScript und Go.

Wie sichere ich den Arbeiterrechner ab?

Container härten — nicht als Wurzelbenutzer, Dateisystem schreibgeschützt, Fähigkeiten entziehen. Ausgehende Verbindungen einschränken, denn es gibt keine Voreinstellung. Und setzen Sie auf dem Arbeiterrechner keinen Anthropic-API-Schlüssel: Er wäre organisationsweit gültig und läge in Reichweite der Werkzeugausführung. Nur der Umgebungsschlüssel gehört dorthin.

Muss der Arbeiterprozess durchgehend laufen?

Nein. Neben dem Dauerbetrieb gibt es die Webhook-Variante: Bei Start einer Sitzung weckt ein Ereignis Ihren Dienst, der genau ein Arbeitspaket abarbeitet. Für Aufbauten, die je Sitzung einen frischen Container hochfahren, gibt es zusätzlich einen Abfrage-Mechanismus auf mittlerer Ebene.


Der nächste Schritt

Prüfen Sie zuerst die vier Einschränkungen gegen Ihren Anwendungsfall — insbesondere, ob Sie Zugangsdaten aus dem Tresor oder eingehängte Repositories brauchen. Wenn nicht, ist die selbst betriebene Sandbox der kürzeste Weg zu Agenten unter strenger Datenlage. Beim Aufbau unterstützen wir gern.

📖 Verwandte Artikel

Weitere interessante Beiträge zu ähnlichen Themen