Назад к вопросам
Middle+
79
questionbank

Как настроить авторизацию для кластера?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Настройка авторизации в Kubernetes включает в себя несколько компонентов:

  • Аутентификация: Кто вы есть?
  • Авторизация: Что вам разрешено делать?
  • Admission Control: Дополнительные проверки перед применением изменений.

Аутентификация: Kubernetes поддерживает различные методы аутентификации:

  • Сертификаты x509: Наиболее распространенный метод.
  • Статические токены (Bootstrap Tokens).
  • Относящиеся к сервисному аккаунту токены (Service Account Tokens).
  • Различные плагины, такие как OpenID Connect (OIDC), Webhook Token Authentication и другие.

Пример создания сертификата для пользователя:

# Создание приватного ключа для пользователя alice
openssl genrsa -out alice.key 2048
# Создание запроса на подпись сертификата (CSR)
openssl req -new -key alice.key -out alice.csr -subj "/CN=alice/O=devs"
# Подпись CSR контрольным центром сертификации (CA)
# Требует доступа к приватному ключу и сертификату CA кластера
# В продакшене предпочтительнее использовать инструменты управления сертификатами
# или интегрироваться с существующей PKI

Авторизация: Наиболее широко используемый механизм авторизации в Kubernetes — Role-Based Access Control (RBAC). RBAC позволяет определять, какие действия (глаголы, verbs) пользователи или группы могут выполнять с определенными ресурсами в определенных пространствах имен или на уровне кластера.

Основные компоненты RBAC:

  • Role: Определяет набор правил доступа в пределах пространства имен.
  • ClusterRole: Определяет набор правил доступа на уровне кластера.
  • RoleBinding: Привязывает Role к пользователю, группе или ServiceAccount в пределах пространства имен.
  • ClusterRoleBinding: Привязывает ClusterRole к пользователю, группе или ServiceAccount на уровне кластера.

Пример создания Role и RoleBinding:

# role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: default
rules:
- apiGroups: [""] # Означает "основной" API group (resources like pods, services)
  resources: ["pods", "pods/log"]
  verbs: ["get", "list", "watch"]
# rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods-binding
  namespace: default
subjects:
- kind: User
  name: alice # Имя пользователя из запроса на аутентификацию
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader # Имя Role из role.yaml
  apiGroup: rbac.authorization.k8s.io

Применение манифестов:

kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml

Admission Control: Admission Controllers перехватывают запросы к Kubernetes API-серверу после аутентификации и авторизации, но до сохранения объекта в etcd. Они могут выполнять дополнительные проверки, изменять запрошенные объекты или полностью их отклонять.

Важные Admission Controllers для безопасности:

  • AlwaysPullImages: Гарантирует, что kubelet всегда загружает образ во время запуска независимо от того, существует ли уже локальный образ с тем же тегом.
  • LimitRanger: Применяет ограничения на использование ресурсов (CPU, памяти, хранилища) для Pods и PersistentVolumeClaims в пространстве имен.
  • ResourceQuota: Определяет максимальное потребление ресурсов для пространства имен.
  • PodSecurityStandards: Применяет политики безопасности для пода. В более новых версиях Kubernetes используется Pod Security Admission.
  • MutatingAdmissionWebhook: Позволяет внешним вебхукам изменять объекты перед их сохранением.
  • ValidatingAdmissionWebhook: Позволяет внешним вебхукам проверять объекты перед их сохранением.

Настройка этих компонентов зависит от конкретных требований безопасности и инфраструктуры. Рекомендуется использовать менеджер секретов для управления сертификатами и ключами. Для централизованного управления пользователями и группами можно интегрировать Kubernetes с внешними провайдерами идентификации, такими как LDAP, Active Directory или IdP на базе OIDC.