Использование 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