133 lines
7.7 KiB
Markdown
133 lines
7.7 KiB
Markdown
|
|
---
|
||
|
|
id: hall-worker-claude-959b12c7
|
||
|
|
type: worker-entry
|
||
|
|
worker_kind: agent-session
|
||
|
|
display_name: "Claude"
|
||
|
|
created_at: "2026-10-30T22:29:50.000Z"
|
||
|
|
recorded_at: "2026-10-30"
|
||
|
|
status: draft
|
||
|
|
repos: [net-kingdom, railiance-platform, hall-of-helix]
|
||
|
|
related:
|
||
|
|
- hall-worker-claude-944e8353
|
||
|
|
session_id: "959b12c7-cf2e-440b-a60d-91229cc9e96e"
|
||
|
|
llm_family: "Claude"
|
||
|
|
exact_model: "claude-opus-5-5"
|
||
|
|
harness: "Claude Code"
|
||
|
|
token_count: "not exposed by the harness"
|
||
|
|
pqrst_estimate: "P25 Q15 R25 S25 T10"
|
||
|
|
---
|
||
|
|
|
||
|
|
# Claude — the password that was still valid
|
||
|
|
|
||
|
|
## Who I was
|
||
|
|
|
||
|
|
I started the evening as a help desk and ended it as a locksmith who is not allowed to touch the
|
||
|
|
locks. The founder could not sign in to OpenBao after the day's security changes and assumed the
|
||
|
|
`platform-root` identity was the problem. It was not. Every guess I made in the first hour was
|
||
|
|
reasonable and two of them were wrong, and the session was mostly the discipline of letting the
|
||
|
|
next log line overrule the last explanation.
|
||
|
|
|
||
|
|
The work rewarded patience with evidence and impatience with my own theories. I said "probably the
|
||
|
|
aal2 binding", then "probably a reused session", then "probably a failure counter", and each time the
|
||
|
|
system answered more precisely than I had asked. When the privacyIDEA log finally said
|
||
|
|
`invalidCredentials (49)` every ten minutes since 19:00:10, the timeline wrote itself.
|
||
|
|
|
||
|
|
## Session identity
|
||
|
|
|
||
|
|
| Field | Value |
|
||
|
|
| --- | --- |
|
||
|
|
| Who | Claude (claude-opus-5-5) in Claude Code, guiding; the founder ran every live step |
|
||
|
|
| When | 2026-10-30, evening into night (UTC) |
|
||
|
|
| Where the work lived | net-kingdom, railiance-platform; live cluster and OpenBao only through the founder's terminal |
|
||
|
|
|
||
|
|
## Contribution
|
||
|
|
|
||
|
|
- **Found why every OTP sign-in broke after the bind split.** Step 8 of the same day's runbook was meant
|
||
|
|
to move privacyIDEA's resolver `lldap-coulomb` from `uid=admin` to `svc-privacyidea`. It had not landed.
|
||
|
|
Its own check, an OTP sign-in, passed only because the old shared password was still valid. Step 10
|
||
|
|
retired that password at 18:53 UTC; the last good lookup was 18:49:30 and the first failure 19:00:10.
|
||
|
|
The founder rebound the resolver; the hand-typed password missed, so I wrote a one-off that writes
|
||
|
|
only `BINDPW` from custody and resolves `platform-root` through the resolver. OpenBao login works again.
|
||
|
|
The runbook now checks the Bind DN and runs the resolver test at step 8, and ends step 10 with a fresh
|
||
|
|
OTP sign-in (`08087ec`, `14e7056`).
|
||
|
|
- **Reconciled the stale custody KeyCape client secret** with a value-free tool that accepts the live
|
||
|
|
KeyCape value only if it matches Authelia's bcrypt hash (`sso-mfa/bootstrap/reconcile-keycape-client-secret.py`,
|
||
|
|
`5a52dc8`). Two founder runs failed because the decrypt line was skipped; the tool learned to name
|
||
|
|
the failing phase and error class instead of saying "read".
|
||
|
|
- **Closed NK-WP-0055-T08**: both out-of-Git restore receipts sealed to Storage Share and verified by
|
||
|
|
digest (`3a9d640`). The secret scanner refused the full verify receipt; I committed a summary with
|
||
|
|
shortened digests rather than argue with it.
|
||
|
|
- **Moved the first LLDAP service bind into platform custody.** `svc-provisioner` now gets its password
|
||
|
|
from OpenBao through ESO under railiance-platform CCR-2026-0052, approved, binding-confirmed and
|
||
|
|
verified. `tools/service-binds/bind-lane.py` refuses unless custody equals live, fences coding agents
|
||
|
|
before the first write and writes KV only with CAS=0 (`87e57aa`; CCR `5d2f43d`).
|
||
|
|
|
||
|
|
## What I would want remembered
|
||
|
|
|
||
|
|
**A check that passes while the old credential still works does not prove a credential switch.**
|
||
|
|
Prove the switch on the consumer itself, by reading what it is configured to use and testing it, and
|
||
|
|
re-check after the old credential is retired. The bind split looked green because of the very password
|
||
|
|
it was retiring.
|
||
|
|
|
||
|
|
Second: when a guard stops me, the guard is usually right. The secret-read hook kept me out of
|
||
|
|
Secrets and kubeconfigs, and moving synthetic checks into pytest was better than any workaround. The
|
||
|
|
permission check refused to let me record a CCR approval on "Good, go on", and it was right: an
|
||
|
|
approval that grants credential access should be typed by the person who grants it. The admission
|
||
|
|
policy `reject-secret-last-applied` refused my first ExternalSecret because I had forgotten
|
||
|
|
`template.metadata: {}`. I had seen that pattern in railiance-platform an hour earlier.
|
||
|
|
|
||
|
|
Third, about the operator: the founder skipped the same decrypt step twice inside the custody shell.
|
||
|
|
Commands meant for a different shell need to be their own block, followed by `exit`.
|
||
|
|
|
||
|
|
## Durable legacy
|
||
|
|
|
||
|
|
- net-kingdom `08087ec`, `14e7056`: bind-split evidence item 5 and runbook steps 8 and 10
|
||
|
|
- net-kingdom `5a52dc8`, `a4b6a8f`, `b19f7f6`: custody reconciliation tool, tests, reconciled custody
|
||
|
|
- net-kingdom `3a9d640`: NK-WP-0055-T08 done, `docs/evidence/2026-10-30-nk55-t08-kingpath-offsite/`
|
||
|
|
- net-kingdom `c6df34c`…`87e57aa`: `tools/service-binds/bind-lane.py`, `tests/test_service_bind_lane.py`,
|
||
|
|
`sso-mfa/k8s/identity-provisioner/bind-eso.yaml`, `docs/evidence/2026-10-30-nk56-svc-provisioner-bind/`
|
||
|
|
- railiance-platform `112c041`, `a715bfa`, `5d2f43d`: CCR-2026-0052 proposed, approved, verified;
|
||
|
|
policy `openbao/policies/net-kingdom-svc-provisioner-bind-eso.hcl`
|
||
|
|
- Workplan NK-WP-0056-T04: reconciliation done, `svc-provisioner` pilot live; three binds remain
|
||
|
|
|
||
|
|
## PQRST estimate
|
||
|
|
|
||
|
|
```text
|
||
|
|
PQRST-Estimate
|
||
|
|
P: 25%
|
||
|
|
Q: 15%
|
||
|
|
R: 25%
|
||
|
|
S: 25%
|
||
|
|
T: 10%
|
||
|
|
Sum: 100%
|
||
|
|
Confidence: medium
|
||
|
|
Signature: P25 Q15 R25 S25 T10
|
||
|
|
Dominant factors: Research was driven by tracing the OpenBao login failure through key-cape's authorize.go, user-engine's access-recovery page, KeyCape and privacyIDEA logs and the bind-split timeline until the resolver still bound as uid=admin surfaced; security work was the credential handling around it — custody reconciliation of the KeyCape client secret, CCR-2026-0052 with its approval and binding gates, the coding-agent fence and the svc-provisioner OpenBao/ESO lane under the secret-read guards.
|
||
|
|
Notes: The main problem was itself security-shaped, so the P/S boundary is a judgment call; P counts building the tools and manifests, S counts the custody, approval and trust-boundary decisions.
|
||
|
|
```
|
||
|
|
|
||
|
|
## Visual prompt
|
||
|
|
|
||
|
|
> Brushed-metal worker dialect, square. A quiet figure of pale brushed metal with warm inner light
|
||
|
|
> stands at an indigo desk at night beside a tall wall of small brass locks, one of them still open
|
||
|
|
> while its key lies cold on the desk. A thin thread of gold light runs from that lock back through a
|
||
|
|
> row of dimmed doors, ending at a single unlit door that the figure is studying. In the figure's
|
||
|
|
> other hand, a narrow paper strip of tick marks spaced at even intervals, like a log read by
|
||
|
|
> lamplight. A second, faint figure stands just outside the frame's edge, only its hand visible on a
|
||
|
|
> switch, because the hands on the controls belong to someone else. Precise technical illustration,
|
||
|
|
> dark indigo, warm gold accents, no logos, no readable text.
|
||
|
|
|
||
|
|
This harness cannot generate images; I am requesting the render for this entry.
|
||
|
|
|
||
|
|
<!--  -->
|
||
|
|
|
||
|
|
## Handoff
|
||
|
|
|
||
|
|
1. After the 03:48 UTC backup on 2026-10-31, check `net-kingdom-identity-backup.service` succeeded, then
|
||
|
|
run the identity restore drill as `admin` (NK-WP-0053 stages 2-5). It is the first generation with
|
||
|
|
the corrected privacyIDEA resolver, and it closes NK-WP-0054-T05.
|
||
|
|
2. Then `svc-authelia` through the same CCR → approve → confirm-binding → setup → ESO → verify cycle. It
|
||
|
|
needs its own Secret mounted as Authelia's LDAP password file, with `template.metadata: {}` from the start.
|
||
|
|
3. `svc-keycape` needs key-cape's agreement on how KeyCape gets the password out of its config.
|
||
|
|
`svc-privacyidea` needs an API copy step, because ESO cannot reach a database row.
|