Перейти к содержанию

Админ, RBAC, аудит

Управленческая поверхность стоит на четырёх ролях, динамическом каталоге прав и журнале аудита с хеш-цепочкой.

Четыре роли

superadmin  →  admin  →  manager  →  user
Роль За что отвечает
superadmin Назначение и снятие админов, приглашения, режим доступа платформы. Единственная роль, которая это делает.
admin Управление системой — авторазрешается во все права каталога
manager Рассмотрение и решение заявлений граждан (gov.review)
user Личный раздел (personal.view)

RBAC — динамические права

Роли и права хранятся в БД и меняются во время работы. Полный каталог — на странице Карта возможностей.

Метод Путь Право
GET /api/v1/rbac/me вход выполнен — собственные права
GET /api/v1/rbac/roles · /permissions roles.manage
POST PUT DELETE /api/v1/rbac/roles… roles.manage
PUT /api/v1/rbac/roles/{id}/permissions roles.manage

Проверка прав выполняется middleware на уровне маршрута (RequirePermission), а не повторяется в каждом обработчике, поэтому новый эндпоинт гораздо реже уезжает в продакшн без защиты. Матрицу фиксирует тест routes_authz_matrix_test.go.

UI: /admin/roles.

Поверхность администратора

Метод Путь Право
GET POST /api/v1/admin/users users.manage
PUT /api/v1/admin/users/{id}/role · /active users.manage
DELETE /api/v1/admin/users/{id} users.manage
GET PUT /api/v1/admin/ai/prompts · /{key} settings.manage
POST /api/v1/admin/ai/knowledge/reindex settings.manage

Слои промптов AI и база знаний настраиваются из БД — см. AI-конвейер. Слой ограничений (guardrails) зашит в код и никогда не настраивается.

UI: /admin/dashboard, /admin/users, /admin/settings, /admin/core.

Суперадмин

Метод Путь Что
GET POST /api/v1/superadmin/admins Список / добавление админов
GET POST /api/v1/superadmin/admins/by-register Поиск / добавление по регистрационному номеру
PUT /api/v1/superadmin/admins/{id}/grant Выдать права
DELETE /api/v1/superadmin/admins/{id} Отозвать права
GET POST DELETE /api/v1/superadmin/invites… Управление приглашениями
GET PUT /api/v1/superadmin/access-mode Режим доступа платформы (public / private)

Онбординг и MFA

Путь к роли суперадмина защищён несколькими слоями:

  • Список приглашений — онбординг не может начаться с неприглашённого адреса, а использованное приглашение больше не работает.
  • Подтверждение eIDPOST /api/v1/auth/superadmin/onboard/eid/start · /start-id · /poll (по РНН или QR).
  • Google или email/onboard/google, /onboard/email/send · /verify.
  • TOTP MFA/onboard/totp/init · /verify, затем при каждом входе POST /api/v1/auth/superadmin/mfa.

Секрет TOTP хранится как шифротекст AES-GCM — открытый текст в БД не попадает никогда. Коды восстановления показываются один раз при создании; в БД хранится только их хеш SHA-256, а использованный код больше не сработает.

Все эндпоинты онбординга закрыты ограничителем auth (5/мин).

UI: /superadmin/login, /superadmin/onboard, /admin/superadmin.

Аудит

Журнал аудита связан хеш-цепочкой и работает только на добавление. Каждая запись несёт хеш предыдущей, поэтому изменение или удаление строки в середине рвёт цепочку.

Метод Путь Что
GET /api/v1/audit Постраничный список (admin)
GET /api/v1/audit/verify Проверка целостности цепочки

verify возвращает { ok, broken_id } — при ok=false указывает id первой повреждённой строки.

Действующее лицо читается из RLS-идентичности запроса, а request_id — из контекста автоматически; вызывающая сторона их не передаёт, что оставляет мало места для подделки авторства.

Микросекундная точность

timestamptz в Postgres имеет микросекундную точность. Если время, попадающее в хеш, не усечено соответствующим образом, VerifyChain даёт ложные срабатывания из-за наносекундного расхождения — код учитывает это намеренно.

UI: /admin/audit.

События безопасности

Собираются клиентские сигналы безопасности (нарушения CSP и подобные):

  • POST /api/v1/security/events — открыт любому вошедшему пользователю (RLS фиксирует user_id)
  • GET /api/v1/security/eventsтолько admin

UI: /admin/security.

Оформление и бренд

Цвета, шрифты и плотность не зашиваются в код — они настраиваются из админки.

Метод Путь Право
GET /api/v1/site/appearance открыто (нужно публичной странице)
PUT /api/v1/site/appearance settings.manage
GET /api/v1/themes/active открыто
GET POST PUT DELETE /api/v1/themes… admin
PUT /api/v1/themes/{id}/active admin

У каждого пользователя может быть собственное переопределение. UI: /admin/themes, /admin/settings.