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

Ресурсы Kubernetes, в которых хранятся назначения прав.

API-группа

Все кастомные ресурсы управления доступом относятся к API-группе permissions.shturval.tech.

Объекты этой группы хранятся в кластере управления в неймспейсе shturval-backend и в неймспейсах клиентских кластеров (при синхронизации). Для избежания коллизий с возможным дублированием имен, для кастомных ресурсов UserRole и GroupRole добавляется автогененируемый постфикс.

Общий обзор кастомных ресурсов платформы «Штурвал» и их API-групп см. на странице «Кастомные ресурсы в платформе».


Основные ресурсы

Scope

Хранит указание, к каким кластерам/неймспейсам какие наборы доступов могут быть применены, а также какие пути покрывает этот скоуп в рамках API. Scope может быть разных уровней. В зависимости от уровня Scope(scope_level) права будут применены к разному уровню объектов:

  • Платформенный - ко всем кластерам в платформе;
  • Кластерный - к кластеру или совокупности кластеров, объединенных в тенант;
  • Неймспейсный - к неймспейсу или совокупности неймспейсов, объединенных в тенант;

Scope_level указывается в объекте Permission (набор доступов). В графическом интерфейсе наборы доступов разделены по уровням скоупа, например, при выборе прав доступа в неймспейсе будут доступны только permissions с неймспейсным уровнем скоупа.

Scope - это системный объект, который создается автоматически. Администратору не требуется его создавать или изменять.

Пример манифеста Scope:

apiVersion: permissions.shturval.tech/v1beta1
kind: Scope
metadata:
  annotations:
    clusters: prod
  name: cluster-prod
  namespace: prod
  ownerReferences:
    - apiVersion: permissions.shturval.tech/v1beta1
      blockOwnerDeletion: true
      controller: true
      kind: Tenant
      name: cluster-prod
spec:
  objects:
    clusters:
      - prod
    namespaces:
      - "*"
    tenants:
      - sometenants
status:
  objectsStatus:
    - metadata:
        kind: Cluster
        name: prod
        namespace: prod
      state: exists
  paths:
    - /clusters
    - /clusters/prod
    - /clusters/prod/*
    - /clusters/prod/ingressclasses/names
    - /clusters/prod/namespaces/*
    - /clusters/prod/namespaces/*/*
    - /clusters/prod/namespaces/permissions/groups
    - /clusters/prod/namespaces/permissions/roles
    - /clusters/prod/persistentvolumes/names
    - /clusters/prod/storageclasses/names
    - /clusters/permissions/groups
    - /clusters/permissions/roles
    - /clusters?page*
    - /platform/auth/ldap/search
    - /platform/clusters/kubeconfigs
    - /platform/clustersinfo
    - /platform/clustersinfo/statistics
    - /platform/license
    - /platform/loginplugin/config
    - /platform/permissions/access-map/groups
    - /platform/permissions/access-map/groups/*
    - /platform/permissions/access-map/roles
    - /platform/permissions/access-map/roles/*
    - /platform/permissions/custom
    - /platform/permissions/custom/*
    - /platform/permissions/custom/roles
    - /platform/permissions/groups
    - /platform/permissions/groups/*
    - /platform/permissions/roles
    - /platform/permissions/roles/*
    - /platform/permissions/scope
    - /platform/scopepermissions
    - /platform/version
    - prod/cluster-prod
  permissions:
    - cluster-admin
    - cluster-admin-restricted
    - custom-permission-set
    - sec-cluster-audit
    - sec-cluster-audit-full
    - sec-security-report

Permissions

Наборы доступов (Permissions) — это отдельные ресурсы, которые описывают:

  • Платформенные разрешения (granted_platform_permissions) — закрытый набор ClusterRoles для предоставления доступа к объектам платформы (cluster, provider, ippool и др.), расположенным в кластере управления. Создает назначения в кластере управления;
  • Кластерные разрешения (granted_cluster_rules) — RBAC в формате Kubernetes (apiGroups, resources, verbs) для применения в клиентских кластерах;
  • Права Kubeflow — роли Kubeflow (kubeflow-admin, kubeflow-edit, kubeflow-view), которые применяются к профилям в зависимости от уровня назначения;
  • Роль в ArgoCD — admin, edit или view.

Пример манифеста Permission:

apiVersion: permissions.shturval.tech/v1beta1
kind: Permission
metadata:
  annotations:
    helm.sh/resource-policy: keep
    isDefault: "true"
    meta.helm.sh/release-name: shturval-backend
    meta.helm.sh/release-namespace: shturval-backend
    permissions.shturval.tech/description: 'Доступ на просмотр разделов "Нагрузки",
      "Сеть", страниц: PersistentVolumeClaims, Configmaps, Quotas'
  labels:
    app.kubernetes.io/managed-by: Helm
  name: dev-basic
  namespace: shturval-backend
spec:
  argo_cd_roles:
    - view
  granted_cluster_rules:
    - apiGroups:
        - ""
      resources:
        - namespaces
        - namespaces/status
        - configmaps
        - endpoints
        - persistentvolumeclaims
        - pods
        - podtemplates
        - replicationcontrollers
        - resourcequotas
        - services
        - poddisruptionbudgets
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - batch
      resources:
        - jobs
        - cronjobs
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - networking.k8s.io
      resources:
        - ingresses
        - ingressclasses
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - gateway.networking.k8s.io
      resources:
        - gateways
        - gateways/status
        - httproutes
        - httproutes/status
        - grpcroutes
        - grpcroutes/status
        - tcproutes
        - tcproutes/status
        - tlsroutes
        - tlsroutes/status
        - udproutes
        - udproutes/status
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - events.k8s.io
      resources:
        - events
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - apps
      resources:
        - deployments
        - replicasets
        - statefulsets
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - ""
      resources:
        - events
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - autoscaling
      resources:
        - horizontalpodautoscalers
        - horizontalpodautoscalers/status
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - ""
      resources:
        - persistentvolumesclaims
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - aquasecurity.github.io
      resources:
        - configauditreports
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - aquasecurity.github.io
      resources:
        - exposedsecretreports
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - aquasecurity.github.io
      resources:
        - vulnerabilityreports
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - kyverno.io
      resources:
        - cleanuppolicies
        - clustercleanuppolicies
        - policies
        - clusterpolicies
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - wgpolicyk8s.io
      resources:
        - policyreports
        - clusterpolicyreports
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - kyverno.io
      resources:
        - admissionreports
        - clusteradmissionreports
        - backgroundscanreports
        - clusterbackgroundscanreports
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - kyverno.io
      resources:
        - updaterequests
      verbs:
        - get
        - list
        - watch
  granted_platform_permissions:
    - cluster-get
    - tenant-get
  scope_level: namespaces

Подробнее: Настройка разрешений.

Существование набора доступов (объекта Permission) не выделяет никому прав доступа. Для связки набора доступов с пользователем создается объект UserRole, с группой - GroupRole.

UserRole и GroupRole указывают на один или несколько наборов доступов. При синхронизации контроллер объединяет разрешения из всех назначенных наборов, формирует ClusterRole и RoleBinding в целевых кластерах, а также применяет роли Kubeflow и ArgoCD, если они заданы в наборе.


UserRole

Назначение: хранит назначение прав пользователю.

Поле Описание
Субъект Уникальное имя пользователя (например, из LDAP или OIDC)
Наборы доступов Ссылки на наборы (Permissions)
Уровень Платформа, Тенант, Кластер или Неймспейс
Целевой объект Тенант, кластер или неймспейс (в зависимости от уровня)

Расположение: неймспейс shturval-backend кластера управления.

Статус показывает, с каким результатом были применены права в каждом запрошенном уровне. Если применение было в платформе, то в статусе будет отражаться применение в каждый объект, входящий в платформу, в т.ч. в кластеры, которые будут созданы после назначения. Аналогично с тенантом.

Пример манифеста UserRole:

apiVersion: permissions.shturval.tech/v1beta1
kind: UserRole
metadata:
  labels:
    updatedByUser: username
  name: p-petrov-user-88s5l
  namespace: prod
  ownerReferences:
    - apiVersion: permissions.shturval.tech/v1beta1
      blockOwnerDeletion: true
      controller: true
      kind: Scope
      name: namespacename
spec:
  permissions:
    - namespace-admin
  scope: namespacename
  username: p.petrov
status:
  permissions:
    namespace-admin:
      clusters:
        prod:
          namespaces:
            namespacename:
              plugins:
                kubeflow:
                  previousstatus: not required
                  status: not required
                rbac:
                  previousstatus: applied
                  status: applied
          plugins:
            argocd:
              previousstatus: not required
              status: not required
      platform:
        plugins:
          rbac:
            previousstatus: applied
            status: applied
          tenant:
            previousstatus: applied
            status: applied

GroupRole

Назначение: хранит назначение прав группе.

Поле Описание
Субъект Имя группы (из LDAP или вручную)
Наборы доступов Ссылки на наборы (Permissions)
Уровень Платформа, Тенант, Кластер или Неймспейс
Целевой объект Тенант, кластер или неймспейс

Расположение: неймспейс shturval-backend кластера управления.

Все пользователи, входящие в группу, получают права, заданные в GroupRole.

Пример манифеста GroupRole:

apiVersion: permissions.shturval.tech/v1beta1
kind: GroupRole
metadata:
  generateName: admins-group-
  labels:
    updatedByUser: username
  name: admins-group-jpbgn
  namespace: shturval-backend
  ownerReferences:
    - apiVersion: permissions.shturval.tech/v1beta1
      blockOwnerDeletion: true
      controller: true
      kind: Scope
      name: platform
spec:
  claim: admins
  permissions:
    - platform-admin
  scope: platform
status:
  permissions:
    platform-admin:
      clusters:
        managementcluster:
          plugins:
            argocd:
              previousstatus: applied
              status: applied
            kubeflow:
              previousstatus: not required
              status: not required
            rbac:
              previousstatus: applied
              status: applied
        ml-cluster:
          plugins:
            argocd:
              previousstatus: applied
              status: applied
            kubeflow:
              previousstatus: not required
              status: not required
            rbac:
              previousstatus: applied
              status: applied
        cluster-stage:
          plugins:
            argocd:
              previousstatus: not required
              status: not required
            kubeflow:
              previousstatus: not required
              status: not required
            rbac:
              previousstatus: applied
              status: applied
      platform:
        plugins:
          rbac:
            previousstatus: applied
            status: applied
          tenant:
            previousstatus: applied
            status: applied

Статус показывает, с каким результатом были применены права в каждом запрошенном уровне. Если применение было в платформе, то в статусе будет отражаться применение в каждый объект, входящий в платформу, в т.ч. в кластеры, которые будут созданы после назначения. Аналогично с тенантом.


Резервное копирование

UserRole и GroupRole входят в объекты, которые рекомендуется включать в резервные копии при настройке Disaster Recovery.

Пример Velero Backup для UserRole и GroupRole:

apiVersion: velero.io/v1
kind: Backup
metadata:
  name: backup-platform-roles
  namespace: velero
  labels:
    velero.io/storage-location: s3
spec:
  includedNamespaces:
    - shturval-backend
  includedResources:
    - GroupRole
    - UserRole
  storageLocation: s3
  ttl: 24h

Подробнее: DR-конфигурация.


Важные замечания

  1. Не редактируйте UserRole и GroupRole вручную без понимания структуры. Назначение прав рекомендуется выполнять через GUI платформы.

  2. Платформенные разрешения необходимы для доступа к объектам API-групп cluster.x-k8s.io, bootstrap.cluster.x-k8s.io, infrastructure.cluster.x-k8s.io и permissions.shturval.tech, так как они хранятся в кластере управления.

  3. Просмотр объектов возможен при наличии разрешения access-map-get или permissions-get в наборе доступов.