Как происходит назначение прав доступа

Цепочка событий при назначении прав пользователю или группе.

Краткий обзор процесса

Если вы ещё не знакомы с особенностями ресурсов для управления правами доступа в платформе «Штурвал», начните с ознакомления со статьей Кастомные ресурсы для управления правами доступа.

  1. Администратор назначает права в GUI (пользователь или группа + один или несколько наборов доступов).
  2. Backend создаёт или обновляет Scope (граница уровня) и UserRole / GroupRole (субъект + список Permission).
  3. Оператор согласования прав (shturval-permission-operator, Deployment shturval-permission-operator-controller) выполняет reconcile:
    • PermissionClusterRole в кластере управления и клиентских кластерах;
    • UserRole / GroupRole → применение через плагины (Argo CD, Kubeflow).
  4. Параллельно оператор обновляет OPA bundle (HTTP /bundle, порт 8082) — данные для Authz (OPA) при проверке запросов в Backend.
  5. Статус отражается в UserRole/GroupRole.status и в GUI.

Схема потока

схема применения прав доступа

Подробные диаграммы reconcile — в Операторе согласования прав.


Пошаговый процесс

Шаг 1. Действие в интерфейсе

Администратор на странице Управление ролями:

  1. Выбирает уровень (Платформа, Тенант, Кластер или Неймспейс).
  2. Нажимает + рядом с «Пользователи» или «Группы».
  3. Указывает имя пользователя или группы (из LDAP или вручную).
  4. Выбирает один или несколько наборов доступов.
  5. Нажимает Сохранить.

Подробнее: Назначение прав доступа.

Шаг 2. Область и привязка (Scope, UserRole / GroupRole)

Backend сохраняет назначение в виде кастомных ресурсов Kubernetes (API-группа permissions.shturval.tech, неймспейс shturval-backend кластера управления).

2a. Область (Scope)

Backend создаёт или использует Scope, соответствующий выбранному уровню (платформа, тенант, кластер, неймспейс). Границы области задаются полем spec.objects.

На уровне Тенант связанный Scope также создаётся оператором из объекта Tenant (имя scope совпадает с именем тенанта).

2b. Привязка (UserRole / GroupRole)

  • UserRole — назначение пользователю;
  • GroupRole — назначение группе.

В спецификации указываются:

Поле UserRole GroupRole
Область spec.scope — имя Scope spec.scope — имя Scope
Субъект spec.username spec.claim
Наборы доступов spec.permissions — имена Permission spec.permissions — имена Permission

Обратите внимание! после создания объекта spec.username (UserRole) и spec.claim (GroupRole) нельзя изменить — validating webhook отклонит Update.

Подробнее: Кастомные ресурсы для управления правами доступа.

Шаг 3. Согласование наборов (Permission)

Каждый набор доступов в платформе соответствует CR Permission. Его согласует PermissionReconciler оператора shturval-permission-operator:

  • granted_platform_permissions → агрегирующий ClusterRole на платформе (префикс имён platform:);
  • granted_cluster_rulesClusterRole в клиентских кластерах (префикс shturval:); доступ к API клиентского кластера — через Secret <имя-кластера>-kubeconfig, ключ value.

События CAPI Cluster (готовность control plane, удаление, пауза) инициируют повторное согласование затронутых Permission.

Шаг 4. Согласование привязки через shturval-permission-operator

UserRoleReconciler и GroupRoleReconciler (оператор shturval-permission-operator, Deployment shturval-permission-operator-controller) выполняют reconcile привязки:

  1. Читают связанный Scope и наборы Permission из spec.permissions.
  2. Определяют целевые кластеры по Scope (см. таблицу уровней ниже).
  3. Последовательно вызывают плагины для каждого permission:
    • RBAC — привязка субъекта к ClusterRole, созданным на шаге 3;
    • Argo CD, Kubeflow, tenant — если соответствующие поля заданы в Permission.
  4. При ошибке плагина — немедленный повтор reconcile; при успехе — обновление status.

Подробнее об архитектуре оператора: Оператор согласования прав (permissions operator).

Шаг 5. Плагины Kubeflow и Argo CD

Если в наборе доступов (Permission) указаны роли Kubeflow (kubeflow-admin, kubeflow-edit, kubeflow-view), плагин Kubeflow применяет соответствующие права:

  • Платформа — профили (неймспейсы) во всех кластерах;
  • Кластер — профили кластера;
  • Неймспейс — профиль одного неймспейса.

Если указана роль Argo CD (admin, edit, view), плагин Argo CD создаёт или обновляет роли в проектах:

  • Платформа — все проекты;
  • Кластер — проекты кластера;
  • Неймспейс — проект одного неймспейса.

Шаг 6. Статус применения

Оператор записывает результат в UserRole.status / GroupRole.status: вложенная карта status.permissions → кластер или платформа → имя плагина → PluginApplyStatus.

GUI отображает сводный статус по каждому целевому контуру:

GUI Значение в CR Смысл
Зелёный applied Плагин успешно применён
Красный undefined или ошибка reconcile Сетевая или иная ошибка, сбой плагина
Серый not required Право не требуется (например, нет роли Kubeflow или Argo CD в наборе)
Ожидание not applied Reconcile ещё не завершён

Для отладки: kubectl describe userrole <имя> -n shturval-backend (или grouprole).


Зависимости от уровня назначения

Уровень Где хранится UserRole/GroupRole Куда применяются права
Платформа shturval-backend Кластер управления + все клиентские кластеры
Тенант shturval-backend Кластер управления + все кластеры тенанта
Кластер shturval-backend Кластер управления (для объектов платформы) + выбранный клиентский кластер
Неймспейс shturval-backend Кластер управления + выбранный неймспейс в клиентском кластере

Границы уровня задаёт Scope, на который ссылается UserRole.spec.scope / GroupRole.spec.scope.

Обратите внимание! объекты кластеров (Cluster, Machine и др.) и объекты permissions.shturval.tech хранятся в кластере управления. Поэтому даже при назначении на уровне «кластер» или «неймспейс» часть прав применяется в кластере управления.


Типичные причины сбоев

Симптом Возможная причина
Красный статус в кластере управления Платформенные разрешения в наборе отсутствуют или некорректны
Красный статус в клиентском кластере Кластер недоступен; нет Secret <имя-кластера>-kubeconfig или неверный ключ value; конфликт имён RoleBinding
Долго «не применяется» Статус not applied — reconcile ещё идёт; проверьте Pod shturval-permission-operator-controller в неймспейсе shturval-backend
Ошибка при ручном patch UserRole/GroupRole Изменение spec.username или spec.claim после создания (validating webhook)
Права пропали или не обновились после паузы кластера CAPI Cluster.Spec.Paused — оператор пересогласовывает при изменении состояния кластера
Пользователь не видит кластер Назначение не применено или применено с ошибкой; проверьте статус в GUI
Группа не получает права Группа не найдена в LDAP; при OIDC — проверьте маппинг групп в токене

Подробнее: Траблшутинг доступа.