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:
77
policies/claude-rw.hcl
Normal file
77
policies/claude-rw.hcl
Normal 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.
|
||||
Reference in New Issue
Block a user