Всем привет!
Одна компания начала миграцию своих базовых образов на наработки от Chainguard (минималистичные образы, в которых содержится минимальное количество уязвимостей).
В рамках миграции у них возник запрос: «Нужен дашборд, на котором будет отображаться информация о том, какие контейнеры используют образы Chainguard, а какие – нет».
Это помогло бы команде отслеживать статус миграции. Решению этой задачи посвящена статья.
Казалось бы, всё просто, но есть нюансы:
🍭 Для самой очевидной проверки ОС внутри контейнера в нём должна быть оболочка, но это не всегда так (например, distroless-образы)
🍭 «Вытаскивать» образ из Kubernetes-манифеста? Не всегда получится, т.к. многие используют
digest, а не image:tag🍭 Использование сканеров, которые анализируют образы и, в том числе, отображают информацию об ОС? Это не всегда происходит корректно, да и для runtime это не всегда подойдёт в моменте
Чтобы решить задачу, Автор начал смотреть в сторону ядра ОС, которое «знает всё».
В итоге получилось следующее: получение информации о
pid контейнера, извлечение информации о нём с узла, анализ принадлежности образа к нужной версии ОС.Вся собранная информация передаётся в Grafana, в которой отображается информация о % операционных систем, используемых в базовых образах.
Больше деталей о реализации и о характерных для неё нюансах можно узнать в статье.
«Утилиту», созданную Автором для решения задачи можно найти вот в этом GitHub-репозитории.
Да, статья написана для Chainguard, но их можно «заменить» на любые иные образы. Сам подход останется прежним.