Использование 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. При необходимости вы можете продублировать базовую кластерную роль и внести в нее изменения. |
Кластерная роль | Описание |
---|---|
|
Роль, определяющая права супер-пользователя. Данный пользователь может выполнить любое действие с любым объектом в кластере, если роль привязана с помощью ClusterRoleBinding. Если роль привязана с помощью RoleBinding, то пользователь сможет управлять всеми ресурсами пространства имен, в том числе квотами. |
|
Роль администратора пространства имен. Пользователь может управлять всеми ресурсами пространства имен кроме квот. |
|
Роль пользователя в пространстве имен, позволяющая выполнять операции с большинством объектов в пространстве имен за исключением ролей и их привязок. |
|
Роль пользователя, который не может производить какие-либо изменения в Kubernetes, но может просматривать большинство объектов кроме ролей, их привязок, некоторых CR и секретов. |
2. Просмотр кластерных ролей и их привязок
Вы можете использовать утилиту kubectl
для просмотра и оценки кластерных ролей и их привязок.
Необходимые условия
-
У вас есть доступ к кластеру с учетной записью, имеющей роль
cluster-admin
в Kubernetes. -
Вы установили утилиту
kubectl
для работы с Kubernetes.
Процедура
-
Для просмотра кластерных ролей и их правил выполните команду:
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 [] [] ...
-
Для просмотра кластерных привязок с пользователями или группами, выполните команду:
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.
Процедура
-
Для просмотра локальных ролей и их правил в пространстве имен, например
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]
-
Для просмотра локальных привязок с пользователями или группами в пространстве имен, например
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
Необходимые условия
-
У вас есть доступ к кластеру с учетной записью, имеющей роль
в Kubernetes или доступ к кластеру с учетной записьюcluster-admin
для управления ролями и привязками в пространстве имен.admin
Процедура
-
Откройте в веб-браузере Nova Console.
-
Перейдите в раздел RBAC Management, далее RoleBindings.
-
Нажмите Create binding.
-
В поле Binding type выберете тип создаваемой привязки: кластерная или локальная.
-
В поле Name укажите имя привязки.
-
В поле Namespace укажите имя пространства имен.
-
В поле Role name укажите имя привязываемой роли.
-
В поле Subject укажите тип субъекта, например, группу пользователей.
-
Нажмите Create для создания привязки роли.
-
Перейдите на вкладку YAML для просмотра YAML-манифеста созданной привязки.
CLI
Необходимые условия
-
У вас есть доступ к кластеру с учетной записью, имеющей роль
в Kubernetes или доступ к кластеру с учетной записьюcluster-admin
для управления ролями и привязками в пространстве имен.admin
-
Вы установили утилиту
для работы с Kubernetes.kubectl
Процедура
Вы можете добавить роль группе пользователей в определенном пространстве имен с помощью команды:
$ 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
Необходимые условия
-
У вас есть доступ к кластеру с учетной записью, имеющей роль
в Kubernetes или доступ к кластеру с учетной записьюcluster-admin
для управления ролями и привязками в пространстве имен.admin
Процедура
-
Откройте в веб-браузере Nova Console.
-
Перейдите в раздел RBAC Management, далее Roles.
-
Нажмите Create role. В открывшемся окне вы можете описать конфигурацию локальной или кластерной роли.
Подсказка Справа в колонке "Schema" предоставлено описание всех доступных опций для конфигурации роли. В колонке "Samples" вы можете ознакомиться с примерами ролей и использовать их как шаблоны, нажав кнопку "Try it".
-
Нажмите Create для создания новой роли.
CLI
Необходимые условия
-
У вас есть доступ к кластеру с учетной записью, имеющей роль
в Kubernetes или доступ к кластеру с учетной записьюcluster-admin
для управления ролями и привязками в пространстве имен.admin
-
Вы установили утилиту
для работы с Kubernetes.kubectl
Процедура
Вы можете создать роль в определенном пространстве имен с помощью команды:
$ 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