OpenBao custody: live e2e against a real OpenBao instance #112
Labels
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: Cordy/Cairn#112
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The OpenBao key-custody backend (#29, v0.3.28) is unit-tested against a fake KV v2 only. Before any customer runs
keyCustody: "openbao"— and AD parity is one of its selling points — it needs a pass against the real thing. Moved onto the v0.6 closed-beta milestone per the 2026-08-04 roadmap redesign.Plan (same pattern as the Keycloak/interop e2e work):
keyCustody: "openbao"+ recovery identity, storage on a scratch bucket.interop-openbao.ymlon the runner (LAN test host):{prefix}/users/<u>— verify via OpenBao API; roundtrip read.X-Cairn-Grouppath) →{prefix}/groups/<space>provisioned; member roundtrip.age -dwith recovery key.legacyIdentitiesretained), old object still decrypts.Open question: keep the OpenBao instance standing (it doubles as a custody option for other homelab experiments) or tear down after green — decide when it exists.
Triage: tandem (needs a real OpenBao). The
openbaokey-custody backend exists and is unit-tested; this is a live e2e against an actual OpenBao KV v2 mount (provision + token). I can prep a test workflow/checklist; you stand up the instance.Verified — OpenBao custody works end to end against a real OpenBao instance.
Deployed (GitOps):
k3s/openbao/openbao.yaml. Plain HTTP on the cluster network,disable_mlock, health probe lenient enough to stay routable while sealed (so init/unseal reach it). Test-grade: one unseal key, no auto-unseal — a pod restart re-seals and needs a manualbao operator unseal.secret/; least-privilegecairnpolicy (create/read/update/deleteonsecret/data/cairn/*,+listonsecret/metadata/cairn/*); a periodic token issued to Cairn.cairn-openbao—k3s/cairn/openbao-dogfood.yaml, own Garage bucketcairn-openbao, OIDC against the same realm, HTTPS via Caddy. Encryption config:keyCustody: openbao,openbaoMount: secret,openbaoPathPrefix: cairn,postQuantum: truewith a hybrid (age-keygen -pq) recovery identity.Verification:
storage encryption enabled custody=openbao recovery=true,auth=oidc,version=v0.6.16. No flavour-mismatch refusal, so the hybrid recovery key correctly matchespostQuantum: true.nikola-test,bao kv list secret/cairn/usersreturnsnikola-test; the age identity is stored atsecret/cairn/users/nikola-testin OpenBao — and not in the Keycloak user profile (nocairnAgeIdentityattribute). Uniform custody without writable IdP attributes, which is the point of the mode (AD deployments).groupsclaim, empty on the fresh bucket — not another instance's data.The OpenBao deployment and the test instance stay in GitOps for future regression. Closing as done.