Как создать пользователя?
Как ограничить права пользователю конкретными пространствами имён?
Чтобы ограничить права пользователя конкретными пространствами имён в экспериментальной ролевой модели, используйте в RoleBinding
use-роль с соответствующим уровнем доступа. Пример….
В текущей ролевой модули используйте параметры namespaceSelector
или limitNamespaces
(устарел) в кастомном ресурсе ClusterAuthorizationRule
.
Что, если два ClusterAuthorizationRules подходят для одного пользователя?
В примере пользователь jane.doe@example.com
состоит в группе administrators
. Созданы два ClusterAuthorizationRules:
1apiVersion: deckhouse.io/v1
2kind: ClusterAuthorizationRule
3metadata:
4 name: jane
5spec:
6 subjects:
7 - kind: User
8 name: jane.doe@example.com
9 accessLevel: User
10 namespaceSelector:
11 labelSelector:
12 matchLabels:
13 env: review
14---
15apiVersion: deckhouse.io/v1
16kind: ClusterAuthorizationRule
17metadata:
18 name: admin
19spec:
20 subjects:
21 - kind: Group
22 name: administrators
23 accessLevel: ClusterAdmin
24 namespaceSelector:
25 labelSelector:
26 matchExpressions:
27 - key: env
28 operator: In
29 values:
30 - prod
31 - stage
jane.doe@example.com
имеет право запрашивать и просматривать объекты среди всех пространств имён, помеченныхenv=review
.Administrators
могут запрашивать, редактировать, получать и удалять объекты на уровне кластера и из пространств имён, помеченныхenv=prod
иenv=stage
.
Так как для Jane Doe
подходят два правила, необходимо провести вычисления:
Jane Doe
будет иметь самый сильный accessLevel среди всех подходящих правил —ClusterAdmin
.- Опции
namespaceSelector
будут объединены так, чтоJane Doe
будет иметь доступ в пространства имён, помеченные меткойenv
со значениемreview
,stage
илиprod
.
Если есть правило без опции namespaceSelector
и без опции limitNamespaces
(устаревшая), это значит, что доступ разрешён во все пространства имён, кроме системных, что повлияет на результат вычисления доступных пространств имён для пользователя.
Как расширить роли или создать новую?
Экспериментальная ролевая модель построена на принципе агрегации, она собирает более мелкие роли в более обширные, тем самым предоставляя лёгкие способы расширения модели собственными ролями.
Создание новой роли подсистемы
Предположим, что текущие подсистемы не подходят под ролевое распределение в компании и требуется создать новую подсистему,
которая будет включать в себя роли из подсистемы deckhouse
, подсистемы kubernetes
и модуля user-authn.
Для решения этой задачи создайте следующую роль:
1apiVersion: rbac.authorization.k8s.io/v1
2kind: ClusterRole
3metadata:
4 name: custom:manage:mycustom:manager
5 labels:
6 rbac.deckhouse.io/use-role: admin
7 rbac.deckhouse.io/kind: manage
8 rbac.deckhouse.io/level: subsystem
9 rbac.deckhouse.io/subsystem: custom
10 rbac.deckhouse.io/aggregate-to-all-as: manager
11aggregationRule:
12 clusterRoleSelectors:
13 - matchLabels:
14 rbac.deckhouse.io/kind: manage
15 rbac.deckhouse.io/aggregate-to-deckhouse-as: manager
16 - matchLabels:
17 rbac.deckhouse.io/kind: manage
18 rbac.deckhouse.io/aggregate-to-kubernetes-as: manager
19 - matchLabels:
20 rbac.deckhouse.io/kind: manage
21 module: user-authn
22rules: []
В начале указаны лейблы для новой роли:
-
показывает, какую роль хук должен использовать при создании use ролей:
1rbac.deckhouse.io/use-role: admin
-
показывает, что роль должна обрабатываться как manage-роль:
1rbac.deckhouse.io/kind: manage
Этот лейбл обязателен.
-
показывает, что роль является ролью подсистемы, и обрабатываться будет соответственно:
1rbac.deckhouse.io/level: subsystem
-
указывает подсистему, за которую отвечает роль:
1rbac.deckhouse.io/subsystem: custom
-
позволяет
manage:all
-роли агрегировать эту роль в себя:1rbac.deckhouse.io/aggregate-to-all-as: manager
Далее указаны селекторы, именно они реализуют агрегацию:
-
агрегирует роль менеджера из подсистемы
deckhouse
:1rbac.deckhouse.io/kind: manage 2rbac.deckhouse.io/aggregate-to-deckhouse-as: manager
-
агрегирует все правила от модуля user-authn:
1 rbac.deckhouse.io/kind: manage 2 module: user-authn
Таким образом роль получает права от подсистем deckhouse
, kubernetes
и от модуля user-authn.
Особенности:
- ограничений на имя роли нет, но для читаемости лучше использовать этот стиль;
- use-роли будут созданы в пространстве имён агрегированных подсистем и модуля, тип роли выбран лейблом.
Расширение пользовательской роли
Например, в кластере появился новый кластерный (пример для manage-роли) CRD-объект — MySuperResource, и нужно дополнить собственную роль из примера выше правами на взаимодействие с этим ресурсом.
Первым делом нужно дополнить роль новым селектором:
1rbac.deckhouse.io/kind: manage
2rbac.deckhouse.io/aggregate-to-custom-as: manager
Этот селектор позволит агрегировать роли к новой подсистеме через указание этого лейбла. После добавления нового селектора роль будет выглядеть так:
1 apiVersion: rbac.authorization.k8s.io/v1
2 kind: ClusterRole
3 metadata:
4 name: custom:manage:mycustom:manager
5 labels:
6 rbac.deckhouse.io/use-role: admin
7 rbac.deckhouse.io/kind: manage
8 rbac.deckhouse.io/level: subsystem
9 rbac.deckhouse.io/subsystem: custom
10 rbac.deckhouse.io/aggregate-to-all-as: manager
11 aggregationRule:
12 clusterRoleSelectors:
13 - matchLabels:
14 rbac.deckhouse.io/kind: manage
15 rbac.deckhouse.io/aggregate-to-deckhouse-as: manager
16 - matchLabels:
17 rbac.deckhouse.io/kind: manage
18 rbac.deckhouse.io/aggregate-to-kubernetes-as: manager
19 - matchLabels:
20 rbac.deckhouse.io/kind: manage
21 module: user-authn
22 - matchLabels:
23 rbac.deckhouse.io/kind: manage
24 rbac.deckhouse.io/aggregate-to-custom-as: manager
25 rules: []
Далее нужно создать новую роль, в которой следует определить права для нового ресурса. Например, только чтение:
1 apiVersion: rbac.authorization.k8s.io/v1
2 kind: ClusterRole
3 metadata:
4 labels:
5 rbac.deckhouse.io/aggregate-to-custom-as: manager
6 rbac.deckhouse.io/kind: manage
7 name: custom:manage:permission:mycustom:superresource:view
8 rules:
9 - apiGroups:
10 - mygroup.io
11 resources:
12 - mysuperresources
13 verbs:
14 - get
15 - list
16 - watch
Роль дополнит своими правами роль подсистемы, дав права на просмотр нового объекта.
Особенности:
- ограничений на имя роли нет, но для читаемости лучше использовать этот стиль.
Расширение существующих manage subsystem-ролей
Если необходимо расширить существующую роль, нужно выполнить те же шаги, что и в пункте выше, но изменив лейблы и название роли.
Пример для расширения роли менеджера из подсистемы deckhouse
(d8:manage:deckhouse:manager
):
1apiVersion: rbac.authorization.k8s.io/v1
2kind: ClusterRole
3metadata:
4 labels:
5 rbac.deckhouse.io/aggregate-to-deckhouse-as: manager
6 rbac.deckhouse.io/kind: manage
7 name: custom:manage:permission:mycustommodule:superresource:view
8rules:
9- apiGroups:
10 - mygroup.io
11 resources:
12 - mysuperresources
13 verbs:
14 - get
15 - list
16 - watch
Таким образом новая роль расширит роль d8:manage:deckhouse
.
Расширение manage subsystem-ролей с добавлением нового пространства имён
Если необходимо добавить новое пространство имён (для создания в нём use-роли с помощью хука), потребуется добавить лишь один лейбл:
1"rbac.deckhouse.io/namespace": namespace
Этот лейбл сообщает хуку, что в этом пространстве имён нужно создать use-роль:
1 apiVersion: rbac.authorization.k8s.io/v1
2 kind: ClusterRole
3 metadata:
4 labels:
5 rbac.deckhouse.io/aggregate-to-deckhouse-as: manager
6 rbac.deckhouse.io/kind: manage
7 rbac.deckhouse.io/namespace: namespace
8 name: custom:manage:permission:mycustom:superresource:view
9 rules:
10 - apiGroups:
11 - mygroup.io
12 resources:
13 - mysuperresources
14 verbs:
15 - get
16 - list
17 - watch
Хук мониторит ClusterRoleBinding
и при создании биндинга ходит по всем manage-ролям, чтобы найти все объединенные в них роли с помощью проверки правила агрегации. Затем он берёт пространство имён из лейбла rbac.deckhouse.io/namespace
и создает use-роль в этом пространстве имён.
Расширение существующих use-ролей
Если ресурс принадлежит пространству имён, необходимо расширить use-роль вместо manage-роли. Разница лишь в лейблах и имени:
1 apiVersion: rbac.authorization.k8s.io/v1
2 kind: ClusterRole
3 metadata:
4 labels:
5 rbac.deckhouse.io/aggregate-to-kubernetes-as: user
6 rbac.deckhouse.io/kind: use
7 name: custom:use:capability:mycustom:superresource:view
8 rules:
9 - apiGroups:
10 - mygroup.io
11 resources:
12 - mysuperresources
13 verbs:
14 - get
15 - list
16 - watch
Эта роль дополнит роль d8:use:role:user:kubernetes
.