Особенность Kubernetes — в отсутствии своей системы аутентификации: каждый пользователь кластера по умолчанию имеет права суперадминистратора и может делать что угодно. Это удобно для небольших команд, но неприемлемо для крупных проектов с высокими требованиями к безопасности и разграничению прав доступа. Решить эту проблему позволяет разделение прав доступа с помощью технологии единого входа (Single Sign-On, SSO).
Меня зовут Алексей Волков, я продакт-менеджер Kubernetes aaS и Backup в VK Cloud. Расскажу, какие инструменты SSO мы рассматривали, как реализовали механизм единого входа для сервиса Kubernetes и что получили в итоге.
Минутка теории: что нужно знать про Single Sign-On
SSO для кластеров Kubernetes — вариант аутентификации, который позволяет разработчикам использовать свои сертификаты из других систем для доступа к кластерам Kubernetes.
Технология избавляет от необходимости создавать новый набор учетных данных для каждой новой системы или репликации: все данные вносятся в единую систему аутентификации и контроля доступа и предоставляются при каждом запросе. Мы рассмотрим Keystone.
От уязвимостей Kubernetes до поиска решения
Отсутствие собственной системы аутентификации создает определенные опасности: любой пользователь облака может получить доступ к kubeconfig и сделать с ним что угодно. Пересоздать, валидировать и отозвать kubeconfig сложно, поэтому любые действия злоумышленников с ним могут причинить значительный ущерб.
Разграничение прав доступа можно организовать только с помощью внешних механизмов: в отличие от авторизации, аутентификация в Kubernetes всегда внешняя. Поэтому поиск системы аутентификации и управления доступом — один из ключевых вопросов для любой команды, работающей с Kubernetes.
Для реализации этой задачи в VK Cloud и поиска оптимальной системы распределения доступа мы провели целое исследование, в ходе которого сравнивали приоритетные для нас варианты: Webhook с произвольным токеном, OIDC-токен и Webhook с Keystone-токеном. Основные критерии: простота установки клиента пользователем, простота настройки клиента в кластере, возможность работы с кластером без регулярного ввода пароля, безопасность хранения токена, независимость kubeconfig, нагрузка клиента и K8s на IAM и другие.
-
Webhook с произвольным токеном. Вариант не подошел из-за сложностей настройки и использования. Вместе с клиентом пользователям надо устанавливать и дополнительную консольную утилиту. Для настройки клиента нужна отдельная утилита для доработки kubeconfig; токен хранится в конфигурации дополнительной утилиты; нет сторонних компонентов; высокая нагрузка на IAM из-за большего количества запросов, чем в других вариантах.
-
OIDC-токен. Вариант считается стандартом во многих системах SSO: легко устанавливается, не требует сложной настройки и постоянного введения пароля, не перегружает IAM, позволяет переиспользовать компоненты для других целей. Но в нашем случае переход на использование OIDC-токена не был идеальным выбором: для его подключения к Kubernetes в VK Cloud требовалось доработать большую часть IAM.
-
Webhook с Keystone-токеном. Вариант оказался лучше первых двух. Все еще нужно устанавливать дополнительную консольную утилиту и вводить пароль при каждом действии с кластером, но преимущества однозначно перевесили. В пользу использования этой системы аутентификации и контроля доступа говорило и то, что база для ее внедрения во многом была готова — требования в части организации RBAC, аутентификации и возможности инвалидации доступа полностью выполнялись. От нас требовалось частично доработать IAM, оркестратор и образ кластеров Kubernetes. Мы остановились на этом варианте и провели нужную подготовку.
Принцип работы Single Sign-On в облаке VK Cloud
На основе выбранного механизма Webhook с Keystone-токеном мы построили замкнутый цикл выдачи и проверки токенов, который обеспечил надежность и отказоустойчивость системы единого входа.
Алгоритм выдачи и валидации токена для авторизации, реализованный в Kubernetes VK Cloud
Выдача и валидация токена происходит в несколько этапов.
- При запросе Kubectl через клиент k8s client-keystone-auth обращается в IAM VK Cloud.
- IAM VK Cloud проверяет права и роль пользователя, назначенные в личном кабинете, и выдает соответствующий токен.
- Запрос с токеном передается в Cluster apiserver.
- Cluster apiserver отправляет запрос в Auth Webhook, который идет в IAM, валидирует токен, получает информацию о пользователе и отдает ее в apiserver. Тот проверяет через RBAC права пользователя по полученной информации.
- После проверки запрос передается в Webhook, где валидируются имеющиеся права.
При внедрении технологии единого входа нам было важно, чтобы длительность проверки была минимальной. Для этого мы доработали стандартные client-keystone-auth и Webhook:
- для client-keystone-auth добавили локальное кэширование токена. Благодаря ему вводить пароль личного кабинета надо не после каждого действия через Kubectl, а раз в час — это продолжительность жизни токена;
- для Webhook добавили кэширование в Memcached. Это повысило скорость обработки данных и расширило совместимость: теперь Webhook понимает, к какому проекту относится пользователь.
По умолчанию пользователю надо вводить пароль раз в час, это самый безопасный режим взаимодействия. Но если надо, в kubeconfig можно внести правки, чтобы пароль запрашивался только однажды.
Ролевая модель распределения прав доступа
В VK Cloud единый вход реализован с механизмом управления доступом на основе ролей (Role-Based Access Control, RBAC) — роли Kubernetes тесно интегрированы с ролями личного кабинета VK Cloud.
Управление доступом на основе ролей (RBAC)
Права, доступные пользователю в кластере Kubernetes, напрямую зависят от роли, назначенной пользователю в личном кабинете VK Cloud. Это позволяет управлять доступом к кластерам на уровне отдельных проектов в личном кабинете, без независимого конфигурирования прав пользователей для личного кабинета и кластеров Kubernetes. Например, отключение учетной записи пользователя или отзыв роли в личном кабинете приводят к отзыву прав на доступ в кластер Kubernetes.
В личном кабинете VK Cloud можно добавить дополнительных участников проекта, которые будут иметь доступ к облачным сервисам. При добавлении указывается роль участника. На платформе VK Cloud доступно 10 ролей:
- администратор пользователей,
- администратор биллинга,
- администратор проекта,
- владелец проекта,
- администратор сети,
- наблюдатель,
- администратор внутренних сетей,
- администратор сетевой безопасности,
- администратор виртуальных машин,
- суперадминистратор.
Права доступа зависят от характера и объема предполагаемых задач. Например, суперадминистратор может все: от добавления новых пользователей в проект и управления виртуальными машинами до управления VPN и просмотра информации обо всех сервисах в рамках проекта. А, например, полномочия администратора виртуальных машин ограничены возможностью управления виртуальными машинами и дисками.
Подробнее со списком ролей и разрешениями можно ознакомиться по ссылке.
В сервисе Cloud Containers от VK Cloud роли личного кабинета VK Cloud влияют на доступность операций с кластерами в личном кабинете и права доступа пользователей ко всем кластерам в рамках проекта. Но в сервисе контейнеров, помимо стандартных, действуют свои, особые роли.
Роль |
Права |
Владелец проекта Администратор проекта Суперадминистратор Администратор Kubernetes |
Роль admin предоставляет административный уровень доступа: дает доступ на чтение и запись к большинству объектов в пространстве имен, включая возможность создавать другие роли и связывать их. |
Оператор Kubernetes |
Роль edit предоставляет доступ на чтение и запись к большинству объектов в пространстве имен. Позволяет получить доступ к секретам и запускать поды от имени любого сервисного аккаунта в пространстве имен. Роль может быть использована для доступа к API от имени любого сервисного аккаунта в пространстве имен. |
Аудитор Kubernetes |
Роль view предоставляет доступ на чтение к большинству объектов в пространстве имен, но не позволяет просматривать или изменять роли, а также получать доступ к секретам. |
При этом любой роли можно выдать любые права в кластере: созданная в VK Cloud система аутентификации позволяет максимально гранулярно разграничивать права доступа. Например, администратору внутренних сетей по email-адресу конкретного пользователя можно дать часть прав суперадминистратора или, наоборот, забрать отдельные разрешения: права каждого пользователя в кластере можно гибко определить, исходя из задач, выполняемых в проекте.
Что получили в итоге
Внедрение SSO и интеграция внутренних механизмов на уровне ролей — серьезный шаг вперед для безопасности платформы. Отключить ее нельзя, и это тоже принципиальный выбор, гарантирующий консистентность процесса аутентификации.
Вы прямо сейчас можете воспользоваться Kubernetes с SSO от VK Cloud. Для тестирования мы начисляем новым пользователям 3000 бонусных рублей и будем рады вашей обратной связи.
Stay tuned
Присоединяйтесь к телеграм-каналу «Вокруг Kubernetes», чтобы быть в курсе новостей из мира K8s!
Регулярные дайджесты, полезные статьи, а также анонсы конференций и вебинаров.
t.me/+cWY7eMrhzNVmMmQy
Комментарии (2)
SergunyaP
00.00.0000 00:00Здравствуйте. Пожалуйста передайте коллегам чтобы поскорее посмотрели 1228 заявку багбаунти относительно уязвимости миллионов профилей вк. (К сожалению Хабр не даёт мне оставить коммент под профильным постом https://habr.com/ru/company/vk/blog/705222/, поэтому написал сюда).
Изначально писал эту проблему еще в поддержку вк, но там из-за полной халатности, некомпетентности и полной профнепригодности на неё отвечают одними отписками с заведомо ложной информацией, чтобы я поскорее от них "отвалил".
angapov
Вы говорите конкретно про VK cloud или в целом про Kubernetes? Если в целом, то это не так.
Опять же, возможно нужно уточнить, что речь идет только про ваше решение. В других облаках все по-другому.
В Kubernetes нет такой сущности как kubeconfig. Вы наверное имеете ввиду клиентские сертификаты?
Вы снова так говорите, словно kubeconfig это часть Kubernetes. Это не так.