Repository navigation
feat(identity): production realm, admin mfa and auth event logging (#121) - #139
Merged
Merged
Conversation
) Closes #121 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The production identity for the deployable stack (#120). Phase 0 has synthetic users only (ADR-0016).
deploy/keycloak/production/realm-decisya.json, C-03):sslRequired: all;${NAME}placeholders filled by the hardenedentrypoint-stack.sh. It validates the host, port 8443 and the client secret, refuses pre-set values, and runskc.sh start --import-realmitself.platform-adminholdersacr"2" through TOTP; the BFF always sendsacr_values=2;/api/adminrequires exactly oneacr"2" claim (policyApi.AdminMfa, a coverage test on every admin route);Authentication:RequireAdminMfais true by default and fails closed outside Development. The dev AppHost turns it off in run mode only.docs/runbooks/go-live-gate.mdand bysynthetic=trueon every user, checked bystackctl verifythrough the read-onlyidentity-check.sql. That check also fails on any master-realm user or service account without OTP once the bootstrap secret is retired.stackctl realm rebuild --confirmexists only while every user is synthetic.auth.signin.succeeded,auth.signin.failedandauth.signout;auth.token.rejected, including the previously silentbad_type, andauth.admin.mfa_required;error_descriptionand exception text at Error level. That category is now set toNonein the BFF, with a test.acr.docs/ai/pipeline/135.md(the ruleset change shipped in the same commit,354eb8b).Rollback
Revert this PR. On a deployed stack (none exists yet; #132), roll back by redeploying the previous release and running
stackctl realm rebuild --confirm, which is allowed only while every user is synthetic. The dev environment needs no step.Verification (local | CI)
dotnet build -warnaserrorCategory=AppHostdeploy/tests(Docker required).claude/tests, lint,roster --checkstackctl up/verifyon Linux or the NASData and packages
deploy/keycloak/production/common-passwords.txt.Passwords/Common-Credentials/100k-most-used-passwords-NCSC.txtat commit1a7bb9127eca9e6ff2fc0301c597fe6e16a0cb56, MIT © 2018 Daniel Miessler (attribution incommon-passwords.SOURCE.md); the data comes from the UK NCSC's list, built on HIBP frequencies.ed0469a2ad1fd4afa94b53d0878eaaa80018a843d6de3fbfaa94a7c68740c976. Approved by Marco 2026-10-07; a test pins the hash.Security
After merge (Marco)
Closes #121
Docs: docs/architecture/production-identity.md, docs/requirements/phase-0/production-identity.md, docs/requirements/nfr.md, docs/runbooks/deployable-stack.md, docs/runbooks/go-live-gate.md, docs/security/threat-models/production-identity.md, docs/security/threat-models/realm-guard-scope.md, docs/security/reviews/121.md, docs/ai/pipeline/135.md
🤖 Generated with Claude Code