0

practicum

Управление доступом

26.04.2022

Кластеры Kubernetes® широко используются для решения самых разных задач. Поэтому надёжность — бесперебойная работа и защита данных — очень важны. Надёжность определяется уровнями доступа к объектам кластера и  операциям над ними.Для разграничения доступа используется ролевая модель. Подробно о ней рассказывается в курсе «Безопасность». А в этом уроке вы узнаете, как её можно применять для работы с кластером Kubernetes.

Ролевой доступ

Роль — это набор разрешений, описывающих допустимые операции с ресурсом. Вы предоставляете пользователю доступ к ресурсу, назначая ему роли. Пользователем может быть не только человек, но и команда, отдел или даже автоматизированные инструменты (например, инструменты CI/CD).Для ограничения потребления ресурсов в облаке применяются квоты. 

Квота — это количество ресурсов, которое пользователь может употребить.Вот несколько типичных ролей при использовании кластера Kubernetes:

  • администратор облака — даёт доступ в облако и выделяет квоты;
  • сетевой администратор — организует и разграничивает доступ к ресурсам, но сам их не использует;
  • специалист по безопасности — наблюдает за тем, что происходит, не потребляет ресурсов;
  • разработчик — пишет код, создаёт pull-request’ы и, соответственно, новые образы контейнеров;
  • DevOps/SRE — управляет кластером Kubernetes и реестром образов;
  • Инструменты CI/CD — запускают приложения в рабочей среде. Именно от их имени часто потребляются основные ресурсы.

Для работы с кластером Kubernetes можно выделить две группы ролей: 1) роли для управления ресурсами внутри кластера и 2) роли в Managed Kubernetes, которые обеспечивают интеграцию кластера в облако. Рассмотрим вторую группу.

Ролевая модель в Yandex.Cloud

Как вы знаете, в Yandex.Cloud доступ к ресурсам контролирует сервис Yandex IAM (Identity and Access Management) и его система сервисных аккаунтов. В IAM есть роли и для Managed Kubernetes, и для Container Registry. С их помощью можно настроить поддержку описанной выше ролевой модели.Примитивные роли viewereditor и admin можно выдавать на сервисы или ресурсы сервиса, и тогда их название строится по принципу сервис.роль или сервис.ресурс.роль. В Managed Kubernetes это выглядит так:

image

Идеология модели сервисных аккаунтов Yandex.Cloud — чёткое разграничение публичных и непубличных ресурсов. Поэтому все роли, предоставляемые по умолчанию, не позволяют открывать публичный доступ к ресурсам. Чтобы пользователь мог создавать публичные ресурсы, необходимо осознанно предоставить ему дополнительные роли.

Как правило, для безопасной разработки и эксплуатации приложений поддерживаются как минимум две среды: рабочая (для пользователей) и среда разработки и тестирования. Каталоги разделяют эти среды в облаке, и для каждого каталога настраивается своя политика ролей и квот. Любому пользователю для работы в каталоге понадобится роль viewer.

В документации Managed Kubernetes описаны все возможные роли. Ниже мы приведем несколько примеров того, как с помощью ролей Yandex.Cloud предоставлять доступ пользователям в реальном мире.

Роли для DevOps/SRE

Задача DevOps — обеспечить ресурсы для работы приложения и организовать регулярные обновления приложения. Посмотрим, какие роли нужны для этого.Чтобы создавать кластеры Kubernetes, нужна роль k8s.admin. Это роль по умолчанию, и поэтому (как мы уже говорили выше) она не даёт возможности открывать публичный доступ. Чтобы создать кластер с публичным доступом, потребуется дополнительная роль vpc.publicAdmin.

Например, чтобы команда разработки случайно не создала публично доступный кластер, ограничьте её ролью k8s.admin, а роль vpc.publicAdmin предоставьте только сотрудникам DevOps/SRE.Чтобы установить системные приложения в кластере, команде DevOps/SRE потребуется полный административный доступ. Это роль k8s.cluster-api.cluster-admin.Чтобы подключить кластер к сети, нужна роль vpc.user.  Чтобы управлять сервисными аккаунтами кластера — iam.serviceAccounts.user.

Чтобы обновлять приложение, нужна возможность помещать новый образ в реестр, создавать машины с помощью образа из реестра, а также удалять ненужные образы. Для управления образами в реестре подойдет роль container-registry.admin.

image

Роли для разработчика

Разработчик будет создавать приложения в кластере, но добавлять и удалять узлы — нет, так как это сфера ответственности DevOps. С учётом этих ограничений разработчику подойдёт роль k8s.cluster-api.editor.Каждое изменение приложения создаёт новый образ — разработчику нужна роль container-registry.images.pusher, чтобы добавлять образы в реестр. Но эту роль следует выдавать только на каталог для разработки, а не на продуктив.

Также разработчику будет полезно отслеживать работу кластера в целом, не вмешиваясь в его работу. Для этого подойдёт k8s.viewer.

image

Роли для кластера K8s

Роль k8s.cluster.agent позволяет создавать в кластере любые объекты, кроме публичных балансировщиков и публичных IP для нод. Также при создании кластера проверяются полномочия сервисного аккаунта, и эта роль позволит создать кластер без доступа в интернет.

Если же системному администратору потребуется предоставлять публичные доступы (доступ кластера в интернет и возможность создавать группы узлов с публичными адресами), ему нужно дать дополнительные роли vpc.publicAdmin или load-balancer.admin.

Роли для узлов K8s

Если вы работаете с Yandex Container Registry, для скачивания образов потребуется роль container-registry.images.puller. Если Container Registry не используется, эта роль не нужна.

Итоги и рекомендации

  • Разворачивая кластеры Kubernetes, не забывайте о безопасности и продумывайте ролевую матрицу для доступа к продуктивной и непродуктивной среде.
  • Используйте возможности Yandex IAM.
  • Осознанно предоставляйте пользователям дополнительные роли для создания публичных ресурсов.

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:380 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(837): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(417): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 380