Управление доступом (RBAC)

Role Binding — механизм управления рольями с параметрами их области действия

Обзор

Доступ к API управления и веб-интерфейсу Meridian выдаётся привязками ролей (Role Binding). Привязка связывает пользователя со встроенной ролью в определённой области: на весь шлюз, внутри заказчика, команды или пользователя.

Одному пользователю можно выдать несколько привязок. Например, администрировать одного заказчика и только просматривать данные другого. Права всех привязок пользователя складываются.

Что это даёт:

  • Делегирование администрирования. Заказчик сам управляет своими командами, виртуальными ключами и бюджетами, не получая доступа к настройкам всего шлюза.
  • Наследование прав. Роль, выданная заказчику, действует на все его команды и их виртуальные ключи.
  • Разделение обязанностей. Отдельные роли для просмотра, управления пользователями и управления бюджетами.
  • Интеграция с каталогом. Привязки можно получать из групп и атрибутов LDAP.

Привязки ролей управляют доступом к API управления и веб-интерфейсу. Запросы к моделям по-прежнему авторизуются виртуальным ключом.


Ключевые понятия

ПонятиеЧто это
РольВстроенный набор разрешений, например s.admin. Роли заданы в продукте и не редактируются. Собственные роли создать нельзя.
Область действияГде действует роль: весь шлюз (global), заказчик (customer), команда (team) или пользователь (user).
Привязка ролиЗапись «пользователь + роль + область». Привязку нельзя изменить: чтобы сменить роль или область, удалите привязку и создайте новую.
НаследованиеПривязка действует в своей области и во всём, что в неё входит.

Области действия и наследование

Области образуют иерархию: весь шлюз → заказчик → команда. Виртуальный ключ принадлежит команде, заказчику или никому.

ОбластьГде действует привязка
globalВесь шлюз.
customerЗаказчик, все его команды и их виртуальные ключи.
teamКоманда и её виртуальные ключи.
userТолько профиль пользователя. Не распространяется на виртуальные ключи, бюджеты, лимиты и правила маршрутизации.

Некоторые разрешения действуют только на определённых уровнях:

  • Создание команд доступно на уровне всего шлюза и заказчика, но не команды.
  • Удалить можно только нижестоящую область. Администратор заказчика не может удалить своего заказчика — это может сделать только тот, у кого права выше.
  • Чтение шире изменения. Администратор команды видит правило маршрутизации родительского заказчика, но не может его изменить. Глобальные правила маршрутизации и лимиты моделей видны всем пользователям.

Встроенные роли

Каталог ролей — Governance → Roles. Строка раскрывается и показывает разрешения роли на каждом уровне.

Каталог встроенных ролей

Глобальные роли

Выдаются только на весь шлюз.

РольНазначениеЧто может
g.adminГлобальный администраторВсё: кластер, провайдеры и ключи, плагины, MCP, наблюдаемость, LDAP, каталог моделей, аудит, привязки ролей.
g.viewerПросмотр всего шлюзаЧтение всех разделов, кроме административных, включая кластер, провайдеров, аудитные логи и привязки ролей.
g.user-managerУправление пользователями и governanceПросмотр всего шлюза, а также управление заказчиками, командами, пользователями и виртуальными ключами.
g.budget-managerУправление бюджетамиПросмотр всего шлюза, а также изменение бюджетов и rate limit'ов.

Роли в области

Выдаются внутри заказчика, команды или пользователя.

РольОбластиЧто может
s.adminзаказчик, команда, пользовательАдминистрирование области: команды, виртуальные ключи, бюджеты, rate limit'ы, правила маршрутизации, просмотр логов, привязки ролей внутри области.
s.user-managerзаказчик, командаПросмотр области, а также управление командами и пользователями.
s.budget-managerзаказчик, командаПросмотр области, а также изменение бюджетов и rate limit'ов.
s.viewerзаказчик, команда, пользовательПросмотр области: заказчик, команды, виртуальные ключи, бюджеты, лимиты, правила маршрутизации, логи.

На уровне команды у s.admin нет прав на заказчика и на создание и удаление команд. На уровне пользователя роль позволяет в основном управлять привязками этого пользователя.

Создание пользователей, изменение их данных и старых ролей, а также лимиты моделей требуют прав на весь шлюз. Роли в области эти операции не открывают.


Кто может выдавать привязки

Создавать и удалять привязки может администратор — g.admin или s.admin — в целевой области или выше неё.

Роль вызывающегоГде может управлять привязками
g.adminВ любой области, включая глобальные роли.
s.admin у заказчикаУ этого заказчика и в его командах.
s.admin у командыТолько в этой команде.
s.admin у пользователяТолько в области этого пользователя.

Следствия:

  • Глобальные роли выдаёт только глобальный администратор.
  • Роли не ранжируются внутри области. Администратор заказчика может выдать s.admin другому пользователю у своего заказчика.
  • Администратор заказчика не управляет областью пользователя. Привязки в области user выдаёт глобальный администратор или s.admin этого пользователя.
  • Нельзя отозвать собственную административную привязку, если только она даёт вам права администратора в этой области. Её удаляет другой администратор.
  • Глобальную привязку g.admin пользователя admin удалить нельзя.

Управление привязками

Привязки управляются на странице Governance → Role Bindings. Список фильтруется по области, заказчику, команде, пользователю и роли. Пользователь видит только привязки в доступных ему областях.

Список привязок ролей

Выдать роль:

  1. В блоке Add Role Binding выберите пользователя в поле User.
  2. В поле Role выберите роль.
  3. В поле Scope Type выберите область: Global, Customer, Team или User.
  4. В поле Scope Entity выберите заказчика, команду или пользователя. Для Global поле не заполняется.
  5. Нажмите Add Binding.
Выдача роли s.admin в области заказчика

Если роль нельзя выдать в выбранной области, форма сообщит об этом до отправки.

Отозвать роль: наведите курсор на строку, нажмите значок удаления и подтвердите удаление.

На страницах заказчика и команды блок Members показывает выданные в этой области роли: роль, пользователя, кто и когда выдал. Блок только для просмотра.

Выдать роль:

curl -X POST http://localhost:8080/api/auth/rbac/bindings \
  -H "Content-Type: application/json" \
  -d '{
    "user_id": "550e8400-e29b-41d4-a716-446655440000",
    "role_name": "s.admin",
    "scope_type": "customer",
    "scope_id": "customer-acme"
  }'

Для области global поле scope_id оставляется пустым. Ответ 201 содержит привязку. Если у пользователя есть старая глобальная роль, в ответе будет поле warning — см. Старые глобальные роли.

Список привязок:

curl "http://localhost:8080/api/auth/rbac/bindings?customer_id=customer-acme&role_name=s.admin&limit=50"
ПараметрОписание
user_id, role_name, customer_id, team_id, sourceФильтры. Можно передать несколько значений.
scope_typeТипы областей через запятую.
scope_idИдентификатор области.
offset, limitПагинация. По умолчанию limit — 50, максимум — 500.

Ответ: { "items": [...], "total": N, "offset": 0, "limit": 50 }. Результат ограничен областями, доступными вызывающему.

Отозвать роль:

curl -X DELETE http://localhost:8080/api/auth/rbac/bindings/{binding_id}

Каталог ролей и свои права:

ЭндпоинтНазначение
GET /api/auth/rbac/rolesВстроенные роли, их области и разрешения на каждом уровне.
GET /api/auth/rbac/meСвой профиль: старая роль и привязки с разрешениями.
GET /api/auth/rbac/visible-scopesДоступные вызывающему области и тип доступа: администратор или просмотр.

Ошибки:

КодПричина
400Неизвестная роль, роль нельзя выдать в этой области, неизвестный заказчик, команда или пользователь, scope_id не соответствует области.
403Нет прав администратора в целевой области; попытка отозвать собственную административную привязку; попытка удалить защищённую привязку g.admin.
409У пользователя уже есть эта роль в той же или охватывающей области.

Старые глобальные роли

До появления привязок каждому пользователю назначалась одна глобальная роль. Эти роли сохранены для совместимости и соответствуют глобальным привязкам:

Старая рольСоответствует
adming.admin
auditorg.viewer
user_managerg.user-manager
noneНет глобальных прав: доступ только через привязки ролей

Права старой роли складываются с привязками. Привязка в области не ограничивает пользователя со старой ролью admin, auditor или user_manager: он сохраняет глобальный доступ.

Чтобы пользователь работал только в своей области, установите ему роль None (scoped access via role bindings). При создании привязки для пользователя со старой глобальной ролью веб-интерфейс и API показывают предупреждение.

Старая роль задаётся при создании пользователя и меняется на странице Governance → Roles & Permissions. В форме создания пользователя по умолчанию выбрана роль None. Изменение старой роли:

  • требует глобального права на изменение пользователей, а назначение ролей admin, auditor и user_manager — прав глобального администратора;
  • сбрасывает все сессии пользователя;
  • недоступно для собственной учётной записи;
  • не может оставить шлюз без администратора.

Управление бюджетами в областях

Параметр authz.budget_management_mode определяет, могут ли области менять свои бюджеты сами:

{
  "authz": {
    "budget_management_mode": "self-management"
  }
}
РежимКто может менять бюджет своей области
self-managementЗаказчик, команда и пользователь. Значение по умолчанию.
self-management-team-levelЗаказчик и команда.
self-management-customer-levelТолько заказчик.
pull-down-onlyНикто: бюджет задаёт только вышестоящая область.

Ограничение действует, когда роль выдана в той же области, что и бюджет. Вышестоящая область может менять бюджеты нижестоящих всегда. Изменение режима требует перезапуска.


Привязки из LDAP

При синхронизации с LDAP-каталогом привязки создаются автоматически из групп пользователя и из его атрибута со значениями вида global:<роль>, customer:<псевдоним>:<роль> или team:<псевдоним>:<роль>.

Синхронизация управляет только своими привязками и не трогает выданные вручную. Привязку из LDAP, удалённую вручную, следующая синхронизация восстановит: отзывайте такие роли в каталоге. Подробнее — LDAP-каталог.


Применение изменений

  • Изменение привязок применяется почти сразу на всех узлах кластера. Если сигнал об изменении потерян, права обновятся не позже чем через 5 минут.
  • Изменение привязок не завершает сессии пользователя. Изменение старой роли завершает.
  • Решения о доступе можно записывать в журнал. Подробнее — Аудитные логи.

Пример: делегирование администрирования заказчику

Задача: сотрудник заказчика Acme управляет командами, ключами и бюджетами Acme, а финансовый аналитик только просматривает команду acme-research.

Создайте пользователей со старой ролью None.

На странице Role Bindings выдайте сотруднику роль s.admin в области Customer → Acme.

Выдайте аналитику роль s.viewer в области Team → acme-research.

Сотрудник Acme видит только своего заказчика, может создавать его команды и виртуальные ключи, менять бюджеты и сам выдавать роли внутри Acme. Аналитик видит только команду acme-research и её виртуальные ключи, без права изменений.


Дальше

Содержание