Модуль отвечает за генерацию RBAC для пользователей и реализует простейший режим multi-tenancy с разграничением доступа по namespace.
Реализует role-based-подсистему сквозной авторизации, расширяя функционал стандартного механизма RBAC.
Вся настройка прав доступа происходит с помощью custom resources.
Возможности модуля
- Управление доступом пользователей и групп на базе механизма RBAC Kubernetes.
- Управление доступом к инструментам масштабирования (параметр
allowScale
ресурсаClusterAuthorizationRule
или AuthorizationRule). - Управление доступом к форвардингу портов (параметр
portForwarding
ресурсаClusterAuthorizationRule
или AuthorizationRule). - Управление списком разрешенных namespace в формате labelSelector (параметр
namespaceSelector
custom resourceClusterAuthorizationRule
).
Ролевая модель
В модуле, кроме прямого использования RBAC, можно использовать удобный набор высокоуровневых ролей:
User
— позволяет получать информацию обо всех объектах (включая доступ к журналам подов), но не позволяет заходить в контейнеры, читать Secret’ы и выполнять port-forward;PrivilegedUser
— то же самое, что иUser
, но позволяет заходить в контейнеры, читать Secret’ы, а также удалять поды (что обеспечивает возможность перезагрузки);Editor
— то же самое, что иPrivilegedUser
, но предоставляет возможность создавать, изменять и удалять все объекты, которые обычно нужны для прикладных задач;Admin
— то же самое, что иEditor
, но позволяет удалять служебные объекты (производные ресурсы, напримерReplicaSet
,certmanager.k8s.io/challenges
иcertmanager.k8s.io/orders
);ClusterEditor
— то же самое, что иEditor
, но позволяет управлять ограниченным наборомcluster-wide
-объектов, которые могут понадобиться для прикладных задач (ClusterXXXMetric
,KeepalivedInstance
,DaemonSet
и т. д). Роль для работы оператора кластера;ClusterAdmin
— то же самое, что иClusterEditor
+Admin
, но позволяет управлять служебнымиcluster-wide
-объектами (производные ресурсы, напримерMachineSets
,Machines
,OpenstackInstanceClasses
и т. п., а такжеClusterAuthorizationRule
,ClusterRoleBindings
иClusterRole
). Роль для работы администратора кластера. Важно, чтоClusterAdmin
, поскольку он уполномочен редактироватьClusterRoleBindings
, может сам себе расширить полномочия;SuperAdmin
— разрешены любые действия с любыми объектами, при этом ограниченияnamespaceSelector
иlimitNamespaces
продолжат работать.
Особенности реализации
Важно! Режим multi-tenancy (авторизация по namespace) в данный момент реализован по временной схеме и не гарантирует безопасность!
В случае, если в ClusterAuthorizationRule
-ресурсе используется namespaceSelector
, limitNamespaces
и allowAccessToSystemNamespace
параметры не учитываются.
Если webhook, который реализовывает систему авторизации, по какой-то причине будет недоступен, в это время опции allowAccessToSystemNamespaces
, namespaceSelector
и limitNamespaces
в custom resource перестанут применяться и пользователи будут иметь доступ во все namespace. После восстановления доступности webhook’а опции продолжат работать.
Список доступа для каждой роли модуля по умолчанию
Сокращения для verbs
:
- read -
get
,list
,watch
- read-write -
get
,list
,watch
,create
,delete
,deletecollection
,patch
,update
- write -
create
,delete
,deletecollection
,patch
,update
Роль User
:
1read:
2 - apiextensions.k8s.io/customresourcedefinitions
3 - apps/daemonsets
4 - apps/deployments
5 - apps/replicasets
6 - apps/statefulsets
7 - autoscaling.k8s.io/verticalpodautoscalers
8 - autoscaling/horizontalpodautoscalers
9 - batch/cronjobs
10 - batch/jobs
11 - configmaps
12 - discovery.k8s.io/endpointslices
13 - endpoints
14 - events
15 - events.k8s.io/events
16 - extensions/daemonsets
17 - extensions/deployments
18 - extensions/ingresses
19 - extensions/replicasets
20 - extensions/replicationcontrollers
21 - limitranges
22 - metrics.k8s.io/nodes
23 - metrics.k8s.io/pods
24 - namespaces
25 - networking.k8s.io/ingresses
26 - networking.k8s.io/networkpolicies
27 - nodes
28 - persistentvolumeclaims
29 - persistentvolumes
30 - pods
31 - pods/log
32 - policy/poddisruptionbudgets
33 - rbac.authorization.k8s.io/rolebindings
34 - rbac.authorization.k8s.io/roles
35 - replicationcontrollers
36 - resourcequotas
37 - serviceaccounts
38 - services
39 - storage.k8s.io/storageclasses
Роль PrivilegedUser
(включает все правила из роли User
):
1create:
2 - pods/eviction
3create,get:
4 - pods/attach
5 - pods/exec
6delete,deletecollection:
7 - pods
8read:
9 - secrets
Роль Editor
(включает все правила из роли User
, PrivilegedUser
):
1read-write:
2 - apps/deployments
3 - apps/statefulsets
4 - autoscaling.k8s.io/verticalpodautoscalers
5 - autoscaling/horizontalpodautoscalers
6 - batch/cronjobs
7 - batch/jobs
8 - configmaps
9 - discovery.k8s.io/endpointslices
10 - endpoints
11 - extensions/deployments
12 - extensions/ingresses
13 - networking.k8s.io/ingresses
14 - persistentvolumeclaims
15 - policy/poddisruptionbudgets
16 - serviceaccounts
17 - services
18write:
19 - secrets
Роль Admin
(включает все правила из роли User
, PrivilegedUser
, Editor
):
1create,patch,update:
2 - pods
3delete,deletecollection:
4 - apps/replicasets
5 - extensions/replicasets
Роль ClusterEditor
(включает все правила из роли User
, PrivilegedUser
, Editor
):
1read:
2 - rbac.authorization.k8s.io/clusterrolebindings
3 - rbac.authorization.k8s.io/clusterroles
4write:
5 - apiextensions.k8s.io/customresourcedefinitions
6 - apps/daemonsets
7 - extensions/daemonsets
8 - storage.k8s.io/storageclasses
Роль ClusterAdmin
(включает все правила из роли User
, PrivilegedUser
, Editor
, Admin
, ClusterEditor
):
1read-write:
2 - deckhouse.io/clusterauthorizationrules
3write:
4 - limitranges
5 - namespaces
6 - networking.k8s.io/networkpolicies
7 - rbac.authorization.k8s.io/clusterrolebindings
8 - rbac.authorization.k8s.io/clusterroles
9 - rbac.authorization.k8s.io/rolebindings
10 - rbac.authorization.k8s.io/roles
11 - resourcequotas
Вы можете получить дополнительный список правил доступа для роли модуля из кластера (существующие пользовательские правила и нестандартные правила из других модулей Deckhouse):
1D8_ROLE_NAME=Editor
2kubectl get clusterrole -A -o jsonpath="{range .items[?(@.metadata.annotations.user-authz\.deckhouse\.io/access-level=='$D8_ROLE_NAME')]}{.rules}{'\n'}{end}" | jq -s add