Как создать пользователя?
Как ограничить права пользователю конкретными пространствами имён?
Чтобы ограничить права пользователя конкретными пространствами имён, используйте в RoleBinding
use-роль с соответствующим уровнем доступа. Пример…
Как ограничить права пользователю конкретными пространствами имён (устаревшая ролевая модель)
Используется устаревшая ролевая модель.
Использовать параметры namespaceSelector
или limitNamespaces
(устарел) в кастомном ресурсе ClusterAuthorizationRule
.
Что, если два ClusterAuthorizationRules подходят для одного пользователя?
Представьте, что пользователь jane.doe@example.com
состоит в группе administrators
. Созданы два ClusterAuthorizationRules:
apiVersion: deckhouse.io/v1
kind: ClusterAuthorizationRule
metadata:
name: jane
spec:
subjects:
- kind: User
name: jane.doe@example.com
accessLevel: User
namespaceSelector:
labelSelector:
matchLabels:
env: review
---
apiVersion: deckhouse.io/v1
kind: ClusterAuthorizationRule
metadata:
name: admin
spec:
subjects:
- kind: Group
name: administrators
accessLevel: ClusterAdmin
namespaceSelector:
labelSelector:
matchExpressions:
- key: env
operator: In
values:
- prod
- stage
jane.doe@example.com
имеет право запрашивать и просматривать объекты среди всех пространств имён, помеченныхenv=review
.Administrators
могут запрашивать, редактировать, получать и удалять объекты на уровне кластера и из пространств имён, помеченныхenv=prod
иenv=stage
.
Так как для Jane Doe
подходят два правила, необходимо провести вычисления:
- Она будет иметь самый сильный accessLevel среди всех подходящих правил —
ClusterAdmin
. - Опции
namespaceSelector
будут объединены так, чтоJane Doe
будет иметь доступ в пространства имён, помеченные меткойenv
со значениемreview
,stage
илиprod
.
Note! Если есть правило без опции
namespaceSelector
и без опцииlimitNamespaces
(устаревшая), это значит, что доступ разрешён во все пространства имён, кроме системных, что повлияет на результат вычисления доступных пространств имён для пользователя.
Как расширить роли или создать новую?
Новая ролевая модель построена на принципе агрегации, она собирает более мелкие роли в более обширные, тем самым предоставляя лёгкие способы расширения модели собственными ролями.
Создание новой роли области
Предположим, что текущие области не подходят под ролевое распределение в компании и требуется создать новую область,
которая будет включать в себя роли из области deckhouse
, области kubernetes
и модуля user-authn.
Для решения этой задачи создайте следующую роль:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: custom:manage:mycustomscope:manager
labels:
rbac.deckhouse.io/use-role: admin
rbac.deckhouse.io/kind: manage
rbac.deckhouse.io/level: scope
rbac.deckhouse.io/scope: custom
rbac.deckhouse.io/aggregate-to-all-as: manager
aggregationRule:
clusterRoleSelectors:
- matchLabels:
rbac.deckhouse.io/kind: manage
rbac.deckhouse.io/aggregate-to-deckhouse-as: manager
- matchLabels:
rbac.deckhouse.io/kind: manage
rbac.deckhouse.io/aggregate-to-kubernetes-as: manager
- matchLabels:
rbac.deckhouse.io/kind: manage
module: user-authn
rules: []
В начале указаны лейблы для новой роли:
-
показывает, какую роль хук должен использовать при создании use ролей:
rbac.deckhouse.io/use-role: admin
-
показывает, что роль должна обрабатываться как manage-роль:
rbac.deckhouse.io/kind: manage
Этот лейбл должен быть обязательно указан!
-
показывает, что роль является ролью области, и обрабатываться будет соответственно:
rbac.deckhouse.io/level: scope
-
указывает область, за которую отвечает роль:
rbac.deckhouse.io/scope: custom
-
позволяет
manage:all
-роли сагрегировать эту роль:rbac.deckhouse.io/aggregate-to-all-as: manager
Далее указаны селекторы, именно они реализуют агрегацию:
-
агрегирует роль менеджера из области
deckhouse
:rbac.deckhouse.io/kind: manage rbac.deckhouse.io/aggregate-to-deckhouse-as: manager
-
агрерирует все правила от модуля user-authn:
rbac.deckhouse.io/kind: manage module: user-authn
Таким образом роль получает права от областей deckhouse
, kubernetes
и от модуля user-authn.
Особенности:
- ограничений на имя роли нет, но для читаемости лучше использовать этот стиль;
- use-роли будут созданы в пространстве имён агрегированных областях и модуля, тип роли выбран лейблом.
Расширение пользовательской роли
Например, в кластере появился новый кластерный (пример для manage-роли) CRD-объект — MySuperResource, и нужно дополнить собственную роль из примера выше правами на взаимодействие с этим ресурсом.
Первым делом нужно дополнить роль новым селектором:
rbac.deckhouse.io/kind: manage
rbac.deckhouse.io/aggregate-to-custom-as: manager
Этот селектор позволит агрегировать роли к новой области через указание этого лейбла. После добавления нового селектора роль будет выглядеть так:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: custom:manage:mycustomscope:manager
labels:
rbac.deckhouse.io/use-role: admin
rbac.deckhouse.io/kind: manage
rbac.deckhouse.io/level: scope
rbac.deckhouse.io/scope: custom
rbac.deckhouse.io/aggregate-to-all-as: manager
aggregationRule:
clusterRoleSelectors:
- matchLabels:
rbac.deckhouse.io/kind: manage
rbac.deckhouse.io/aggregate-to-deckhouse-as: manager
- matchLabels:
rbac.deckhouse.io/kind: manage
rbac.deckhouse.io/aggregate-to-kubernetes-as: manager
- matchLabels:
rbac.deckhouse.io/kind: manage
module: user-authn
- matchLabels:
rbac.deckhouse.io/kind: manage
rbac.deckhouse.io/aggregate-to-custom-as: manager
rules: []
Далее нужно создать новую роль, в которой следует определить права для нового ресурса. Например, только чтение:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
rbac.deckhouse.io/aggregate-to-custom-as: manager
rbac.deckhouse.io/kind: manage
name: custom:manage:capability:mycustommodule:superresource:view
rules:
- apiGroups:
- mygroup.io
resources:
- mysuperresources
verbs:
- get
- list
- watch
Роль дополнит своими правами роль области, дав права на просмотр нового объекта.
Особенности:
- ограничений на имя роли нет, но для читаемости лучше использовать этот стиль.
Расширение существующих manage scope-ролей
Если необходимо расширить существующую роль, нужно выполнить те же шаги, что и в пункте выше, но изменив лейблы и название роли.
Пример для расширения роли менеджера из области deckhouse
(d8:manage:deckhouse:manager
):
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
rbac.deckhouse.io/aggregate-to-deckhouse-as: manager
rbac.deckhouse.io/kind: manage
name: custom:manage:capability:mycustommodule:superresource:view
rules:
- apiGroups:
- mygroup.io
resources:
- mysuperresources
verbs:
- get
- list
- watch
Таким образом новая роль расширит роль d8:manage:deckhouse
.
Расширение manage scope-ролей с добавлением нового пространства имён
Если необходимо добавить новое пространство имён (для создания в нём use-роли с помощью хука), потребуется добавить лишь один лейбл:
"rbac.deckhouse.io/namespace": namespace
Этот лейбл сообщает хуку, что в этом пространстве имён нужно создать use-роль:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
rbac.deckhouse.io/aggregate-to-deckhouse-as: manager
rbac.deckhouse.io/kind: manage
rbac.deckhouse.io/namespace: namespace
name: custom:manage:capability:mycustommodule:superresource:view
rules:
- apiGroups:
- mygroup.io
resources:
- mysuperresources
verbs:
- get
- list
- watch
Хук мониторит ClusterRoleBinding
и при создании биндинга ходит по всем manage-ролям, чтобы найти все сагрерированные роли с помощью проверки правила агрегации. Затем он берёт пространство имён из лейбла rbac.deckhouse.io/namespace
и создает use-роль в этом пространстве имён.
Расширение существующих use-ролей
Если ресурс принадлежит пространству имён, необходимо расширить use-роль вместо manage-роли. Разница лишь в лейблах и имени:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
rbac.deckhouse.io/aggregate-to-role: user
rbac.deckhouse.io/kind: use
name: custom:use:capability:mycustommodule:superresource:view
rules:
- apiGroups:
- mygroup.io
resources:
- mysuperresources
verbs:
- get
- list
- watch
Эта роль дополнит роль d8:use:role:user
.