diff --git a/credential-change-requests/CCR-2026-0008-binky-qonto-api.yaml b/credential-change-requests/CCR-2026-0008-binky-qonto-api.yaml new file mode 100644 index 0000000..dbd631f --- /dev/null +++ b/credential-change-requests/CCR-2026-0008-binky-qonto-api.yaml @@ -0,0 +1,105 @@ +id: CCR-2026-0008 +kind: credential-change-request +schema_version: 1 +request_type: workload-kv-read +title: Binky Qonto bank API credentials (tenant lane, read-only MCP) +status: approved +created: '2026-07-21' +updated: '2026-07-21' +requester: + agent: grok + reason: Establish OpenBao custody for Binky Hedgehog GmbH / Operational Knowledge + GmbH Qonto API credentials used by the self-hosted qonto/qonto-mcp-server (binky-control + BINKY-WP-0005; DEC-2026-004 approved). Read-only use enforced at harness tool + allow-list; payments/transfers remain founder Red lane forever. +review: + required: true + required_approvers: + - platform-operator + comments: + - at: '2026-07-21T19:26:02+00:00' + reviewer: bernd.worsch + decision: approved + comment: 'Approved as platform implemention of DEC-2026-004 (founder 2026-07-19): + self-hosted qonto-mcp-server, tenants/binky/qonto/api custody, read-only harness. + Proceed with policy+OIDC role apply; secret values remain founder Red-lane only.' +target: + domain: financials + tenant: binky + workload: qonto + environment: production + purpose: Read-only Qonto MCP for balance/transactions/CostRunRate feeds +openbao: + mount: tenants + kv_path: tenants/binky/qonto/api + fields: + - QONTO_API_KEY + - QONTO_ORGANIZATION_ID + policy_name: workload-kv-read-binky-qonto-api + policy_file: openbao/policies/workload-kv-read-binky-qonto-api.hcl + auth: + method: oidc + mount: netkingdom + role: binky-qonto-api-workload-kv-read + allowed_redirect_uris: + - https://bao.coulomb.social/ui/vault/auth/netkingdom/oidc/callback + - http://localhost:8250/oidc/callback + - http://127.0.0.1:8250/oidc/callback + oidc_scopes: + - openid + - profile + - email + - groups + user_claim: sub + groups_claim: groups + bound_claims: + groups: + - net-kingdom-admins + bound_claims_confirmed: true + policies: + - workload-kv-read-binky-qonto-api + ttl: 15m +access_frontdoor: + type: ops-warden + catalog_id: binky-qonto-api + selector: binky qonto api bank + command: warden access binky-qonto-api --out FILE + resolvable: false + readiness: approved-pending-apply +delivery: + surface: operator-workstation + target: qonto-mcp-server via env QONTO_API_KEY/QONTO_ORGANIZATION_ID (names only); + binky-control finance/ for metadata-only evidence (no bulk statements in git) +risk: + classification: high + notes: + - Full-scope bank API key (Qonto keys are not scope-limited server-side). + - Read-only is harness-enforced (tool allow-list); never allow payment/transfer + tools. + - "High-risk lane (WP-0026 T04) \u2014 agents must not stream raw values; use --out/--exec/--wrap." + - Values must not appear in Git, State Hub, chat, or workplans. + - ops-warden proxies as the caller and must not retain values. + - Distinct from platform/workloads/* fleet lanes; lives on mount tenants/. +verification: + positive: + - Approved net-kingdom-admins identity can read the data path (capabilities include + read) without printing values. + negative: + - default-policy token denied on tenants/data/binky/qonto/api. + activation_conditions: + - tenants/ KV v2 mount enabled on bao.coulomb.social (already from CCR-2026-0007). + - Policy and OIDC role applied. + - Secret values provisioned by founder (Red lane) through approved custody. + - Positive and negative capabilities-safe verification recorded. + - ops-warden catalog promoted after verify + provision. + evidence: [] +lifecycle: + deactivate: Disable ops-warden catalog entry and detach OIDC role policy; revoke + API key in Qonto dashboard. + rotate: Mint a new API key in Qonto /settings/integrations; bao kv put tenants/binky/qonto/api + QONTO_API_KEY=@file (and QONTO_ORGANIZATION_ID if changed); revoke old key; verify + capabilities-safe. + compromised: Deactivate front door, revoke key in Qonto, clear EXPOSED taint after + rotation, record blast-radius notes. +state_hub: + workplan_id: BINKY-WP-0005 diff --git a/docs/workload-kv-access-lanes.md b/docs/workload-kv-access-lanes.md index ff8094c..cf53f89 100644 --- a/docs/workload-kv-access-lanes.md +++ b/docs/workload-kv-access-lanes.md @@ -397,6 +397,32 @@ warden access binky-company-email-imap --all --out /tmp/p # preferred Onboarding playbook: `ops-warden/wiki/playbooks/tenant-secret-onboarding.md`. +### Binky Qonto bank API (`CCR-2026-0008`) + +| Item | Value | +| --- | --- | +| ops-warden catalog id | `binky-qonto-api` | +| Tenant | `binky` | +| Mount | `tenants` | +| OpenBao CLI path | `tenants/binky/qonto/api` | +| Fields | `QONTO_API_KEY`, `QONTO_ORGANIZATION_ID` | +| Read policy | `workload-kv-read-binky-qonto-api` | +| Policy file | `openbao/policies/workload-kv-read-binky-qonto-api.hcl` | +| OIDC role | `binky-qonto-api-workload-kv-read` | +| Front-door readiness | draft until founder Red provision (DEC-2026-004 / BINKY-WP-0005-T05) | +| Risk | high | +| Consumer | self-hosted `qonto/qonto-mcp-server`; harness read-only tool allow-list | + +```bash +bao login -method=oidc -path=netkingdom role=binky-qonto-api-workload-kv-read +# after provision: +warden access binky-qonto-api --all --exec -- \ + env | grep -E '^QONTO_' | sed 's/=.*/=/' # lengths only in normal ops +``` + +Design: `binky-control/integrations/qonto-mcp.md`. +Onboarding playbook: `ops-warden/wiki/playbooks/tenant-secret-onboarding.md`. + ## agent-harness Forgejo deploy key | Item | Value | diff --git a/openbao/policies/agent-high-risk-boundary.hcl b/openbao/policies/agent-high-risk-boundary.hcl index ae59d32..858f023 100644 --- a/openbao/policies/agent-high-risk-boundary.hcl +++ b/openbao/policies/agent-high-risk-boundary.hcl @@ -30,6 +30,12 @@ path "tenants/data/binky/company-email/imap" { path "tenants/metadata/binky/company-email/imap" { capabilities = ["read"] } +path "tenants/data/binky/qonto/api" { + capabilities = ["deny"] +} +path "tenants/metadata/binky/qonto/api" { + capabilities = ["read"] +} path "sys/capabilities-self" { capabilities = ["update"] diff --git a/openbao/policies/workload-kv-read-binky-qonto-api.hcl b/openbao/policies/workload-kv-read-binky-qonto-api.hcl new file mode 100644 index 0000000..fc82a14 --- /dev/null +++ b/openbao/policies/workload-kv-read-binky-qonto-api.hcl @@ -0,0 +1,12 @@ +# Least-privilege read policy for Binky Qonto bank API credentials. +# Tenant mount (WARDEN-WP-0028) — client commercial secrets, not platform workloads. +# Exact path only; no list on parent, no sibling tenant paths. +# Used by self-hosted qonto/qonto-mcp-server (BINKY-WP-0005); read-only at harness. + +path "tenants/data/binky/qonto/api" { + capabilities = ["read"] +} + +path "tenants/metadata/binky/qonto/api" { + capabilities = ["read"] +}