VK Cloud logo
Обновлена 15 апреля 2024 г. в 08:50

Политики безопасности

Кластер Kubernetes — сложная система, в которой можно развернуть множество ресурсов. Типичные риски, которые возникают при работе с такой системой:

  • выдача слишком широких прав доступа;
  • развертывание ресурсов, которые либо уязвимы к атакам, либо потребляют слишком большие мощности, либо не соответствуют корпоративным политикам.

Чтобы снизить эти риски, в Cloud Containers кроме поддержки разграничения прав доступа к кластеру реализованы политики безопасности.

Возможности кластеров Cloud Containers по работе с политиками безопасности:

Политики безопасности не действуют в кластерах версий ниже 1.21. Чтобы подключить их, обновите такие кластера до актуальной версии. Если обновление невозможно, установите Gatekeeper вручную, а затем настройте ограничения и шаблоны.

Политики безопасности по умолчанию

В кластерах Cloud Containers версий 1.21 и выше действуют политики безопасности по умолчанию, которые обеспечивают базовую защиту кластера от нескольких распространенных уязвимостей:

Политика безопасности по умолчанию
Соответствующие ресурсы Gatekeeper
Ограничение и шаблон ограничения: k8spsphostfilesystem
Ограничение и шаблон ограничения: k8spsphostnamespace

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

Работа с политиками безопасности через личный кабинет

В кластерах Cloud Containers версий 1.23 и выше есть возможность быстрой настройки распространенных политик безопасности через личный кабинет. В кластере будет автоматически создан необходимый набор ограничений и шаблонов ограничений Gatekeeper.

При этом можно включить синхронизацию политик с кластером, которая влияет на ресурсы Gatekeeper в кластере:

  • Если из кластера удалены ограничение или шаблон, соответствующие включенной в личном кабинете политике, то они будут восстановлены.
  • Если в кластере есть созданные вручную ограничения, которые не соответствуют какой-либо включенной в личном кабинете политике, то они будут удалены.

Синхронизация политик с кластером происходит каждые несколько минут.

Включите синхронизацию, чтобы в кластере соблюдались только политики безопасности, настроенные в личном кабинете. Выключите синхронизацию, если вы планируете использовать другие ограничения или шаблоны Gatekeeper для реализации сторонних политик безопасности. Примеры работы со сторонними политиками безопасности смотрите в разделе Использование Gatekeeper.

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

Доступные политики безопасности и их настройки

Часть политик не имеет настроек, для них можно только выбрать пространство имен.

Блокировать NodePort

Запрещает использовать сервисы (services) типа NodePort.

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

Блокировать Wildcard Ingress

Проверяет для ресурса Ingress наличие параметра spec.rules.host в правиле маршрутизации Ingress. Запрещает в качестве значения для параметра:

  • пустую строку;
  • wildcard * в значении.

Использование ресурсов Ingress c указанными значениями spec.rules.host дает возможность перехватывать трафик других сервисов, даже если к самим сервисам нет доступа.

Блокировать обновление Service Account

Запрещает обновление сервисного аккаунта для рабочей нагрузки (workload). Запрет не действует на группы и пользователей, для которых настроены исключения.

Ничем не ограниченная возможность смены сервисного аккаунта для рабочей нагрузки может привести к превышению полномочий в кластере.

Запросы ресурсов контейнеров

Делает обязательным запрос вычислительных ресурсов для контейнеров: CPU в параметре requests.cpu и памяти в параметре requests.memory. Проверяет, чтобы значения этих параметров не превышали настроенных порогов.

Возможность создать контейнер со слишком высокими запросами может привести к исчерпанию ресурсов, если не установлены лимиты.

Лимиты ресурсов контейнеров

Делает обязательным указание лимитов вычислительных ресурсов для контейнеров: CPU в параметре limits.cpu и памяти в параметре limits.memory. Проверяет, чтобы значения этих параметров не превышали настроенных порогов.

Создание контейнера с завышенными лимитами может исчерпать вычислительные ресурсы.

Запуск образов с SHA-хешем

Запрещает использовать образы контейнеров без указания SHA-хеша (digest).

Если в значении параметра image не указан SHA-хеш, то не гарантируется, что будет использоваться одна и та же версия образа. При использовании тегов вместо хешей возможна ситуация, когда одна часть подов использует старый образ, а другая — новый образ, хотя теги образов будут совпадать.

Разрешенные репозитории

Запрещает использовать образы контейнеров с префиксами репозиториев, которые не указаны в настройках как доверенные.

Использование образов из недоверенных репозиториев может снизить безопасность кластера. Например, в такие образы может быть встроен вредоносный код.

Ограничение host-filesystem

Запрещает использовать в контейнерах тома (volumes) типа hostPath. Монтирование таких томов эквивалентно монтированию директории узла кластера Kubernetes. Запрет не действует на директории, для которых настроены исключения.

Использование hostPath без ограничений дает контейнеру полный доступ к файловой системе узла кластера, на котором выполняется под. Это может привести к раскрытию чувствительной информации о кластере, эскалации привилегий и другим проблемам.

Ограничение host-namespaces

Запрещает получать доступ к инструментам межпроцессной коммуникации (IPC) и процессам узла кластера Kubernetes c помощью параметров hostIPC: true и hostPID: true.

Запущенный с этими параметрами под получает следующие возможности:

  • Просмотр всех процессов, запущенных на хосте.
  • Принудительное завершение любого процесса на хосте командой kill, отправленной из пода.
  • Чтение переменных окружения из файла /proc/[PID]/environ для каждого пода или процесса на хосте.
  • Доступ к данным тех процессов, которые используют IPC для коммуникации между собой.

Это очень широкие возможности, которые приравниваются к уязвимостям. Они позволяют манипулировать процессами, раскрывать чувствительные переменные окружения и эксплуатировать другие уязвимости.

Ограничение количества реплик

Запрещает задавать количество реплик для развертываний (deployments) Kubernetes, которое не укладывается в настроенный диапазон.

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