Управление доступом#
Описание#
В данном разделе описан стандартный процесс управления доступом к кластеру DropApp на основе существующего каталога пользователей (LDAP/Active Directory).
В качестве механизма авторизации используется RBAC Kubernetes - создание ролей и кластерных ролей (Role/ClusterRole), определяющих допустимые действия над ресурсами кластера, и привязка этих ролей привязываются к группам и/или отдельным пользователям через объекты RoleBinding и ClusterRoleBinding. Группы и учетные записи берутся из корпоративного каталога, что позволяет использовать единый источник прав и идентичностей для всех систем, включая Kubernetes.
Ниже описаны типовые шаги:
выбор уровня доступа (пространство имен или весь кластер);
проектирование набора разрешений;
создание ролей;
создание привязок к группам AD/LDA;
проверка корректности работы (тестовый логин, попытка выполнения разрешенных и запрещенных операций).
Также приведены рекомендации по именованию ролей и привязок, принципам разделения обязанностей и минимально необходимым правам, чтобы обеспечить единообразный подход к управлению доступом во всех командах.
Контекст использования#
Основная цель — обеспечить безопасное, предсказуемое и управляемое распределение прав в кластере DropApp за счет использования централизованного каталога пользователей. Вместо ручной выдачи прав на уровне отдельных учетных записей в кластере используются существующие группы и организационные структуры в LDAP/Active Directory. Это снижает риск ошибок, исключает дублирование учетных записей и упрощает отзыв доступа при увольнении или смене роли сотрудника: достаточно обновить членство в группах в одном месте.
Также целью являются прозрачность и контроль. Формализованный процесс создания ролей и привязки их к группам позволяет документировать, кто и почему имеет тот или иной доступ, а также воспроизводить настройки в других кластерах (dev/stage/prod) через единый подход и инфраструктуру как код (Helm, Kustomize, GitOps и т.п.). В результате, команды разработки получают понятную модель прав, а служба безопасности — контролируемый и проверяемый механизм управления доступом.
Предварительные условия (пример групп пользователей)#
Перед настройкой ролей и привязок (RBAC) необходимо выполнить следующие условия:
развернут кластер DropApp;
созданы выделенные под команды пространства имен:
team-a;team-b;team-c.
настроена интеграция аутентификации Dex с корпоративным каталогом (LDAP или Active Directory).
Важно
При аутентификации пользователь получает токен, в котором есть информация о его группах из каталога. DropApp использует эти группы для принятия решений в RBAC.
определены группы пользователей;
заведена учетная запись с правами
cluster-admin.
Группы пользователей#
В каталоге определены группы, отражающие роль сотрудника и его принадлежность к команде, например:
Администраторы команд:
team-a-admins;team-b-admins;team-c-admins.
Разработчики:
team-a-developers;team-b-developers;team-c-developers.
Тестировщики:
team-a-testers;team-b-testers;team-c-testers.
Пользователи включены в соответствующие группы в каталоге (например, разработчик команды A состоит в team-a-developers).
Права cluster-admin#
Предварительным условием является созданная учетная запись с правами cluster-admin (или эквивалентными), от имени которой будут создаваться объекты:
ClusterRole;RoleBindingв пространствах имен команд.
Добавление ролей#
В данном разделе описан пример настройки ролей и привязок:
Администраторы команд — администраторы пространств имен (через
RoleBindingна стандартнуюClusterRoleadmin).Тестировщики - имеют доступ только на чтение в рамках пространства имен (через
ClusterRoleview).Разработчики - имеют доступ к управлению рабочими нагрузками и конфигурацией в рамках пространства имен, но не являются администраторами (через пользовательскую
ClusterRoleteam-developer).
Привязка просмотра проектов и пространств имен#
Настройте каждому пользователю роль на просмотр проектов и пространств имен на уровне кластера. Пользователь сможет просматривать только те пространства имен, к которым у него есть доступ. В кластере DropApp есть роли projects-viewer и namespace-list:
project-namespace-viewer-crb
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: projects-viewer-crb
subjects:
- kind: Group
name: team-a-admins
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-b-admins
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-c-admins
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-a-developers
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-b-developers
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-c-developers
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-a-testers
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-b-testers
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-c-testers
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: projects-viewer
apiGroup: rbac.authorization.k8s.io
---
# RoleBinding (не ClusterRoleBinding!) для просмотра пространств имен team-a
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: team-a-ns-viewer
namespace: team-a
subjects:
- kind: Group
name: team-a-admins
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-a-developers
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-a-testers
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: namespace-list
apiGroup: rbac.authorization.k8s.io
---
# RoleBinding (не ClusterRoleBinding!) для просмотра пространств имен team-b
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: team-b-ns-viewer
namespace: team-b
subjects:
- kind: Group
name: team-b-admins
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-b-developers
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-b-testers
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: namespace-list
apiGroup: rbac.authorization.k8s.io
---
# RoleBinding (не ClusterRoleBinding!) для просмотра пространств имен team-c
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: team-a-ns-viewer
namespace: team-c
subjects:
- kind: Group
name: team-c-admins
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-c-developers
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: team-c-testers
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: namespace-list
apiGroup: rbac.authorization.k8s.io
Создание кластерной роли для разработчиков#
Для создания общей кластерной роли team-developer, которая будет применяться ко всем командам через RoleBinding выполните шаги:
Создайте файл настроек:
rbac-clusterrole-team-developer.yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: team-developer rules: - apiGroups: ["apps"] resources: - deployments - statefulsets - daemonsets - replicasets verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - apiGroups: ["batch"] resources: - jobs - cronjobs verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # Базовые ресурсы и конфигурация - apiGroups: [""] resources: - pods - pods/log - services - configmaps - secrets - endpoints - persistentvolumeclaims verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # Диагностика - apiGroups: [""] resources: - events verbs: ["get", "list", "watch"] # Только чтение serviceaccounts (чтобы не выдавать себе повышенные права) - apiGroups: [""] resources: - serviceaccounts verbs: ["get", "list", "watch"]Примените настройку от имени пользователя с правами
cluster-admin:kubectl apply -f rbac-clusterrole-team-developer.yaml
Назначение администраторов пространств имен#
Администраторы команд должны иметь полный контроль в пределах своего пространства имен, но не быть cluster-admin:
Используя стандартную
ClusterRoleadminсоздайтеRoleBindingдля каждого пространства имен:Пример для
team-a:rbac-team-a-admins-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ns-admins namespace: team-a roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: admin subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: team-a-adminsПример для
team-b:rbac-team-b-admins-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ns-admins namespace: team-b roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: admin subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: team-b-admins ---Пример для
team-c:rbac-team-c-admins-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ns-admins namespace: team-c roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: admin subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: team-c-adminsПримените настройки:
kubectl apply -f rbac-team-a-admins-rolebinding.yamlkubectl apply -f rbac-team-b-admins-rolebinding.yamlkubectl apply -f rbac-team-c-admins-rolebinding.yaml
Назначение прав view для тестировщиков#
Тестировщики должны иметь доступ только на чтение в рамках пространства имен. Для этого используйте стандартную ClusterRole view:
Создайте единый файл конфигурации
RoleBindingдля трех пространств имен:rbac-testers-rolebindings.yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ns-testers-view namespace: team-a roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: view subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: team-a-testers --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ns-testers-view namespace: team-b roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: view subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: team-b-testers --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ns-testers-view namespace: team-c roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: view subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: team-c-testersПримените конфигурацию:
kubectl apply -f rbac-testers-rolebindings.yaml
Назначение прав team-developer для разработчиков#
Разработчики должны иметь права на работу с рабочими нагрузками и конфигурацией, но без административных возможностей и без прав изменять RBAC или настройки на уровне пространства имен:
Создайте
RoleBindingв каждом пространстве имен, привязывающий кластерную рольteam-developerк группе разработчиков команды:rbac-developers-rolebindings.yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ns-developers namespace: team-a roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: team-developer subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: team-a-developers --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ns-developers namespace: team-b roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: team-developer subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: team-b-developers --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ns-developers namespace: team-c roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: team-developer subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: team-c-developersПримените конфигурацию:
kubectl apply -f rbac-developers-rolebindings.yaml
Заключение#
Использование стандартных ролей (admin, view) в сочетании с пользовательской кластерной ролью team-developer позволяет обеспечить понятную ролевую модель:
администраторы управляют пространством имен;
разработчики управляют рабочими нагрузками и конфигурацией;
тестировщики наблюдают за состоянием системы.
Такой подход легко масштабируется на новые команды и окружения (dev/stage/prod), подходит для реализации через компонент GitOps и упрощает аудит: все права заданы декларативно, прозрачно и воспроизводимо.
При необходимости модель можно расширять — добавлять новые роли, уточнять набор разрешений, вводить дополнительные группы — не меняя общую архитектуру решения.