Newer
Older
openstack-caracal-dc-dc / creds-manifests / vm-secret-locations
# vm-secret-locations -- the ABSOLUTE bound on credential discovery (D-137 ruling 3).
#
# RULING 3, 2026-07-26, operator utterance "Declared locations only": this list bounds
# `--remote` ABSOLUTELY. The sweep visits these locations and NOTHING else. It never walks
# a host looking for secrets, never expands beyond a listed path, and never touches a
# tenant surface -- D-069 (tenant credential custody stays off-repo) is preserved BY
# CONSTRUCTION rather than by the sweep's good behaviour.
#
# ADDING A ROW HERE IS DEFINITION-OF-DONE FOR ANY NEW MINT SITE. A location that is not
# listed is not audited, and an unaudited location is how SEC-022 happened.
#
# WHY EACH CLASS IS PRESENT (the ruling's faithful-implementation note):
#   - per-site creds folders on the JUMPHOST      -- the SEC-009 convention itself
#   - per-site creds folders on the HEADEND       -- SEC-022, the shadow stores that were
#     structurally invisible: creds-audit resolves the folder against $HOME on whatever
#     host it runs on and contains no ssh at all, so a headend-resident store could never
#     be seen. D-128 puts Plane-2 execution on the headend, so these keep appearing.
#   - the region secrets dir                      -- SEC-020, where admin.pass sat
#     root-only for 12 days while the audit read CLEAN
#   - the three dirs outside the SEC-009 convention (research FINDING 2)
#   - the PKI overlay inside the repo clone       -- a CA private key plus a plaintext
#     passphrase, gitignored, in a repo SEC-004 records as currently PUBLIC
#
# ON THE TENANT DIRECTORIES, which look like a contradiction and are not: the per-tenant
# directories listed below are LOCAL operator-held copies on the jumphost. They are NOT a
# tenant surface. `ssh-target=local` is load-bearing -- no tenant VM, tenant project, or
# tenant-operated host is reachable from this file, and none may ever be added to it.
#
# FORMAT. Whitespace-separated: <host-role> <site-key> <ssh-target> <path>
#   host-role   the role token used by creds-matrix.tsv (jumphost|headend|netbox|...)
#   site-key    region-qualified site this location belongs to, or `-` if not site-scoped.
#               ADDED 2026-07-26 (committee finding): without it the checker matched
#               credentials on (role, basename) alone, so a file in ONE site's folder
#               satisfied the row for EVERY site -- which masked SEC-021's dc0
#               opnsense-api.txt absence. A per-DC credential must be resolved against its
#               OWN site's location or the check is decorative.
#   ssh-target  `local` = the host this runs on (the jumphost), else an ssh alias from
#               the D-126 ssh_config fragment (scripts/site-ssh-config.sh) -- these are
#               MEASURED as-built aliases, never invented hostnames
#   path        an absolute path or a `~`-relative one, expanded on the TARGET host.
#               A trailing `/*` means "the files directly in this directory".
# `#` comments and blank lines ignored. NO FIELD MAY CONTAIN WHITESPACE.
#
# A listed location that does not exist is NOT a failure -- it is reported as an explicit
# skip. Several of these belong to deployment stages this rehearsal has not reached.

# --- jumphost (vcloud): the SEC-009 convention -------------------------------
jumphost  vr1-office1  local  ~/vr1-office1-creds/*
jumphost  vr1-dc0      local  ~/vr1-dc0-creds/*
jumphost  vr1-dc1      local  ~/vr1-dc1-creds/*

# --- jumphost: OUTSIDE the SEC-009 convention (research FINDING 2) -----------
# Named in CLAUDE.md as secret locations, so KNOWN -- simply outside the control until now.
jumphost  -            local  ~/vault-init/*
jumphost  -            local  ~/octavia-pki/*
jumphost  -            local  ~/tenant-*/*
# The PKI overlay lands INSIDE the repo clone (gitignored). `<repo>` is substituted at
# runtime from the checker's own location -- the repo has been renamed once already
# (D-110) and its name must never be hardcoded into a command or a data file.
jumphost  -            local  <repo>/overlays/octavia-pki.yaml
# DOCFIX-175: the Office1 MAAS API key reaches tfstate in PLAINTEXT. A secret-at-rest
# location with no mint of its own -- declared so the copy is audited, not just the mint.
jumphost  vr1-office1  local  <repo>/opentofu/terraform.tfstate
# Committee finding: the tfstate SIBLINGS carry the same plaintext key and were unaudited.
jumphost  vr1-office1  local  <repo>/opentofu/terraform.tfstate.backup
jumphost  vr1-office1  local  <repo>/opentofu/terraform.tfstate.pre-*
# CLAUDE.md names ~/as-executed/ as credential material; it was missing from this list.
jumphost  -            local  ~/as-executed/*
# The Octavia PKI artifacts are written into THREE SUBDIRECTORIES (phase-01:288), so the
# bare ~/octavia-pki/* pattern matched ZERO of the 8 artifacts incl. two CA private keys.
jumphost  -            local  ~/octavia-pki/issuing-ca/*
jumphost  -            local  ~/octavia-pki/controller-ca/*
jumphost  -            local  ~/octavia-pki/controller/*
# Predicted Stage-5 exposure (SEC-023): phase-03 writes $HOME/admin-openrc.
jumphost  -            local  ~/admin-openrc

# --- headend (voffice1): the SEC-022 shadow stores + the region secrets dir ---
# The region dir is root-owned; the sweep reads METADATA ONLY (existence, mode, digest)
# and never file content.
headend   vr1-dc0      voffice1  ~/vr1-dc0-creds/*
headend   vr1-dc1      voffice1  ~/vr1-dc1-creds/*
headend   vr1-office1  voffice1  /root/maas-secrets/*
# MEASURED 2026-07-26: the CLI profile, the Juju client store, the MAAS snap ssh dir (which
# holds the per-DC power keys) and the rack-enrollment secret all live OUTSIDE the region
# secrets dir. Each was an inferred path in the first matrix draft; these are the real ones.
headend   vr1-office1  voffice1  ~/snap/maas/current/.maascli.db
headend   -            voffice1  ~/.local/share/juju/*
headend   -            voffice1  /var/snap/maas/current/root/.ssh/*
headend   vr1-office1  voffice1  /var/snap/maas/common/maas/secret

# --- netbox VM: the founding SEC-009 miss ------------------------------------
netbox    vr1-office1  office1-netbox  /root/netbox-secrets/*