Consumes one admission once through the approval-engine carrier after an effect-free preflight (validity, source pins, trust, window vs budget, binding digest, actor, human aal2 approvers), emits run.started, runs steps with settle-timed checks, reverts on failure with per-revert checks, retries within attempts, stops on unknown outcomes, honours budget and kill switch, and emits one value-free receipt (PDP not-evaluated). 22 tests with fakes. BEA-9 extended to revert steps; examples regenerated. 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
139 lines
4.5 KiB
YAML
139 lines
4.5 KiB
YAML
# NK-WP-0056-T01 example: the bind split (NK-WP-0054) as admissions. Illustrative: the executor
|
|
# (T03) and its operations do not exist yet; files are pinned at the commit named in plan.source.
|
|
apiVersion: netkingdom.io/bounded-execution-admission/v0.1
|
|
kind: BoundedExecutionAdmission
|
|
spec:
|
|
id: BEA-2026-0002
|
|
title: Create the service bind accounts (bind-split step 3, root-class)
|
|
purpose: 'Create svc-authelia, svc-keycape and svc-privacyidea in LLDAP as read-only binds. Needs lldap_admin: LLDAP has
|
|
no narrower grant that can create users (SI-X6), so the founder admits this run and the executor runs it.'
|
|
work_ref: NK-WP-0056-T01 example
|
|
risk_class: high
|
|
window:
|
|
not_before: '2026-11-03T09:00:00Z'
|
|
not_after: '2026-11-03T12:00:00Z'
|
|
approval:
|
|
approvers:
|
|
- admin
|
|
principal_type: HUMAN
|
|
assurance: aal2
|
|
carriers:
|
|
- approval-engine
|
|
- founder-ssh-signature
|
|
executor:
|
|
identity: service:nk-bind-executor
|
|
principal_type: WORKLOAD
|
|
runtime: k8s sso/serviceaccount nk-bind-executor (planned, NK-WP-0056-T03)
|
|
scope_ceiling:
|
|
- mode: ADMINISTER
|
|
scope: lldap
|
|
environments: &id001
|
|
- PRODUCTION
|
|
- mode: OPERATE
|
|
scope: openbao/platform/workloads/net-kingdom/directory-binds
|
|
environments: *id001
|
|
blast_radius:
|
|
unit: account
|
|
consumers:
|
|
- lldap
|
|
max_concurrent: 1
|
|
trust_requires:
|
|
- runtime_secret_trust
|
|
- runtime_identity_trust
|
|
plan:
|
|
source:
|
|
repo: net-kingdom
|
|
commit: 3b1abc405423
|
|
files:
|
|
- path: sso-mfa/k8s/lldap/bind-split.py
|
|
sha256: 4decc3bbe65120ff6c4cef5613b9a41a60168ae64ecd4c1380f61a2fcd37b6b3
|
|
- path: tools/service-binds/bind-lane.py
|
|
sha256: 5b31b3567af07bba09530c6d3b0ed8b5c947df22bd13ac0442dc33c0d9b420c0
|
|
steps:
|
|
- id: create-accounts
|
|
operation: lldap.user.create-read-only-binds
|
|
target: lldap:svc-authelia,svc-keycape,svc-privacyidea
|
|
consumer: lldap
|
|
class: root-class
|
|
mutates: true
|
|
requires:
|
|
mode: ADMINISTER
|
|
scope: lldap
|
|
checks_after:
|
|
- accounts-read-only
|
|
revert: delete-accounts
|
|
- id: hold-passwords
|
|
operation: openbao.kv.write-cas0
|
|
target: openbao:platform/workloads/net-kingdom/directory-binds
|
|
consumer: lldap
|
|
class: root-class
|
|
mutates: true
|
|
requires:
|
|
mode: OPERATE
|
|
scope: openbao/platform/workloads/net-kingdom/directory-binds
|
|
checks_after:
|
|
- accounts-sign-in
|
|
revert: destroy-kv
|
|
revert_steps:
|
|
- id: delete-accounts
|
|
operation: lldap.user.delete-created
|
|
target: lldap:svc-authelia,svc-keycape,svc-privacyidea
|
|
consumer: lldap
|
|
class: root-class
|
|
mutates: true
|
|
requires:
|
|
mode: ADMINISTER
|
|
scope: lldap
|
|
checks_after:
|
|
- accounts-read-only
|
|
- id: destroy-kv
|
|
operation: openbao.kv.destroy-created
|
|
target: openbao:platform/workloads/net-kingdom/directory-binds
|
|
consumer: lldap
|
|
class: root-class
|
|
mutates: true
|
|
requires:
|
|
mode: OPERATE
|
|
scope: openbao/platform/workloads/net-kingdom/directory-binds
|
|
checks_after:
|
|
- accounts-sign-in
|
|
plan_digest: sha256:a4c60ad06ae93b7ebc4d12417678a7bf8e7507f6670d8861cb5b30c2cd517b68
|
|
checks:
|
|
- id: accounts-read-only
|
|
description: each account exists in lldap_strict_readonly only and cannot write
|
|
ref: sso-mfa/k8s/lldap/bind-split.py
|
|
sha256: 4decc3bbe65120ff6c4cef5613b9a41a60168ae64ecd4c1380f61a2fcd37b6b3
|
|
timeout_seconds: 60
|
|
expect: pass
|
|
- id: accounts-sign-in
|
|
description: each KV value signs in to LLDAP as its account
|
|
ref: tools/service-binds/bind-lane.py
|
|
sha256: 5b31b3567af07bba09530c6d3b0ed8b5c947df22bd13ac0442dc33c0d9b420c0
|
|
timeout_seconds: 60
|
|
expect: pass
|
|
stop_and_revert:
|
|
on_check_failure: revert
|
|
on_budget_exhausted: revert
|
|
on_unknown: stop
|
|
on_revert_failure: stop-and-alert
|
|
alert: founder via State Hub message
|
|
budget:
|
|
wall_time_seconds: 900
|
|
attempts: 1
|
|
cost:
|
|
compute_cpu_seconds: 60
|
|
egress_bytes: 1000000
|
|
currency: EUR
|
|
amount: 0.02
|
|
consumption:
|
|
single_use: true
|
|
consume_before_first_step: true
|
|
receipt:
|
|
schema: netkingdom.playbook-capability-contract/v0.2#execution-attribution-receipt
|
|
emit_to: audit-core
|
|
retain: by-hash-no-secret-values
|
|
independent_verifier: tools/bounded-execution-admission/validate.py check-approval + receipt source hashes
|
|
not_authorized:
|
|
- switching any consumer to the new accounts
|
|
- any human account
|
|
- changing LLDAP's configured super-admin
|