Модуль отвечает за генерацию RBAC для пользователей и реализует простейший режим multi-tenancy с разграничением доступа по namespace.

Реализует role-based-подсистему сквозной авторизации, расширяя функционал стандартного механизма RBAC.

Вся настройка прав доступа происходит с помощью custom resources.

Возможности модуля

  • Управление доступом пользователей и групп на базе механизма RBAC Kubernetes.
  • Управление доступом к инструментам масштабирования (параметр allowScale ресурса ClusterAuthorizationRule или AuthorizationRule).
  • Управление доступом к форвардингу портов (параметр portForwarding ресурса ClusterAuthorizationRule или AuthorizationRule).
  • Управление списком разрешенных namespace в формате labelSelector (параметр namespaceSelector custom resource ClusterAuthorizationRule).

Ролевая модель

В модуле, кроме прямого использования 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