Credential Custody Map

Where every credential class lives — Vault, ESO-materialized Secret, htpasswd, local-only file, or operator-managed — owner, rotation, and reference doc.

The lab’s credentials live in a small number of well-defined custody planes. This page is the map. For each credential class it lists the custodian (where the value lives), the owner, the rotation policy, and the canonical operator-doc reference. No credential values appear on this page.

Custody planes

PlaneWhat lives there
Vault (KV-v2)Long-lived secrets consumed by clusters via ESO, plus a few local-automation tokens.
ESO-materialized SecretPer-namespace Kubernetes Secrets created by ESO from Vault. Treated as ephemeral copies.
OBC-generated SecretNooBaa OBC creates a Secret in the operand namespace. Bridged into operand-shaped Secret via ESO.
htpasswd (in-cluster)OpenShift identity-provider bootstrap and a few operator-bootstrap credentials (RHACS Central admin).
Local-only fileWorkstation files under opp-full-plat/secrets/ (local-only, contents not enumerated here) for bootstrap credentials that pre-date Vault.
Operator-managedGenerated by an operator (e.g., NooBaa OBC, cert-manager, ACM). Not human-edited.

Credential classes

Credential classCustodianOwnerRotation policyReference
Vault root token + unseal keysLocal-only (out-of-band) on operator workstationplatform-adminManual; on operator changeplans/disconnected-rebuild/environments/dc-lab/vault-oss-vm-plan.md
Vault snapshot tokenScoped Vault token (not root)platform-adminPer Vault policyvault-oss-vm-plan.md
OpenShift kubeadmin password (hub)Local-only file at the hub kubeadmin password file (local-only)platform-adminManual rotate after install steady stateconnection-details/platform-admin-handoff.md
OpenShift kubeadmin password (spoke)Local-only file at the spoke kubeadmin password file (local-only)platform-adminManual rotate after install steady stateconnection-details/platform-admin-handoff.md
Nexus admin passwordLocal-only file at the Nexus admin password file (local-only)platform-adminManual; do not shareconnection-details/nexus.md
Nexus jenkinsbot service accountLocal-only file at the Nexus jenkinsbot password file (local-only)platform-admin (Jenkins consumer)Manual; rotate on suspected leakconnection-details/nexus.md
Nexus OAuth2 cookie secretLocal-only file at the Nexus OAuth2 cookie-secret file (local-only)platform-adminOn compromiseconnection-details/nexus.md
MinIO CI evidence writerLocal-only file at secrets/minio-developer-ci-evidence.envplatform-adminManualconnection-details/minio.md
MinIO CI evidence readerLocal-only file at secrets/minio-developer-ci-evidence-reader.envplatform-adminManualconnection-details/minio.md
GitLab admin PATVault secret/platform/gitlab/admin-patplatform-adminPer GitLab PAT policyplans/disconnected-rebuild/gitlab-bootstrap-design.md
GitLab runner registration token (per class)Vault secret/platform/gitlab-runner/<class>/registration-tokenplatform-adminOn runner rebuildplans/gitlab-runner-classes-and-tags.md
GitLab MR creator PATLocal-only file at the bootstrap GitLab PAT file (local-only)platform-adminManualreference_platform_gitops_mr_path.md
Cluster ESO Kubernetes-auth reviewer SAIn-cluster SA + Vault auth mount configplatform-adminOn Vault re-initvault-oss-vm-plan.md
App tenant Vault paths (secret/apps/<division>/<app>/...)Vault KV-v2division teamPer app policyconnection-details/vault-app-secrets.md
App tenant ESO SecretStoreNamespace-scoped CR in tenant namespacedivision teamGitOps-managedconnection-details/vault-app-secrets.md
Quay robot token (per team)Vault secret/apps/<division>/<app>/ci/quay-robotdivision teamPer team policyreference_quay_robot_token_convention.md
Quay config bundle (in-cluster operand)Vault secret/ocp/spoke-dc-v6/quay/config-bundleplatform-adminOn Quay redeployproject_obc_to_operand_secret_bridge.md
App registry pull secretVault secret/ocp/spoke-dc-v6/registries/app-registry-pullplatform-adminOn Nexus credential rotateconnection-details/app-registry-pullsecret.md
OADP S3 credentialsOADP DataProtectionApplication Secret in openshift-adpplatform-adminOn MinIO key rotateOADP install runbook
NooBaa OBC creds (Loki / Tempo / Quay)NooBaa-generated Secret + ConfigMap in operand namespaceoperator-managedOBC lifecycleproject_obc_to_operand_secret_bridge.md
RHACS Central admin (htpasswd)In-cluster Secret in stackrox namespaceplatform-adminOn Central reinstallreference_rhacs_init_bundle_via_api.md
RHACS init bundle (kubectlBundle)Vault for ESO delivery; flattened from Central APIplatform-adminOn bundle regenreference_rhacs_init_bundle_via_api.md
Let’s Encrypt wildcard private keys (*.apps.sub.*, *.mon.sub.*)On HAProxy VM under /etc/haproxy/certs/platform-adminLE renewal (90d)reference_haproxy_vm.md
ACME dns_pdns credentialsOn pdns VM under acme.sh userplatform-adminOn PowerDNS API key rotatereference_pdns_vm.md
OIDC client secrets (WSO2 / Nexus / GitLab / Grafana)Local-only file under secrets/ (e.g., the Nexus OIDC client config (local-only))platform-adminOn IdP rebuildper-service connection-detail doc
SSH custody for platform VMsLocal-only on operator workstationplatform-adminPer personal key rotation policyreference_lab_infrastructure.md

Custody plane: Vault

Path conventions and policies are detailed in Vault Paths. Highlights:

  • secret/ocp/<cluster>/* -> per-cluster platform secrets read via ESO.
  • secret/platform/* -> lab-automation tokens (GitLab, MinIO HMAC, runners).
  • secret/apps/<division>/<app>/<env>/* -> tenant secrets read by tenant SecretStore (vault-apps) into the tenant namespace.

Custody plane: ESO-materialized Secret

ESO consumes Vault paths and writes namespace-scoped Kubernetes Secrets. These Secrets are treated as ephemeral: GitOps must not manage them directly, and they must not be backed up. The ExternalSecret manifest is the source of truth — re-creating the ExternalSecret re-creates the Secret.

Custody plane: htpasswd

Used only where an operator’s bootstrap design requires it:

  • OpenShift cluster admin identity provider (post-kubeadmin handover) — managed by the cluster install GitOps.
  • RHACS Central admin — generated at install, captured via the Central API for downstream init-bundle generation (per reference_rhacs_init_bundle_via_api.md).

Custody plane: local-only files

Files under opp-full-plat/secrets/ (local-only, contents not enumerated here) are mode-restricted, git-ignored, and never copied off the operator workstation. They cover the gap between “cluster + Vault are up” and “Vault is the system of record”. The directory is the canonical custody location for:

  • kubeadmin passwords (hub + spoke).
  • Nexus admin + service-account passwords + OIDC client.
  • MinIO CI evidence keys (writer + reader).
  • GitLab MR-creator PAT.
  • Vault unseal/root material (out-of-band copy).

The .prev and .stale-pre-* siblings are previous custody — not for use unless rolling back.

Rotation policy notes

ClassCadenceTrigger
LE wildcard certsEvery renewal (~60-90 days)ACME timer on HAProxy VM.
Nexus service accountsOn suspected leakManual; re-issue + restart Jenkins job creds.
Vault root tokenNever used for automationUse a scoped role / policy instead.
App tenant Vault pathsPer division teamOnboarding script + tenant policy.
GitLab admin PATPer GitLab policyStored in Vault secret/platform/gitlab/admin-pat.
OpenShift kubeadminAfter installing real IdPThen disable kubeadmin per OCP guidance.

Failure modes

SymptomRoot causeFix
ESO Status: Failed, “permission denied” on Vault pathTenant SA not in role’s namespace globRe-run onboarding with correct division name.
ESO operand Secret missing keysOBC -> operand shape mismatchApply the OBC -> operand ExternalSecret bridge.
Jenkins push fails 403 on app-registry.*jenkinsbot credentials rotated but Jenkins not updatedUpdate Jenkins credential nexus-jenkinsbot and rerun.
Cert expiry alert from HAProxyacme.sh renewal failedCheck PowerDNS API key + acme.sh log on pdns VM.

Internal only

All concrete credential values are kept off this site. Local custody paths are listed by filename above; the values themselves are in opp-full-plat/secrets/ or in Vault.

Last regenerated from connection-details/platform-admin-handoff.md, connection-details/nexus.md, connection-details/minio.md, connection-details/vault-app-secrets.md, reference_lab_infrastructure.md, reference_quay_robot_token_convention.md, reference_rhacs_init_bundle_via_api.md, reference_haproxy_vm.md.

Last reviewed: 2026-05-11