Zum Hauptinhalt springen Zur Navigation springen Zur Fußzeile springen

KI-Agent-Sicherheit & Schutzmaßnahmen

Wie Rediaccss CLI verhindert, dass KI-Coding-Assistenten Geheimnisse preisgeben, Anmeldedaten überschreiben oder Berechtigungen eskalieren: Wissenstores, Schwärzung, abstammungsverifizierte Überschreibungen und ein hash-verkettetes Audit-Log.

Wenn Claude Code, Cursor, Gemini CLI, Copilot CLI oder ein anderer KI-Coding-Assistent rdc steuert, behandelt die CLI ihn anders als einen Menschen an der Tastatur. Diese Seite erklärt, was der Agent tun kann, was er nicht tun kann, und wie die Schutzmaßnahmen auch dann greifen, wenn der Agent versucht, sie zu umgehen.

Kurzreferenz: was Agents können und nicht können

OperationAgent-StandardFreischaltung für einen bestimmten Anwendungsfall
rdc config show (geschwärzt)✅ allowed
rdc config field get --pointer <pointer> (geschwärzter Stub oder Digest)✅ allowed
rdc config field get --pointer <pointer> --digest✅ allowed
rdc config field set --pointer <pointer> (öffentliches Feld)✅ allowed
rdc config field set --pointer <pointer> (sensibles Feld, mit korrektem --current)✅ allowed
rdc config edit --dump (geschwärztes JSONC)✅ allowed
rdc config audit {log, tail, verify}✅ allowed
rdc config field set --pointer <pointer> (sensibles Feld, kein --current)🔴 refused--current "<alter Wert>" angeben
rdc config field get --pointer <pointer> --reveal🔴 refusedStattdessen --digest verwenden
rdc config show --reveal🔴 refusedEinfaches rdc config show verwenden
rdc config edit (interaktiver Editor)🔴 refusedMensch setzt REDIACC_ALLOW_CONFIG_EDIT=* vor dem Start des Agents
rdc config edit --apply <file>🔴 refusedGleiche Überschreibung
rdc config field rotate --pointer <pointer>🔴 refusedGleiche Überschreibung; nutzt interaktive Bestätigung
rdc term connect -m <machine> (direktes Maschinen-SSH)🔴 refusedZuerst ein Repository forken und mit dem Fork verbinden

Jede Verweigerung gegenüber einem Agent wird mit outcome: refused und einem Grund in das Audit-Log geschrieben.

Wie Agents erkannt werden

Die CLI behandelt einen Prozess als Agent, wenn eine der folgenden Bedingungen zutrifft:

  • Eines der Umgebungsvariablen REDIACC_AGENT, CLAUDECODE, GEMINI_CLI, COPILOT_CLI ist auf "1" gesetzt, oder CURSOR_TRACE_ID ist überhaupt gesetzt.
  • Unter Linux: Ein übergeordneter Prozess in der Abstammungskette hat eine dieser Variablen in seiner Umgebung (über /proc/<pid>/environ). Selbst wenn der Agent seine eigenen Variablen mit env -i oder einem Wrapper-Skript entfernt, verrät die übergeordnete Kette der CLI, wer ihn gestartet hat.

Die Erkennung läuft einmal pro Prozess und wird gecacht. Sie kann nicht deaktiviert werden.

Das Wissens-Gate-Modell

Sensible Mutationen folgen der passwd(1)-Konvention: Um ein Geheimnis zu ändern, muss man beweisen, dass man es bereits kannte.

  • Sie wollen ein API-Token, das unter /credentials/cfDnsApiToken gespeichert ist, rotieren?
  • Die CLI fragt: „Was ist der aktuelle Wert?”
  • Der Agent gibt den Klartext über --current "$OLD" an. Die CLI hasht $OLD mit SHA-256 und vergleicht ihn mit dem Digest des aktuell gespeicherten Werts. Übereinstimmung → Schreibvorgang wird durchgeführt. Abweichung → verweigert, protokolliert.

Das Modell ist einfach, schließt aber drei Angriffsflächen:

  1. Stille Rotation: Ein Agent ohne vorherigen Zugriff auf $OLD kann ihn nicht durch einen eigenen Wert ersetzen.
  2. Exfiltration durch Sondierung: Die Digest-Antwort enthält niemals Klartext; selbst ein kompromittiertes Audit-Log zeigt expected abc12345…, got deadbeef…, nicht die zugrunde liegenden Werte.
  3. Versehentliches Überschreiben der Benutzerkonfiguration: Erfordert bei jedem Mal ein explizites --current; kein automatisches Überschreiben bei set.

Beispiel

# Den kurzen Digest des Schwärzungs-Stubs abrufen (sicher für Agents).
$ rdc config field get --pointer /credentials/cfDnsApiToken
{"pointer": "/credentials/cfDnsApiToken", "value": "<redacted:secret>:abc12345"}

# Ohne Nachweis überschreiben versuchen: verweigert.
$ rdc config field set --pointer /credentials/cfDnsApiToken --new '"agent-picked-value"'
 Precondition failed: sensitive path requires --current (or --rotate-secret)

# Den aktuellen Klartext angeben: erlaubt.
$ rdc config field set --pointer /credentials/cfDnsApiToken \
    --current "$OLD_CF_TOKEN" \
    --new   "$NEW_CF_TOKEN"
Set /credentials/cfDnsApiToken

Wenn der Agent $OLD_CF_TOKEN nie hatte, kann er die Vorbedingung nicht erfüllen und die Rotation wird verweigert. Der Benutzer, der ihn hat, kann sie dennoch über den Editor oder durch Übergabe von --current aus seiner Shell durchführen.

Schwärzung als Standard

Jeder rdc-Befehl, der sensiblen Zustand liest: config show, config field get, config machine list, config edit --dump: gibt Schwärzungs-Stubs für Geheimnisfelder zurück, nicht Klartext:

"sshKey":       "<redacted:credential>:9f3a2c1b"
"cfDnsApiToken":"<redacted:secret>:abc12345"
"storages.s3-prod.vaultContent": "<redacted:secret>:1f2e3d4c"

Das 8-stellige Hex-Suffix des Stubs sind die ersten 8 Zeichen von sha256(canonicalize(value)): genug, um zwei verschiedene Werte auf einen Blick zu unterscheiden, aber nicht genug zum Umkehren. Ein Agent kann einen Stub verwenden, um zu verfolgen, ob sich ein Wert geändert hat, ohne ihn jemals zu sehen.

--reveal hebt die Schwärzung für Menschen auf einem interaktiven TTY auf. Agents werden unabhängig vom TTY-Status verweigert. Jede Gewährung schreibt einen reveal_granted-Audit-Eintrag; jede Verweigerung schreibt einen refused-Eintrag mit den Agent-Signalen des Akteurs.

Die Überschreibung REDIACC_ALLOW_CONFIG_EDIT

Einige Operationen: der interaktive Editor, --apply, field rotate: sind für Menschen gedacht und haben keinen agentensicheren Pfad. Wenn Sie explizit möchten, dass ein Agent eine davon ausführt, setzen Sie:

export REDIACC_ALLOW_CONFIG_EDIT='*'          # vollständige Umgehung
# oder
export REDIACC_ALLOW_CONFIG_EDIT='/credentials/ssh/privateKey,/infra/cfDnsZoneId'
# (kommagetrennte Bereichs-Globs: * Wildcards pro Segment erlaubt)

…und der Agent erbt es.

Wichtiges Detail: Die Überschreibung muss in einem Prozess oberhalb des Agents in der Abstammungskette erscheinen. Wenn der Agent sie in seiner eigenen Umgebung setzt (oder in einer Subshell, die er gestartet hat), verweigert die CLI und teilt Ihnen dies mit:

Interactive editor is blocked in agent environments (REDIACC_ALLOW_CONFIG_EDIT was set but ancestry verification failed: the override must be set by your shell, not by an agent).

Der Effekt: Ein Agent kann eine Schutzmaßnahme nicht umgehen, indem er mitten in einer Sitzung export REDIACC_ALLOW_CONFIG_EDIT='*' ausführt. Nur ein übergeordneter Prozess (Sie, in Ihrem Terminal, vor dem Start des Agents) kann diese Tür öffnen.

Audit-Log

Jede Mutation, jede Verweigerung, jede --reveal-Gewährung schreibt eine JSONL-Zeile in ~/.config/rediacc/audit.log.jsonl (Modus 0600, rotiert bei 10 MB). Jede Zeile ist hash-verkettet: Ihr prevHash-Feld ist sha256("<vorherige Zeile>"). Das Manipulieren einer Zeile bricht die Kette in allen nachfolgenden Zeilen.

{"ts":"2026-04-21T10:02:47.831Z","actor":{"kind":"agent","agentSignals":["CLAUDECODE"]},"command":"config field set","paths":["/credentials/cfDnsApiToken"],"outcome":"ok","configId":"...","configVersion":48,"prevHash":"sha256:9f3a..."}
{"ts":"2026-04-21T10:02:51.114Z","actor":{"kind":"agent","agentSignals":["CLAUDECODE"]},"command":"config edit","paths":[],"outcome":"refused","reason":"agent without REDIACC_ALLOW_CONFIG_EDIT=*","prevHash":"sha256:abc1..."}
{"ts":"2026-04-21T10:03:05.220Z","actor":{"kind":"human"},"command":"config show --reveal","paths":[],"outcome":"reveal_granted","configId":"...","configVersion":48,"prevHash":"sha256:deac..."}

Inspektion

# Letzte Einträge auflisten
rdc config audit log --since 24h

# Nach Pointer-Glob filtern
rdc config audit log --path '/credentials/*'

# Nur agent-initiierte Einträge
rdc config audit log --actor agent

# Neue Einträge live streamen (Strg+C zum Stoppen)
rdc config audit tail

# Prüfen, ob die Hash-Kette intakt ist
rdc config audit verify
# → "Chain integrity verified across 247 entries."
#   ODER
# → "Chain broken at line 103: file has been tampered with or corrupted."

Was nie im Audit-Log erscheint

  • Klartextgeheimnisse
  • Passphrases, Tokens, SSH-Schlüssel
  • Die alten/neuen Werte bei einem --current-Vorbedingungsfehler (nur das 8-stellige Digest-Präfix)

Das Log ist sicher für Sicherheitsprüfer oder als Anhang an einen Fehlerbericht.

Grenzen des Verhaltensmodells

Die Agent-Schutzmaßnahmen sind verhaltensbasiert, nicht kryptografisch. Ein entschlossener oder gesteuerter Agent, der unter derselben UID wie die Konfigurationsdatei läuft, kann immer cat ~/.config/rediacc/rediacc.json ausführen und den Klartext lesen, da die Datei vom Prozess lesbar ist.

Für echte kryptografische Durchsetzung verwenden Sie den verschlüsselten Config-Speicher: Geheimnisse liegen serverseitig, jedes sensible Feld trägt eine Feld-spezifische HMAC-Bindung, und der Account-Worker verweigert Schreibvorgänge, deren --current-Vorbedingung nicht mit dem gespeicherten Hash übereinstimmt. Der Server sieht niemals den Klartext: Zero-Knowledge: aber er erzwingt das Gate.

Der lokale Datei-Pfad ist „einfacher Weg ist sicher”. Der Remote-Store-Pfad ist „schwieriger Weg ist auch schwierig”.

Schnellrezepte

Einem Agent erlauben, ein einzelnes Cloud-Token zu rotieren

# Als Sie, vor dem Start des Agents:
export REDIACC_ALLOW_CONFIG_EDIT='/credentials/cfDnsApiToken'
claude-code              # oder cursor, gemini, usw.

Jetzt kann der Agent config field rotate /credentials/cfDnsApiToken --new … ausführen, aber /credentials/ssh/privateKey immer noch nicht bearbeiten oder den interaktiven Editor öffnen.

Einem Agent eine umfassende Konfigurationsbearbeitungssitzung ermöglichen

export REDIACC_ALLOW_CONFIG_EDIT='*'
claude-code

Der Agent kann rdc config edit öffnen, --reveal verwenden und field rotate ausführen. Jede Aktion wird weiterhin im Audit-Log mit actor.kind: agent und dem CLAUDECODE-Signal protokolliert.

Herausfinden, welche Felder ein Agent bearbeiten darf

rdc config field list --sensitive --output json

Gibt jede Pointer-Vorlage, ihre Art (secret / credential / pii / identifier) und ob sie im serverseitigen HMAC-Envelope gespeichert ist zurück.

Siehe auch