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

Использование RBAC для разграничения доступа в Kubernetes

1. Об RBAC в Kubernetes

Объекты RBAC (Role-based access control) в Kubernetes определяют, разрешена ли пользователю определенная операция в контексте всего кластера или в контексте пространства имен (Namespace).

Администраторы кластера Kubernetes могут использовать кластерные роли (ClusterRoles) и их привязки (ClusterRoleBindings) к пользовательским объектам, чтобы контролировать тот или иной доступ к ресурсам Kubernetes, пространствам имен и другим сущностям в контексте всего кластера.

Регулярные пользователи кластера могут использовать локальные роли (Roles) и их локальные привязки (RoleBindings), чтобы контролировать доступ к собственным пространствам имен (Namespaces).

Авторизация в Kubernetes управляется с помощью следующих объектов:

Объект авторизации Описание

Правила (Rules)

Перечень разрешенных методов работы с объектами Kubernetes.

Роли (Roles)

Набор правил, определяющий разрешенные действия с объектами Kubernetes.

Привязки (Bindings)

Ассоциация между пользователями или группами с какой-либо ролью.

В Kubernetes предусмотрено два уровня ролей RBAC и их привязок:

Уровень RBAC Описание

Кластерный RBAC

Кластерные роли и привязки, которые могут применяться на уровне всего кластера.

Локальный RBAC

Локальные роли и привязки, которые могут применяться на уровне пространства имен. При этом, в привязке может указываться также и кластерная роль, описывающая какие-либо действия в Kubernetes.

Информация

Для удобства администрирования используйте кластерные роли (ClusterRoles) в локальных привязках (RoleBindings) и создавайте локальные роли (Roles) только при необходимости.

Данная двухуровневая иерархия позволяет переиспользовать одни и те же кластерные роли (ClusterRoles) в пределах пространств имен, а также сохраняет возможность установки дополнительных локальных ролей.

В результате какого-либо действия пользователя в Kubernetes предварительно оцениваются правила в ролях (Roles), назначенных ему с помощью привязок (Bindings):

  • Выполняется проверка разрешений по кластерным ролям (ClusterRoles)

  • Выполняется проверка разрешений по локальным ролям (Roles)

  • Запрещается все, что явно не разрешено.

1.1. Кластерные роли по умолчанию

Nova Container Platform включает базовый набор кластерных ролей (ClusterRoles), которые вы можете использовать для назначения пользователям и группам в контекстах кластера и пространств имен.

Не рекомендуется изменять базовые кластерные роли (ClusterRoles). Изменение базовых кластерных ролей или системных ролей может привести к некорректной работе Kubernetes. При необходимости вы можете продублировать базовую кластерную роль и внести в нее изменения.

Кластерная роль Описание

cluster-admin

Роль, определяющая права супер-пользователя. Данный пользователь может выполнить любое действие с любым объектом в кластере, если роль привязана с помощью ClusterRoleBinding. Если роль привязана с помощью RoleBinding, то пользователь сможет управлять всеми ресурсами пространства имен, в том числе квотами.

admin

Роль администратора пространства имен. Пользователь может управлять всеми ресурсами пространства имен кроме квот.

edit

Роль пользователя в пространстве имен, позволяющая выполнять операции с большинством объектов в пространстве имен за исключением ролей и их привязок.

view

Роль пользователя, который не может производить какие-либо изменения в Kubernetes, но может просматривать большинство объектов кроме ролей, их привязок, некоторых CR и секретов.

2. Просмотр кластерных ролей и их привязок

Вы можете использовать утилиту kubectl для просмотра и оценки кластерных ролей и их привязок.

Необходимые условия

  • У вас есть доступ к кластеру с учетной записью, имеющей роль cluster-admin в Kubernetes.

  • Вы установили утилиту kubectl для работы с Kubernetes.

    1. Для просмотра кластерных ролей и их правил выполните команду:

      kubectl describe clusterrole.rbac

      Пример

      $ kubectl describe clusterrole.rbac
      
      Name:         admin
      Labels:       kubernetes.io/bootstrapping=rbac-defaults
      Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
      PolicyRule:
        Resources                                         Non-Resource URLs  Resource Names  Verbs
        ---------                                         -----------------  --------------  -----
        leases.coordination.k8s.io                        []                 []              [create delete deletecollection get list patch update watch]
        rolebindings.rbac.authorization.k8s.io            []                 []              [create delete deletecollection get list patch update watch]
        roles.rbac.authorization.k8s.io                   []                 []              [create delete deletecollection get list patch update watch]
        configmaps                                        []                 []              [create delete deletecollection patch update get list watch]
        events                                            []                 []              [create delete deletecollection patch update get list watch]
        persistentvolumeclaims                            []                 []              [create delete deletecollection patch update get list watch]
        pods                                              []                 []              [create delete deletecollection patch update get list watch]
        replicationcontrollers/scale                      []                 []              [create delete deletecollection patch update get list watch]
        replicationcontrollers                            []                 []              [create delete deletecollection patch update get list watch]
        services                                          []                 []              [create delete deletecollection patch update get list watch]
        challenges.acme.cert-manager.io                   []                 []              [create delete deletecollection patch update get list watch]
        orders.acme.cert-manager.io                       []                 []              [create delete deletecollection patch update get list watch]
        daemonsets.apps                                   []                 []              [create delete deletecollection patch update get list watch]
        deployments.apps/scale                            []                 []              [create delete deletecollection patch update get list watch]
        deployments.apps                                  []                 []              [create delete deletecollection patch update get list watch]
        replicasets.apps/scale                            []                 []              [create delete deletecollection patch update get list watch]
        replicasets.apps                                  []                 []              [create delete deletecollection patch update get list watch]
        statefulsets.apps/scale                           []                 []
        ...
    2. Для просмотра кластерных привязок с пользователями или группами, выполните команду:

      kubectl describe clusterrolebinding.rbac

      Пример

      $ kubectl describe clusterrolebinding.rbac
      
      Name:         cluster-admin
      Labels:       kubernetes.io/bootstrapping=rbac-defaults
      Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
      Role:
        Kind:  ClusterRole
        Name:  cluster-admin
      Subjects:
        Kind   Name            Namespace
        ----   ----            ---------
        Group  system:masters
      
      
      Name:         cluster-reconciler
      Labels:       app.kubernetes.io/instance=nova-gitops
                    app.kubernetes.io/part-of=flux
      Annotations:  <none>
      Role:
        Kind:  ClusterRole
        Name:  cluster-admin
      Subjects:
        Kind            Name                  Namespace
        ----            ----                  ---------
        ServiceAccount  kustomize-controller  nova-gitops
        ServiceAccount  helm-controller       nova-gitops
      
      
      Name:         crd-controller
      Labels:       app.kubernetes.io/instance=nova-gitops
                    app.kubernetes.io/part-of=flux
      Annotations:  <none>
      Role:
        Kind:  ClusterRole
        Name:  crd-controller
      Subjects:
        Kind            Name                         Namespace
        ----            ----                         ---------
        ServiceAccount  kustomize-controller         nova-gitops
        ServiceAccount  helm-controller              nova-gitops
        ServiceAccount  source-controller            nova-gitops
        ServiceAccount  notification-controller      nova-gitops
        ServiceAccount  image-reflector-controller   nova-gitops
        ServiceAccount  image-automation-controller  nova-gitops
      
      
      Name:         hubble-generate-certs
      Labels:       app.kubernetes.io/managed-by=Nova
                    kustomize.toolkit.fluxcd.io/name=nova-release-cilium-hubble
                    kustomize.toolkit.fluxcd.io/namespace=nova-gitops
      Annotations:  <none>
      Role:
        Kind:  ClusterRole
        Name:  hubble-generate-certs
      Subjects:
        Kind            Name                   Namespace
        ----            ----                   ---------
        ServiceAccount  hubble-generate-certs  kube-system
      
      
      Name:         hubble-ui
      Labels:       app.kubernetes.io/managed-by=Nova
                    kustomize.toolkit.fluxcd.io/name=nova-release-cilium-hubble
                    kustomize.toolkit.fluxcd.io/namespace=nova-gitops
      Annotations:  <none>
      Role:
        Kind:  ClusterRole
        Name:  hubble-ui
      Subjects:
        Kind            Name       Namespace
        ----            ----       ---------
        ServiceAccount  hubble-ui  kube-system
      
      
      Name:         kubeadm:get-nodes
      Labels:       <none>
      Annotations:  <none>
      Role:
        Kind:  ClusterRole
        Name:  kubeadm:get-nodes
      Subjects:
        Kind   Name                                             Namespace
        ----   ----                                             ---------
        Group  system:bootstrappers:kubeadm:default-node-token
      ...

3. Просмотр локальных ролей и их привязок

Вы можете использовать утилиту kubectl для просмотра и оценки локальных ролей и их привязок.

Необходимые условия

  • У вас есть доступ к кластеру с учетной записью, имеющей роль cluster-admin в Kubernetes или доступ к кластеру с учетной записью admin для просмотра ролей и привязок в пространстве имен.

  • Вы установили утилиту kubectl для работы с Kubernetes.

    1. Для просмотра локальных ролей и их правил в пространстве имен, например nova-cert-management, выполните команду:

      kubectl describe roles.rbac -n nova-cert-management

      Пример

      $ kubectl describe roles.rbac -n nova-cert-management
      
      Name:         nova-cert-manager-startupapicheck:create-cert
      Labels:       app=startupapicheck
                    app.kubernetes.io/component=startupapicheck
                    app.kubernetes.io/managed-by=Nova
                    app.kubernetes.io/name=startupapicheck
                    app.kubernetes.io/version=v1.12.3
                    kustomize.toolkit.fluxcd.io/name=nova-release-cert-manager-main
                    kustomize.toolkit.fluxcd.io/namespace=nova-gitops
      Annotations:  <none>
      PolicyRule:
        Resources                     Non-Resource URLs  Resource Names  Verbs
        ---------                     -----------------  --------------  -----
        certificates.cert-manager.io  []                 []              [create]
      
      
      Name:         nova-cert-manager-webhook:dynamic-serving
      Labels:       app=webhook
                    app.kubernetes.io/component=webhook
                    app.kubernetes.io/managed-by=Nova
                    app.kubernetes.io/name=webhook
                    app.kubernetes.io/version=v1.12.3
                    kustomize.toolkit.fluxcd.io/name=nova-release-cert-manager-main
                    kustomize.toolkit.fluxcd.io/namespace=nova-gitops
      Annotations:  <none>
      PolicyRule:
        Resources  Non-Resource URLs  Resource Names                  Verbs
        ---------  -----------------  --------------                  -----
        secrets    []                 []                              [create]
        secrets    []                 [nova-cert-manager-webhook-ca]  [get list watch update]
    2. Для просмотра локальных привязок с пользователями или группами в пространстве имен, например nova-monitoring, выполните команду:

      kubectl describe rolebinding.rbac -n nova-monitoring

      Пример

        $ kubectl describe rolebinding.rbac -n nova-monitoring
      
        Name:         nova-grafana
        Labels:       app.kubernetes.io/managed-by=Nova
                      app.kubernetes.io/name=nova-release-grafana
                      app.kubernetes.io/version=10.0.3
                      kustomize.toolkit.fluxcd.io/name=nova-release-grafana-main
                      kustomize.toolkit.fluxcd.io/namespace=nova-gitops
        Annotations:  <none>
        Role:
          Kind:  Role
          Name:  nova-grafana
        Subjects:
          Kind            Name          Namespace
          ----            ----          ---------
          ServiceAccount  nova-grafana  nova-monitoring
      
      
        Name:         nova-metrics-server-auth-reader
        Labels:       app.kubernetes.io/managed-by=Nova
                      app.kubernetes.io/name=nova-release-metrics-server
                      app.kubernetes.io/version=0.6.4
                      kustomize.toolkit.fluxcd.io/name=nova-release-metrics-server-main
                      kustomize.toolkit.fluxcd.io/namespace=nova-gitops
        Annotations:  <none>
        Role:
          Kind:  Role
          Name:  extension-apiserver-authentication-reader
        Subjects:
          Kind            Name                 Namespace
          ----            ----                 ---------
          ServiceAccount  nova-metrics-server  nova-monitoring

4. Добавление ролей пользователям и группам

Вы можете использовать утилиту kubectl для управления ролями и их привязками или веб-интерфейс Nova Console.

Web UI

Необходимые условия

  • У вас есть доступ к кластеру с учетной записью, имеющей роль cluster-admin в Kubernetes или доступ к кластеру с учетной записью admin для управления ролями и привязками в пространстве имен.

    • Откройте в веб-браузере Nova Console.

    • Перейдите в раздел RBAC Management, далее RoleBindings.

    • Нажмите Create binding.

    • В поле Binding type выберете тип создаваемой привязки: кластерная или локальная.

    • В поле Name укажите имя привязки.

    • В поле Namespace укажите имя пространства имен.

    • В поле Role name укажите имя привязываемой роли.

    • В поле Subject укажите тип субъекта, например, группу пользователей.

    • Нажмите Create для создания привязки роли.

Настройка привязки роли для группы пользователей
  • Перейдите на вкладку YAML для просмотра YAML-манифеста созданной привязки.

Просмотр привязки роли для группы пользователей
CLI

Необходимые условия

  • У вас есть доступ к кластеру с учетной записью, имеющей роль cluster-admin в Kubernetes или доступ к кластеру с учетной записью admin для управления ролями и привязками в пространстве имен.

  • Вы установили утилиту kubectl для работы с Kubernetes.

Вы можете добавить роль группе пользователей в определенном пространстве имен с помощью команды:

$ kubectl create rolebinding <Имя привязки> --clusterrole=<Имя кластерной роли> \
    --group=<Имя группы пользователей> -n <Имя пространства имен>

Пример

$ kubectl create rolebinding external-project-one-admins \
    --clusterrole=admin --group=project-one-admins -n project-one

Для того, чтобы предварительно ознакомиться с конфигурацией привязки или получить ее в формате YAML-манифеста, вы можете добавить ключи --dry-run=client и -o=yaml.

Пример

$ kubectl create rolebinding external-project-one-admins \
    --clusterrole=admin --group=project-one-admins -n project-one \
    --dry-run=client -o yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  creationTimestamp: null
  name: external-project-one-admins
  namespace: project-one
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: project-one-admins

5. Создание ролей

Вы можете использовать утилиту kubectl для управления ролями и их привязками или веб-интерфейс Nova Console.

Web UI

Необходимые условия

  • У вас есть доступ к кластеру с учетной записью, имеющей роль cluster-admin в Kubernetes или доступ к кластеру с учетной записью admin для управления ролями и привязками в пространстве имен.

    • Откройте в веб-браузере Nova Console.

    • Перейдите в раздел RBAC Management, далее Roles.

    • Нажмите Create role. В открывшемся окне вы можете описать конфигурацию локальной или кластерной роли.

Подсказка

Справа в колонке "Schema" предоставлено описание всех доступных опций для конфигурации роли.
В колонке "Samples" вы можете ознакомиться с примерами ролей и использовать их как шаблоны, нажав кнопку "Try it".
  • Нажмите Create для создания новой роли.

Создание новой роли в Nova Console
CLI

Необходимые условия

  • У вас есть доступ к кластеру с учетной записью, имеющей роль cluster-admin в Kubernetes или доступ к кластеру с учетной записью admin для управления ролями и привязками в пространстве имен.

  • Вы установили утилиту kubectl для работы с Kubernetes.

Вы можете создать роль в определенном пространстве имен с помощью команды:

$ kubectl create role <Имя роли> --verb=<Метод> --resource==<Имя ресурса> \
    -n <Имя пространства имен>

В данной команде укажите:

  • <Имя роли> - имя роли, которое в дальнейшем будет использоваться в конфигурации привязки данной роли.

  • <Метод> - перечень методов (операций), которые будут разрешены для ресурсов в данной роли.

  • <Имя ресурса> - перечень ресурсов, для которых используется роль.

  • <Имя пространства имен> - имя пространства имен, в котором будет создана роль.

Пример

$ kubectl create role podview --verb=get --resource=pod -n project-one

role.rbac.authorization.k8s.io/podview created

В данном примере создается роль podview, которая разрешает выполнять операции Get для ресурсов Pod.

Для создания кластерной роли вы можете использовать команду:

$ kubectl create clusterrole <Имя роли> --verb=<Метод> --resource==<Имя ресурса>

Пример

$ kubectl create clusterrole podview --verb=get --resource=pod

clusterrole.rbac.authorization.k8s.io/podview created