Проект Kubernetes, разработанный в 2014 году силами компании Google, первоначально предполагался для удовлетворения внутренних потребностей компании в сфере управления контейнерами, однако вскоре стал чуть ли не стандартом в области оркестрации. Как и любой другой продукт, Kubernetes не лишён различных проблем с безопасностью. В связи с чем возникает «острый» вопрос в обеспечении её должного уровня. К счастью, было разработано множество инструментов, призванных усовершенствовать безопасность платформы.
И сегодня я расскажу о таких популярных сканерах и утилитах безопасности, как Anchore grype, Kube-bench, Kube-hunter и Falco.
Anchore grype
Официальный сайт: anchore.com
Лицензия: коммерческая и свободная (open source).
Документация: github.com/anchore/grype
Сканер grype предназначен для сканирования образов контейнеров на наличие уязвимостей. Также присутствует поддержка сканирования файловых систем. При сканировании образа grype обращается к своей внутренней базе данных уязвимостей, чтобы найти соответствие. База данных с уязвимостями обновляется каждый раз при запуске утилиты.
На официальной странице проекта в GitHub присутствует документация по установке и обзору основных функций. Для установки сканера достаточно выполнить две команды:
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sudo sh -s -- -b /usr/local/bin
Синтаксис grype выглядит следующим образом:
grype имя_образа:версия
grype имя_репозитория/имя_образа:версия
Образ сканируется из официального репозитория – docker hub. Также поддерживаются частные репозитории.
В качестве примера просканируем образ alpine. Для этого необходимо выполнить команду:
grype alpine:latest
Если не указывать версию образа, то будет просканирован самый последний образ (тег latest).
Сканирование занимает в среднем 1–2 минуты, но может занять и больше времени в зависимости от размера образа и количества слоёв в нём. Если после сканирования отобразилась фраза No vulnerabilities found, это означает, что в образе отсутствуют уязвимости, которые есть в базе данных сканера.
Если уязвимости были найдены, то после завершения сканирования они будут отображены в виде списка:
Список содержит следующие столбцы:
Name (имя) – отображает имя компонента, в котором была найдена уязвимость.
Severity (степень угрозы) – определяет критичность угрозы. Anchore классифицирует уязвимости по уровням: negligible (незначительное влияние), low (низкое влияние), high (высокое влияние), medium (среднее влияние), critical (критическое влияние) и unknown (степень угрозы неизвестна).
Installed (установлено) – отображает версию, в которой впервые появилась эта уязвимость.
Fixed-in (исправлено) — отображает версию, в которой эта уязвимость была устранена.
Type (тип) – отображает тип контейнера (deb, python, go-module, dotnet и т. д.).
Vulnerability (уязвимость) – отображает имя найденной уязвимости в формате CVE.
Также grype умеет находить уязвимости в исходных файлах программного обеспечения. Для этого необходимо указать ключевое слово dir и полный путь до необходимой директории. В качестве примера просканируем директорию /usr. В этом случае команда будет выглядеть следующим образом:
sudo grype dir:/usr/
Принцип действия такой же, как и при сканировании образов.
Kube-bench
Официальный сайт: github.com
Лицензия: свободная (open source).
Документация: docs.k0sproject.io
Kube-bench — утилита, написанная на языке программирования Go, которая сканирует кластер Kubernetes на соответствие практикам и рекомендациям из руководства безопасности CIS Kubernetes.
Чтобы запустить утилиту, достаточно скачать репозиторий с GitHub:
git clone https://github.com/aquasecurity/kube-bench.git
Далее перейти в скачанную директорию и запустить файл job.yaml:
Затем посмотреть список подов и найти под с именем kube-bench:
kubectl get po
Необходимо дождаться, когда статус пода перейдет в Completed:
Только после этого можно посмотреть результаты сканирования. Сканирование может занимать от 5 до 30 минут. После того, как у пода появился Completed, можно вывести итоговый отчёт при помощи команды:
kubectl logs <имя_пода_с_kube_bench>
Проверки разбиты на 5 блоков, каждый из которых отвечает за свой компонент:
Worker Node Security Configuration – отвечает за блок проверок, связанных с рабочими нодами.
Kubernetes Policies – отвечает за политики, используемые внутри кластера. Сюда входят RBAC, Pod Security Policies, Network Policies, CNI.
Control Plane Configuration — отвечает за проверки компонента Control Plane.
Etcd Node Configuration – отвечает за проверки компонента etcd.
Master Node Security Configuration – отвечает за проверки, связанные с безопасностью мастер-ноды.
После каждого блока выводится итоговый отчёт, характерный для данного блока проверок.
PASS – означает, что проверка была успешно пройдена.
FAIL – проверку не удалось выполнить.
WARN – на данную проверку необходимо обратить внимание. Описан алгоритм дальнейших действий.
INFO – для этой проверки есть дополнительные рекомендации, однако они не являются критическими.
Kube-hunter
Официальный сайт: github.com
Лицензия: свободная (open source).
Документация: aquasecurity.github.io/kube-hunter
Kube-hunter — утилита, написанная на языке программирования Python. Как и утилита kube-bench, она также предназначена для поиска уязвимостей в кластере Kubernetes. Однако отличается тем, что в первую очередь анализирует и оценивает защиту кластера как бы с точки зрения злоумышленника, то есть эмулируя атаки на кластер.
Установка производится при помощи пакетного менеджера PIP:
pip3 install kube-hunter
При запуске kube-hunter предлагает 3 типа сканирования:
Remote scanning — сканирование IP-адреса или DNS-имени;
Interface scanning — сканирование интерфейсов;
IP range scanning — сканирование диапазона IP-адресов.
Для примера запустим сканирование Remote scanning и укажем для утилиты частный (серый) IP-адрес хоста, с которого запускается сканирование. На этом же хосте расположена мастер-нода:
По завершении в графе Detected Services отобразятся сервисы, найденные утилитой. В примере это означает, что если злоумышленник будет сканировать кластер в нашей частной сети, то он найдет 3 потенциальных точки «входа» в кластер, через которые можно реализовывать различные атаки.
Кроме того, утилита выведет список уязвимостей, присутствующих в кластере. kube-hunter использует базу данных уязвимостей от Aqua Security. База находится по адресу avd.aquasec.com.
Также можно просканировать кластер c помощью белого IP-адреса с целью нахождения сервисов извне (т. е. те сервисы, к которым можно получить доступ из интернет):
Как видно по результатам сканирования, сервисы кластера недоступны извне – это можно определить по фразе «Kube Hunter couldn't find any clusters».
Falco
Официальный сайт: falco.org
Лицензия: свободная (open source).
Документация: falco.org/docs
Falco представляет собой набор инструментов, предназначенных для обнаружения угроз на уровне ядра Linux при помощи профилирования системных вызовов. Falco способен обнаруживать подозрительную активность не только на уровне кластера Kubernetes, но и в приложениях, контейнерах и подах.
Установка falco в кластер Kubernetes производится при помощи helm чартов. Перед установкой убедитесь, что у вас установлен helm. Для начала необходимо добавить репозиторий falco:
helm repo add falcosecurity https://falcosecurity.github.io/charts
Далее необходимо обновить списки репозиториев helm:
helm repo update
И после этого можно установить сам falco:
helm install falco falcosecurity/falco
Через несколько минут необходимо проверить статус подов и убедиться, что поды в статусе Ready и Running:
kubectl get po
Для полноценной проверки нам понадобится среда для эмуляции и обнаружения атаки. В качестве примера запустим СУБД MySQL. Для начала скачиваем конфиг с MySQL:
wget https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/application/mysql/mysql-deployment.yaml
Далее запускаем под с MySQL:
kubectl apply -f mysql-deployment.yaml
Теперь запускаем контейнер с MySQL. По умолчанию он запустится от имени root пользователя:
kubectl exec -it mysql-77bd8d464d-lvnbc -- bash -il
После этого смотрим логи любого из двух контейнеров с falco:
kubectl logs -f falco-rlhzq
В логах можно увидеть, что был запущен контейнер с терминалом и от имени пользователя root. В данном контексте мы использовали один из модулей falco, который обнаруживает поды с запущенными терминалами внутри.
Подводя итог, замечу, что разнообразие утилит для усиления безопасности Kubernetes не ограничивается теми, о которых идет речь в статье. Тем не менее, уже применение этих четырех однозначно позволит избежать ряда возможных проблем с уязвимостью Kubernetes. Поскольку утилиты предназначены для решения различных задач, для лучшего результата можно использовать их совместно.