Promote railiance-backup-offsite-lane to active/resolvable after capabilities-safe re-verify. Add catalog risk=high, agent read-boundary (exit 7 + OpenBao policy companion), EXPOSED taint via warden taint, and close WP-0026.
4.9 KiB
Railiance Offsite Backup Lane
Date: 2026-07-16
Catalog: railiance-backup-offsite-lane (status active, resolvable: true, risk: high)
Owner: railiance-platform (CCR-2026-0004)
Nextcloud WebDAV upload token and URL for age-encrypted offsite backups (Option A).
Used by railiance-backup (workstation) and forgejo-backup (platform).
OpenBao pointers
| Field | Value |
|---|---|
| Mount | platform |
| Path | platform/workloads/railiance/backup/offsite-lane |
| Fields | NC_WEBDAV_TOKEN (primary fetch), NC_WEBDAV_URL, AGE_PRIVATE_KEY (recovery escrow) |
| Policy | workload-kv-read-railiance-backup-offsite-lane (operator OIDC) |
| Agent policy | agent-high-risk-boundary — deny data-read; metadata only |
| OIDC role | railiance-backup-workload-kv-read (groups=net-kingdom-admins) |
| Risk | high (upload token + age recovery escrow) |
Worker checklist
-
Login (caller identity — ops-warden adds no credential):
bao login -method=oidc -path=netkingdom role=railiance-backup-workload-kv-read -
Export for a backup run (sanctioned transports — never paste into chat):
# Preferred: file or exec injection via warden warden access railiance-backup-offsite-lane --no-policy --out /tmp/nc.token # or: warden access railiance-backup-offsite-lane --no-policy --exec -- env | grep -v .If you must use raw bao in an interactive human shell (not an agent session):
export RAILIANCE_BACKUP_NC_TOKEN=$( bao kv get -field=NC_WEBDAV_TOKEN platform/workloads/railiance/backup/offsite-lane ) export RAILIANCE_BACKUP_NC_WEBDAV_URL=$( bao kv get -field=NC_WEBDAV_URL platform/workloads/railiance/backup/offsite-lane ) -
Proxy via warden access (catalog active + resolvable):
warden access railiance-backup-offsite-lane --no-policy --fetch --out /tmp/nc.token # Primary field is NC_WEBDAV_TOKEN. AGE_PRIVATE_KEY is recovery escrow only. -
Run backup:
# workstation custodian DB + config bin/railiance backup # Forgejo production (from railiance-platform checkout) tools/cmd/forgejo-backup
AGE_PRIVATE_KEY in the same path is recovery escrow — fetch only for restore drills.
Agents (WARDEN_AGENT_ID set) cannot stream raw high-risk values; use --out /
--exec / --wrap. See wiki/playbooks/agent-read-boundary.md.
Verify the lane (capabilities-safe — never read the value)
Prove allow/deny with bao token capabilities, not bao kv get. Reading the
value to "confirm" it triggered the 2026-07-16 disclosure of NC_WEBDAV_TOKEN /
NC_WEBDAV_URL / AGE_PRIVATE_KEY (see history/2026-07-16-credential-disclosure-lessons.md).
# Positive: lane policy identity can read the data path
LANE=$(bao token create -policy=workload-kv-read-railiance-backup-offsite-lane -ttl=2m -field=token)
bao token capabilities "$LANE" platform/data/workloads/railiance/backup/offsite-lane
# → expect: read
bao token revoke "$LANE"
# Negative: default-only identity is denied (no value is read)
DEFAULT_TOKEN=$(bao token create -policy=default -field=token) # if this is denied, that IS the pass — do NOT fall back
bao token capabilities "$DEFAULT_TOKEN" platform/data/workloads/railiance/backup/offsite-lane
# → expect: deny
bao token revoke "$DEFAULT_TOKEN"
# Agent boundary: data deny, metadata allow
AGENT=$(bao token create -policy=agent-high-risk-boundary -ttl=2m -field=token)
bao token capabilities "$AGENT" platform/data/workloads/railiance/backup/offsite-lane # deny
bao token capabilities "$AGENT" platform/metadata/workloads/railiance/backup/offsite-lane # read
bao token revoke "$AGENT"
The capability lists contain no secret material — safe to record on
CCR-2026-0004 as promotion evidence. Full pattern:
wiki/playbooks/catalog-lane-promotion.md#capabilities-safe-lane-verification.
Evidence recorded 2026-07-16 (WP-0026 T07)
| Check | Result |
|---|---|
Policy workload-kv-read-railiance-backup-offsite-lane present |
pass |
OIDC role railiance-backup-workload-kv-read bound to net-kingdom-admins + lane policy |
pass |
| Lane-policy token capabilities on data path | read |
| Default-policy token capabilities on data path | deny |
| Agent-boundary token on data / metadata | deny / read |
| Field presence (keys only, lengths; no values) | NC_WEBDAV_TOKEN, NC_WEBDAV_URL, AGE_PRIVATE_KEY present |
| EXPOSED taint on version 2 | set (see warden taint railiance-backup-offsite-lane) |
| Rotation guidance | warden rotate-guide railiance-backup-offsite-lane |
Taint / rotation
warden taint railiance-backup-offsite-lane
warden rotate-guide railiance-backup-offsite-lane
Rotation of exposed values is the operator's optional call (buildup mode);
promotion is not blocked on rotation. After rotation, clear exposed_*
custom_metadata keys (wiki/playbooks/exposed-taint.md).