Благодаря широкой совместимости и большому количеству встроенных функций Kubernetes позволяет выстроить надежную систему безопасности и мониторинга. Но «из коробки» пользователям почти ничего недоступно. Если остро стоит вопрос безопасности, отдельные инструменты нужно активировать и подключать, что для многих, особенно новичков в K8s, становится нетривиальной задачей и требует дополнительного изучения.
Я Алексей Волков, менеджер продукта Cloud Containers, сервиса по управлению кластерами Kubernetes в VK Cloud. В этом материале я на примере Cloud Containers (сервиса VK Cloud) и Luntry расскажу, как можно обеспечить безопасность кластеров K8s и почему это важно.
Статья подготовлена на основе совместного вебинара с основателем и техническим директором Luntry Дмитрием Евдокимовым «Безопасность K8s на практике: возможности и инструменты».
Возможности Kubernetes aaS от VK Cloud
Kubernetes — платформа с открытым исходным кодом для управления кластерами приложений и сервисами на основе контейнеров. Решение создано, чтобы помочь разработчикам эффективно управлять любым количеством контейнеров — благодаря ему можно через единый интерфейс разворачивать тысячи экземпляров приложений, находить ошибки и масштабировать инфраструктуру. При этом Kubernetes довольно гибок в настройке и модернизации, чем пользуются вендоры K8s, «допиливая» решение с учетом потребностей пользователей.
Cloud Containers от VK Cloud тоже отличается от ванильного K8s «из коробки», который пользователи могут развернуть у себя на «железе». В частности, ключевые отличия заключаются в реализованных мерах безопасности. Так, в нашем сервисе есть:
- интерфейс управления для создания кластера в несколько кликов, масштабирования и настройки;
- Multi-master кластера с возможностью добавления от 1 до 7 мастер нод;
- автоматическое масштабирование узлов кластера (добавление или удаление нод) с учетом нагрузки (Cluster Autoscaler);
- возможность работы с Calico для управления сетью и сетевыми политиками;
- Data plane в разных зонах доступности;
- расширенные возможности мониторинга с помощью Prometheus, Grafana, Kubernetes Dashboard, Cloud Monitoring;
- Terraform-провайдер, полностью совместимый с API VK Cloud;
- Ingress Controller (Nginx), интегрированный с облачным балансировщиком;
- OPA Gatekeeper, который автоматически устанавливается на создаваемые кластера;
- кластерный DNS (Core DNS) и не только.
Помимо встроенных инструментов, которыми «из коробки» защищен каждый клиент VK Cloud, акцент в обеспечении безопасности нашей реализации Kubernetes as a Service сделан на использовании аддонов — дополнений, которые каждый пользователь может самостоятельно подключить с учетом своих сценариев работы.
Встроенные аддоны VK Cloud
В Cloud Containers есть несколько встроенных, доступных к установке аддонов, которые позволяют выстроить дополнительные уровни защиты кластеров Kubernetes.
- Kube-prometheus-stack — система мониторинга на базе Prometheus, Alertmanager и Grafana;
- Istio — решение, которое упрощает мониторинг, а также управление трафиком, безопасностью и сетевыми политиками с помощью подхода Service Mesh;
- Kiali — консоль для аддона Istio;
- Ingress-nginx — инструмент для управления и маршрутизации трафика;
- Docker-registry — приватный репозиторий для хранения Docker образов.
Интегрированный IAM облака и Kubernetes
От ванильного K8s наш Kubernetes aaS отличает и наличие встроенного IAM. Он упрощает управление безопасностью и ее контроль, в том числе за счет возможности гранулярного назначения прав доступа до определенного неймспейса. Так, IAM позволяет получать в K8s права, соответствующие роли и уровню прав в личном кабинете VK Cloud. Например, если вы создадите пользователя и дадите ему доступ уровня «Администратор Kubernetes», то у него в личном кабинете будут ограниченные возможности только на управление кластерами, без дополнительных функций. При этом внутри кластера у него будет соотнесена роль Admin, которая позволит полностью управлять кластером.
Меры защиты на практике
Для наглядности реализованных и доступных способов защиты внутри Kubernetes aaS от VK Cloud рассмотрим «внутрянку» на примере работы с условным классическим микросервисным приложением. Пройдем весь путь — от создания кластера и подключения аддона до мониторинга с его помощью.
Для создания кластера K8s:
- Переходим в личный кабинет VK Cloud.
- Заходим в раздел «Контейнеры», далее «Кластеры Kubernetes». У меня уже есть несколько — для примера.
- Создаем новый кластер. Для этого нажимаем «Добавить», выбираем версию Kubernetes и переходим на следующий шаг.
- Далее задаем имя кластера, выбираем тип виртуальной машины, зону доступности, тип Master-диска.
- На следующем этапе указываем настройки для группы узлов: задаем название, тип нод, зону доступности, тип диска, количество нод и другие параметры. Тут же можно включить автомасштабирование и задать его настройки. В Kubernetes aaS от VK Cloud нод-группы можно располагать в разных зонах доступности — это помогает управлять отказоустойчивостью и георспределением нагрузки.
В этом же разделе настроек кластера можно добавить лейблы (labels) и тейнты (taints), которые будут применяться для всех нод в кластере. С их помощью можно реализовать некоторые концепции Multi-Tenancy, например, когда разные команды могут работать только на разных группах нод, то есть с изолированной нагрузкой.
- Нажимаем «Создать кластер».
Настройками созданных и уже существующих кластеров можно управлять через соответствующий раздел личного кабинета VK Cloud. Например, можно:
- добавить группу узлов;
- получить kubeconfig для доступа к кластеру;
- получить Secret для входа в Kubernetes dashboard;
- обновить версию;
- изменить тип виртуальной машины Master;
- удалить кластер.
Аналогично есть настройки и для нод-групп. Например, можно настроить:
- масштабирование;
- Labels и taints;
- обновление нод.
Внутри каждого кластера можно увидеть базовый набор данных и журнал событий — на основе этой информации можно отслеживать состояние рабочей среды и мониторить инциденты.
Здесь же, в соответствующей вкладке, можно по клику подключить нужные аддоны.
Алгоритм установки любого из аддонов упрощен и сведен к нескольким шагам. Например, при установке конфигурации kube-prometheus-stack нужно:
- Указать название приложения.
- Указать пространство имен, куда будет установлен аддон. При этом, если указанного пространства нет, оно будет автоматически создано при инсталляции аддона.
- Указать пароль к порталу Grafana и поле adminPasword.
- Нажать «Установить аддон».
- Запустить в терминале команду kubectl -n <Пространство имен> port-forward service/kube-prometheus-stack-grafana 8001:80.
- Открыть в браузере адрес http://127.0.0.1:8001.
Demo-приложение: пример работы с аддонами на VK Cloud
Пройдем этот же путь в рамках тестового микросервисного приложения, упомянутого раньше.
- Создаем namespace, в котором будем запускать приложение. Под каждую нагрузку оптимально создавать свой namespace, чтобы ограничить их взаимодействие и повысить безопасность изолированных рабочих сред.
kubectl create ns demo
- Назначаем label. Он нужен, чтобы istio, который установлен в кластере, знал, к каким приложениям подселять Sidecar для проксирования запросов.
kubectl label namespace demo istio-injection=enable --overwrite
- Запускаем демо-приложение.
kubectl config set-context --current --namespace-demo kubectl apply -f .\release\kubernetes-manifest.yaml
- Подключаем консоль Grafana.
kubectl -n prometheus-monitoring port-forward service/kube-prometheus-stack-grafana 8001:80
В Grafana «из коробки» доступно много предустановленных дашбордов.
Например, можно сразу посмотреть нагрузку по namespace с запущенными деплойментами и их потреблением.
Кроме того, можно создавать и свои дашборды, реализуя те сценарии мониторинга, которые реально нужны.
- Подключаем консоль Kaili.
kauthproxy -n istio-system https://kiali.svc
При запуске Kiali, который является визуализатором к Istio, сразу можно увидеть параметры подключенного demo-приложения в динамике.
Luntry — российское решение по безопасности контейнеров и Kubernetes
Luntry — инструмент для улучшения Observability и безопасности Kubernetes, включая OpenShift и Managed Kubernetes. Базируется на мониторинге за происходящим в Kubernetes на уровне контейнеров, образов, k8s-ресурсов, сервисов, их взаимосвязей и эволюции. Решение позволяет видеть, какие процессы происходят внутри кластеров, куда они ходят по сети, какие процессы запускают, с чем взаимодействуют и так далее. Работа с Luntry — один из способов обнаружения аномалий в реальном времени для Kubernetes.
У Luntry широкий набор функций:
- управление уязвимостями образов и best practices;
- проверка Kubernetes-ресурсов;
- Runtime Security;
- защита сети;
- анализ RBAC;
- интеграция с SIEM.
Luntry совместим с разными средами, в том числе может работать с приложениями, развернутыми в Kubernetes aaS на платформе VK Cloud, реализовывая дополнительный контур защиты и мониторинга.
Возможности Luntry также рассмотрим на примере ранее упомянутого микросервисного demo-приложения, развернутого в VK Cloud, и кластера с 6 нодами.
Один из плюсов Luntry — наглядность. Можно увидеть приложение со всеми сервисами, связями, свойствами, нагрузками и другими параметрами в общем «дереве». Здесь же можно отслеживать, как микросервисы взаимодействуют с внешними компонентами: базами данных, очередями и другими.
Причем через интерфейс решения можно одновременно следить не только за одним приложением, но и за несколькими, в том числе взаимодействующими друг с другом.
При этом Luntry позволяет гибко настраивать параметры отображения — например, можно скрыть всю дополнительную информацию, установить фильтры по namespace, показать взаимодействие со сторонними сервисами. Причем по клику на каждый из ворклоадов можно получить развернутую информацию по каждому компоненту — например, какой контейнер на базе какого образа какой процесс выполняет.
Кроме базовой информации, с помощью фильтров можно отслеживать, например, у каких микросервисов есть назначенные сетевые политики.
Зеленым будут подсвечены микросервисы с сетевыми политиками, красным — без них. Кликнув по соответствующему компоненту, можно увидеть развернутую информацию по назначенным политикам — это существенно упрощает работу инженеров и специалистов по безопасности.
Luntry позволяет использовать фильтры как к нативным, так и к кастомным ресурсам, например, Istio или Cilium.
Можно задействовать и более сложные сценарии. Например, одновременно отфильтровывать VirtualService и по JQ-правилам запрашивать отображение прописанных хостов.
В интерфейсе Luntry можно отобразить и карту Kubernetes-ресурсов, которая отображает максимальную картинку взаимодействий между разными ресурсами.
Поскольку даже для работы небольшого микросервисного приложения, как правило, задействуется много ресурсов, подобная карта часто имеет довольно большие размеры. С одной стороны, это сложно — чтобы разобраться, нужно время. С другой, — полезно, ведь позволяет детализировать все компоненты, операции и свойства.
Если лишние детали не нужны, — их можно скрыть, оставив, например, только поды и применяемые к ним сетевые политики (NetworkPolicy).
Через Luntry также можно строить модели поведения, в которых можно увидеть рабочие параметры отдельных компонентов приложения и даже, из чего состоит компонент.
Например, в нашем demo-приложении istio-proxy-контейнер имеет такой вид.
По клику можно получить подробную информацию о каждом процессе, в том числе для поиска аномалий.
Помимо прочего, в Luntry есть анализатор RBAC. С его помощью можно как просто просматривать права различных субъектов, так и искать, у кого есть та или иная Role/ClusterRole. Также можно проанализировать все на опасные права по базе правил. Проверки можно отфильтровать по разным параметрам: например, отобразить проверки по субъектам и сущности, которые приходят с Istio.
Помимо прочего, в Luntry есть интеграции с двумя Policy Engine движками: OPA Gatekeeper, Kyverno. Можно использовать как один, так и второй, так и два одновременно — система это позволяет. Это позволит вам контролировать как нативные, так и кастомные Kubernetes-ресуры.
Например, можно по каждому namespace посмотреть результаты проверок и причины возможных отказов или несоответствий.
Одновременно с этим также можно получить подробную информацию по каждому компоненту, в том числе относительно подключенных политик безопасности.
Подробную информацию по микросервисам можно посмотреть и в соответствующем разделе интерфейса Luntry — Microservice View.
Такой подход удобнее, если безопасностью приложения занимается не один департамент, которому нужно видеть общую картину по всему кластеру, а разные команды, отвечающие за отдельные микросервисы или namespace, — можно зайти в нужный раздел и найти всю информацию непосредственно о нем, решая задачи безопасности полного цикла относительно только своей зоны ответственности.
Вместо выводов
- Kubernetes имеет большой набор инструментов и функций безопасности, который позволяет выстроить полный цикл защиты и расследования инцидентов. Вместе с тем лишь малая часть из них работает «из коробки».
- При добавлении аддонов и внешних библиотек безопасности важно помнить, что каждая новая функциональность скрывает в себе потенциальные уязвимости. Чтобы исключить их, нужно тщательно выбирать инструменты и работать с ними через проверенные средства аутентификации. В идеале нужно выстроить работу через единые консоли, такие как SSO.
- В кластерах K8s важно не только назначить политики безопасности, но и отслеживать их выполнение. Особенно это актуально в больших микросервисных приложениях — по разным причинам отдельные сервисы могут остаться не покрыты защитой, что создает бреши в контуре обороны.
- В Kubernetes aaS от VK Cloud реализованы меры, которые решают вопросы безопасности всех уровней (как на уровне K8s, так и на уровне облака), а также позволяют в несколько кликов выстроить нужную систему безопасности и мониторинга с гранулярным разделением прав доступа.
- Lunty позволяет через единый интерфейс управлять и контролировать всеми аспектами безопасности сущностей Kubernetes на всех их жизненных стадиях. Luntry может работать с кластерами K8s, развернутыми на разных платформах, в том числе в Kubernetes aaS от VK Cloud.