# Verraten Platzhalter für Zugangsdaten weiterhin operative Details?

Ein geschwärztes Zugangsdaten-Fragment kann jedem, der es sieht, trotzdem den Aufbau deiner Produktionsumgebung erklären. Teams freuen sich oft darüber, ein Token durch `***` ersetzt zu haben, lassen dann aber Mandanten-Subdomain, Administratorrolle, Region, Kontonummer, Geheimnispfad und Einspeisungssyntax unverändert. Das Token blieb privat. Das Betriebsmodell nicht.

Dieser Unterschied ist besonders wichtig, wenn Konfigurationen, Logs, Prompts, Tickets und Agentenprotokolle weiter verbreitet werden als die Zugangsdaten selbst. Ein entschlossener Eindringling braucht nicht jedes Geheimnis in einem einzigen Screenshot. Es reichen genaue Details, um ein Ziel auszuwählen, einen Ablauf zu imitieren, eine überzeugende Supportanfrage zu schreiben oder aus einem ersten Zugriff eine brauchbare Übersicht zu machen.

## Ein Platzhalter sind Metadaten mit anderem Schadensradius

Ein Zugangsdatenwert beweist, dass jemand etwas besitzt. Ein Platzhalter tut das normalerweise nicht. Die beiden Datentypen sind deshalb verschieden, aber der Platzhalter ist dadurch nicht harmlos.

Betrachte diesen Deployment-Ausschnitt:

```yaml
billing_export:
  url: https://acme-prod.eu.example.net/v2/exports
  authorization: Bearer ${ACME_PROD_EU_BILLING_ADMIN_TOKEN}
  tenant: northstar-retail
  credential_ref: vault://teams/finance/prod/billing-export-admin
```

Hier erscheint kein echtes Token. Trotzdem erfährt der Leser, dass die Organisation einen Produktionsmandanten in Europa hat, eine Export-API betreibt, Zugangsdaten für die Finanzabteilung trennt, einen Tresor verwendet und eine Identität mit Administratorrechten für Abrechnungsexporte besitzt. Die Zeichenfolge `northstar-retail` kann einen Kunden identifizieren. Der Hostname kann ein Namensschema offenlegen, das auch für andere Dienste gilt. Der Tresorpfad verrät vermutlich, welche Gruppe die Zugangsdaten verwaltet und wo ein Angreifer nach einem Einbruch in ein internes Entwicklertool suchen könnte.

Sicherheitsprüfungen reduzieren das oft auf eine Ja-nein-Frage: «Enthält es ein Geheimnis?» Das greift zu kurz. Stelle stattdessen zwei Fragen:

1. Kann jemand mit diesem Wert eine Aktion authentifizieren oder autorisieren?
2. Kann jemand den Wert nutzen, um unseren Betrieb zu verstehen, anzugreifen, zu imitieren oder mit anderen Informationen zu verknüpfen?

Die erste Antwort zeigt, ob ein Zugangsdatenwert offengelegt wurde. Die zweite zeigt, ob operative Metadaten nach außen gelangt sind. Beide Fälle brauchen Kontrollen, aber nicht dieselben. Jeden Alias wie ein Passwort zu behandeln, macht Logs unbrauchbar. Jeden Alias als öffentlich einzustufen, erzeugt unabsichtlich Material für Aufklärung.

Die AWS-IAM-Dokumentation erklärt diesen Unterschied am Beispiel von Amazon Resource Names. Ein ARN identifiziert eine Ressource mit Feldern wie Partition, Dienst, Region, Konto-ID, Ressourcentyp und Ressourcen-ID. AWS sagt, dass ARNs keine Zugangsdaten sind, und das stimmt. Die Dokumentation zeigt aber auch, warum sie nützliche Strukturinformationen enthalten können. Eine Ressourcenreferenz kann Cloud-Partition, Region, Besitzerkonto, Dienst sowie Ressourcenname oder -pfad nennen. «Nicht geheim» bedeutet nicht «für jede Zielgruppe sicher».

## Aliase verraten oft Besitz und Berechtigungen

Aliase helfen Menschen dabei, sich zu merken, wofür Zugangsdaten gelten. Genau deshalb geben sie Kontext preis.

`STRIPE_TOKEN` verrät abgesehen vom Anbieter nur wenig. `PROD_US_CARD_REFUNDS_SUPERVISOR_TOKEN` sagt dagegen sehr viel. Der Name verweist auf Produktion, eine Region, Kartenzahlungen, Rückerstattungen, eine wahrscheinliche Geschäftsfunktion und erhöhte Berechtigungen. In einem Incident-Kanal kann ein Angreifer, der dieses Label gesehen hat, das richtige System mit der passenden Sprache ansprechen. Das verbessert Phishing, Vorwände und Social Engineering, noch bevor ein technischer Exploit beginnt.

Besonders riskant sind Namen, die vier Informationsarten verbinden:

- Umgebung: `prod`, `staging`, `dr`, `sandbox`
- Berechtigung: `admin`, `root`, `write`, `breakglass`
- Geschäftsfunktion: `payroll`, `claims`, `refunds`, `identity`
- Mandant oder Eigentümer: Kundenname, Akquisitionscode, Teamname oder Kontonummer

Ein Label kann auch Beziehungen offenlegen. `SALESFORCE_TO_ERP_SYNC_PROD` zeigt, dass zwei Systeme Daten austauschen. `PAYROLL_SFTP_VENDOR_A` deutet auf einen externen Übertragungsweg hin. `EMERGENCY_DB_RESTORE_KEY` macht eine Zugangsmöglichkeit interessant, selbst wenn der eigentliche Wert unerreichbar bleibt.

Löse das Problem nicht, indem du jedem Credential einen bedeutungslosen Zufallsnamen gibst und die Sache damit für erledigt erklärst. Betreiber müssen wissen, was sie genehmigen, rotieren und untersuchen. Die Lösung ist, den Namen je nach Zielgruppe unterschiedlich detailliert zu machen.

Verwende im geschützten Credential-Register einen ausführlichen Eintrag. Dort kann stehen, wer die Zugangsdaten besitzt, welches Konto erreicht wird, was damit möglich ist und warum sie existieren. In breit sichtbaren Bereichen wie CI-Ausgaben, Agenten-Prompts oder Genehmigungskarten nutzt du einen weniger aussagekräftigen Laufzeit-Alias. Zum Beispiel:

```text
Restricted registry record
Owner: Revenue systems
Purpose: Submit production refund adjustments
Target: payments tenant northstar-retail in EU
Authority: write refund adjustments
Runtime alias: cred_4d91

Broad operational event
credential=cred_4d91 action=refund_adjustment outcome=denied
```

Der Laufzeit-Alias ermöglicht weiterhin Korrelationen. Ein Bearbeiter kann wiederholte Fehler mit `cred_4d91` verknüpfen. Nur Personen mit Zugriff auf das Register können den Alias jedoch dem vollständigen Geschäftskontext zuordnen.

Gehe gezielt vor. Ein Genehmigungsdialog muss vielleicht zeigen, dass eine Aktion Rückerstattungen in der Produktion verändert. Wenn die Folge der Aktion verborgen bleibt, ist die Genehmigung wertlos. Er muss dafür aber weder den Kundenmandanten, die Cloud-Konto-ID, den Tresorpfad noch den Namen der Zugangsdaten anzeigen.

## Formate verraten mehr, als die meisten Schwärzungsregeln erwarten

Ein festes Format zeigt Beobachtern, welches System den Wert erzeugt hat, wie er geprüft wird und manchmal auch, nach welchen Feldern sie an anderer Stelle suchen sollten.

Betrachte diese Referenzen:

```text
arn:aws:iam::123456789012:role/ci-prod-deployer
projects/810245991002/secrets/payments-prod-api/versions/latest
https://tenant-44.api.vendor.example/v1/invoices
postgresql://reporting:${DB_PASSWORD}@db-prod-2.internal:5432/revenue
```

Das Passwort kann in jedem Fall fehlen, während die übrige Syntax unterschiedliche Dinge verrät. Der ARN enthält Cloud-Partition, Dienst, Kontostruktur und Rollennamen. Die Referenz des Secret Managers nennt Projekt, Zweck des Geheimnisses und eine Praxis für Versionen. Der API-Hostname zeigt ein Mandantenmodell. Die Form der Datenbankverbindung verrät Protokoll, Hostnamenschema, Port, Datenbanknamen und eine Stelle, an der ein Passwort eingesetzt wird.

RFC 3986 definiert die wichtigsten Bestandteile eines URI, darunter Schema, Authority, Host, Port, Pfad, Query und Fragment. Außerdem bezeichnet der Standard die Form `user:password@host` in den User-Informationen eines URI als veraltet und warnt Anwendungen davor, Daten nach dem ersten Doppelpunkt im Klartext darzustellen. Die praktische Lehre geht über wörtliche Passwörter hinaus: Ein URI ist ein Container mit mehreren Feldern. Wenn ein Feld maskiert wird, verschwindet die übrige Betriebsgeschichte nicht.

Bei Formaten treten zwei Fehler regelmäßig auf.

Der erste ist unvollständige Maskierung. Ein Log-Transformer erkennt `Authorization: Bearer` und ersetzt das nächste Token, gibt aber eine vollständige signierte URL aus, deren Query-Parameter `X-Amz-Credential`, eine Access-Key-ID, Datum, Region, Dienst und Scope enthalten. Die geheime Signatur kann verborgen sein, die Identitätsform und das Ziel bleiben aber sichtbar.

Der zweite Fehler ist, eine Referenz als undurchsichtige Zeichenfolge zu behandeln, obwohl sie strukturiert ist. Ein Muster wie `vault://path/to/item#field` enthält mehrere Teile mit unterschiedlicher Sensibilität. Entfernt ein Team den Feldwert, während ein anderes den vollständigen Pfad ausgibt, existiert keine Zielgruppenregel. Es gibt nur verstreute Textersetzungen.

Nutze, wenn möglich, strukturierte Verarbeitung. Zerlege einen URI in Felder. Parse eine Cloud-Ressourcenkennung nach ihrer dokumentierten Grammatik. Weise jeder Komponente eine Klassifizierung zu. Verlasse dich nicht auf einen regulären Ausdruck, der davon ausgeht, dass jede sensible Zeichenfolge wie ein API-Key aussieht.

## Mandantennamen und Endpunkte können Personen und Systeme identifizieren

Mandantenbezeichnungen werden leicht unterschätzt, weil sie oft in normalen Produkt-URLs sichtbar sind. Das Risiko hängt davon ab, womit sie verbunden werden.

Ein öffentlicher Firmenname in einem öffentlichen Hostnamen fügt für sich genommen vielleicht wenig hinzu. Derselbe Name zusammen mit `prod`, einer privilegierten API-Route, einem internen Host, einem Supportfall oder einer Fehlermeldung bildet jedoch einen nützlichen Verknüpfungspunkt. Ein Beobachter kann erkennen, dass ein bestimmter Kunde ein Produkt nutzt, in einer bestimmten Region liegt oder Zugriff auf eine Integration hat, die anderen Kunden nicht offensteht.

Interne Namen sind problematischer. Teams verwenden Bezeichnungen wie `payer-west`, `acquisition-cedar`, `health-data` oder `gov-contracts`, weil sie den Betrieb beschleunigen. Gleichzeitig verraten sie Geschäftstätigkeit, regulierte Workloads und organisatorische Beziehungen. Ein Platzhalter wie `${ACQUISITION_CEDAR_SFTP_KEY}` kann eine Transaktion offenlegen, bevor sie jemand bekanntgeben wollte.

Dasselbe gilt für die Struktur von Endpunkten. Vergleiche diese beiden Ereignisse:

```text
request failed: credential=cred_4d91 target_class=payment_export status=403

request failed: POST https://northstar-retail.prod-payments.eu.internal/v3/refunds/export
credential=PROD_NORTHSTAR_REFUNDS_ADMIN status=403
```

Das erste Ereignis bleibt brauchbar, wenn es auf einen geschützten Trace verweist. Das zweite ist eine kompakte Kontokarte. Es verrät Mandant, Stufe, Domainstruktur, Region, Funktionsdienst, Route, Operation und Berechtigungsstufe.

Entferne nicht reflexartig alle Zielinformationen. Betreiber können ein vages Ereignis wie `request failed` nicht untersuchen, wenn ein Dienst ausfällt. Ersetze bei breiter Sichtbarkeit exakte Kennungen durch kontrollierte Klassen: `payment_export`, `customer_data_write`, `artifact_publish`, `repository_deploy`. Den exakten Endpunkt legst du in einem geschützten Ereignisdatensatz ab, wenn der Zugriff für die Untersuchung erforderlich ist.

Hier ordnen viele Teams die Daten falsch ein. Sie behandeln einen Mandantennamen als gewöhnlichen Text, weil er kein Credential ist. Die sinnvolle Einstufung hängt vom Kontext ab. In einem privaten, zugriffsgeschützten Auditsystem kann ein Mandantenname angemessen sein. Derselbe Name in einem Agentenprotokoll, das in einen Pull-Request-Kommentar kopiert wird, ist es vielleicht nicht.

## Ersetzungsmarker zeigen den Vertrauensweg

Ein Marker wie `${TOKEN}` bedeutet mehr als nur, dass ein Wert fehlt. Er zeigt, dass ein Prozess später einen Wert einsetzt. Die Schreibweise verrät oft, welcher Prozess das ist.

Diese Beispiele sehen für einen Entwickler ähnlich aus, zeigen aber unterschiedliche Vertrauensgrenzen:

```text
${GITHUB_ACTIONS_DEPLOY_TOKEN}
${{ secrets.DEPLOY_TOKEN }}
{{ vault "kv/prod/deploy" "token" }}
secretKeyRef: name: prod-deployer key: token
op://Infrastructure/Production Deploy/token
```

Das erste Beispiel deutet auf ein Modell mit Umgebungsvariablen und eine CI-Identität hin. Das zweite identifiziert den Kontext eines Workflow-Geheimnisses. Das dritte legt eine Template-Engine und einen Tresorpfad nahe. Das vierte verweist auf ein Orchestrator-Objekt mit Namespace und Schlüssel. Das fünfte zeigt, dass ein bestimmtes Benennungsschema eines Passwortmanagers verwendet wird.

Wer diese Zeichenfolgen sieht, hat noch kein Geheimnis gestohlen. Er weiß aber, wo er nach einem Zugriff auf Codeausführung, Build-Logs, ein Repository oder einen Supportkanal suchen sollte. Er kann einschätzen, ob Umgebungsvariablen, eingehängte Dateien, eine API eines Secret Stores oder eine lokale Desktop-Sitzung interessant sind.

Der Marker kann außerdem zeigen, wann die Ersetzung stattfindet. Eine im Quellcode gespeicherte Referenz wird vielleicht während der CI aufgelöst. Eine Referenz in einer generierten Datei wird vielleicht beim Deployment aufgelöst. Ein Platzhalter in einer Anfragevorlage wird vielleicht erst zur Laufzeit ersetzt. Diese Zeitpunkte haben unterschiedliche Kontrollen und landen wahrscheinlich in unterschiedlichen Logs. Wenn sie nicht dokumentiert sind, schalten Menschen bei Fehlern oft eine breit sichtbare Debug-Ausgabe ein. Genau dann gelangt das eigentliche Geheimnis besonders leicht nach außen.

Ein nützliches Inventar verfolgt den Vertrauensweg, ohne ihn in jedes Artefakt zu schreiben. Für jedes Credential sollten Quelle der Referenz, auflösender Prozess, konsumierender Prozess und mögliche Log-Orte dokumentiert sein. So lässt sich die Offenlegung bewusst prüfen, statt sie erst bei einer Untersuchung zu entdecken.

## Ein maskiertes Log kann einem Angreifer trotzdem einen brauchbaren Plan geben

Das Problem entsteht oft durch eine Debugging-Änderung, die zunächst vernünftig wirkte.

Stell dir einen Deployment-Job vor, der eine Vendor-API aufruft. Das Token liegt als CI-Geheimnis vor. Wegen gelegentlicher Authentifizierungsfehler aktiviert das Shell-Skript die Befehlsverfolgung. Die CI-Plattform maskiert das wörtliche Token, deshalb hält das Team die Logs für sicher.

Die Ausgabe sieht so aus:

```text
+ API_BASE=https://tenant-44.eu.vendor.example
+ TOKEN=***
+ curl -X POST https://tenant-44.eu.vendor.example/v1/admin/export \
  -H 'Authorization: Bearer ***' \
  -H 'X-Account: 784221' \
  -H 'X-Client-Name: finance-nightly-export'
< HTTP/2 403
< x-request-id: 81b5b8e1
< x-region: eu-central
```

Niemand kann das maskierte Bearer-Token wiederverwenden. Eine Person mit Zugriff auf die Logs kennt nun aber Anbieter, Mandantenmuster, Administrationsendpunkt, Kontonummer, Workload-Namen, Region und ungefähr den Zeitplan. Sie kann im selben Unternehmen nach `finance-nightly-export` suchen, den Kontoinhaber mit einer glaubwürdigen Anfrage ansprechen oder die Endpunktdetails nutzen, sobald sie ein anderes Credential findet.

Eine häufige Reaktion lautet: «Wir maskieren einfach mehr.» Das hilft, verfehlt aber den Designfehler. Der Job hat einen vollständigen Anfrageplan in ein breit aufbewahrtes Log geschrieben. Ein Redactor kann nicht wissen, ob `tenant-44`, `784221` oder `finance-nightly-export` für dein Unternehmen wichtig sind. Er kann nur Zeichenfolgen erkennen, die du ihm vorgibst.

Die Sicherheitsdokumentation von GitHub enthält eine verwandte Warnung: Die Schwärzung von Geheimnissen hängt weitgehend von exakten Treffern ab, und strukturierte Daten wie JSON, XML oder YAML erschweren zuverlässige Maskierung. GitHub empfiehlt außerdem, erzeugte sensible Werte wie ein aus einem anderen Geheimnis erstelltes JWT zur Maskierung zu registrieren. Das ist sinnvoll, bleibt aber eine Rückfallebene. Sicherer ist eine Debugging-Vereinbarung, die eine für Menschen gedachte Anfragezusammenfassung ausgibt, nicht einen für das Terminal gedachten Shell-Trace.

Ersetze den Trace durch ein begrenztes Ereignis:

```text
outbound_call
operation=finance_export
credential=cred_4d91
target_class=vendor_admin_api
method=POST
result=403
request_id=81b5b8e1
```

Bewahre die exakte Anfrage nur dann in einem geschützten Diagnoseeintrag auf, wenn der Anbieter sie für den Support benötigt. Lege dafür eine kurze Aufbewahrungsfrist fest. Kopiere sie nicht in ein Issue, einen Chatverlauf oder eine Agentenaufgabe.

## Klassifiziere die Referenz, nicht nur das aufgelöste Geheimnis

Eine praktische Richtlinie braucht mehr als zwei Bezeichnungen. «Geheimnis» und «kein Geheimnis» erzwingen schlechte Kompromisse, weil die Daten rund um Zugangsdaten mehrere Offenlegungsstufen haben.

Verwende ein kleines Schema, das Menschen bei Code-Reviews anwenden können:

| Klasse | Beispiele | Breite Logs und Prompts | Geschützte Betriebsdatensätze |
| --- | --- | --- | --- |
| Credential-Wert | Tokens, private Schlüssel, Passwörter, Signaturen signierter Anfragen | Nie | Nur wenn unvermeidbar, verschlüsselt und streng aufbewahrt |
| Direkte Kennung | Mandantennamen, Konto-IDs, exakte Hostnamen, Tresorpfade | Meist entfernen oder ersetzen | Erlauben, wenn für die Untersuchung nötig |
| Strukturelle Metadaten | Anbieter, Umgebung, Serviceklasse, Modell zur Credential-Einspeisung | Nur wenn die Zielgruppe sie braucht | Erlauben |
| Operatives Label | undurchsichtiger Alias, Aktionsklasse, Ergebnis, Korrelations-Token | Erlauben | Erlauben |

Die Tabelle ist bewusst kein Compliance-Standard. Für Kundenkennungen kann dein Unternehmen strengere Regeln brauchen. Innerhalb eines gesperrten Incident-Systems können lockerere Regeln angemessen sein. Entscheidend ist, dass jemand die Einstufung festlegt, bevor ein Fehlerhandler den Text ausgibt.

OWASPs Logging Cheat Sheet vertritt denselben Grundgedanken für Logs. Zugriffstokens, Passwörter, Datenbankverbindungszeichenfolgen, Verschlüsselungsschlüssel und kommerziell sensible Informationen sollten normalerweise entfernt, maskiert, bereinigt, gehasht oder verschlüsselt werden. Außerdem nennt OWASP Dateipfade und interne Netzwerknamen als Daten, die besondere Behandlung benötigen können. Genau hier gehören Platzhalter für Zugangsdaten oft hin. Ihr Wert fehlt, aber der umgebende Pfad und Name kann weiterhin sensibel sein.

Kennzeichne nicht jedes strukturelle Feld als verboten. Wenn jedes Ereignis System- und Aktionskontext verliert, umgehen Bearbeiter die Logging-Regel mit Screenshots und spontanen Debug-Flags. Ein gutes Ereignis beantwortet, was eine Aktion versucht hat, welche genehmigte Fähigkeit verwendet wurde, welche Zielklasse erreicht werden sollte und was passiert ist. Details, die nur Personen mit genehmigtem Untersuchungszugriff benötigen, bleiben außen vor.

## Erstelle Referenzen für die am wenigsten vertrauenswürdige Zielgruppe

Die schnellste Verbesserung besteht darin, vor der Benennung festzulegen, wo eine Referenz erscheinen wird. Ein Name, der in einer privaten Tresoroberfläche funktioniert, kann für ein Build-Log oder eine Agenten-Genehmigungskarte ungeeignet sein.

Beginne mit vier Bereichen: Quellcodeverwaltung, Laufzeitkonfiguration, sichtbare Genehmigungen und Audit-Datensätze. Bestimme für jeden Bereich den am wenigsten vertrauenswürdigen legitimen Leser. Das kann jeder Repository-Beitragende, ein Betrachter von CI-Logs, ein Supportmitarbeiter, ein automatisierter Agent oder eine kleine Incident-Gruppe sein. Gib dem Bereich anschließend nur die Informationen, die für seine Aufgabe nötig sind.

Eine praktikable Konvention besteht aus drei Teilen:

```yaml
# Broadly visible configuration
export_job:
  action: finance_export
  credential_alias: cred_4d91
  target_class: vendor_admin_api

# Restricted credential registry
cred_4d91:
  owner: revenue-systems
  approved_action: finance_export
  exact_target: https://tenant-44.eu.vendor.example/v1/admin/export
  secret_reference: restricted-store-record
```

Die Konfiguration bleibt verständlich. Ein Prüfer sieht, dass der Job Finanzdaten über eine administrative Vendor-API exportiert. Exakter Mandant, Endpunkt und Secret-Store-Referenz bleiben im Register, wo sie hingehören.

Diese Konvention verhindert noch einen zweiten Fehler: Aliase ändern sich seltener als kopierte Endpunkte. Wenn ein Mandant umzieht oder ein Anbieter seinen Hostnamen ändert, wird die geschützte Zuordnung aktualisiert, während dieselbe Schnittstelle auf Aktionsebene bestehen bleibt. Der aufrufende Job muss nicht jedes Infrastrukturdetail kennen.

Ein kleiner Scanner kann offensichtliche Fälle erkennen, bevor eine Konfiguration in ein gemeinsames Repository gelangt. Dieses Beispiel markiert Aliase und Referenzen, die Umgebungs-, Berechtigungs- oder Mandantenbegriffe enthalten. Es ist absichtlich einfach. Es sollte eine Prüfung anstoßen und nicht ohne menschliche Beurteilung ein Release blockieren.

```python
import re
from pathlib import Path

pattern = re.compile(
    r"(?i)(prod|staging|admin|root|breakglass|tenant|customer|"
    r"account|vault://|secretkeyref|secrets\.)"
)

for path in Path(".").rglob("*"):
    if path.is_file() and path.suffix in {".yml", ".yaml", ".json", ".env", ".txt"}:
        for number, line in enumerate(path.read_text(errors="ignore").splitlines(), 1):
            if pattern.search(line):
                print(f"REVIEW {path}:{number}: {line.strip()}")
```

Eine nützliche Ausgabe sieht so aus:

```text
REVIEW deploy.yaml:7: credential_alias: PROD_NORTHSTAR_REFUNDS_ADMIN
REVIEW deploy.yaml:11: secret_reference: vault://finance/prod/northstar/refunds
```

Der Prüfer sollte fragen, ob der Begriff in dieser Datei wirklich nötig ist und ob die Leser der Datei ihn brauchen. Jedes Wort mechanisch zu ersetzen, zerstört die Nachvollziehbarkeit. Meist ist es besser, die sensible Information in die geschützte Zuordnung zu verschieben.

## Agentenzugriff braucht Aktionskontext, nicht Credential-Anatomie

Autonome Coding-Agenten verschärfen das Problem, weil sie Konfigurationen verarbeiten und in großer Zahl Protokolle erzeugen. Kann ein Agent ein Repository lesen, können Aliase, Geheimnisreferenzen, Endpunktvorlagen und fehlgeschlagene Befehle in seinem Prompt-Kontext landen. Auch wenn der Agent nie ein Token erhält, bekommt er womöglich eine Betriebsanleitung für Zugangsdaten, die er nicht lesen darf.

Gib einem Agenten das kleinste nützliche Aktionsvokabular. Er muss vielleicht `finance_export` für ein Ziel der Klasse `vendor_admin_api` anfordern. Den Tresorpfad, eine Mandanten-ID, das Format des Authorization-Headers oder die genaue Umgebungsvariable, die ein Geheimnis auflöst, braucht er nur selten. Wenn er diese Felder nicht sehen kann, kann er sie auch nicht in eine Patchbeschreibung, einen Terminal-Trace oder einen externen Tool-Aufruf übernehmen.

Das verbessert auch menschliche Genehmigungen. Ein Mensch genehmigt eine Aktion anhand ihrer Folge: «Finanzexport an die freigegebene Vendor-API senden.» Eine bessere Sicherheitsentscheidung entsteht nicht dadurch, dass die Oberfläche `vault://teams/finance/prod/...` oder einen kundenspezifischen Hostnamen anzeigt. Diese Details lenken den Genehmigenden ab und liefern Informationen an jeden, der den Datensatz später sieht.

Sallyport folgt dieser Trennung, indem API- und SSH-Zugangsdaten im verschlüsselten Tresor bleiben und die Aktion ausgeführt wird, ohne Zugangsdaten an den Agenten weiterzugeben. Sitzungs- und Aktivitätsprotokolle können den Agentenlauf und einzelne Aufrufe zeigen, ohne Secret-Werte für den Agenten verfügbar zu machen. Diese Grenze ist hilfreich, aber auch Aktionsnamen, Endpunkte und Aliase müssen auf Metadaten geprüft werden.

Warte nicht auf ein Token-Leck, um diese Artefakte zu untersuchen. Nimm ein repräsentatives CI-Log, Agentenprotokoll, Genehmigungs-Prompt, eine Konfigurationsdatei und ein Support-Ticket. Lies sie so, wie es ein Auftragnehmer mit umfassendem Projektzugriff tun würde. Markiere jedes Feld, das einen Mandanten, eine privilegierte Rolle, einen Secret Store, ein Cloud-Konto oder ein Netzwerkziel identifiziert. Entscheide anschließend, welche Felder die Aufgabe unterstützen und welche nur eine Geschichte erzählen, die deine Systeme nicht veröffentlichen mussten.

Der Wert der Zugangsdaten ist das Erste, was geschützt werden muss. Die Karte darum herum ist das Nächste, was du nicht weiter verteilen solltest.
