security: retain native LDAP group maintenance verification
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Reject generated-only commits / generated-commit-guard (push) Successful in 10s

This commit is contained in:
codex 2026-10-14 01:26:39 +02:00
parent 880c224a4b
commit c53ebce2b7
2 changed files with 128 additions and 0 deletions

View file

@ -0,0 +1,108 @@
{
"observed_at": "2026-10-14",
"source_repo": "net-kingdom",
"source_base": "e861f63513859d5240773ce72e162b303fa7b9e4",
"workplan_id": "NK-WP-0049",
"task_id": "NK-WP-0049-T02",
"custodian_task_id": "CUST-WP-0080-T03",
"result": "ldap_group_callers_reconciled_with_isolated_native_proof_not_estate_acceptance",
"files": {
"docs/attended-procedure-inventory.md": "9b3cde4de1f6410c105d608f7ff45774862c50dd72535aff5b131f8528357ab3",
"docs/legacy-lldap-lifecycle-retirement.md": "996d562989516beb1830232fb7c77800c6ae4b033883c6d5760fc4f93cdb107e",
"sso-mfa/WORKPLAN.md": "6a88e36c8e82b447e1297e970ee429ba066a42605771520d352cf899e844dc10",
"sso-mfa/k8s/backup/DR-RUNBOOK.md": "4a5227703fca967fb550a93682ad20310b3c7cdf792736682d7067e0d8df8353",
"sso-mfa/k8s/keycape/README.md": "9571e99a535b1a26999e7fc3bfe22185dd3014d101c328300f57dde44d014522",
"sso-mfa/k8s/lldap/OPERATOR-GROUPS.md": "7adfea8205fd3e6a98d9c2c49032f17bc67dcf8e3bc9e39c1d940be714c32798",
"sso-mfa/k8s/lldap/README.md": "44ad28585ddbe1ab2eeb299246f1dbec2a186b71fa67b9b874780662216ffc6a",
"sso-mfa/k8s/lldap/bootstrap-users.sh": "309da1de430638e4ed0b9bfe11b7bbb472a6bfe364cdfb6c69499c6fb78b66d6",
"sso-mfa/k8s/lldap/manage-group-members.sh": "3c85e4e882ad003a4dc513d9085d136531511273db8adf27e1fcf5e749ae04d1",
"sso-mfa/k8s/verify-t07.sh": "026406ff1fec9e4bf542741c08002c45ea8a94a4ce5a50980665b601485882df",
"workplans/NK-WP-0049-bootstrap-secret-free-recovery-handoff.md": "099fe590e7cbc5b2bda7b2da5f2e083ab0305bb3bdde60f02de785efbe301358",
"sso-mfa/k8s/lldap/lldap_admin.py": "80a353b4a452267be32ffc7f4ece7f7b727a18778575444b93177425b4f660e3",
"sso-mfa/k8s/lldap/GROUP-MAINTENANCE.md": "61618e61d077bae00daa4ea77ebd3af124810c1047d90832b3f1b351f3b46a22",
"tests/test_lldap_group_maintenance.py": "ab9c3620b8f779b258aabf742d678860d647be55c307abf112925a8b817f0c18",
"tests/lldap_groups_native_fixture.py": "19ce0721671114b632ffc4215cb1ebe5349354e1666942bccd4a500b8cb0a1d1"
},
"unchanged_dependencies": [
{
"path": "identity-provisioner/provisioner.py",
"sha256": "bac0069de2552a2f226d788ab9891ab9362c65244e7cdf13e8b20d2c569e4618"
},
{
"path": "sso-mfa/bootstrap/apply-service-secrets.py",
"sha256": "ea9c3418ed00527b9019ab9893f1f3c9fe29d0697f1f0c879e28fdbae373889b"
}
],
"verification": {
"baseline": {
"failed": 3,
"description": "Old bootstrap, membership and T07 scripts executed supplied credential-file shell code; curl/kubectl were controlled stubs, credentials synthetic."
},
"affected_tests": {
"run": 200,
"failures": 0,
"errors": 0,
"skipped": 0,
"scope": "LDAP maintenance, retired lifecycle, private service custody and identity-provisioner suites"
},
"native": {
"image": "sha256:2a8454b668c1aba7157e832eab0e242e1e7eb5fb7591d7e7774ba05286511ca8",
"synthetic_only": true,
"checks": {
"preview_nonmutating": true,
"bootstrap_exact_and_existing_preserved": true,
"bootstrap_idempotent": true,
"exact_add_and_readback": true,
"exact_remove_and_readback": true,
"reserved_group_refusal_preserves_state": true,
"stale_preview_refused": true,
"t07_structural_only_exit_and_no_trace_disclosure": true,
"fixture_removed": true
},
"outcome": "passed"
},
"applied_files_match_manifest": true,
"changed_shell_syntax": "passed",
"git_diff_check": "passed",
"log_digests": {
"baseline.log": "384f2dfaaec9435d2f9fd372008afd97dec4de67555b1edbd28963a31534e828",
"focused-tests.log": "a3445b5a3491588d8202dfd42aecdc9b564491495debdaab83bfc0cfc44e3bfc",
"http-tests.log": "5be5939bc6eb2e47ece63dd138aa35f763056c33e68889110981fb4211874d30",
"affected-tests.log": "0f0fd49b9d98ad9a1e30418ee2d6e5f130b30b73eb7e18ce3c9baf7f04becb5e",
"native.json": "be4673cc4f6aa9e0eebee3b37a670dfcc7611fa71d8b7564e6a092818710e9a9"
},
"secret_scan": {
"status": "clean",
"changed_blobs": 15,
"version": "8.30.1"
},
"evidence_scan_triage": {
"rule": "generic-api-key",
"blocked_blob_id": "5f3edfcd46698972a32415aee0005c424b00a7ed",
"classification": "false_positive_public_source_sha256",
"verification": "Flagged value exactly equals SHA256 of the committed apply-service-secrets.py dependency at source_base. Dependency entries now separate path and sha256 fields; scanner policy unchanged."
}
},
"behavior": [
"Three shell entry points disable tracing and delegate to the shared adapter; existing provider operations and literal private-custody reader are reused.",
"Explicit outside-Git private custody; no ambient admin-password fallback, shell sourcing, auto Secret discovery, curl/kubectl, credentials in child argv or KeyCape configuration Secret reads.",
"Fixed HTTPS origin or explicit literal-loopback port; system trust, no redirects or ambient proxies; bounded strict JSON and contained diagnostics.",
"Bootstrap previews only missing fixed empty baseline groups; service membership uses an existing exact user/group and refuses reserved namespaces before login.",
"Apply binds origin/operation/target/observed state, checks again before first write and requires exact final preservation; stale or mismatched state refuses.",
"T07 emits only observed directory structure and explicit unverified native acceptance with exit 2; input/protocol/authentication failure exits 1."
],
"limits": [
"LLDAP has no cross-query compare-and-swap here. An owner-controlled exclusive maintenance window is required; preview digests confer no approval or runtime isolation.",
"Multiple group creations can leave partial changes on failure. No blind rollback/retry or group deletion; owner must reconcile current state.",
"Local native fixture used an immutable existing image, generated synthetic credentials and disposable storage. It does not prove the deployed estate version, current credentials or attended authority.",
"No live estate credential, account, membership, deployment or KeyCape Secret was read or changed.",
"Actual lifecycle/login/MFA/claims/consumer/revocation and independent recovery acceptance remain open under T03. Incident-cutover callers and full root-output/caller inventory remain under T02.",
"Earlier provider reserved-group repair still requires owner-scoped deployment/native enforcement verification."
],
"knowledge_orientation": {
"version": "0.2.6",
"digest": "8d1d6a9d4d07fec7b619618de7dfe2be2254c1790f85f4198c7fe19db9751c02",
"status": "withheld/source-changed/orientation-only; current provider, caller, custody and verification-audit sources reviewed"
},
"source_commit": "ab25dde80d4520c4ff09240944d1510b2a17b9f0"
}

View file

@ -479,6 +479,26 @@ Mixed requests and delete-if-empty also refuse before login. Receipt:
No rollout or live directory mutation; exact owner deployment and native checks
remain necessary before claiming live enforcement. NK-WP-0049 stays active.
2026-10-14 LDAP group caller reconciliation delivered in NetKingdom `ab25dde`.
Bootstrap, membership and T07 wrappers now reuse provider operations and literal
private custody through one adapter. No executable credential sourcing, ambient
password fallback, credential argv, curl/kubectl or KeyCape config Secret read.
Bootstrap only creates missing empty fixed baseline groups; service membership
requires exact existing identities/groups and refuses reserved namespaces.
Preview/apply binds origin, operation, target and observed state; fresh prewrite
and final exact readback preserve unrelated data. Owner-controlled exclusive
maintenance remains necessary because LLDAP has no cross-query CAS; partial
failures require reconciliation, not blind rollback.
Three old-source regressions failed; all 200 affected tests pass without skips.
An actual isolated local immutable LLDAP image passed preview, preservation,
idempotence, add/remove, reserved/stale refusal and T07 incomplete-exit checks.
The synthetic fixture/container/private files were removed. T07 is explicitly
structural-only (exit 2), not lifecycle/login/recovery acceptance. Receipt:
`docs/evidence/2026-10-14-netkingdom-security/lldap-group-maintenance.json`.
No live estate change. Incident-cutover/full inventory and owner-approved native
recovery/estate acceptance keep NK-WP-0049 and G08 open.
## Verify native closure against every requirement
```task