Настройка RBAC через ClusterRoleBinding

Автор Itworkroom

В контексте описанной выше интеграции критически важно правильно разграничить доступ к Kubernetes-кластеру. Аутсорсинговая команда не должна иметь полный доступ ко всем неймспейсам — это риск безопасности. Используем ClusterRoleBinding и RoleBinding в связке с ServiceAccount или внешними identity-провайдерами (OIDC).

Сценарий

  • Есть аутсорсинговая DevOps-команда, которая управляет CI/CD, мониторингом и слаботочной инфраструктурой (IoT Hub).
  • Им нужен доступ только к определённым неймспейсам (monitoringiot-hubci-cd) с возможностью просмотра подов, логов, запуска отладки.
  • Доступ к нодам, secrets (кроме их собственных) и критическим компонентам (kube-system) — запрещён.

Решение: ClusterRole + ClusterRoleBinding (для глобальных прав) и RoleBinding (для неймспейс-специфичных)

Создадим ClusterRole с минимальными правами для чтения ресурсов во всём кластере (например, просмотр нод, storage classes — это бывает нужно для понимания топологии, но без права изменять). А затем через RoleBinding дадим более широкие (например, CRUD подов) только в нужных неймспейсах.

Шаг 1. Создаём ServiceAccount для аутсорсера

Хорошей практикой является создание отдельного ServiceAccount для каждой аутсорсинговой команды, а не использование пользовательских аккаунтов (User). Это упрощает аудит.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: outsourcing-devops
  namespace: default
Шаг 2. Создаём ClusterRole с правами только на чтение (безопасный уровень)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: readonly-global
rules:
- apiGroups: [""]
  resources: ["nodes", "persistentvolumes", "storageclasses", "namespaces"]
  verbs: ["get", "list", "watch"]
- apiGroups

Шаг 3. Создаём Role для каждого неймспейса, где нужны расширенные права

В неймспейсах monitoring, iot-hub и ci-cd дадим права на управление подами, деплойментами, сервисами, конфигмапами и секретами (только в этих неймспейсах).

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: devops-manager
  namespace: monitoring
rules:
- apiGroups: ["", "apps", "batch"]
  resources: ["pods", "pods/log", "pods/exec", "deployments", "statefulsets", "daemonsets", "services", "configmaps", "secrets", "jobs", "cronjobs"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["autoscaling"]
  resources: ["horizontalpodautoscalers"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: devops-manager
  namespace: iot-hub
rules:
- apiGroups: ["", "apps", "batch"]
  resources: ["pods", "pods/log", "pods/exec", "deployments", "statefulsets", "daemonsets", "services", "configmaps", "secrets", "jobs", "cronjobs"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: devops-manager
  namespace: ci-cd
rules:
- apiGroups: ["", "apps", "batch"]
  resources: ["pods", "pods/log", "pods/exec", "deployments", "statefulsets", "daemonsets", "services", "configmaps", "secrets", "jobs", "cronjobs"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

Шаг 4. Связываем ServiceAccount с правами через RoleBinding (неймспейс-специфичные)

Теперь привязываем ServiceAccount outsourcing-devops к каждой Role.

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: outsourcing-devops-monitoring
  namespace: monitoring
subjects:
- kind: ServiceAccount
  name: outsourcing-devops
  namespace: default
roleRef:
  kind: Role
  name: devops-manager
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: outsourcing-devops-iot-hub
  namespace: iot-hub
subjects:
- kind: ServiceAccount
  name: outsourcing-devops
  namespace: default
roleRef:
  kind: Role
  name: devops-manager
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: outsourcing-devops-ci-cd
  namespace: ci-cd
subjects:
- kind: ServiceAccount
  name: outsourcing-devops
  namespace: default
roleRef:
  kind: Role
  name: devops-manager
  apiGroup: rbac.authorization.k8s.io

Шаг 5. Связываем ServiceAccount с глобальными правами только на чтение через ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: outsourcing-devops-global-readonly
subjects:
- kind: ServiceAccount
  name: outsourcing-devops
  namespace: default
roleRef:
  kind: ClusterRole
  name: readonly-global
  apiGroup: rbac.authorization.k8s.io

Итоговая модель доступа

Ресурс Доступ
Nodes (ноды) Только чтение (get, list, watch)
PersistentVolumes (PV) Только чтение
StorageClasses Только чтение
Namespaces (все) Только чтение
Pods, Deployments, Services, ConfigMaps, Secrets, Jobs, HPA в неймспейсах monitoringiot-hubci-cd Полный CRUD (create, read, update, delete)
Pods, Deployments, Services, ConfigMaps, Secrets, Jobs, HPA в остальных неймспейсах (например, defaultkube-systemproduction) Нет доступа
RoleBindings, ClusterRoles, ServiceAccounts (RBAC) Нет доступа

Данная конфигурация:

  1. Даёт аутсорсинговой команде минимально необходимые права (принцип least privilege).
  2. Позволяет видеть глобальную инфраструктуру (ноды, PV, StorageClasses) без возможности изменять.
  3. Даёт полный контроль над приложениями только в целевых неймспейсах.
  4. Запрещает изменять права доступа (RBAC), что защищает от эскалации привилегий.

Дополнительные рекомендации по безопасности

  • Вести аудит – включить аудит Kubernetes API, чтобы отслеживать действия аутсорсеров.
  • Использовать Pod Security Admission – настроить политики безопасности для подов в этих неймспейсах (например, запретить запуск с root, ограничить capabilities).
  • Network Policies – ограничить сетевой трафик между неймспейсами, чтобы изолировать рабочие нагрузки аутсорсеров.
  • Resource Quotas – установить квоты на CPU/RAM в неймспейсах, чтобы предотвратить истощение ресурсов кластера.
  • ServiceAccount токены – выдавать ограниченные по времени токены или использовать внешние OIDC-провайдеры.
  • Регулярный пересмотр прав – периодически проверять, не нужны ли команде более широкие права, и отзывать лишние.

Если потребуется более гибкий доступ (например, дать права только на pods/log без права на exec), можно детализировать правила в Role.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *