spike: PBS DR tier provisioning SLICE 0 — all 3 mechanisms settled (token-create impossible -> pinned sudoers; ep0 tenancy op-set + stdout secret transport proven; encryption-key autogen births K, pvesm remove deletes it)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
This commit is contained in:
2026-07-10 20:12:26 +02:00
parent 4703b9ec4e
commit 00afadc1fe
3 changed files with 204 additions and 17 deletions
+29 -17
View File
@@ -2,22 +2,34 @@
> **Overwrite** this file with a summary of the most recent task only (uniform with the other repos; not cumulative). The cumulative hub history lives in [hub/CHANGELOG.md](hub/CHANGELOG.md); the scripts history lives in [scripts/CHANGELOG.md](scripts/CHANGELOG.md).
## TASK — hub v0.43.1: Git Sync form hint (credentials optional) — 2026-07-10
## SPIKE — PBS DR tier auto-provisioning, SLICE 0: the three load-bearing mechanisms — 2026-07-10
**Pairs with controller v0.112.0 (anonymous registry self-update — full report in
felhom-controller/REPORT.md).** One template string, no behavior change: the config editor's Git Sync
section looked load-bearing, but the credentials matter only for a PRIVATE app catalog — since
controller v0.112.0 version discovery + self-update work without them (anonymous Docker v2 token flow).
**No production code — findings record at
`documentation/audits/SPIKE-pbs-tier-provisioning-2026-07-10.md`.** All three unproven mechanisms of the
"PBS DR tier" epic got empirical answers; every probe artifact was `spike-*`-named and torn down (asserted);
the demo's real `felhom-offsite`/`felhom-pbs` storages re-verified active afterwards. Viktor approved the
one 🛑 (the ep0 touch) mid-run.
- `config_form.html` Git Sync section gains the hint: **"Opcionális — csak privát
alkalmazás-katalógushoz. A verziófrissítés enélkül is működik."**
- Deployed via GitOps: image `0.43.1`, manifest bump, ArgoCD sync → Synced/Healthy, rollout complete.
- Green gate green; render tests cover template parse.
**Pending operator step (per the controller task spec):** after the floor bump rolls Peti to 0.112.0,
delete the temporary Git Sync creds from Peti's hub config → next config pull → Peti's settings page
shows "Registry: nyilvános (hitelesítés nélkül)" with zero credentials on the box. (Verified live on
the credential-less demo box already: anonymous check OK, latest resolved, mode line renders.)
*(Previous report — hub v0.43.0 remote app-log diagnostics incl. the completed live tail round-trip —
is recorded in hub/CHANGELOG.md v0.43.0 and the git history of this file.)*
- **Probe 1 (demo host): path-scoped token create is IMPOSSIBLE.** `POST/PUT/DELETE /storage*` all 403 with
`Permission check failed (/storage, Datastore.Allocate)` — the whole entry-lifecycle CRUD checks the
`/storage` ROOT; `/storage/<id>` ACLs govern usage only. **Probe 1b settled the fallback:** a pinned-id
sudoers alias (`pvesm add/set/remove <id>`, `pveum acl modify /storage/<id>`) — full cycle green as the
`felhom-agent` user via `sudo -n`, unpinned id denied. Gotcha: sudo logs argv → the token secret must go
through a stdin-reading root wrapper, never `sudo pvesm add --password …`.
- **Probe 2 (ep0, 🛑): the tenancy op-set + secret transport PROVEN.** Recon recorded the surface (one
`restrict`+forced-command key, one sudoers line; the peersync user can sudo nothing else — live-proven).
Throwaway `spike-tenant` on the real `felhom-offsite`: namespace + privsep token + dual-grant, the token
secret returned over SSH stdout (36 bytes, never persisted on ep0, never displayed), S4 isolation asserts
green incl. a real cross-tenant WRITE 403. Ordering gotchas recorded (token-before-ACL; delete-token purges
its ACLs; no `--output-format` on generate-token). Slice-1 recommendation: a second forced-command surface
(`felhom-tenantsync`, own keypair + sudoers line), peersync untouched.
- **Probe 3 (demo host): `pvesm add pbs … --encryption-key autogen` works end-to-end.** Entry active, K born
at `/etc/pve/priv/storage/<id>.enc` (0600, = `PBSEncKeyPath` on demo), vzdump of a small guest lands as
**ciphertext** PBS-side (`crypt-mode: encrypt` — the doc-06 property), `escrow-create` would find K.
**`pvesm remove` DELETES the `.enc` (K!) + `.pw`** → the epic's re-apply must be `pvesm set`-only.
- **Flags surfaced (pre-existing):** orphan `root@pam!spike` DatastoreAdmin on ep0 `/datastore/scratch`;
the demo host is missing the §4b step-3 `/storage/felhom-pbs|felhom-offsite` FelhomAgentStore grants
(backups still green — needs a deliberate re-assert before slice 2 codifies the self-grant); 180's
`felhom@pbs!n100` is datastore-wide DatastoreAdmin (dev-grade, don't copy).
- **Epic slice map** (hub tenantsync + consume-once → agent apply-bridge with stdin-wrapper + set-only
re-apply → DR schedule/monitoring → Peti ceremony one-liner) in the record §5.