Безопасность K8s: защита кластеров в Сloud Containers от VK Cloud и Luntry

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.


Благодаря широкой совместимости и большому количеству встроенных функций 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:

  1. Переходим в личный кабинет VK Cloud.



  2. Заходим в раздел «Контейнеры», далее «Кластеры Kubernetes». У меня уже есть несколько — для примера.



  3. Создаем новый кластер. Для этого нажимаем «Добавить», выбираем версию Kubernetes и переходим на следующий шаг.



  4. Далее задаем имя кластера, выбираем тип виртуальной машины, зону доступности, тип Master-диска.



  5. На следующем этапе указываем настройки для группы узлов: задаем название, тип нод, зону доступности, тип диска, количество нод и другие параметры. Тут же можно включить автомасштабирование и задать его настройки. В Kubernetes aaS от VK Cloud нод-группы можно располагать в разных зонах доступности — это помогает управлять отказоустойчивостью и георспределением нагрузки. 



    В этом же разделе настроек кластера можно добавить лейблы (labels) и тейнты (taints), которые будут применяться для всех нод в кластере. С их помощью можно реализовать некоторые концепции Multi-Tenancy, например, когда разные команды могут работать только на разных группах нод, то есть с изолированной нагрузкой.

  6. Нажимаем «Создать кластер».

Настройками созданных и уже существующих кластеров можно управлять через соответствующий раздел личного кабинета VK Cloud. Например, можно:

  • добавить группу узлов;
  • получить kubeconfig для доступа к кластеру;
  • получить Secret для входа в Kubernetes dashboard;
  • обновить версию;
  • изменить тип виртуальной машины Master;
  • удалить кластер.



Аналогично есть настройки и для нод-групп. Например, можно настроить:

  • масштабирование;
  • Labels и taints;
  • обновление нод.

Внутри каждого кластера можно увидеть базовый набор данных и журнал событий — на основе этой информации можно отслеживать состояние рабочей среды и мониторить инциденты.



Здесь же, в соответствующей вкладке, можно по клику подключить нужные аддоны. 



Алгоритм установки любого из аддонов упрощен и сведен к нескольким шагам. Например, при установке конфигурации kube-prometheus-stack нужно:

  1. Указать название приложения.
  2. Указать пространство имен, куда будет установлен аддон. При этом, если указанного пространства нет, оно будет автоматически создано при инсталляции аддона. 
  3. Указать пароль к порталу Grafana и поле adminPasword.
  4. Нажать «Установить аддон».
  5. Запустить в терминале команду kubectl -n <Пространство имен> port-forward service/kube-prometheus-stack-grafana 8001:80.  
  6. Открыть в браузере адрес http://127.0.0.1:8001. 

Demo-приложение: пример работы с аддонами на VK Cloud 


Пройдем этот же путь в рамках тестового микросервисного приложения, упомянутого раньше. 

  1. Создаем namespace, в котором будем запускать приложение. Под каждую нагрузку оптимально создавать свой namespace, чтобы ограничить их взаимодействие и повысить безопасность изолированных рабочих сред.

    kubectl create ns demo
    

  2. Назначаем label. Он нужен, чтобы istio, который установлен в кластере, знал, к каким приложениям подселять Sidecar для проксирования запросов.

    kubectl label namespace demo istio-injection=enable --overwrite
    

  3. Запускаем демо-приложение.

    kubectl config set-context --current --namespace-demo
    
    kubectl apply -f .\release\kubernetes-manifest.yaml
    

  4. Подключаем консоль Grafana.

    kubectl -n prometheus-monitoring port-forward service/kube-prometheus-stack-grafana 8001:80
    

    В Grafana «из коробки» доступно много предустановленных дашбордов.



    Например, можно сразу посмотреть нагрузку по namespace с запущенными деплойментами и их потреблением.



    Кроме того, можно создавать и свои дашборды, реализуя те сценарии мониторинга, которые реально нужны. 
  5. Подключаем консоль 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.
Источник: https://habr.com/ru/companies/vk/articles/759026/


Интересные статьи

Интересные статьи

Как далеко на самом деле ушли GPT-агенты, такие как AutoGPT, AgentGPT и GodMode, в автоматизации повседневных задач? Стоит ли ожидать от них высокой эффективности, или их возможности ограничены? И как...
ВведениеСегодня мы поговорим о Pingora, новом HTTP-прокси, который мы создали у себя внутри с помощью Rust. Прокси обслуживает более 1 триллиона запросов в день, форсирует производительность и предост...
Определите критические предупреждения и запрограммируйте ловушки для этих предупреждений. Установите ловушки так, чтобы отслеживать условия срабатывания и состояния оповещений. Разбираем последние рек...
Организуйте процесс таким образом, чтобы обеспечить проверку достоверности путем перекрестной проверки различных измерений. Убедитесь, что операторы могут вводить только то, что практически или физиче...
Мы запускаем новый проект: маркетплейс технологических решений и услуг, которые будут полезны бизнесу и которые можно интегрировать с инфраструктурой Cloud4Y для создания...