[Перевод] 9 лучших практик по обеспечению безопасности в Kubernetes

Прим. перев.: Это уже не первая статья с общими рекомендациями по безопасности в Kubernetes, что мы переводим в своём блоге. Однако её актуальность — по меньшей мере, как напоминание о простых и важных вещах, на которые не стоит закрывать глаза из-за нехватки времени, — только подтверждается недавними событиями, упоминаемыми автором в начале материала. К слову, автором является Connor Gilbert — менеджер продуктов компании StackRox, предлагающей готовую платформу для обеспечения безопасности приложений, разворачиваемых в рамках Kubernetes-кластеров. Итак, вот что он советует читателям блога CNCF…

NB: Чтобы сделать статью более информативной, для некоторых из упоминаемых автором терминов/методов мы добавили ссылки на соответствующую документацию.

e8jro7e_kniovbz2hmc3aw9xxsk.jpeg

В прошлом месяце в Kubernetes, самой популярной в мире системе оркестровки контейнеров, обнаружили первую крупную уязвимость в безопасности, что ударило по экосистеме проекта. Уязвимость CVE-2018–1002105 даёт возможность злоумышленникам скомпрометировать кластеры через API-сервер Kubernetes, что позволяет исполнять вредоносный код для установки malware и т.п.

Ранее в том же году некорректная конфигурация панели управления Kubernetes привела к тому, что на ресурсах Tesla был установлен софт для майнинга криптовалют. Тогда злоумышленники воспользовались тем, что одна из панелей Kubernetes не была защищена паролем, что позволило им получить доступ к одному из pod’ов с учётной записью для доступа к более масштабной инфраструктуре Tesla в AWS.

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

1. Обновитесь до последней версии


В каждом квартальном релизе [Kubernetes] появляются не только исправления багов, но и новые возможности в области безопасности: чтобы воспользоваться ими, рекомендуем работать с последней стабильной версией.

Использование последнего релиза с последними же патчами будет особенно актуальным в свете недавнего обнаружения CVE-2018–1002105. Обновления и поддержка могут оказаться сложнее, чем предлагаемые в релизах новые возможности, поэтому спланируйте обновления хотя бы раз в квартал.

Значительно упростить обновления может использование провайдеров управляемых Kubernetes-решений.

2. Включите управление доступом на основе ролей (RBAC)


Используйте RBAC (Role-Based Access Control) для контроля над тем, кто может иметь доступ к Kubernetes API и какими правами обладать. Обычно RBAC включён по умолчанию в Kubernetes версии 1.6 и выше (или позже в случае некоторых провайдеров), но если с тех вы обновлялись и не меняли конфигурацию, стоит перепроверить свои настройки. Из-за механизма, по которому совмещается работа контроллеров авторизации в Kubernetes (об общей последовательности операций читайте в статье «Что происходит в Kubernetes при запуске kubectl run? Часть 1» — прим. перев.), необходимо иметь включёнными и RBAC, и устаревший ABAC (Attribute-Based Access Control).

Однако мало включить RBAC — его ещё необходимо эффективно использовать. В общем случае следует избегать прав на весь кластер (cluster-wide), отдавая предпочтение правам в определённых пространствах имён. Избегайте выдачи кому-либо привилегий администратора кластера даже для отладки — гораздо безопаснее выделять права только по необходимости и от случая к случаю.

Посмотреть роли кластера и просто роли можно командами kubectl get clusterrolebinding или kubectl get rolebinding --all-namespaces. А так можно быстро проверить, кому выдана роль cluster-admin (в данном примере она только у группы masters):

$ kubectl describe clusterrolebinding cluster-admin
Name:         cluster-admin
Labels:       kubernetes.io/boostrapping=rbac-defaults
Annotations:  rbac.authorization.kubernetes.io/autoupdate=true
Role:
  Kind:  ClusterRole
  Name:  cluster-admin
Subjects:
 Kind   Name
 ----   ----
 Group  system:masters
Namespace
---------


Если приложению требуется доступ к Kubernetes API, создайте отдельные service accounts (подробнее о них читайте в этом материале — прим. перев.) и выдавайте им минимальный набор прав, требуемых для каждого случая использования. Такой подход гораздо лучше выдачи слишком больших прав аккаунту по умолчанию в пространстве имён.

Большинству же приложений и вовсе не нужен доступ к API: для них можно выставить automountServiceAccountToken в false.

3. Используйте пространства имён для установки границ безопасности


Создание отдельных пространств имён важно как первый уровень изоляции компонентов. Намного проще регулировать настройки безопасности — например, сетевые политики, — когда разные виды рабочих нагрузок развёрнуты в отдельных пространствах имён.

А ваша команда эффективно использует пространства имён? Проверьте их список на наличие нестандартных (не создаваемых по умолчанию):

$ kubectl get ns
NAME          STATUS    AGE
default       Active    16m
kube-public   Active    16m
kube-system   Active    16m


4. Отделяйте чувствительные рабочие нагрузки


Хорошая практика для ограничения потенциальных последствий компрометации — запуск рабочих нагрузок с конфиденциальными данными на выделенном множестве машин. Такой подход снижает риск того, что к приложению с конфиденциальными данными будет обращаться менее безопасное приложение, работающее в той же исполняемой среде контейнеров или на том же хосте. Например, kubelet скомпрометированного узла обычно имеет доступ к содержимому секретов только в том случае, если они примонтированы к pod’ам, выполнение которых планируется на том же узле. Если важные секреты можно найти на множестве узлов кластера, у злоумышленника будет больше возможностей заполучить их.

Разделение можно осуществить с помощью пулов узлов — node pools (в облаке или для on-premises), —, а также контролирующих механизмов Kubernetes, таких как пространства имён, taints, tolerations и другие.

5. Защитите доступ к метаданным облачных сервисов


Чувствительные метаданные — например, административные учётные данные kubelet — могут быть украдены или использованы со злым умыслом для эскалации привилегий в кластере. Например, недавняя находка в рамках bug bounty от Shopify показала в деталях, как пользователь мог превысить полномочия, получив метаданные от облачного провайдера с помощью специально сформированных данных для одного из микросервисов.

В GKE функция скрытия метаданных — metadata concealment — изменяет механизм развёртывания кластера таким образом, что позволяет избежать подобной проблемы, и мы рекомендуем воспользоваться ей, пока не реализовано постоянное решение.

Аналогичные контрмеры могут потребоваться и в других окружениях.

6. Создайте и определите сетевые политики кластера


Сетевые политики — Network Policies — позволяют контролировать доступ к сети в контейнеризированные приложения и из них. Чтобы воспользоваться ими, необходимо иметь сетевого провайдера с поддержкой такого ресурса; в случае провайдеров управляемых Kubernetes-решений вроде Google Kubernetes Engine (GKE) поддержку потребуется включить. (Включение сетевых политик для существующих кластеров в GKE потребует короткого rolling-обновления.)

Как только всё готово, начните с простых сетевых политик по умолчанию — скажем, блокирования (по умолчанию) трафика из других пространств имён.

В случае использования Google Container Engine так можно проверить, включена ли поддержка политик в работающих кластерах:

$ gcloud container clusters list \ 
   --format='table[box] (name,addonsConfig.networkPolicyConfig)'


lip_m0ktegylgndbgtlryqcmxwk.png

7. Задайте Pod Security Policy для кластера


Политика безопасности pod’ов — Pod Security Policy — устанавливает значения по умолчанию, используемые для запуска рабочих нагрузок в кластере. Подумайте над определением политики и включением admission controller’а Pod Security Policy: инструкции по этим шагам варьируются в зависимости от облачного провайдера или используемой модели деплоя.

Для начала можно потребовать отключения в контейнерах NET_RAW capability, чтобы защититься от некоторых видов spoofing-атак.

8. Поработайте над безопасностью узлов


Для улучшения безопасности узлов можно выполнить следующие шаги:

  1. Убедитесь, что хост безопасно и корректно настроен. Один из способов — CIS Benchmarks; у многих продуктов есть autochecker, который автоматически проверяет систему на соответствие этим стандартам.
  2. Контролируйте сетевую доступность важных портов. Убедитесь, что сеть блокирует доступ к портам, используемым kubelet, включая 10250 и 10255. Подумайте над ограничением доступа к API-серверу Kubernetes — за исключением доверенных сетей. В кластерах, которые не требовали аутентификации и авторизации в kubelet API, злоумышленники использовали доступ к таким портам для запуска майнеров криптовалют.
  3. Минимизируйте административный доступ к узлам Kubernetes. Доступ к узлам кластера в принципе должен быть ограничен: для отладки и решения других задач, как правило, можно обойтись и без прямого доступа к узлу.


9. Включите Audit Logging


Убедитесь, что audit-логи включены и что вы отслеживаете появление необычных или нежелательных вызовов API в них, особенно в контексте любых сбоев авторизации — у таких записей будет сообщение со статусом «Forbidden». Сбои авторизации могут означать, что злоумышленник пытается воспользоваться полученными учётными данными.

Провайдеры управляемых решений (включая GKE) предоставляют доступ к этим данным в своих интерфейсах и могут помочь вам в настройке уведомлений в случае сбоев авторизации.

Заглядывая в будущее


Следуйте этим рекомендациям, чтобы Kubernetes-кластер был более безопасным. Помните, что даже после того, кластер настроен безопасно, необходимо обеспечивать безопасность и в других аспектах конфигурации и эксплуатации контейнеров. Для улучшения безопасности технологического стека изучите инструменты, предоставляющие центральную систему для управления развёрнутыми контейнерами, постоянного мониторинга и защиты контейнеров и облачных (cloud native) приложений.

P.S. от переводчика


Читайте также в нашем блоге:

© Habrahabr.ru