Прямой ответ
RBAC (Role-Based Access Control) — механизм авторизации в Kubernetes. Он отвечает на вопрос «разрешено ли этому субъекту выполнить это действие с этим ресурсом». По умолчанию доступ запрещён: без явной привязки субъект не может сделать ничего.
Модель состоит из двух пар объектов:
| Объект | Назначение | Область |
|---|---|---|
| Role | Набор правил (глаголы + ресурсы) | В пределах namespace |
| ClusterRole | Тот же набор правил | Весь кластер |
| RoleBinding | Привязывает роль к субъектам | В пределах namespace |
| ClusterRoleBinding | Привязывает ClusterRole к субъектам | Весь кластер |
Правило состоит из трёх частей: группа API, ресурсы и глаголы.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: billing
name: deploy-runner
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "patch"]
- apiGroups: [""] # пустая строка — core-группа
resources: ["pods", "pods/log"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: billing
name: ci-deploy
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: deploy-runner
subjects:
- kind: ServiceAccount
name: ci-runner
namespace: billing
Глаголы: get, list, watch, create, update, patch, delete, deletecollection. Полезная деталь — ClusterRole можно привязать внутри одного namespace через RoleBinding: правила берутся из ClusterRole, а область действия ограничивается привязкой. Это позволяет описать набор прав один раз и выдавать его по namespace.
Проверка прав выполняется командой:
kubectl auth can-i patch deployments -n billing --as=system:serviceaccount:billing:ci-runner
kubectl auth can-i --list -n billing
Практика: минимальные права и типовые ошибки
1. Запрещено по умолчанию. Если действие не разрешено явно, оно отклоняется. Это упрощает аудит: достаточно перечислить разрешённое.
2. Различайте глаголы чтения и записи. list часто дают «на всякий случай», но список секретов — это уже утечка. Правило resources: ["secrets"], verbs: ["list"] выдаёт содержимое всех секретов namespace.
3. Защита от повышения привилегий. Пользователь может выдать права, только если сам ими обладает. Нельзя создать Role с доступом к секретам, не имея такого доступа.
4. ClusterRoleBinding — крайняя мера. Привязка cluster-admin сервисному аккаунту даёт полный контроль над кластером, включая чтение всех секретов. Такое решение требует обоснования.
5. Встроенные роли. view — чтение без секретов, edit — изменение ресурсов namespace, admin — плюс управление ролями внутри namespace, cluster-admin — всё.
6. Токены сервисных аккаунтов. Постоянные токены в секретах создаются только при явном указании аннотации; обычный механизм — проекция токена в под с ограниченным сроком жизни. Токен, найденный в скомпрометированном поде, действует ограниченное время.
7. Доступ к секретам — это доступ ко всему. Сервисный аккаунт с правом читать секреты может получить учётные данные облачного провайдера и выйти за пределы кластера.
8. Права на поды включают выполнение команд. Право pods/exec позволяет получить оболочку в любом поде namespace и использовать его сервисный аккаунт — см. статью про security context.
Рекомендации:
- Выдавайте права на уровне namespace. Role и RoleBinding покрывают большинство задач; ClusterRoleBinding нужен редко.
- Отдельный сервисный аккаунт на каждую задачу. Общий аккаунт «для CI» накапливает права и делает инциденты неконтролируемыми.
- Проверяйте фактические права, а не манифесты.
kubectl auth can-i --listпоказывает итоговую картину с учётом всех привязок. - Версионируйте роли в репозитории. Изменение прав через
kubectlне оставляет следов и не проходит ревью. - Учитывайте агрегацию. ClusterRole может включать другие роли через метки, поэтому итоговые права не всегда видны из одного объекта.
- Храните учётные данные вне секретов кластера там, где это возможно — см. статью про управление секретами.
Практический сценарий: пайплайн не мог обновить Deployment
Контекст: CI выполнял kubectl set image, получал ошибку deployments.apps "api" is forbidden, хотя сервисный аккаунт существовал.
- Диагностика.
kubectl auth can-i patch deployments -n billing --as=system:serviceaccount:billing:ci-runnerвернулno. Значит, проблема в правах, а не в контексте kubeconfig. - Проверка привязок.
kubectl get rolebinding -n billingпоказал привязку к ролиview, то есть только чтение. - Причина. Роль выдали по шаблону «для CI», не уточнив, какие действия нужны. Дополнительно в Role отсутствовала группа
apps, аdeploymentsотносятся именно к ней: правило сapiGroups: [""]не сработало бы. - Действия. (а) Создали роль
deploy-runnerс глаголамиget,list,patchдляdeploymentsв группеappsиget,listдляpods/log; (б) привязали её кci-runnerчерез RoleBinding в namespacebilling; (в) явно отказались от доступа к секретам иpods/exec; (г) добавили проверкуkubectl auth can-iв пайплайн перед деплоем, чтобы ошибка прав обнаруживалась до попытки изменения; (д) завели отдельный сервисный аккаунт для задачи отката с правом только наpatch. - Результат. Деплой прошёл; права ограничены четырьмя глаголами вместо полного доступа, а проверка в пайплайне исключила повторение ситуации.
Вывод: ошибка прав в Kubernetes почти всегда объясняется отсутствием привязки либо неверной группой API. Проверка через auth can-i снимает догадки, а минимальный набор глаголов сокращает последствия компрометации.
FAQ
Как узнать, какие права у сервисного аккаунта?
kubectl auth can-i --list --as=system:serviceaccount:<namespace>:<имя> -n <namespace>. Команда выводит итоговый перечень разрешённых действий с учётом всех привязок.
Можно ли запретить действие явно? Нет. RBAC работает по принципу «разрешено только то, что указано»; механизма запрета нет. Чтобы отменить доступ, удаляют привязку.
Чем Role отличается от ClusterRole по содержимому? Структура правил одинакова. Разница в области: Role существует внутри namespace, ClusterRole — в масштабе кластера и может описывать ресурсы, не привязанные к namespace, например узлы.
Нужны ли права на чтение секретов для обычного приложения?
Обычно нет: секрет монтируется в под автоматически, и приложению не нужен API-доступ. Право get secrets требуется только контроллерам, которые управляют секретами.
Источники: Kubernetes docs (RBAC, authorization, service accounts) — ссылки в шапке.