Глава 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) для заблаговременного выявления рисков такой системы. Моделирование угроз используется для размышления относительно требований безопасности на ранней стадии общего цикла разработки для снижения тяжести рисков с самого начала. Моделирование угроз включает в себя выявление угроз, осознания последствий каждой из угроз и окончательной разработки стратегии снижения риска для каждой из угроз. Моделирование угроз имеет целью выделить имеющиеся в некой экосистеме риски в виде простой матрицы с вероятностью их возникновения и воздействием такого риска, а также соответствующей стратегии снижения риска, если она имеется.
По окончанию успешного сеанса моделирования угроз, вы получаете возможность определения следующего:
-
Ресурсы (Asset): Подлежащее защите имущество экосистемы.
-
Контроль безопасности (Security control): Хозяйство системы, которое защищает присутствующие ресурсы от выявленных рисков. Это либо способы защиты, либо меры противодействия риску данного ресурса.
-
Злоумышленник (treat actor): Злоумышленник это некий субъект или организация, в том числе, персональные разработчики скриптов, злоумышленники национальных государств и хакеры- активисты, использующие риски.
-
Поверхность атаки (Attack surface): Те части системы, с которыми взаимодействует злоумышленник. Она содержит точки входа злоумышленников в рассматриваемую систему.
-
Угроза (Treat): Собственно риск для ресурсов.
-
Смягчение риска (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 будет обеспечивать что в каждом узле будет иметься один исполняющий эту службу под, причём, ни более, ни менее. Итак, что же происходит за сценой? Давайте взглянем на схему, чтобы показать на верхнем уровне взаимодействие компонентов:
Быстро резюмируем что эти компоненты делают:
-
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:
Для создания DaemonSet мы применяем такие шаги:
-
Пользователь отправляет некий запрос в
kube-apiserver
для создания рабочего потока DaemonSet через HTTPS. -
После аутентификации, авторизации и удостоверения объекта,
kube-apiserver
создаёт сведения о соответствующем объекте рабочего потока для DaemonSet в своей базе данныхetcd
. По умолчанию, никакие ни передаваемые, ни неподвижные сведения вetcd
не шифруются. -
Имеющийся контроллер DaemonSet отслеживает что создан некий новый объект DaemonSet и затем отправляется запрос создания в
kube-apiserver
. Обратите внимание, что DaemonSet обычно подразумевает, что сами микрослужбы будут запускаться внутри некого пода в каждом из узлов. -
kube-apiserver
повторяет свои действия шага 2 и создаёт необходимые сведения объекта рабочего потока для подов в базе данныхetcd
. -
kube-scheduler
отслеживает создание некого нового пода, и по его созданию принимает решение какой узел запускает этот под по установленному критерию выбора узла. После этого,kube-scheduler
отправляет некий запрос вkube-apiserver
в каком именно узле должен запускаться этот под. -
kube-apiserver
получает запрос изkube-scheduler
и зтем обновляетetcd
сведениями назначения подов узлам. -
Запущенный в узле исполнителя
kubelet
отслеживает тот новый под, который назначается в этом узле, затем отправляет запрос в компоненты CRI (Container Runtime Interface), например, Docker, для запуска контейнера. После этогоkubelet
отправит состояние этого пода обратно вkube-apiserver
. -
kube-apiserver
получает сведения о состоянии такого пода отkubelet
в соответствующем целевом узле, затем обновляет свою базу данныхetcd
соответствующим состояние пода. -
После того как эти поды (из DaemonSet) созданы, эти поды получают возможность взаимодействовать с прочими компонентами Kubernetes, а их микрослужба должна быть поднятой и исполняющейся.
Обратите внимание, что не все взаимодействия между компонентами по умолчанию безопасные. Это определяется настройками таких компонентов. Мы обсудим это более подробно в Главе 6, Защита компонентов кластера.
Злоумышленник это некий логический элемент или исполняемый в рассматриваемой системе код, от которого следует защищать имеющиеся ресурсы. С позиции обороны вам прежде всего требуется понимать кто потенциально может быть врагами, или же ваша стратегия обороны будет очень мутной. Злоумышленников в средах Kubernetes большими мазками можно классифицировать по трём категориям:
-
Конечные пользователи: Некий логический элемент, который имеет возможность подключаться к соответствующему приложению. Входной точкой для этого злоумышленника обычно выступает балансировщик нагрузки или ingress (вход доступа). Иногда поды, контейнеры или NodePorts могут непосредственно выставляться в Интернет, добавляя больше точек входа для своего конечного пользователя.
-
Внутренний злоумышленник: Некий логический элемент, который обладает ограниченным доступом внутри рассматриваемого кластера Kubernetes. Примерами внутреннего злоумышленника могут служить порождаемые внутри кластера вредоносные контейнеры или поды.
-
Злоумышленник с полномочиями: Некий логический элемент, который обладает внутри кластера Kubernetes правами администратора. Примерами привилегированных злоумышленников являются администраторы инфраструктуры, скомпрометированные экземпляры
kube-apiserver
и вредоносные узлы.
Примеры злоумышленников включают в свой состав персональных разработчиков скриптов, хакеров- активистов и субъектов национальных государств. Все эти злоумышленники подпадают под перечисленные три категории зависимости от того где именно в системе присутствует такой злоумышленник.
Приводимая ниже схема выделяет различных злоумышленников в экосистеме Kubernetes:
Как вы можете видеть из этой схемы, конечный пользователь обычно взаимодействует через маршруты HTTP/HTTPS, выставляемые имеющимися контроллерами ingress, балансировщиками нагрузки или соответствующими подами. Конечный пользователь обладает наинизшими полномочиями. Внутренний злоумышленник, с другой стороны, обладает ограниченным доступом к имеющемся в кластере ресурсам. Привилегированный злоумышленник имеет больше всего полномочий и обладает возможностью изменения всего кластера. Эти три категории злоумышленников помогают определять серьёзность угроз. Некая угроза, в которую вовлечён конечный пользователь имеет более высокий уровень серьёзности по сравнению с угрозой со стороны привилегированного злоумышленника. Хотя на схеме эти роли и кажутся изолированными, злоумышленник способен измениться из конечного пользователя во внутреннего злоумышленника, применяя атаку с повышением полномочий.
Со своим новым пониманием компонентов и злоумышленников Kubernetes, мы отправляемся в путешествие моделирования
угроз некого кластера Kubernetes. В своей следующей таблице мы рассматриваем все основные компоненты, узлы и поды
Kubernetes. Узлы и поды это основополагающие объекты Kubernetes, которые исполняют рабочие нагрузки. Обратите
внимание, что все эти компоненты выступают ресурсами и подлежат защите от угроз. Когда любой из этих компонентов
превращается в скомпрометированный, это может повлечь следующий этап некой атаки, например, эскалации полномочий.
Кроме того, заметьте, что kube-apiserver
и
etcd
являются мозгом и сердцем кластера Kubernetes. Когда скомпрометирован
любой из них, это будет окончанием игры.
Приводимая далее таблица выделяет все угрозы в конфигурации кластера Kubernetes по умолчанию. Эта таблица к тому же высвечивает как разработчики и администраторы кластера способны защищать свои ресурсы от таких угроз:
Ресурсы | Угроза | Контроль безопасности | Стратегия снижения риска |
---|---|---|---|
|
Нет устанавливаемой по умолчанию политики аудита. Это препятствует расследовательскому анализу после некой атаки. |
Политика аудита |
Включение политики аудита. Рекомендуется уровень метаданных по всей системе. |
|
|
Аутентификация/ Авторизация |
Убедитесь что |
|
Слабая аутентификация по причине использования самостоятельно подписываемых сертификатов. |
Включает клиента CA при помощи
|
Выполняет мониторинг подключений к
установлено в |
|
Данные не шифруются при постоянном хранении по умолчанию. |
Шифруйте данные при помощи
|
Передавайте параметр настройки |
|
Аутентификация не включена по умолчанию. |
Аутентификация/ Авторизация |
Убедитесь что аутентификация включена и использует TLS во избежание доступа к
|
|
Может быть доступна из любого компонента в экосистеме Kubernetes. |
|
|
|
Может быть доступtн из любого компонента в экосистеме Kubernetes. Это можно применять для составления плана данного кластера Kubernetes. |
нет сведений |
Помечайте все подключения к
|
|
Отсутствие изоляции компонентов может повлечь атаки повышения полномочий. |
нет сведений |
нет сведений |
|
Диспетчеры контроллеров обрабатывают такие секреты как переменные среды, параметры командной строки и секреты Kubernetes, но каждый компонент обладает минимальной защитой для таких секретов. |
Ротация секретов и применение секретов Kubernetes. |
Секреты Kubernetes предоставляют некий стандартный способ обработки секретов. Секреты должны настраиваться на шифрование пр запуске. Кроме того вместо секретов можно применять vaults (сейфы) секретов, такие как HashiCorp. |
|
|
нет сведений |
Сертификаты подлежат удаления после того как кластер поднят и выполняется. Кроме того, должно быть включено полное шифрование диска. |
|
Для компрометации узлов и контейнеров могут использоваться терминалы. Такие терминалы не аутентифицируются. |
Аутентификация/ Авторизация |
Совместно с |
|
Отсутствие фильтрации источника для некого контейнера времени выполнения может приводить к извлечению из экосистемы вредоносных образов. |
Контроллер принятия |
Для гарантирования получения образов из подтверждённых источников пользуйтесь
контроллером принятия |
|
Скомпрометированные узлы способны внедрять модули ядра для компрометации подов. |
|
Для защиты от компрометации контейнера может предоставляться чёрный список модулей ядра. |
|
Уязвимые исполняемые файлы и службы в узлах способны повлечь компрометацию подов/ кластера. |
нет сведений |
Помочь заметить доступ к частным ключам
|
|
Поды способны запускаться от имени root и компрометировать сам хост. |
|
Не часто подам требуются полномочия root в обычном рабочем потоке. Политики безопасности пода могут гарантировать что поды не запускаются от имени привилегированных пользователей. |
|
Сетевая изоляция подов может реализоваться при помощи сетевых политик. Отказы сетевых политик происходят втихую, без выставления ошибок. |
нет сведений |
Для проверки того что политики применяются верно предлагается создавать некий сетевой обмен. |
|
По умолчанию все поды ассоциированы с учётной записью службы
|
нет сведений |
Исправление |
Данная таблица выделяет лишь некоторые из угроз. Имеются и прочие угрозы, которые будут обсуждены в последующих главах. Мы надеемся, что предыдущая таблица вдохновит вас задуматься на обсуждение вслух того что подлежит защите и как это защищать в вашем кластере Kubernetes.
Теперь, когда мы рассмотрели угрозы в неком кластере Kubernetes, давайте перейдём к обсуждению того чем отличается моделирование угроз для некого разрабатываемого в Kubernetes приложения. Развёртывание в Kubernetes дополнительно увеличивает сложность в моделирование угроз. Kubernetes прибавляет дополнительные подлежащие рассмотрению вопросы, ресурсы, злоумышленников и новые меры безопасности, которые требуется учитывать перед исследованием угроз для вашего развёрнутого приложения.
Давайте рассмотрим простой пример трёхуровневого веб приложения:
В среде Kubernetes то же самое приложение выглядит несколько иначе:
Как показано на предыдущей схеме, все наши веб сервер, сервер приложений и базы данных запущены внутри подов. Давайте проведём сопоставление на верхнем уровне моделирования угроз между традиционной веб архитектурой и естественной для облачных решений ахитектуры:
Традиционная веб архитектура | Веб приложение Kubernetes | |
---|---|---|
Ресурсы |
Веб сервер |
Веб сервер |
|
Сервер приложений |
Сервер приложений |
|
Сервер баз данных |
Сервер баз данных |
|
Хосты |
Узлы (исполнители и хозяева) |
|
|
Поды |
|
|
Постоянные тома |
|
|
Компоненты Kubernetes
( |
Злоумышленники |
Интернет/ конечные пользователи |
Интернет/ конечные пользователи |
|
Внутренние злоумышленники |
Внутренние злоумышленники |
|
Администраторы |
Администраторы |
|
|
Вредоносные/ скомпрометированные узлы |
|
|
Вредоносные/ скомпрометированные поды |
|
|
Скомпрометированные компоненты Kubernetes |
|
|
Исполняемые внутри кластера приложения |
Меры безопасности |
Межсетевой экран |
Сетевые политики |
|
DMZ |
TLS, mTLS |
|
Внутренняя сетевая среда |
Политики безопасности подов |
|
Межсетевой экран веб приложения |
Межсетевой экран веб приложения |
|
Соединения TLS |
Изоляция подов |
|
Шифрование файлов |
Шифрование файлов |
|
Авторизация базы данных |
Авторизация базы данных |
|
Шифрование базы данных |
Шифрование базы данных |
|
|
Контроллеры допуска |
|
|
Авторизация Kubernetes |
Подводя итого приведённому выше сопоставлению, вы обнаружите, что для облачной архитектуры требуется защищать большее число ресурсов, а также вы столкнётесь с большим количеством злоумышленников в этом пространстве. Kubernetes предоставляет больше средств контроля безопасности, но также добавляет и сложность. Дополнительные меры безопасности не обязательно означают большую безопасность. Помните: сложность - основной враг безопасности.
В этой главе мы начали с введения в базовые понятия моделирования угроз. Мы обсудили все важные ресурсы, угрозы и всех злоумышленников в средах Kubernetes. Мы рассмотрели разные меры безопасности и стратегии снижения рисков для улучшения положения безопасности в вашем кластере Kubernetes.
Далее мы прошлись по моделированию угроз приложения, приняли во внимание развёртываемые в Kubernetes приложения м сопоставили их с традиционным моделированием угроз монолитных приложений. Та сложность, которая вносится построением Kubernetes, усложняет моделирование угроз, причём, как мы показали: следует защищать больше ресурсов и бороться с большим количеством злоумышленников. К тому же, дополнительные меры безопасности не обязательно означают большую безопасность.
Вам следует иметь в виду, что хотя моделирование угроз может быть длительным и сложным процессом, им стоит заниматься для понимания позиции безопасности вашей среды. Для лучшей безопасности вашего кластера Kubernetes, совершенно необходимо совместно моделировать угрозы и приложения, и инфраструктуры.
В своей следующей главе в помощь вашему обучению безопасности своего кластера Kubernetes на следующем уровне, мы пройдёмся по принципу наименьших полномочий и тому как реализовывать его в вашем кластере Kubernetes.
-
Когда вы приступаете к моделированию угроз своего приложения?
-
Каковы различные злоумышленники в средах Kubernetes?
-
Назовите одну из самых серьёзных угроз в устанавливаемом по умолчанию развёртыванию Kubernetes
-
Почему в Kubernetes сложнее моделировать угрозы?
-
Как сопоставить поверхность атаки развёртывания Kubernetes с развёртываниями в традиционных архитектурах?
Trail of Bits and Atredis Partners проделали хорошую работу по моделированию угроз компонентов Kubernetes. Вы можете обнаружить её в белых страницах.
Обратите внимание, что цель, масштабы и подход к моделированию угроз в предыдущем техническом документе отличались. Так что и результаты будут несколько иными.