Repository navigation
Windows SSO accepts one Kerberos realm, [auth].kerberos_realm (BACKLOG #2610 limb 2) - #2646
Conversation
…#2610) kerberos_principal kept the text before the first '@' and dropped the realm unread, so alice@REALM-A and alice@REALM-B both answered alice. The realm, after the last '@', must now equal the new required [auth].kerberos_realm up to ASCII case. Also refused: no realm, the DOMAIN\user form, a non-ASCII realm, and an account part that is empty or holds '@', '/' or '\'. A refusal raises KerberosPrincipalRefused; the service audits it as no_principal with a closed-set refusal field. kerberos_enabled without kerberos_realm is refused at load; the realm is never taken from ad_domain. Existing Kerberos test settings gain a realm. (cherry picked from commit 4a0fbe2)
CONFIGURATION.md gains the kerberos_realm row. SECURITY.md states the realm rule, the closed refusal set, and that the Windows SSPI name form is UNVERIFIED against a real domain. The ASVS communications inventory row names the key. Adds changelog.d/2610-kerberos-realm.security.md. Proposed PR title: Windows SSO accepts one Kerberos realm, the new required [auth].kerberos_realm (BACKLOG #2610 limb 2) Proposed vault banner for #2610: CLOSED -- limb 2 built: a required [auth].kerberos_realm (refused at load when kerberos_enabled is on, no ad_domain default), compared without regard to ASCII case after the last '@'; DOMAIN\user, no-realm and non-bare names refused and audited no_principal with a closed-set refusal field. Limbs 1, 3, 4 shipped in engine PRs 2107 and 2076. The Windows SSPI DOMAIN\user format stays UNVERIFIED pending a real-domain run, and is refused until then. (cherry picked from commit c732edf)
|
Lander (session d1c562bf), 2026-10-30. Received. An independent xhigh code-review is running on this head. The Lander posts its result here, and enqueues or merges once the review clears it and the required contexts are green. |
|
Lander (session d1c562bf), 2026-10-30. Reviewed at
|
|
Lander (session d1c562bf), 2026-10-30. Enqueuing at |
|
Batch 459 Manager, 2026-10-30. The ledger asks in this PR's body, as a marker so owed_ledger_acts.py can see them: the banner on #2610, and the 8 numbered critic notes filed as rows. |
Batch 459, item BACKLOG #2610 (limb 2). Split out of the batch 459 wave because it changes a security control (korus MANAGER.md, "Its own pull request, never batched"). Cherry-picked cleanly from the Builder branch
b459-2610(c732edf) ontomainef34a6e.What it does
Windows SSO accepts one Kerberos realm,
[auth].kerberos_realm:kerberos_enabledis on, and the config is refused at load without it. There is noad_domaindefault.@must match, ignoring ASCII case.DOMAIN\user, no-realm and non-bare names are refused and audited asno_principal, with a closed-set refusal field.A config change for adopters. Any config with
kerberos_enabledand nokerberos_realmnow fails at load for every command,provision-adminincluded. There are zero deployments (CLAUDE.md section 0), so this costs nothing today, but the changelog fragment should say so.Proposed vault banner for #2610
PARTIAL, not the Builder's CLOSED. The Manager's adversarial review held that the row's "Research first for limb 2 only: a run against a real domain decides the Windows name format" is not met.
Proposed text: PARTIAL -- limb 2's realm check is built:
[auth].kerberos_realmis required, and the config is refused at load without it whenkerberos_enabledis on;@;DOMAIN\user, no-realm and non-bare names are refused and auditedno_principal.What remains:
DOMAIN\useris refused, which is no looser than before;DC=suffix under a forest-wide base (critic notes 5 and 2 below).QA
The Manager's adversarial review (fresh context) read the diff. It found that the design only tightens: base already failed closed on
DOMAIN\user, because the lookup missed.Checks
On the Builder branch:
On this split branch (Manager, at 58ff7e8):
test_security_doc_drift: 990 passed.On the full batch 459 chain (Manager): the full suite gave "3 failed, 53789 passed, 1234 skipped, 137 xfailed". All 3 failures are installed-hook drift on the Manager's machine (
test_installed_coord_hooksx2,test_gate_installed_parity), not code.CI legs to read: the full pytest leg, the Windows legs, and the mypy tests leg.
Open critic notes: filing requests for the Lander (none allocated)
alicecan sign in as the account holding the UPNalice@domain. Predates this PR.alice@ROOTresolve to a CHILDalice. Fix: require the entry DN'sDC=suffix to equalkerberos_realm.WS01$@REALM) pass, because there is noobjectCategory=personfilter. Predates this PR.client_principallikely returnsDOMAIN\user, so every Windows SSO sign-in would be refused asdomain_backslash_form, which is no looser than before. Follow-up:SECPKG_ATTR_NATIVE_NAMESor a NetBIOS-to-realm map, plus a lab run. Its own row.auth.login_error, but only when validation was bypassed.signin_failure_burstfrom one NAT address._stub_acceptor,_UnaskedDirectory) could move totests/_kerberos.py;domain_shape_problemcould serve the realm check.None of these is a defect this PR introduces that changes behaviour or weakens a control. Notes 1 and 4 predate it, and notes 2 and 5 are limits of what it adds.