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

Комментарии (0)