CCR-2026-0057: approved (platform-owner, net-kingdom-owner)
All checks were successful
CCR intake gate / gate (push) Successful in 1m10s
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s

Founder approval in session 2026-10-31 for NK-WP-0056-T09.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 994874@bnt-lap001
Assistant-Session: 6017c416-d619-47eb-bd1a-f670a02d7d87
This commit is contained in:
codex 2026-10-31 12:50:43 +01:00
parent 0f012dbe28
commit 2ac97865da

View file

@ -2,32 +2,43 @@ id: CCR-2026-0057
kind: credential-change-request
schema_version: 1
request_type: attended-service-credential-delivery
title: NetKingdom synthetic journey identity (syn-journey) password and TOTP seed custody
status: proposed
title: NetKingdom synthetic journey identity (syn-journey) password and TOTP seed
custody
status: approved
created: '2026-10-31'
updated: '2026-10-31'
requester:
agent: claude-code
reason: 'NK-WP-0056-T09: a synthetic, unprivileged sign-in identity whose MFA journey through
KeyCape, Authelia and privacyIDEA replaces the founder''s sign-in as the check between
consumers in a bounded bind rotation (NK-WP-0056-T06). Its password and TOTP seed are
generated in memory and held only in OpenBao; LLDAP and privacyIDEA receive them through
one attended procedure. No workload reads them until the executor identity exists (T03/T10),
which needs its own request.'
reason: 'NK-WP-0056-T09: a synthetic, unprivileged sign-in identity whose MFA journey
through KeyCape, Authelia and privacyIDEA replaces the founder''s sign-in as the
check between consumers in a bounded bind rotation (NK-WP-0056-T06). Its password
and TOTP seed are generated in memory and held only in OpenBao; LLDAP and privacyIDEA
receive them through one attended procedure. No workload reads them until the
executor identity exists (T03/T10), which needs its own request.'
review:
required: true
required_approvers:
- platform-owner
- net-kingdom-owner
comments: []
comments:
- at: '2026-10-31T11:50:37+00:00'
reviewer: platform-owner
decision: approved
comment: Approved by the founder in session 2026-10-31 ('i accept the ccr') for
NK-WP-0056-T09.
- at: '2026-10-31T11:50:37+00:00'
reviewer: net-kingdom-owner
decision: approved
comment: Approved by the founder in session 2026-10-31 ('i accept the ccr') for
NK-WP-0056-T09.
target:
domain: infotech
tenant: platform
workload: net-kingdom-synthetic-journey
environment: production
purpose: Hold the password and TOTP seed of the LLDAP user syn-journey (no groups, no rights)
so that a synthetic journey can prove sign-in with MFA without a person. No other identity,
directory, privacyIDEA or service credential.
purpose: Hold the password and TOTP seed of the LLDAP user syn-journey (no groups,
no rights) so that a synthetic journey can prove sign-in with MFA without a person.
No other identity, directory, privacyIDEA or service credential.
openbao:
mount: platform
kv_path: platform/workloads/net-kingdom/synthetic-journey/syn-journey
@ -46,10 +57,10 @@ access_frontdoor:
readiness: pending-review
resolvable: false
lifecycle:
deactivate: lane.py teardown deletes the privacyIDEA token SYNJOURNEY01, the LLDAP user
syn-journey (refused if it has gained any group) and the KV entry with all versions;
the KeyCape client nk-synthetic-journey is removed with keycape-client.py --operation
remove. The coding-agent fence stays.
deactivate: lane.py teardown deletes the privacyIDEA token SYNJOURNEY01, the LLDAP
user syn-journey (refused if it has gained any group) and the KV entry with all
versions; the KeyCape client nk-synthetic-journey is removed with keycape-client.py
--operation remove. The coding-agent fence stays.
rotate: Tear down and set up again (new password and seed, CAS=0 on the fresh path).
No in-place rotation path in this request.
compromised: Delete the privacyIDEA token first (the account then cannot pass MFA),
@ -57,38 +68,41 @@ lifecycle:
no protected service.
delivery:
surface: attended-service-config
service: LLDAP (sso) user syn-journey; privacyIDEA (mfa) TOTP token SYNJOURNEY01 in realm
coulomb
target: the LLDAP user's password (set with the pinned lldap_set_password, OPAQUE) and the
privacyIDEA token's OTP key (stored encrypted in the privacyIDEA database)
service: LLDAP (sso) user syn-journey; privacyIDEA (mfa) TOTP token SYNJOURNEY01
in realm coulomb
target: the LLDAP user's password (set with the pinned lldap_set_password, OPAQUE)
and the privacyIDEA token's OTP key (stored encrypted in the privacyIDEA database)
procedure: net-kingdom sso-mfa/k8s/synthetic-journey/lane.py setup
gate: attended platform-admin (aal2) OpenBao session, the human admin's LLDAP password, the
attended pi-admin password, and a passing synthetic journey (lane.py verify) against
the live issuer
gate: attended platform-admin (aal2) OpenBao session, the human admin's LLDAP password,
the attended pi-admin password, and a passing synthetic journey (lane.py verify)
against the live issuer
risk:
classification: medium
notes:
- 'The identity is new and holds no group. Authelia admits it (it is not svc-* or ld-admin),
KeyCape issues it tokens, but no consuming service grants it anything. KeyCape has no
per-client group gate, so every client that admits any authenticated user would admit it
too; none of the registered clients grants rights without a group.'
- KeyCape marks its tokens principal_type human (key-cape token.go); the account is
declared SERVICE in the service-identity declarations. Recorded, not changed here.
- The identity is new and holds no group. Authelia admits it (it is not svc-* or
ld-admin), KeyCape issues it tokens, but no consuming service grants it anything.
KeyCape has no per-client group gate, so every client that admits any authenticated
user would admit it too; none of the registered clients grants rights without
a group.
- KeyCape marks its tokens principal_type human (key-cape token.go); the account
is declared SERVICE in the service-identity declarations. Recorded, not changed
here.
- Values are generated in memory by lane.py and written CAS=0; neither is printed,
logged or written to disk. The journey's receipts are value-free.
- Coding agents are fenced from the data and metadata paths in agent-high-risk-boundary
before the first write.
- No workload, Kubernetes or ESO reader exists; T10 needs a separate workload-kv-read request
for the executor identity.
- No workload, Kubernetes or ESO reader exists; T10 needs a separate workload-kv-read
request for the executor identity.
verification:
positive:
- The KV password signs in to LLDAP as syn-journey (compared without display)
- The synthetic journey passes against https://kc.coulomb.social at aal2 with the KV
values (lane.py verify), with a value-free receipt
- The synthetic journey passes against https://kc.coulomb.social at aal2 with the
KV values (lane.py verify), with a value-free receipt
negative:
- Coding-agent boundary denies data and metadata of the path
- No auth role or policy grants the path to a workload
- setup refuses if the KV path, the LLDAP user or the privacyIDEA token already exist
- setup refuses if the KV path, the LLDAP user or the privacyIDEA token already
exist
activation_conditions:
- Explicit platform-owner and net-kingdom-owner approval of this exact request (sha256-bound
by lane.py).