• Русский
  • Как создать пользовательскую роль платформы

    1. Обзор

    В этом документе объясняются основные концепции пользовательских ролей и как настроить RoleTemplate.

    2. Основные понятия

    • RoleTemplate: Шаблон пользовательской роли. Определяет семантику роли и наборы разрешений, которые контроллер преобразует в ClusterRoles.
    • FunctionResource: Абстракция ресурсов K8s, используемых функционалом продукта; ссылается через functionResourceRef в RoleTemplate.
    • ClusterRole: Набор правил RBAC; может агрегироваться в системные роли с помощью меток.
    • UserBinding: Связь между пользователями и ролями/областями; контроллер на основе UserBinding генерирует RoleBinding/ClusterRoleBinding для окончательной авторизации.
    NOTE
    • Значение functionResourceRef берётся из metadata.name FunctionResource.
    • Отображаемые имена обычно находятся в metadata.annotations, которые можно использовать для сопоставления с модулями UI.

    3. Технические изменения

    Начиная с ACP v4.3, разрешения функций постепенно мигрируют с FunctionResource на нативное управление ClusterRole в K8s. Разрешения модуля RoleTemplate будут агрегированы в системные роли через метки ClusterRole. Управление на основе FunctionResource будет снято с поддержки в v4.5.

    4. Поддерживаемые методы конфигурации

    • Метод FunctionResource: Выбор разрешений по модулям продукта и управление глаголами с тонкой детализацией.
    • Метод агрегации ClusterRole (aggregationRules): Централизованная агрегация через метки ClusterRole; рекомендуется для v4.2+.
    • customRules: Настройка разрешений с использованием нативного синтаксиса RBAC K8s; формат правил такой же, как в ClusterRole rules.

    5. Конфигурация

    5.1 YAML RoleTemplate

    Метод FunctionResource (поддерживается до v4.5)

    apiVersion: auth.alauda.io/v1beta1
    kind: RoleTemplate
    metadata:
      name: demo-funcrole
      annotations:
        cpaas.io/display-name: Пример функции роли
        cpaas.io/description: Пример FunctionResource
      labels:
        auth.cpaas.io/roletemplate.level: namespace
    spec:
      rules:
        - functionResourceRef: acp-app
          verbs: [get, list, watch]

    Пример FunctionResource:

    apiVersion: auth.alauda.io/v1beta1
    kind: FunctionResource
    metadata:
      name: acp-app
      annotations:
        cpaas.io/functionresource.module.display-name: Container Platform
        cpaas.io/functionresource.function.display-name: Application
      labels:
        auth.cpaas.io/functionresource.module: acp
        auth.cpaas.io/functionresource.function: app
        auth.cpaas.io/product: console-acp
    spec:
      rules:
        - apiGroup: app.k8s.io
          resources: ["*"]
          bindScope: namespace
          bindCluster: unlimit
          bindNamespacePart: common

    Метод агрегации ClusterRole (v4.2+)

    apiVersion: auth.alauda.io/v1beta1
    kind: RoleTemplate
    metadata:
      name: demo-aggrole
      annotations:
        cpaas.io/display-name: Пример агрегационной роли
        cpaas.io/description: Пример агрегации ClusterRole
      labels:
        auth.cpaas.io/roletemplate.level: namespace
    spec:
      aggregationRules:
        - clusterRoleSelectors:
            - matchLabels:
                rbac.cpaas.io/aggregate-to-namespace-developer: "true"
                rbac.cpaas.io/aggregate-to-scope-business-ns: "true"
          scope: business-ns
      rules: []

    ClusterRole с метками агрегации:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: cpaas:demo:business-ns:view
      labels:
        rbac.cpaas.io/aggregate-to-namespace-developer: "true"
        rbac.cpaas.io/aggregate-to-scope-business-ns: "true"
    rules:
      - apiGroups: ["apps"]
        resources: ["deployments"]
        verbs: ["get", "list", "watch"]

    Метод customRules

    apiVersion: auth.alauda.io/v1beta1
    kind: RoleTemplate
    metadata:
      name: demo-customrules
      annotations:
        cpaas.io/display-name: Пример роли с пользовательскими правилами
        cpaas.io/description: Пример customRules
      labels:
        auth.cpaas.io/roletemplate.level: namespace
    spec:
      customRules:
        - apiGroups: [""]
          resources: ["configmaps"]
          verbs: ["get", "list", "watch"]

    Справочник полей RoleTemplate (с диапазонами):

    ПолеОписаниеЗначения/Диапазон
    metadata.nameИмя ролиПроизвольная строка
    metadata.labels.auth.cpaas.io/roletemplate.levelУровень ролиplatform / cluster / project / namespace
    metadata.annotations.cpaas.io/(display-name/description)Отображаемое имя и описаниеПроизвольная строка
    spec.rules[].functionResourceRefСсылка на FunctionResourceСм. индекс (FunctionResource metadata.name)
    spec.rules[].verbsГлаголыget / list / watch / create / update / patch / delete / deletecollection
    spec.aggregationRules[].scopeОбласть агрегацииcluster / project-ns / business-ns / system-ns / kube-public
    spec.aggregationRules[].clusterRoleSelectorsСелекторы метокmatchLabels / matchExpressions
    spec.aggregationRules[].clusterRoleSelectors.matchLabelsКлюч/значение меткиkey: value
    spec.aggregationRules[].clusterRoleSelectors.matchExpressionsВыраженияkey + operator + values (операторы: In / NotIn / Exists / DoesNotExist)
    spec.customRules[].apiGroupsГруппы API"" core группа, "*" все
    spec.customRules[].resourcesРесурсы"*" все
    spec.customRules[].verbsГлаголыкак выше
    spec.customRules[].resourceNamesИмена ресурсовНеобязательно
    spec.customRules[].nonResourceURLsURL без ресурсовНеобязательно (обычно для ClusterRole)
    NOTE

    spec.rules и spec.aggregationRules взаимоисключающие.

    Системные метки для matchLabels

    Метки агрегации системных ролей:

    • rbac.cpaas.io/aggregate-to-platform-admin: "true"
    • rbac.cpaas.io/aggregate-to-platform-auditor: "true"
    • rbac.cpaas.io/aggregate-to-cluster-admin: "true"
    • rbac.cpaas.io/aggregate-to-project-admin: "true"
    • rbac.cpaas.io/aggregate-to-namespace-admin: "true"
    • rbac.cpaas.io/aggregate-to-namespace-developer: "true"
    • rbac.cpaas.io/aggregate-to-basic-user: "true"

    Метки агрегации по областям:

    • rbac.cpaas.io/aggregate-to-scope-cluster: "true"
    • rbac.cpaas.io/aggregate-to-scope-project-ns: "true"
    • rbac.cpaas.io/aggregate-to-scope-business-ns: "true"
    • rbac.cpaas.io/aggregate-to-scope-system-ns: "true"
    • rbac.cpaas.io/aggregate-to-scope-kube-public: "true"
    NOTE

    Поддерживаются также пользовательские метки для агрегации.

    Справочник полей FunctionResource:

    ПолеОписание
    metadata.nameИдентификатор FunctionResource (для functionResourceRef)
    metadata.annotationsОтображаемые имена (для сопоставления в UI)
    metadata.labelsМетаданные модуля/функции (для индексирования)
    spec.rules[].apiGroupГруппа API ("" для core)
    spec.rules[].resourcesТипы ресурсов
    spec.rules[].bindScopeОбласть (cluster / namespace)
    spec.rules[].bindClusterОбласть кластера (global / unlimit / business)
    spec.rules[].bindNamespacePartЧасть namespace (common / system / kube-public / project_ns / cluster / "")
    NOTE

    acp-namespace-resource-manage не разрешён в пользовательских ролях.

    5.2 Получение ClusterRoles, сгенерированных из RoleTemplate

    Запросить ClusterRoles, сгенерированные RoleTemplate, можно по меткам:

    kubectl get clusterrole -l auth.cpaas.io/role.relative=<roletemplate-name>

    6. Копирование и сокращение (примеры)

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

    6.1 Сокращение системного RoleTemplate YAML

    Шаги:

    • Оставить необходимые FunctionResources.
    • Сократить глаголы до только чтения (get/list/watch).
    • Удалить неиспользуемые модули.

    Пример роли: developer auditor без разрешений на секреты

    NOTE
    • В пользовательских ролях не настраивайте Namespace Resource Management (FunctionResource: acp-namespace-resource-manage).
    • Удалите User Secret Dictionary (FunctionResource: acp-user-secret).
    • Установите все глаголы в get/list/watch.

    Пример YAML:

    apiVersion: auth.alauda.io/v1beta1
    kind: RoleTemplate
    metadata:
      annotations:
        cpaas.io/description: Ответственность за разработку, деплой и сопровождение в рамках namespace.
        cpaas.io/display-name: Копия роли разработчика
      labels:
        auth.cpaas.io/roletemplate.level: namespace
      name: namespace-developer-system-copy
    spec:
      rules:
        - functionResourceRef: views-acp-userview
          verbs:
            - get
            - list
            - watch
        - functionResourceRef: infrastructure-clusters
          verbs:
            - get
            - list
            - watch
        - functionResourceRef: infrastructure-nodesmanage
          verbs:
            - get
            - list
            - watch
        - functionResourceRef: infrastructure-domains
          verbs:
            - get
            - list
            - watch
        - functionResourceRef: acp-subnet
          verbs:
            - get
            - list
            - watch
        - functionResourceRef: acp-networkpolicies
          verbs:
            - get
            - list
            - watch
        - functionResourceRef: infrastructure-storageclasses
          verbs:
            - get
            - list
            - watch
        - functionResourceRef: infrastructure-persistentvolumes
          verbs:
            - get
            - list
            - watch
        - functionResourceRef: acp-virtualmachineimagetemplates
          verbs:
            - get
            - list
            - watch

    6.2 Сокращение namespace-developer-system до роли аудитора

    Подход:

    • Сохранить структуру областей (cluster / project-ns / business-ns / system-ns / kube-public).
    • Заменить метки агрегации на метки аудитора (требуются промаркированные ClusterRoles).

    Пример (фрагмент):

    apiVersion: auth.alauda.io/v1beta1
    kind: RoleTemplate
    metadata:
      name: namespace-auditor
      annotations:
        cpaas.io/display-name: Аудитор namespace
        cpaas.io/description: Аудит только для чтения
      labels:
        auth.cpaas.io/roletemplate.level: namespace
    spec:
      aggregationRules:
        - clusterRoleSelectors:
            - matchLabels:
                rbac.cpaas.io/aggregate-to-namespace-auditor: "true"
                rbac.cpaas.io/aggregate-to-scope-business-ns: "true"
          scope: business-ns
      rules: []
    NOTE

    aggregate-to-namespace-auditor должен совпадать с метками на существующих ClusterRoles. Если нет, сначала создайте ClusterRole только для чтения и добавьте метку.