Модуль user-authz реализует ролевую модель управления доступом (RBAC) в Deckhouse Platform (DP). Модуль создаёт кластерные роли для управления доступом пользователей и групп пользователей к ресурсам кластера, а в редакциях DP Ultimate, CSE Core и CSE Pro дополнительно поддерживает авторизацию в режиме мультитенантности.
Подробнее с ролевой моделью управления доступа можно ознакомиться в соответствующем разделе описания модуля.
Модуль работает со следующими кастомными ресурсами API-группы deckhouse.io:
- ClusterAuthorizationRule — задаёт правила доступа на уровне кластера;
- AuthorizationRule — задаёт правила доступа в границах одного неймспейса.
В редакциях DP Ultimate, CSE Core и CSE Pro дополнительно работает со следующими кастомными ресурсами API-группы authorization.deckhouse.io:
- BulkSubjectAccessReview — ресурс для массовой проверки прав доступа пользователя сразу по нескольким объектам или действиям;
- AccessibleNamespace — ресурс для получения списка неймспейсов, доступных конкретному пользователю;
- WhoCan — ресурс для поиска пользователей, групп и ServiceAccount’ов, которым разрешено выполнить заданное действие;
- SubjectAccessReport — ресурс для получения полного списка прав, предоставленных субъекту;
- RoleAccessReport — ресурс для получения полного списка ресурсов и действий, которые предоставляет роль.
Подробнее с настройками модуля и примерами его использования можно ознакомиться в соответствующем разделе документации.
Архитектура модуля
Для упрощения схемы приняты следующие допущения:
- На схеме показано, что контейнеры разных подов взаимодействуют друг с другом напрямую. Фактически они взаимодействуют через соответствующие сервисы Kubernetes (внутренние балансировщики). Названия сервисов не указываются, если они очевидны из контекста. В остальных случаях название сервиса указано над стрелкой.
- Поды могут быть запущены в нескольких репликах, однако на схеме все поды изображены в одной реплике.
Архитектура модуля user-authz на уровне 2 модели C4 и его взаимодействие с другими компонентами DP изображены на следующей диаграмме:
Компоненты модуля
Модуль состоит из следующих компонентов:
- User-authz-controller (Deployment) — компонент состоит из одного контейнера user-authz-controller и следит за кастомными ресурсами ClusterAuthorizationRule и AuthorizationRule, создавая, обновляя и удаляя соответствующие им ClusterRoleBinding и RoleBinding.
Редакции DP Ultimate, CSE Core и CSE Pro дополнительно включают следующие компоненты:
-
User-authz-webhook (DaemonSet) — опциональный компонент, реализующий для kube-apiserver вебхук-режим авторизации, включённый в цепочку авторизации между встроенными авторайзерами Node и RBAC. Компонент запускается на всех мастер-узлах в режиме
hostNetwork.Настройку вебхука для авторизации в kube-apiserver выполняет модуль
control-plane-manager, если параметр.controlPlaneConfigurator.enabledв настройках модуля принимает значениеtrue(по умолчанию). При этом модульcontrol-plane-managerсоздаёт AuthorizationConfiguration, в параметреmatchConditionsкоторого исключаются следующие субъекты из проверки вебхуком:- основные системные учётные записи control plane, например
kubernetes-admin; - идентификаторы узлов
system:node:*; - ServiceAccount’ы из неймспейсов
kube-systemиd8-*.
Вебхук при получении запроса SubjectAccessReview проверяет ограничения на доступ к неймспейсам, заданные в кастомном ресурсе ClusterAuthorizationRule (мультитенантность). При этом вебхук не ограничивает субъекта, у которого есть доступ RBAC независимо от ClusterAuthorizationRule. Таким образом обеспечивается работа работа двух моделей описания доступов.
Компонент явно запрещает запросы, по всем остальным запросам он не выносит решения (
no opinion), и решение передаётся дальше авторайзеру RBAC. User-authz-webhook настроен по принципу fail-closed, поэтому если вебхук недоступен или не успевает ответить за это время, kube-apiserver запрещает все неисключённые запросы, а не передаёт их RBAC.Используются следующие параметры fail-closed для вебхука:
- параметр
failurePolicyустановлен вDeny; - таймаут 3 секунды;
- кеширование решений раздельно для авторизованных и неавторизованных запросов (
authorizedTTL: 5m/unauthorizedTTL: 30s).
Deckhouse-контроллер разворачивает этот компонент, если параметр
.enableMultiTenancyв настройках модуля принимает значениеtrue(по умолчанию —false).Состоит из следующих контейнеров:
- user-authz-webhook — основной контейнер;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищённого доступа к метрикам компонента.
- основные системные учётные записи control plane, например
-
Permission-browser-apiserver (Deployment) — опциональный компонент (является расширением API Kubernetes), публикующий кастомные ресурсы API-группы
authorization.deckhouse.io.Кастомные ресурсы BulkSubjectAccessReview, AccessibleNamespace, WhoCan, SubjectAccessReport и RoleAccessReport API-группы
authorization.deckhouse.ioиспользуются модулемconsoleи обеспечивают расширенные возможности по определению прав пользователей, ресурсов или действий.Deckhouse-контроллер разворачивает этот компонент, если параметр
.enableMultiTenancyв настройках модуля принимает значениеtrue(по умолчанию —false).Компонент раскрывает wildcard-правила RBAC в конкретные API-ресурсы кластера. Для этого он периодически опрашивает Discovery API Kubernetes, кеширует результат и определяет, является ли каждый ресурс namespaced- или cluster-wide-ресурсом.
Состоит из следующих контейнеров:
- permission-browser-apiserver — основной контейнер;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищённого доступа к метрикам компонента.
Взаимодействия модуля
Модуль взаимодействует со следующими компонентами:
-
Kube-apiserver:
- следит за кастомными ресурсами ClusterAuthorizationRule и AuthorizationRule;
- управляет ресурсами ClusterRoleBinding и RoleBinding;
- читает ресурсы Namespace и RBAC-ресурсы, выполняет запросы к discovery API;
- авторизует запросы на получение метрик.
С модулем взаимодействуют следующие внешние компоненты:
-
Kube-apiserver:
- выполняет авторизацию запросов к кластерным ресурсам;
- пересылает запросы к API-группе
authorization.deckhouse.io.
-
Prometheus-main — сбор метрик компонентов user-authz-webhook и permission-browser-apiserver.