diff --git a/credential-change-requests/CCR-2026-0051-mas-tem-relay-smtp.yaml b/credential-change-requests/CCR-2026-0051-mas-tem-relay-smtp.yaml new file mode 100644 index 0000000..dc27095 --- /dev/null +++ b/credential-change-requests/CCR-2026-0051-mas-tem-relay-smtp.yaml @@ -0,0 +1,95 @@ +id: CCR-2026-0051 +kind: credential-change-request +schema_version: 1 +request_type: workload-kv-read +title: Temporary MAS Scaleway TEM relay SMTP ESO read lane +status: proposed +created: '2026-10-18' +updated: '2026-10-18' +requester: + agent: ops-mason + reason: ops-mason plans/mas-tem-relay-smtp.md (MASON-WP-0014, reviewed 2026-10-18T10:13:55Z) + for consumer mail-address-semantics MAS-WP-0003. Hub messages daa119e6, a77e5879 + (kv_path correction) and 049afa1f. No approval is implied by this filing. +review: + required: true + required_approvers: + - founder + - railiance-platform-owner + - mail-address-semantics-owner + comments: [] +target: + domain: infotech + tenant: platform + workload: mas-tem-relay + environment: production + purpose: Deliver Scaleway TEM SMTP relay username/password to namespace mas only. + Temporary lane; torn down with namespace mas. +openbao: + mount: platform + kv_path: platform/suppliers/scaleway/mas-tem-relay + fields: + - username + - password + metadata_read: false + token_self_lifecycle: true + policy_name: workload-kv-read-mas-tem-relay + policy_file: openbao/policies/workload-kv-read-mas-tem-relay.hcl + auth: + method: kubernetes + mount: kubernetes + role: external-secrets-mas-tem-relay + bound_claims: + service_account_names: + - mas-tem-relay-eso + service_account_namespaces: + - mas + bound_claims_confirmed: false + policies: + - workload-kv-read-mas-tem-relay + ttl: 15m + audience: openbao + token_max_ttl: 15m + token_explicit_max_ttl: 15m + token_no_default_policy: true +access_frontdoor: + type: external-secrets + catalog_id: mas-tem-relay-smtp + selector: Namespace mas, SA mas-tem-relay-eso only + readiness: pending-review + resolvable: false +delivery: + surface: external-secrets + target: Namespace mas; dedicated SA mas-tem-relay-eso; ExternalSecret projecting + username and password only. + bootstrap_command: Not applicable. KV value already written by the founder (v2); + this CCR creates no value and authorizes no value read. +risk: + classification: medium + notes: + - Supplier SMTP credential can send mail as the TEM sending domain; exposure is + limited to namespace mas. + - New read scope on a supplier path; founder approval required. No other lane reads + this path (ops-mason live survey 2026-10-18T10:13:55Z). + - Apply may be run by ops-mason under ops-mason-construct (MASON-IN-0005) once + installed (MASON-WP-0015-T02) and this CCR is approved; that grant covers + workload-kv-read-* policies and external-secrets-* roles only. +verification: + positive: + - Exact SA/namespace/audience login succeeds; ESO Ready/SecretSynced; metadata + version matches admitted KV version 2 without printing values. + negative: + - Wrong SA, namespace or audience login refused; sibling paths under platform/suppliers/scaleway, + list, metadata, write and delete denied. + activation_conditions: + - Founder, platform owner and consumer owner approve the exact CCR. + - Native bound claims confirmed (confirm-binding) and native policy/role readback + matches source. + evidence: [] +lifecycle: + deactivate: Delete ExternalSecret and role external-secrets-mas-tem-relay, then + policy workload-kv-read-mas-tem-relay, when namespace mas is torn down. + rotate: Founder writes a new KV version via UI; ESO refresh picks it up; verify + metadata version only. + compromised: Revoke the SMTP credential at Scaleway, disable the role, rotate the + KV value, then re-enable after review. diff --git a/openbao/policies/workload-kv-read-mas-tem-relay.hcl b/openbao/policies/workload-kv-read-mas-tem-relay.hcl new file mode 100644 index 0000000..bc3fcbe --- /dev/null +++ b/openbao/policies/workload-kv-read-mas-tem-relay.hcl @@ -0,0 +1,11 @@ +path "platform/data/suppliers/scaleway/mas-tem-relay" { + capabilities = ["read"] +} + +path "auth/token/lookup-self" { + capabilities = ["read"] +} + +path "auth/token/revoke-self" { + capabilities = ["update"] +} diff --git a/workplans/RPF-WP-0061-self-service-ccr-intake.md b/workplans/RPF-WP-0061-self-service-ccr-intake.md new file mode 100644 index 0000000..969acc5 --- /dev/null +++ b/workplans/RPF-WP-0061-self-service-ccr-intake.md @@ -0,0 +1,124 @@ +--- +id: RPF-WP-0061 +type: workplan +title: "Self-service CCR intake: clients file and progress CCRs without a platform worker" +domain: financials +repo: railiance-platform +status: proposed +owner: codex +created: "2026-10-18" +updated: "2026-10-18" +flavor: implementation +origin: cross-repo +origin_ref: ops-mason daa119e6 / 049afa1f; MASON-IN-0005 +--- + +Demand: every credential change request today waits on a railiance-platform +worker session to allocate the CCR number, copy the client's draft and policy +file into this repo, run `credential-change.py validate`, write the platform +owner review and relay the founder command. For routine lanes the worker adds +no judgement: ops-mason already produces drafts that pass `validate` +(MASON-WP-0010-T03, MASON-WP-0014), and from MASON-IN-0005 ops-mason can apply +`workload-kv-read-*` policies and `external-secrets-*` roles itself. The worker +has become a relay, and clients stall whenever no platform session runs. + +Goal: a client can take a standard CCR from draft to approved and applied +using only repo tooling, CI and the State Hub decision flow. Platform judgement +is moved into a versioned, reviewed *standard lane profile*; only requests that +fall outside it are routed to a platform worker. + +Invariants (unchanged by this plan): + +- CCRs remain non-secret repo files in `credential-change-requests/`; the repo + stays authoritative and the hub stays a read model. +- Founder approval is never automated. Bound claims still need + `confirm-binding` against native state before apply. +- Nothing here widens ops-mason-construct or any applier grant; secret-id, + token creation and value reads stay with the founder and applier. + +## Design + +1. **Submit.** The client runs, in a railiance-platform checkout, + `scripts/credential-change.py submit --bundle