Глава 3. Моделирование угроз

Kubernetes это большая экосистема, составленная из множества компонентов, таких как kube-apiserver, etcd, kube-scheduler, kubelet и многих других. В своей первой главе мы выделили самые основные функциональные возможности различных компонентов Kubernetes. В конфигурации по умолчанию взаимодействие между компонентами Kubernetes приводит к угрозам, о которых следует знать разработчикам и администраторам кластера. Кроме того, развёртывание приложений в кластере вводит в действие новые логические элементы, с которыми взаимодействует это приложение, добавляя новые субъекты угроз и расширяя поверхность атак в общую модель угроз данного приложения.

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

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

Эта глава преследует цель высветить те угрозы экосистемы Kubernetes, которая содержит определённые компоненты Kubernetes и рабочие потоки кластера Kubernetes с тем, чтобы разработчики и инженеры DevOps осознавали риски своих развёртываний и обладали под рукой планом снижения рисков для известных угроз. В данной главе мы обсудим следующие темы:

  • Введение в моделирование угроз

  • Взаимодействие компонентов

  • Субъекты угроз в среде Kubernetes

  • Модель угроз компонентов, объектов самого Kubernetes

  • Моделирование угроз приложений в Kubernetes

Введение в моделирование угроз

Моделирование угроз это некий процесс анализа определённой системы в целом в процессе фазы проектирования жизненного цикла разработки программного обеспечения (SDLC, sofware development life cycle) для заблаговременного выявления рисков такой системы. Моделирование угроз используется для размышления относительно требований безопасности на ранней стадии общего цикла разработки для снижения тяжести рисков с самого начала. Моделирование угроз включает в себя выявление угроз, осознания последствий каждой из угроз и окончательной разработки стратегии снижения риска для каждой из угроз. Моделирование угроз имеет целью выделить имеющиеся в некой экосистеме риски в виде простой матрицы с вероятностью их возникновения и воздействием такого риска, а также соответствующей стратегии снижения риска, если она имеется.

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

  1. Ресурсы (Asset): Подлежащее защите имущество экосистемы.

  2. Контроль безопасности (Security control): Хозяйство системы, которое защищает присутствующие ресурсы от выявленных рисков. Это либо способы защиты, либо меры противодействия риску данного ресурса.

  3. Злоумышленник (treat actor): Злоумышленник это некий субъект или организация, в том числе, персональные разработчики скриптов, злоумышленники национальных государств и хакеры- активисты, использующие риски.

  4. Поверхность атаки (Attack surface): Те части системы, с которыми взаимодействует злоумышленник. Она содержит точки входа злоумышленников в рассматриваемую систему.

  5. Угроза (Treat): Собственно риск для ресурсов.

  6. Смягчение риска (Mitigation): Смягчение риска определяет как понизить саму вероятность риска и воздействие угрозы на ресурсы.

При моделировании угроз в отрасли обычно следуют одним из таких подходов:

  • STRIDE: Модель STRIDE была опубликована Microsoft в 1999 году. Это сокращение для Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, and Escalation of Privilege {Обман, Фальсификация, Расторжение, Раскрытие сведений, Отказ в обслуживании и Эскалация полномочий}. STRIDE моделирует угрозы некой системы для того чтобы ответить на вопрос "Что может пойти не так в системе?"

  • PASTA: Process for Attack Simulation and Threat Analysis {Процесс эмуляции атак и Анализа угроз} это сосредоточенный на рисках подход к моделированию угроз. PASTA следует за сосредоточенном на злоумышленнике подходом, который используется деловыми и техническими командами для разработки стратегий снижения рисков ресурсам.

  • VAST: Моделирование Visual, Agile, and Simple Threat {Визуальное, Подвижное и Элементарное} имеет целью интеграцию моделирования угроз по разработке приложения и инфраструктуры с SDLC {жизненным циклом разработки программного обеспечения} и динамичной разработкой программного обеспечения. Оно предоставляет некую схему визуализации, которая обеспечивает применимый на практике вывод для всех заинтересованных сторон, включая разработчиков, архитекторов, исследователей безопасности и руководящего персонала.

Существуют и прочие подходы {Прим. пер.: например, см. Threat Modeling: 12 Available Methods Наталии Шевченко}, но предыдущие три наиболее часто применяются в нашей отрасли.

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

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

Взаимодействие компонентов

Компоненты Kubernetes работают совместно для обеспечения того, чтобы все запущенные внутри этого кластера микрослужбы функционировали ожидаемым образом. Когда вы развёртываете микрослужбу в как DaemonSet, компоненты Kubernetes будет обеспечивать что в каждом узле будет иметься один исполняющий эту службу под, причём, ни более, ни менее. Итак, что же происходит за сценой? Давайте взглянем на схему, чтобы показать на верхнем уровне взаимодействие компонентов:

 

Рисунок 3-1


Взаимодействие между компонентами Kubernetes

Быстро резюмируем что эти компоненты делают:

  • kube-apiserver: Сервер API Kubernetes (kube-apiserver) это компоненте панели управления, который утверждает и настраивает данные для объектов.

  • etcd: etcd это хранилище ключ- значение с высокой доступностью, применяемое для хранения таких сведений, как конфигурация, состояние и метаданные.

  • kube-scheduler: kube-scheduler это планировщик по умолчанию для Kubernetes. Он отслеживает вновь создаваемые поды и назначает поды узлам.

  • kube-controller-manager: Диспетчер контроллеров Kubernetes это сочетание контроллеров ядра, которое отслеживаете состояние обновлений и вносит соответствующие изменения в свой кластер.

  • cloud-controller-manager: Диспетчер контроллеров облака запускает контроллеры для взаимодействие с лежащими в основе облачными решениями поставщиков.

  • kubelet: kubelet регистрирует имеющиеся узлы с их серверами API и отслеживает создаваемые при помощи Podspecs поды для обеспечения жизнеспособности соответствующих подов и контейнеров.

Следует отметить, что с etcd взаимодействует только kube-apiserver. Прочие компоненты Kubernetes, таких как kube-scheduler, kube-controller-manager и cloud-controller-manager взаимодействуют с запущенным в узлах зозяев kube-apiserver для осуществления их обязанностей. На своих узлах исполнителей, и kubelet, и kube-proxy взаимодействуют с kube-apiserver.

Давайте рассмотрим в качестве примера того как общаются друг с другом эти компоненты создание DaemonSet:

 

Рисунок 3-2


Создание DaemonSet в Kubernetes

Для создания DaemonSet мы применяем такие шаги:

  1. Пользователь отправляет некий запрос в kube-apiserver для создания рабочего потока DaemonSet через HTTPS.

  2. После аутентификации, авторизации и удостоверения объекта, kube-apiserver создаёт сведения о соответствующем объекте рабочего потока для DaemonSet в своей базе данных etcd. По умолчанию, никакие ни передаваемые, ни неподвижные сведения в etcd не шифруются.

  3. Имеющийся контроллер DaemonSet отслеживает что создан некий новый объект DaemonSet и затем отправляется запрос создания в kube-apiserver. Обратите внимание, что DaemonSet обычно подразумевает, что сами микрослужбы будут запускаться внутри некого пода в каждом из узлов.

  4. kube-apiserver повторяет свои действия шага 2 и создаёт необходимые сведения объекта рабочего потока для подов в базе данных etcd.

  5. kube-scheduler отслеживает создание некого нового пода, и по его созданию принимает решение какой узел запускает этот под по установленному критерию выбора узла. После этого, kube-scheduler отправляет некий запрос в kube-apiserver в каком именно узле должен запускаться этот под.

  6. kube-apiserver получает запрос из kube-scheduler и зтем обновляет etcd сведениями назначения подов узлам.

  7. Запущенный в узле исполнителя kubelet отслеживает тот новый под, который назначается в этом узле, затем отправляет запрос в компоненты CRI (Container Runtime Interface), например, Docker, для запуска контейнера. После этого kubelet отправит состояние этого пода обратно в kube-apiserver.

  8. kube-apiserver получает сведения о состоянии такого пода от kubelet в соответствующем целевом узле, затем обновляет свою базу данных etcd соответствующим состояние пода.

  9. После того как эти поды (из DaemonSet) созданы, эти поды получают возможность взаимодействовать с прочими компонентами Kubernetes, а их микрослужба должна быть поднятой и исполняющейся.

Обратите внимание, что не все взаимодействия между компонентами по умолчанию безопасные. Это определяется настройками таких компонентов. Мы обсудим это более подробно в Главе 6, Защита компонентов кластера.

Злоумышленники в средах Kubernetes

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

  1. Конечные пользователи: Некий логический элемент, который имеет возможность подключаться к соответствующему приложению. Входной точкой для этого злоумышленника обычно выступает балансировщик нагрузки или ingress (вход доступа). Иногда поды, контейнеры или NodePorts могут непосредственно выставляться в Интернет, добавляя больше точек входа для своего конечного пользователя.

  2. Внутренний злоумышленник: Некий логический элемент, который обладает ограниченным доступом внутри рассматриваемого кластера Kubernetes. Примерами внутреннего злоумышленника могут служить порождаемые внутри кластера вредоносные контейнеры или поды.

  3. Злоумышленник с полномочиями: Некий логический элемент, который обладает внутри кластера Kubernetes правами администратора. Примерами привилегированных злоумышленников являются администраторы инфраструктуры, скомпрометированные экземпляры kube-apiserver и вредоносные узлы.

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

Приводимая ниже схема выделяет различных злоумышленников в экосистеме Kubernetes:

 

Рисунок 3-3


Злоумышленники в средах Kubernetes

Как вы можете видеть из этой схемы, конечный пользователь обычно взаимодействует через маршруты HTTP/HTTPS, выставляемые имеющимися контроллерами ingress, балансировщиками нагрузки или соответствующими подами. Конечный пользователь обладает наинизшими полномочиями. Внутренний злоумышленник, с другой стороны, обладает ограниченным доступом к имеющемся в кластере ресурсам. Привилегированный злоумышленник имеет больше всего полномочий и обладает возможностью изменения всего кластера. Эти три категории злоумышленников помогают определять серьёзность угроз. Некая угроза, в которую вовлечён конечный пользователь имеет более высокий уровень серьёзности по сравнению с угрозой со стороны привилегированного злоумышленника. Хотя на схеме эти роли и кажутся изолированными, злоумышленник способен измениться из конечного пользователя во внутреннего злоумышленника, применяя атаку с повышением полномочий.

Угрозы в кластерах Kubernetes

Со своим новым пониманием компонентов и злоумышленников Kubernetes, мы отправляемся в путешествие моделирования угроз некого кластера Kubernetes. В своей следующей таблице мы рассматриваем все основные компоненты, узлы и поды Kubernetes. Узлы и поды это основополагающие объекты Kubernetes, которые исполняют рабочие нагрузки. Обратите внимание, что все эти компоненты выступают ресурсами и подлежат защите от угроз. Когда любой из этих компонентов превращается в скомпрометированный, это может повлечь следующий этап некой атаки, например, эскалации полномочий. Кроме того, заметьте, что kube-apiserver и etcd являются мозгом и сердцем кластера Kubernetes. Когда скомпрометирован любой из них, это будет окончанием игры.

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

Таблица 3-1. Основные угрозы и снижение степени риска в Kubernetes с установками по умолчанию
Ресурсы Угроза Контроль безопасности Стратегия снижения риска

kube-apiserver

Нет устанавливаемой по умолчанию политики аудита. Это препятствует расследовательскому анализу после некой атаки.

Политика аудита

Включение политики аудита. Рекомендуется уровень метаданных по всей системе.

 

--anonymous-auth устанавливается в true по умолчанию, что обычно допускает любые подключения к kube-apiserver.

Аутентификация/ Авторизация

Убедитесь что --anonymous-auth устанавлено в false.

 

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

Включает клиента CA при помощи --client-ca-file.

Выполняет мониторинг подключений к установлено в kube-apiserver на предмет аномалий.

etcd

Данные не шифруются при постоянном хранении по умолчанию.

Шифруйте данные при помощи --encryption-provider-config.

Передавайте параметр настройки --encryption-provider-config в kube-apiserver.

 

Аутентификация не включена по умолчанию.

Аутентификация/ Авторизация

Убедитесь что аутентификация включена и использует TLS во избежание доступа к false вредоносными компонентами или объектами из этого кластера.

 

Может быть доступна из любого компонента в экосистеме Kubernetes.

mTLS

mTLS будет отвергать все подключения к etcd за исключением kube-apiserver mTLS вырабатывает некие сертификат CA и ключ. Она также вырабатывает соответствующую пару сертификата и ключа сервера. Эти сертификаты применяются сервером API и etcd при запуске.

kube-sheduller

Может быть доступtн из любого компонента в экосистеме Kubernetes. Это можно применять для составления плана данного кластера Kubernetes.

нет сведений

Помечайте все подключения к kube-sheduller как вредоносные за исключением в kube-apiserver.

Диспетчер контроллера

Отсутствие изоляции компонентов может повлечь атаки повышения полномочий.

нет сведений

нет сведений

 

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

Ротация секретов и применение секретов Kubernetes.

Секреты Kubernetes предоставляют некий стандартный способ обработки секретов. Секреты должны настраиваться на шифрование пр запуске. Кроме того вместо секретов можно применять vaults (сейфы) секретов, такие как HashiCorp.

kubelet

kubelet записывает сертификаты самораскрутки на не зашифрованном диске.

нет сведений

Сертификаты подлежат удаления после того как кластер поднят и выполняется. Кроме того, должно быть включено полное шифрование диска.

 

Для компрометации узлов и контейнеров могут использоваться терминалы. Такие терминалы не аутентифицируются.

Аутентификация/ Авторизация

Совместно с kubelet предоставляйте пакет CA для обеспечения аутентификации.

Контейнер времени выполнения

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

Контроллер принятия ImagePolicyWebhook и инструменты сканирования образов, например Clair.

Для гарантирования получения образов из подтверждённых источников пользуйтесь контроллером принятия ImagePolicyWebhook. Здесь также поможет сканирование образов при помощи таких инструментов как Clair.

Узлы

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

/etc/modprobe.d/kubernetes-blacklist.conf

Для защиты от компрометации контейнера может предоставляться чёрный список модулей ядра.

 

Уязвимые исполняемые файлы и службы в узлах способны повлечь компрометацию подов/ кластера.

нет сведений

Помочь заметить доступ к частным ключам kubeconfig способны Host Intrusion Detection System (HIDS) и File Integrity Monitoring (FIM).

Поды

Поды способны запускаться от имени root и компрометировать сам хост.

PodSecurityPolicy

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

 

Сетевая изоляция подов может реализоваться при помощи сетевых политик. Отказы сетевых политик происходят втихую, без выставления ошибок.

нет сведений

Для проверки того что политики применяются верно предлагается создавать некий сетевой обмен.

 

По умолчанию все поды ассоциированы с учётной записью службы default. Скомпрометированные поды способны активировать вызовы API в своём кластере когда не включён RBAC.

нет сведений

Исправление kubectl serviceaccount default -p &qout;automountServiceAccountToken^ false&qout; отключает автоматическое монтирование маркера учётной записи службы default.

Данная таблица выделяет лишь некоторые из угроз. Имеются и прочие угрозы, которые будут обсуждены в последующих главах. Мы надеемся, что предыдущая таблица вдохновит вас задуматься на обсуждение вслух того что подлежит защите и как это защищать в вашем кластере Kubernetes.

Приложения моделирования угроз в Kubernetes

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

Давайте рассмотрим простой пример трёхуровневого веб приложения:

 

Рисунок 3-4


Моделирование угроз в традиционном веб приложении

В среде Kubernetes то же самое приложение выглядит несколько иначе:

 

Рисунок 3-5


Моделирование угроз в трёхуровневом веб приложении в Kubernetes

Как показано на предыдущей схеме, все наши веб сервер, сервер приложений и базы данных запущены внутри подов. Давайте проведём сопоставление на верхнем уровне моделирования угроз между традиционной веб архитектурой и естественной для облачных решений ахитектуры:

Таблица 3-2. Сопоставление моделирования угроз
  Традиционная веб архитектура Веб приложение Kubernetes

Ресурсы

Веб сервер

Веб сервер

 

Сервер приложений

Сервер приложений

 

Сервер баз данных

Сервер баз данных

 

Хосты

Узлы (исполнители и хозяева)

 

 

Поды

 

 

Постоянные тома

 

 

Компоненты Kubernetes (api-server, etcd, proxy, kubelet, sheduler, control-manager)

Злоумышленники

Интернет/ конечные пользователи

Интернет/ конечные пользователи

 

Внутренние злоумышленники

Внутренние злоумышленники

 

Администраторы

Администраторы

 

 

Вредоносные/ скомпрометированные узлы

 

 

Вредоносные/ скомпрометированные поды

 

 

Скомпрометированные компоненты Kubernetes

 

 

Исполняемые внутри кластера приложения

Меры безопасности

Межсетевой экран

Сетевые политики

 

DMZ

TLS, mTLS

 

Внутренняя сетевая среда

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

 

Межсетевой экран веб приложения

Межсетевой экран веб приложения

 

Соединения TLS

Изоляция подов

 

Шифрование файлов

Шифрование файлов

 

Авторизация базы данных

Авторизация базы данных

 

Шифрование базы данных

Шифрование базы данных

 

 

Контроллеры допуска

 

 

Авторизация Kubernetes

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

Выводы

В этой главе мы начали с введения в базовые понятия моделирования угроз. Мы обсудили все важные ресурсы, угрозы и всех злоумышленников в средах Kubernetes. Мы рассмотрели разные меры безопасности и стратегии снижения рисков для улучшения положения безопасности в вашем кластере Kubernetes.

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

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

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

Вопросы

  1. Когда вы приступаете к моделированию угроз своего приложения?

  2. Каковы различные злоумышленники в средах Kubernetes?

  3. Назовите одну из самых серьёзных угроз в устанавливаемом по умолчанию развёртыванию Kubernetes

  4. Почему в Kubernetes сложнее моделировать угрозы?

  5. Как сопоставить поверхность атаки развёртывания Kubernetes с развёртываниями в традиционных архитектурах?

Последующее чтение

Trail of Bits and Atredis Partners проделали хорошую работу по моделированию угроз компонентов Kubernetes. Вы можете обнаружить её в белых страницах.

Обратите внимание, что цель, масштабы и подход к моделированию угроз в предыдущем техническом документе отличались. Так что и результаты будут несколько иными.