Документация

К списку статей
07. Роли и доступ (RBAC): кто что видит и кто что может

Аудитория: суперадминистратор, ИБ-служба. Закрывает вопрос: №8 («кто и что может менять, как выдать доступ?»). Сценарий: S8 — выдать доступ новому инженеру / понять, кто что видит.


Короткий ответ

В продукте 5 пользовательских ролей и одна служебная (collector, без интерфейса). Доступ к разделам определяется единой картой ROUTE_ROLES — она же управляет и видимостью пунктов в меню, и проверкой на бэкенде (require_role). Публичный демо-арендатор доступен только на чтение. Вход — по логину вида роль@арендатор и паролю; пароли хешируются Argon2id (не Стрибог, см. статью 01).


Роли
РольКто этоНазначение
viewerНаблюдательТолько чтение общедоступных разделов (дашборд, системы, эффективность, риски, каталог…)
it_managerИТ-менеджер+ работа с заявками на ПО (создание заявки)
it_adminИТ-администратор+ «железо», ЖЦ, провижининг, коллекторы (эксплуатация ИТ)
dpoОтветственный за ПДн+ аудит ФЗ-152 и Identity Vault (раскрытие соответствий)
superadminСуперадминистраторПолный доступ, включая /settings
collectorАгент сбора телеметрииСлужебная, без UI — только приём телеметрии по сети
Карта доступа к разделам

Карта ROUTE_ROLES: маршруты, которых нет в карте, доступны всем ролям (дашборд, /systems, /efficiency, /risks, /catalog, /requests, /finops и т.п.). Ограниченные:

РазделКто видит
/hardwareit_admin, superadmin
/lifecycleit_admin, superadmin
/provisioningit_admin, superadmin
/collectorsit_admin, superadmin
/auditdpo, superadmin
/identity (Vault)dpo, superadmin
/settingssuperadmin

Принцип: canAccess(route, role) — нет ограничения → доступно; есть → роль должна быть в списке. Меню и проверка доступа используют одну и ту же карту — пункт не показывается, и прямой заход на URL тоже отдаёт «доступ запрещён» (403). То есть скрытие в меню — не косметика.

Что может делать роль (записи, не только просмотр)

RBAC распространяется и на действия (require_role/require_auth на бэкенде):

ДействиеКто может
Создать заявку на ПО (POST /requests)it_manager, it_admin
Перевести заявку по статусам (/transition)требует аутентификации (require_auth)
Grace-sweep (отзыв по простою)it_admin
Приём телеметрии (/ingest/activity)collector, it_admin
Раскрыть соответствие в Vault (/vault/resolve)dpo (+ обязательное основание)
Любая запись в demo_publicзапрещена всем (read-only)
Изоляция арендаторов — поверх ролей

Роль определяет что можно делать; арендатор определяет над какими данными. Изоляция встроена в СУБД через Row-Level Security (RLS FORCE) с первой миграции, а роль приложения licenziar_appне суперпользователь, поэтому RLS реально применяется. Даже superadmin одного арендатора не видит данные другого: SELECT * FROM sam.systems под контекстом demo отдаёт только demo (доказано тестом приёмки). При логине арендатор берётся из учётной записи (роль@арендатор) → запрос в чужой арендатор при входе отвергается (401).


S8. Как выдать доступ новому сотруднику

На стенде операторы засеяны автоматически для каждого customer-арендатора в виде роль@арендатор с паролем licenziar. Примеры:

it_admin@artek   / licenziar     # ИТ-админ Артека
dpo@artek        / licenziar     # ответственный за ПДн Артека
superadmin@rggu  / licenziar     # суперадмин РГГУ
  • Выбор роли = выбор объёма доступа. Инженеру эксплуатации — it_admin; тому, кто работает

с ПДн, — dpo; руководителю для просмотра — viewer/it_manager; полный доступ — только superadmin (минимизируйте число суперадминов).

  • Учётные записи операторов живут в sam.app_users (под RLS, заводятся при сиде/онбординге).

Листинг пользователей в UI сознательно не выносится; матрицу «роли × разделы» можно посмотреть на /settings → вкладка «Пользователи и роли».

  • Заведение нового арендатора целиком — отдельная процедура онбординга (вне этой статьи).
Хранение сессии (dev vs prod)
  • Прод: JWT в httpOnly-cookie same-origin через nginx + CSRF (double-submit). Токен

недоступен из JS — устойчивее для гос-контекста. Включается AUTH_COOKIE_MODE=1.

  • Dev-стенд: фолбэк на localStorage (AUTH_MODE=token) — удобнее для отладки.
  • Это решение зафиксировано осознанно (оценка 10×10: cookie 72 vs localStorage 62 для

гос-контекста). Переключение — переменными окружения, без правок кода экранов.

Грабли
  • Скрытый пункт меню ≠ защищённый ресурс только на фронте. Защита дублируется на бэкенде

(require_role); не полагайтесь на то, что «раздел не виден» — он ещё и закрыт по API.

  • `superadmin` не всемогущ между арендаторами. RLS изолирует данные по арендатору всегда;

это не настройка, а инвариант СУБД.

  • `collector` — не для людей. Это служебная роль приёма телеметрии; не выдавайте её

сотрудникам и не ждите для неё интерфейса.

  • demo_public — витрина. Любая попытка записи туда — 403 by design; для реальной работы

используйте customer-арендатора.


Связанные статьи: 02 — ПДн и Vault · 05 — Автономность и стек.