Особенность 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 и другие.

  1. Webhook с произвольным токеном. Вариант не подошел из-за сложностей настройки и использования. Вместе с клиентом пользователям надо устанавливать и дополнительную консольную утилиту. Для настройки клиента нужна отдельная утилита для доработки kubeconfig; токен хранится в конфигурации дополнительной утилиты; нет сторонних компонентов; высокая нагрузка на IAM из-за большего количества запросов, чем в других вариантах. 
  2. OIDC-токен. Вариант считается стандартом во многих системах SSO: легко устанавливается, не требует сложной настройки и постоянного введения пароля, не перегружает IAM, позволяет переиспользовать компоненты для других целей. Но в нашем случае переход на использование OIDC-токена не был идеальным выбором: для его подключения к Kubernetes в VK Cloud требовалось доработать большую часть IAM. 
  3. Webhook с Keystone-токеном. Вариант оказался лучше первых двух. Все еще нужно устанавливать дополнительную консольную утилиту и вводить пароль при каждом действии с кластером, но преимущества однозначно перевесили. В пользу использования этой системы аутентификации и контроля доступа говорило и то, что база для ее внедрения во многом была готова — требования в части организации RBAC, аутентификации и возможности инвалидации доступа полностью выполнялись. От нас требовалось частично доработать IAM, оркестратор и образ кластеров Kubernetes. Мы остановились на этом варианте и провели нужную подготовку.

Принцип работы Single Sign-On в облаке VK Cloud


На основе выбранного механизма Webhook с Keystone-токеном мы построили замкнутый цикл выдачи и проверки токенов, который обеспечил надежность и отказоустойчивость системы единого входа. 


Алгоритм выдачи и валидации токена для авторизации, реализованный в Kubernetes VK Cloud

Выдача и валидация токена происходит в несколько этапов.

  1. При запросе Kubectl через клиент k8s client-keystone-auth обращается в IAM VK Cloud.
  2. IAM VK Cloud проверяет права и роль пользователя, назначенные в личном кабинете, и выдает соответствующий токен.
  3. Запрос с токеном передается в Cluster apiserver.
  4. Cluster apiserver отправляет запрос в Auth Webhook, который идет в IAM, валидирует токен, получает информацию о пользователе и отдает ее в apiserver. Тот проверяет через RBAC права пользователя по полученной информации. 
  5. После проверки запрос передается в 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)


  1. angapov
    00.00.0000 00:00
    +1

    Особенность Kubernetes — в отсутствии своей системы аутентификации: каждый пользователь кластера по умолчанию имеет права суперадминистратора и может делать что угодно.

    Вы говорите конкретно про VK cloud или в целом про Kubernetes? Если в целом, то это не так.

    Отсутствие собственной системы аутентификации создает определенные опасности: любой пользователь облака может получить доступ к kubeconfig и сделать с ним что угодно.

    Опять же, возможно нужно уточнить, что речь идет только про ваше решение. В других облаках все по-другому.

    Пересоздать, валидировать и отозвать kubeconfig сложно, поэтому любые действия злоумышленников с ним могут причинить значительный ущерб.

    В Kubernetes нет такой сущности как kubeconfig. Вы наверное имеете ввиду клиентские сертификаты?

    По умолчанию пользователю надо вводить пароль раз в час, это самый безопасный режим взаимодействия. Но если надо, в kubeconfig можно внести правки, чтобы пароль запрашивался только однажды.

    Вы снова так говорите, словно kubeconfig это часть Kubernetes. Это не так.


  1. SergunyaP
    00.00.0000 00:00

    Здравствуйте. Пожалуйста передайте коллегам чтобы поскорее посмотрели 1228 заявку багбаунти относительно уязвимости миллионов профилей вк. (К сожалению Хабр не даёт мне оставить коммент под профильным постом https://habr.com/ru/company/vk/blog/705222/, поэтому написал сюда).

    Изначально писал эту проблему еще в поддержку вк, но там из-за полной халатности, некомпетентности и полной профнепригодности на неё отвечают одними отписками с заведомо ложной информацией, чтобы я поскорее от них "отвалил".