АРХ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: правила витрины сервисов и security handoff

This commit is contained in:
Codex 2026-05-12 15:30:00 +03:00
parent 60e70bf86d
commit 61d373f076
4 changed files with 63 additions and 6 deletions

View File

@ -49,7 +49,7 @@ docker run --rm --env-file .env.staging.example -v "$PWD/reverse-proxy/Caddyfile
- control-plane snapshot перенесён из public static в server-only storage; - control-plane snapshot перенесён из public static в server-only storage;
- `/storage/launcher-data.json` закрыт; - `/storage/launcher-data.json` закрыт;
- `/api/storage/data` и `/api/storage/upload` требуют session; - `/api/storage/data` и `/api/storage/upload` требуют session;
- `/api/apps` отдаёт только приложения с app access; - `/api/apps` отдаёт каталог сервисов с флагами доступа; карточки сервисов видны всем authenticated users, но launch разрешён только при app access;
- hard delete вызывает Tasker cleanup: sessions, identity links, workspace/project memberships, issue assignees; - hard delete вызывает Tasker cleanup: sessions, identity links, workspace/project memberships, issue assignees;
- internal API token отделён от OIDC client secret; - internal API token отделён от OIDC client secret;
- повторный accept уже принятого invite отклоняется. - повторный accept уже принятого invite отклоняется.
@ -252,8 +252,8 @@ docker compose --env-file plane-app/plane.env.staging -f plane-app/docker-compos
3. Ответы содержат HSTS. 3. Ответы содержат HSTS.
4. Cookies выставляются как `Secure` и `HttpOnly`. 4. Cookies выставляются как `Secure` и `HttpOnly`.
5. Без login Launcher ведёт в Authentik. 5. Без login Launcher ведёт в Authentik.
6. Active user видит только разрешённые сервисы. 6. Active user видит все карточки сервисов, но открыть может только разрешённые сервисы.
7. User без Task Manager app access не видит Task Manager в Launcher и получает deny по прямому `https://task...`. 7. User без Task Manager app access видит карточку Task Manager в Launcher, не может открыть сервис и получает deny по прямому `https://task...`.
8. Blocked/annulled user теряет Launcher и Tasker session после hard refresh. 8. Blocked/annulled user теряет Launcher и Tasker session после hard refresh.
9. Self-host workspace invite создаёт pending request в Launcher. 9. Self-host workspace invite создаёт pending request в Launcher.
10. Launcher-managed workspace не принимает self-service invite request из Tasker. 10. Launcher-managed workspace не принимает self-service invite request из Tasker.

View File

@ -2,6 +2,7 @@
Staging path and runbook: `docs/STAGING_SECURITY_PLAN.md`. Staging path and runbook: `docs/STAGING_SECURITY_PLAN.md`.
DevOps handoff: `docs/DEVOPS_SECURITY_HANDOFF.md`. DevOps handoff: `docs/DEVOPS_SECURITY_HANDOFF.md`.
Service catalog UX rules: `docs/SERVICE_CATALOG_UX_RULES.md`.
## Network ## Network
@ -55,7 +56,7 @@ DevOps handoff: `docs/DEVOPS_SECURITY_HANDOFF.md`.
## Acceptance scenarios ## Acceptance scenarios
- [x] Без логина Launcher отправляет в Authentik. - [x] Без логина Launcher отправляет в Authentik.
- [x] Пользователь без Task Manager app access не видит Task Manager в Launcher. - [ ] Пользователь без Task Manager app access видит карточку Task Manager в Launcher, но не может открыть сервис.
- [x] Пользователь без Task Manager app access получает deny в Tasker access middleware при прямом доступе. - [x] Пользователь без Task Manager app access получает deny в Tasker access middleware при прямом доступе.
- [ ] Пользователь с доступом открывает Task Manager. - [ ] Пользователь с доступом открывает Task Manager.
- [ ] Старый Plane admin после OIDC видит старые workspace/tasks/comments. - [ ] Старый Plane admin после OIDC видит старые workspace/tasks/comments.

View File

@ -0,0 +1,56 @@
# Service Catalog UX Rules
Актуализировано: 2026-05-12.
Этот документ фиксирует обязательное правило Launcher-витрины NODE.DC.
## Главное правило
Все authenticated users видят карточки всех сервисов, добавленных в каталог Launcher, независимо от текущего app access.
Видимость карточки сервиса не означает право запуска сервиса.
## Зачем это нужно
Launcher — это не только access gate, но и витрина платформы. Пользователь должен видеть, какие приложения существуют в NODE.DC, даже если доступ к конкретному приложению ещё не выдан.
Это нужно для:
- демонстрации состава платформы;
- ручного запроса доступа;
- будущих тарифов и paid access;
- понимания, какие модули доступны в экосистеме.
## Как должен работать UI
Для сервиса без доступа:
- карточка сервиса остаётся видимой в нижней/сервисной панели;
- описание, медиа и карточка доступны для чтения;
- статус/chip показывает отсутствие доступа;
- кнопка открытия сервиса disabled или ведёт в controlled request/access flow;
- прямой запуск через `/api/services/:serviceSlug/launch` обязан возвращать deny.
Для сервиса с доступом:
- карточка сервиса видима;
- кнопка открытия активна;
- launch идёт только через Launcher BFF, а не прямым trust из UI.
## Realtime правило
Изменение доступа должно обновлять состояние карточки без hard refresh:
- выдали доступ — кнопка открытия становится активной;
- сняли доступ — карточка остаётся видимой, но кнопка открытия выключается;
- direct launch после снятия доступа остаётся запрещённым server-side.
Нельзя чинить безопасность через скрытие карточек. Безопасность обеспечивается server-side launch deny, Tasker middleware и internal access enforcement.
## Что запрещено
- Фильтровать `/api/apps` только до доступных пользователю приложений, если это ломает витрину.
- Убирать карточку сервиса из UI только потому, что у пользователя нет app access.
- Считать скрытие карточки security control.
- Ломать realtime-переключение кнопки `Открыть` при approve/revoke доступа.

View File

@ -146,8 +146,8 @@ Rotation policy до допуска внешних пользователей:
Минимальный staging smoke: Минимальный staging smoke:
1. Super sudo входит в Launcher через `https://launcher...`. 1. Super sudo входит в Launcher через `https://launcher...`.
2. Обычный active user видит только разрешённые сервисы. 2. Обычный active user видит все карточки сервисов, но открыть может только разрешённые сервисы.
3. User без Task Manager app access не видит Task Manager в витрине и получает deny по прямому `https://task...`. 3. User без Task Manager app access видит карточку Task Manager в витрине, не может открыть сервис и получает deny по прямому `https://task...`.
4. Blocked/annulled user теряет Launcher и Tasker session после hard refresh. 4. Blocked/annulled user теряет Launcher и Tasker session после hard refresh.
5. Self-host workspace invite создаёт pending request в Launcher. 5. Self-host workspace invite создаёт pending request в Launcher.
6. Launcher-managed workspace не принимает self-service invite request из Tasker. 6. Launcher-managed workspace не принимает self-service invite request из Tasker.