Policy claude-rw einchecken und SSH-Rechte eingrenzen

Die Policy der Agentenidentitaet claude existierte nur live in OpenBAO und
fehlte als Datei - deshalb war sie bei der Fehlersuche nicht gegenzulesen.

Inhaltlich umgebaut: statt einem pauschalen path "claude/*" nun getrennte
Pfade je Mount. Grund: claude/* deckt auch claude/ssh/config/ca und
claude/ssh/roles/* mit Schreibrecht ab - das war mit einem Testtoken belegt.
Damit haette die Identitaet die SSH-CA ueberschreiben und eigene Rollen mit
beliebigen Principals anlegen koennen, was auf jedem Host, der die CA kennt,
faktisch Root bedeutet. Jetzt gilt: Rollen definiert der Admin, signieren
darf claude.

Dazu die beiden Punkte, die vorher gefehlt hatten: fuer KV v2 sind data/ und
metadata/ getrennte Pfadbaeume und "list" ist eine eigene Faehigkeit; und
sys/mounts mit read, damit `bao secrets list` auf der Kommandozeile nicht
leer bleibt.

Mit Testtoken nachgeprueft: alle erwarteten Rechte vorhanden,
claude/ssh/config/ca und secret/* verweigert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FXUoNtUh1qEdZXSzQeSos4
This commit is contained in:
2026-10-03 10:51:53 +02:00
parent 14275a5627
commit 175c0bc2d1

77
policies/claude-rw.hcl Normal file
View File

@@ -0,0 +1,77 @@
# Rechte der Agentenidentitaet "claude" (Entity claude-automations).
# Umgebaut 2026-10-03 als Ersatz fuer das zu grobe path "claude/*".
#
# Warum nicht einfach claude/*: dieses Muster deckt auch claude/ssh/config/ca und
# claude/ssh/roles/* MIT SCHREIBRECHT ab (mit einem Testtoken belegt). Damit koennte
# diese Identitaet die SSH-CA ueberschreiben und eigene Rollen mit beliebigen
# Principals anlegen - auf jedem Host, der die CA kennt, faktisch Root.
# Aufteilung daher: Rollen definiert der Admin, signieren darf claude.
#
# Hinweis zur Syntax: in OpenBAO ist * NUR als letztes Zeichen eine Wildcard;
# mitten im Pfad ist es ein literales Sternchen. Fuer ein einzelnes Segment: +.
# "list" ist eine eigene Faehigkeit und steckt nicht in "read".
# ---------- KV v2 ----------
# Die Daten liegen unter data/, das Auflisten laeuft ueber metadata/ - zwei
# getrennte Pfadbaeume desselben Mounts.
path "claude/kv/data/*" {
capabilities = ["create", "read", "update", "patch", "delete"]
}
# Beide Formen absichtlich: claude/kv/metadata/* hat den Praefix
# "claude/kv/metadata/" und trifft den Wurzel-Listing-Pfad ohne Schraegstrich nicht.
path "claude/kv/metadata" {
capabilities = ["list"]
}
path "claude/kv/metadata/" {
capabilities = ["list"]
}
path "claude/kv/metadata/*" {
capabilities = ["list", "read", "delete"]
}
# Soft-Delete, Wiederherstellen und endgueltiges Loeschen von Versionen.
path "claude/kv/delete/*" {
capabilities = ["update"]
}
path "claude/kv/undelete/*" {
capabilities = ["update"]
}
path "claude/kv/destroy/*" {
capabilities = ["update"]
}
# ---------- SSH ----------
# Signieren mit vorhandenen Rollen ja, Rollen oder CA aendern nein.
path "claude/ssh/sign/*" {
capabilities = ["update"]
}
path "claude/ssh/roles" {
capabilities = ["list"]
}
path "claude/ssh/roles/*" {
capabilities = ["read"]
}
# claude/ssh/config/* fehlt hier BEWUSST - siehe Kopf.
# ---------- TOTP ----------
path "claude/totp/code/*" {
capabilities = ["read", "update"]
}
path "claude/totp/keys" {
capabilities = ["list"]
}
path "claude/totp/keys/*" {
capabilities = ["read", "create", "update", "delete"]
}
# ---------- Sichtbarkeit der Mounts ----------
# Die Mount-Liste der Weboberflaeche kommt aus sys/internal/ui/mounts und ist
# policy-gefiltert, braucht das hier nicht. `bao secrets list` auf der
# Kommandozeile liest dagegen sys/mounts und bliebe sonst leer.
path "sys/mounts" {
capabilities = ["read"]
}
# Selbstverwaltung des eigenen Tokens (lookup-self, renew-self, revoke-self)
# kommt aus der Policy "default" und steht hier deshalb nicht noch einmal.