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