[Перевод] Продвинутые принципы безопасности в Kubernetes
Kubernetes используется для автоматизации таких процессов, как развертывание, администрирование и масштабирование контейнерных приложений. Например, в Kubernetes работает Docker, который развертывает микросервисы и управляет ими. В Kubernetes рекомендуется запускать на одном узле по одному контейнеру, потому что так гораздо безопаснее. Или можно интегрировать несколько программ в один процесс, чтобы оптимизировать обработку и управление.
Некорректная конфигурация может затронуть разные уровни Kubernetes, включая облако, кластер, контейнер и код. Например, у нас есть образ, который использует уязвимый программный пакет и находится в контейнере. Через эту уязвимость злоумышленник может получить доступ ко всему кластеру, куда входит много контейнеров.
В Kubernetes мы продумываем защиту с разных сторон. Например, мы должны защищать хост и его компоненты, а также обеспечить безопасность на этапе сборки, развертывания или выполнения. У каждого аспекта безопасности есть свои методы и стандартные рекомендации для Kubernetes. Безопасность должна обеспечиваться на разных уровнях — код, кластер, контейнер, облако. Давайте рассмотрим методы обеспечения безопасности в Kubernetes.
Пространства имен для изоляции ресурсов Kubernetes
Пространства имен позволяют разделить наборы ресурсов в одном кластере.
В одном пространстве имена должны быть уникальными, но между пространствами имен они могут повторяться. Каждый ресурс Kubernetes находится только в одном пространстве имен, и в пространство имен можно вложить не больше одного пространства имен.
С их помощью мы реализуем логическое разделение кластера и ограничиваем разрешения пользователей.
Задать пространство имен можно следующей командой:
kubectl run nginx --image=nginx --namespace=
kubectl
— это утилита командной строки в Kubernetes. В этой команде мы используем образ nginx с флагом --namespace
для установки пространства имен. Добавив пространство имен, мы обращаемся к pod«ам в нем следующей командой:
kubectl get pods --namespace=
Если мы хотим указать пространство имен сразу для нескольких последующих команд, мы выполняем следующую команду:
kubectl config set-context --current --namespace=
Пространство имен обеспечивает логическое разделение и изоляцию ресурсов.
Защита компонентов Kubernetes
Если кластеры Kubernetes выполняются на стандартных портах, то для поиска открытых портов достаточно будет выполнить простой скан, и если порт не требует аутентификации, к нему будет легко подключиться. Поэтому рекомендуется настраивать на портах кластера и узлов аутентификацию и авторизацию.
Кроме того, мы можем ограничить потребление ресурсов в кластере, установив минимальное и максимальное значение. Если не продумать эти значения, один контейнер может захватить все ресурсы, ничего не оставив другим.
Указывая минимум и максимум для контейнера, мы оставляем запас для дефолтных операций и обеспечиваем нормальное функционирование для всей среды. По умолчанию все объекты в кластере Kubernetes создаются с неограниченными ресурсами ЦП и памяти. После создания пространства имен Kubernetes можно назначить политики с квотами, чтобы ограничить потребление ресурсов.
Ниже мы создаем пространство имен, чтобы ограничить память, ЦП и pod«ы.
apiVersion: v1
metadata: compute-resources
spec:
pods: "6”
request.cpu: "1”
request.memory: 1Gi
limits.cpu: "4”
limits.memory: 4Gi
Мы назвали этот фрагмент кода "com-resources.yaml”
. Теперь развернем его в пространстве имен следующей командой:
kubectl create -f ./ –
Ограничение доступа к ресурсам Kubernetes
Чтобы ограничить доступ к ресурсам Kubernetes, организация должна заблокировать SSH и рекомендовать пользователям использовать kubectl exec
, чтобы получать доступ к контейнеру, не получая доступ к хосту. В Kubernetes есть плагины авторизации, где можно детально настроить правила контроля доступа пользователей к ресурсам.
Мы можем действовать через запросы Kubernetes API, и это будет работать как наша первая линия обороны, но нужно четко понимать, у кого должен быть доступ и какие действия можно выполнять в среде.
Сервисы должны общаться друг с другом через TLS, чтобы весь трафик был зашифрован, и злоумышленник не мог украсть информацию. Это важный шаг, потому что иногда мы считаем, что кластер и так достаточно защищен и можно не тратить ресурсы на шифрование. Шифрование также осуществляется через Kubernetes API.
Мы знаем, какое важное место в Kubernetes занимает Kubernetes API, так что для защиты API можно использовать аутентификацию. В Kubernetes есть несколько встроенных методов аутентификации (статичный файл токена, токен аккаунта сервиса и т. д.), но они не подходят для продакшена. Приходится использовать внешние методы аутентификации, например OpenID Connect (OIDC), поставщики удостоверений, имперсонацию в Kubernetes и т. д.
Кроме того, для API требуется авторизация с использованием управления доступом на основе ролей (RBAC). Как следует из названия, RBAC предоставляет пользователям доступ к ресурсам в зависимости от роли. Когда в Kubernetes поступает запрос, он сопоставляется с пользователем или группой. Если у них достаточно разрешений, запрос будет обработан. Если нет — отклонен. Авторизация RBAC использует группу API rbac.authorization.k8s.io, чтобы динамически настраивать политики через Kubernetes API.
Команда для этой задачи:
kube-apiserver --authorization-mode=Example,RBAC --more-options --other-options
Нужно перезапустить сервер API с флагом authorization-mode
и указать список для RBAC через --more-options
.
Непрерывные обновления для системы безопасности
Каждый день мы слышим о новых уязвимостях в разных опенсорс-пакетах. Скорее всего, ваша организация тоже использует какие-то пакеты с уязвимостями, поэтому лучше отслеживать их все. Если вы управляете списком всего используемого программного обеспечения, вы будете вовремя замечать проблемы и при необходимости обновляться.
При этом не стоит устанавливать обновление прямо в продакшене, потому что оно может быть несовместимо с уже используемыми пакетами ПО. Сначала нужно все как следует протестировать в стейджинге и только потом выкатывать в продакшен. Для обновления мы используем команду: apt- update
.
В Kubernetes лучше всегда использовать функцию последовательных апдейтов и заменять экземпляры pod«ов по одному, чтобы обновление прошло без простоев. Новые pod«ы планируются на узлах, где есть достаточно ресурсов для их размещения.
Применение контекста безопасности к разным ресурсам Kubernetes, таким как pod«ы и контейнеры
Мы можем определить в файле deployment.yaml контекст безопасности, например разрешения, чтобы запретить несанкционированный доступ к pod«ам, контейнерам и томам.
Например, мы можем указать SecurityContext->runAsNonRoot
, чтобы контейнер мог выполняться, только если у пользователя нет прав root. Можно настроить и другие параметры безопасности.
Пример кода для pod«а:
apiVersion: v1
metadata:
name: test
spec:
securityContext:
runAsNonRoot : True
readOnlyRootFilesystem : True
Заключение
Сегодня все больше организаций переносят рабочие нагрузки в контейнеры и стараются обеспечить безопасность в Kubernetes. Kubernetes содержит ресурсы на разных уровнях, и мы должны защищать каждый из них. Если на одном уровне возникнет уязвимость, вся система Kubernetes будет уязвима. Существует много способов защиты Kubernetes, здесь мы перечислили самые основные.
Еще о безопасности в Kubernetes
В учебном центре Слёрм открыта запись на курс «Безопасность в Kubernetes» для инженеров безопасности, DevOps«ов, SRE и разработчиков, самостоятельно работающих в Kubernetes.
На курсе вы познакомитесь с основными моделями угроз, а также узнаете как им противостоять и что делать, чтобы контейнер запустился в срок, а безопасность была на всех этапах — от разработки до отправки на сервер и последующего разворачивания.
Все знания вы можете закрепить на практике на стендах — проработаете теорию и будете уверены в решениях. Приятный бонус — дарим бесплатный демо-урок об основных принципах безопасности проекта, живущего в K8s, и о моделях угроз.
Если вы уже имеете базовые знания и хотите потрогать внутрянку Kuba, приходите на «Kubernetes Мега», который стартует уже 11 ноября. Вас ждут 6 часов практики, приправленной щепоткой теории от спикеров.
Что будет?
авторизация в кластере
настройка autoscaling
резервное копирование
Stateful приложения в кластере
интеграция Kubernets и Vault для хранения секретов
HorizontalPodAutoscaler
ротация сертификатов в кластере
Blue-Green Deploy и Canary Deploy
настройка Service mesh
«Мега» подойдет всем, кому предстоит запускать Kubernetes в продакшн и отвечать за работу проекта в дальнейшем: специалистам по безопасности, системным инженерам, администраторам, архитекторам, DevOps и др. Пройдите бесплатный курс, чтобы научиться устанавливать Kubernetes в ручном режиме.
Комплектом дешевле:
Мы предлагаем комплекты видеокурсов (тариф «Стандарт») со скидкой от 20%
«Безопасность» + «Мега» = 90 000 рублей вместо 130 000
Узнать подробности и записаться: «Безопасность в Kubernetes», «Kubernetes Мега».