net-kingdom/examples/bounded-execution-admission/bind-split-create-service-accounts.yaml
tegwick 989d5d4f5d
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
NK-WP-0056-T01 done: Bounded Execution Admission v0.1 (proposed)
Standard, schema and validator for the founder's admission of one bounded
executor run: exact plan by digest, window by risk class, SI MODE @ SCOPE
ceiling with least-privilege coverage, blast radius by consumer, named
source-pinned checks, revert per mutating step, budget, single use, and the
NK-WP-0040 receipt. check-approval verifies a carrier record (Approval
Engine or founder SSH signature): aal2 human approver, not the executor,
consumed at most once in the window. Examples express the bind split;
step 10 is refused as human-intrinsic. 22 tests; make targets; tool index.

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
2026-10-31 13:55:18 +01:00

135 lines
4.4 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: b8d3dacc4195
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
- 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
plan_digest: sha256:94910771c288437dbaeeba80e32a4f61ef1cdb7d438e7352d21a5e10fe92e77e
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