Модуль отвечает за генерацию 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:

read:
    - apiextensions.k8s.io/customresourcedefinitions
    - apps/daemonsets
    - apps/deployments
    - apps/replicasets
    - apps/statefulsets
    - autoscaling.k8s.io/verticalpodautoscalers
    - autoscaling/horizontalpodautoscalers
    - batch/cronjobs
    - batch/jobs
    - configmaps
    - discovery.k8s.io/endpointslices
    - endpoints
    - events
    - events.k8s.io/events
    - extensions/daemonsets
    - extensions/deployments
    - extensions/ingresses
    - extensions/replicasets
    - extensions/replicationcontrollers
    - limitranges
    - metrics.k8s.io/nodes
    - metrics.k8s.io/pods
    - namespaces
    - networking.k8s.io/ingresses
    - networking.k8s.io/networkpolicies
    - nodes
    - persistentvolumeclaims
    - persistentvolumes
    - pods
    - pods/log
    - policy/poddisruptionbudgets
    - rbac.authorization.k8s.io/rolebindings
    - rbac.authorization.k8s.io/roles
    - replicationcontrollers
    - resourcequotas
    - serviceaccounts
    - services
    - storage.k8s.io/storageclasses

Роль PrivilegedUser (включает все правила из роли User):

create:
    - pods/eviction
create,get:
    - pods/attach
    - pods/exec
delete,deletecollection:
    - pods
read:
    - secrets

Роль Editor (включает все правила из роли User, PrivilegedUser):

read-write:
    - apps/deployments
    - apps/statefulsets
    - autoscaling.k8s.io/verticalpodautoscalers
    - autoscaling/horizontalpodautoscalers
    - batch/cronjobs
    - batch/jobs
    - configmaps
    - discovery.k8s.io/endpointslices
    - endpoints
    - extensions/deployments
    - extensions/ingresses
    - networking.k8s.io/ingresses
    - persistentvolumeclaims
    - policy/poddisruptionbudgets
    - serviceaccounts
    - services
write:
    - secrets

Роль Admin (включает все правила из роли User, PrivilegedUser, Editor):

create,patch,update:
    - pods
delete,deletecollection:
    - apps/replicasets
    - extensions/replicasets

Роль ClusterEditor (включает все правила из роли User, PrivilegedUser, Editor):

read:
    - rbac.authorization.k8s.io/clusterrolebindings
    - rbac.authorization.k8s.io/clusterroles
write:
    - apiextensions.k8s.io/customresourcedefinitions
    - apps/daemonsets
    - extensions/daemonsets
    - storage.k8s.io/storageclasses

Роль ClusterAdmin (включает все правила из роли User, PrivilegedUser, Editor, Admin, ClusterEditor):

read-write:
    - deckhouse.io/clusterauthorizationrules
write:
    - limitranges
    - namespaces
    - networking.k8s.io/networkpolicies
    - rbac.authorization.k8s.io/clusterrolebindings
    - rbac.authorization.k8s.io/clusterroles
    - rbac.authorization.k8s.io/rolebindings
    - rbac.authorization.k8s.io/roles
    - resourcequotas

Вы можете получить дополнительный список правил доступа для роли модуля из кластера (существующие пользовательские правила и нестандартные правила из других модулей Deckhouse):

D8_ROLE_NAME=Editor
kubectl get clusterrole -A -o jsonpath="{range .items[?(@.metadata.annotations.user-authz\.deckhouse\.io/access-level=='$D8_ROLE_NAME')]}{.rules}{'\n'}{end}" | jq -s add