diff --git a/.gitignore b/.gitignore index 04cf4d6..9167765 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ plane-src/apps/web/.react-router/ plane-src/apps/admin/.react-router/ plane-src/apps/space/.react-router/ plane-app/archive/ +plane-app/backup/ diff --git a/scripts/bootstrap_nodedc_platform_plan.py b/scripts/bootstrap_nodedc_platform_plan.py index b8140d7..73d9871 100644 --- a/scripts/bootstrap_nodedc_platform_plan.py +++ b/scripts/bootstrap_nodedc_platform_plan.py @@ -219,6 +219,8 @@ Runtime launch закрыт через локальный Caddy-based image node {"text": "Настроить app access policies по группам.", "checked": True}, {"text": "Описать bootstrap/export или blueprint strategy.", "checked": True}, {"text": "Проверить login/logout в Authentik за proxy.", "checked": True}, + {"text": "Добавить безопасный NODE.DC branded login через Authentik Brand/CSS.", "checked": True}, + {"text": "Зафиксировать запрет HTML-proxy/password facade в security RFC.", "checked": True}, ], ), text_block( @@ -264,6 +266,18 @@ Plane live WebSocket upgrade через proxy проверен: запрос с Application access задан через group bindings: Launcher доступен nodedc:superadmin, nodedc:launcher:admin, nodedc:launcher:user; Task Manager доступен nodedc:superadmin, nodedc:taskmanager:admin, nodedc:taskmanager:user. OIDC tokens получают стандартные openid/email/profile/offline_access scopes и custom groups scope. +2026-05-04 добавлен безопасный branded login prototype без proxy над Authentik. В platform/docs/AUTH_BRANDED_LOGIN_RFC.md зафиксирована threat model: запрещены HTML-rewrite proxy, password form в Launcher/BFF, ROPC/password grant и обход MFA/recovery/audit. Разрешенный путь — Authentik-native Brand/CSS/Flow customization. + +platform/infra/authentik/bootstrap-dev.py теперь idempotent настраивает Brand для auth.local.nodedc: title NODE.DC, default authentication flow default-authentication-flow, flow title "Работайте во всех измерениях.", layout stacked и branding_custom_css из /templates/branding/nodedc-login.css. CSS лежит в platform/infra/authentik/custom-templates/branding/nodedc-login.css и монтируется в Authentik существующим volume /templates. + +Runtime bootstrap выполнен: curl страницы auth.local.nodedc подтверждает title NODE.DC, matched_domain auth.local.nodedc и наличие brand-css со строкой "Работайте во всех измерениях". Authentik shell подтверждает default Brand auth.local.nodedc, branding_title NODE.DC и flow title "Работайте во всех измерениях.". Password/MFA/recovery mechanics не тронуты. + +Дополнение 2026-05-04: экран Authentik "My applications" признан не login flow, а пользовательским dashboard самого identity provider. Для обычного платформенного UX он исключен на proxy-уровне: auth.local.nodedc/ и auth.local.nodedc/if/user* возвращают 302 на launcher.local.nodedc. OIDC discovery/authorize/callback и /if/admin/ не редиректятся, чтобы не ломать SSO и служебную админку Authentik. + +Дополнение 2026-05-04: экран "You've logged out of NODE.DC Launcher" признан Authentik provider invalidation dashboard. OAuth2 providers переключены на штатный default-invalidation-flow с UserLogoutStage, чтобы global logout закрывал Authentik session и возвращал пользователя в NODE.DC route без показа Authentik application logout UI. + +Дополнение 2026-05-04: authentication flow приближен к старому Plane login в рамках Authentik-native customization. Brand attributes выставлены в settings.locale=ru и settings.theme.base=dark. Flow title изменен на "Работайте во всех измерениях.". IdentificationStage теперь использует только email как идентификатор и привязан к штатному PasswordStage, поэтому email/password находятся в одном Authentik challenge без передачи пароля в Launcher. Отдельный PasswordStage binding удален из flow, MFA и UserLoginStage остаются штатными. + Изменения platform repo закоммичены и отправлены в origin/main: 4a10726, "АРХ - NODEDC PLATFORM: bootstrap Authentik applications". Remote main обновлен с afa53d5 до 4a10726. """, ), @@ -371,22 +385,29 @@ Production flow: пользователь открывает nodedc.ru, види "launcher", "Этап 3.5. NODE.DC login facade", """ -Статус: backlog. +Статус: частично реализовано. -Ручная проверка 2026-05-04 подтвердила: при входе пользователь пока видит стандартное окно Authentik. Это допустимо только для текущего dev/OIDC bootstrap, но не соответствует целевой UX-модели NODE.DC. +Ручная проверка 2026-05-04 подтвердила: при входе пользователь видел стандартное окно Authentik. Это допустимо только для dev/OIDC bootstrap, но не соответствует целевой UX-модели NODE.DC. -Нужно сделать production login без публичного Authentik UI: либо полностью кастомизированный Authentik flow, если он реально выдержит дизайн-канон NODE.DC, либо Launcher/BFF login facade, который server-side работает с внутренним Authentik flow/API и не раскрывает IdP пользователю. +Выбран безопасный первый путь: полностью кастомизированный Authentik-native Brand/CSS/Flow, а не proxy и не password facade в Launcher. Это сохраняет Authentik как password/session/MFA/recovery/audit authority. -Безопасностная граница: не делать frontend-only password form, не хранить IdP/service secrets в browser bundle, не ломать MFA/recovery/rate-limit/audit и не обходить Authentik как password/session authority. +Безопасностная граница: не делать frontend-only password form, не хранить IdP/service secrets в browser bundle, не ломать MFA/recovery/rate-limit/audit и не обходить Authentik как password/session authority. Если Brand/CSS не даст pixel-level дизайн Plane login, следующий допустимый уровень — template override внутри Authentik deployment с отдельным security review, но не HTML-rewrite proxy. """, ), checker( "launcher35", "Чекер этапа 3.5. NODE.DC login facade", [ - "Выбрать безопасную стратегию: branded Authentik flow или Launcher/BFF facade.", - "Сверстать NODE.DC login по канону Task Manager/Launcher.", - "Скрыть Authentik brand во всех штатных login/logout/error текстах.", + {"text": "Выбрать безопасную стратегию: branded Authentik flow или Launcher/BFF facade.", "checked": True}, + {"text": "Запретить reverse proxy HTML rewrite и password form в Launcher/BFF.", "checked": True}, + {"text": "Добавить AUTH_BRANDED_LOGIN_RFC.md с threat model.", "checked": True}, + {"text": "Настроить Authentik Brand/CSS для auth.local.nodedc.", "checked": True}, + {"text": "Сверстать NODE.DC login по канону Task Manager/Launcher в пределах Brand/CSS.", "checked": True}, + {"text": "Объединить email/password в одном Authentik challenge через IdentificationStage.password_stage.", "checked": True}, + {"text": "Включить ru locale и dark theme на уровне Authentik Brand settings.", "checked": True}, + {"text": "Скрыть Authentik brand в базовом authentication page title/brand.", "checked": True}, + {"text": "Исключить Authentik My applications dashboard из пользовательского маршрута.", "checked": True}, + {"text": "Исключить Authentik application logout dashboard из пользовательского маршрута.", "checked": True}, "Поддержать returnTo для прямых ссылок на приложения.", "Поддержать forced login для диагностики.", "Спроектировать recovery/enrollment/MFA без раскрытия Authentik UI.",