6
/10
Прожарка: dragonfly‑operator
Оценка: 6/10
Критично
- [⚠ МНЕНИЕ] Dockerfile : строка 12 – образ собирается без
HEALTHCHECK. При падении POD‑а оркестратор будет перезапускать контейнер, но без возможности быстро определить, жив ли процесс Dragonfly. - [⚠ МНЕНИЕ] Dockerfile : строка 8 – используется тег
:latest. При каждом CI‑запуске может подтянуться новая версия базового образа, что нарушает воспроизводимость сборки. - [⚠ МНЕНИЕ] Dockerfile : строка 4‑6 – контейнер запускается от root, а
USERне переопределён. Это открывает путь к эскалации привилегий внутри кластера. - [✓ ФАКТ: YAML-Граммарнаци] Kustomize/CRD : файл
config/manager/manager.yaml– не заданыresources.limitsиresources.requestsдля CPU/Memory. При нагрузке оператор может вытеснить соседние поды, а планировщик не будет учитывать его потребности. - [✓ ФАКТ: YAML-Граммарнаци] RBAC :
role.yaml– предоставляет права*наpodsиconfigmaps. Такой «широкий» доступ нарушает принцип наименьших привилегий и может быть использован злоумышленником для изменения чужих объектов.
Надо переделать
- [⚠ МНЕНИЕ] Конфигурация безопасности – добавить
runAsNonRoot: true,readOnlyRootFilesystem: true,allowPrivilegeEscalation: falseи явно задатьseccompProfile. - [✓ ФАКТ: YAML-Граммарнаци] Ресурсы – прописать
requestsиlimitsдля CPU и памяти вdeployment.yaml. - [⚠ МНЕНИЕ] Логику реплик – в
controllers/dragonflycluster_controller.goесть несколько функций (validateSpec,defaultSpec) объявленных, но не вызываемых ни в одной точке входа; их следует либо подключить, либо удалить. - [⚠ МНЕНИЕ] Обработчики ошибок – в
pkg/client/client.goошибки часто игнорируются (_ = err). Нужно возвращать их наверх или логировать с уровнемError. - [⚠ МНЕНИЕ] Именование – переменные типа
cвcontrollers/dragonflycluster_controller.goслишком короткие, затрудняют чтение; замените наctx,client,request. - [⚠ МНЕНИЕ] Документация – README содержит лишь ссылку на Docker Hub без описания пользовательского API. Добавьте раздел «Как развернуть оператор» и примеры CR‑файлов.
Мелочи
- [⚠ МНЕНИЕ] go.mod – не использует
go.sumдля всех зависимостей, некоторые версии фиксированы вручную, что усложняет обновление. - [⚠ МНЕНИЕ] Makefile – цель
buildне учитывает кросс‑компиляцию дляlinux/amd64; CI‑пайплайн собирает образ под текущую платформу, что может сломаться на другой runner. - [✓ ФАКТ: YAML-Граммарнаци] YAML‑лиенты – в
config/default/kustomization.yamlприсутствует лишний комментарий# TODO: add more bases, который уже реализован. - [⚠ МНЕНИЕ] Линтеры –
golangci-lintне был запущен, поэтому в коде остаются «shadowed variables» и «ineffective assignments».
Что хорошо
- [⚠ МНЕНИЕ] Структура проекта чётко разделена:
api/– схемы CRD,controllers/– бизнес‑логика,config/– манифесты k8s,pkg/– вспомогательные утилиты. Это упрощает навигацию. - [⚠ МНЕНИЕ] CRD‑версии поддерживают
v1alpha1иv1beta1, а вapi/v1alpha1/dragonflycluster_types.goиспользованыkubebuilder‑тэги, что генерирует корректные OpenAPI‑спеки. - [⚠ МНЕНИЕ] Тесты – в
controllers/dragonflycluster_controller_test.goпокрыты основные сценарии создания и удаления кластера, проверяется, что оператор ставит статусReady. - [⚠ МНЕНИЕ] Логирование – применяется
zap‑логгер с уровнемInfo/Error, сообщения содержат контекст (namespace,name), что облегчает отладку в продакшене. - [⚠ МНЕНИЕ] Событийный подход – оператор реагирует на
UpdateиDeleteсобытий, а не только наCreate, что делает его более надёжным при изменении конфигурации.
Вердикт
Добротный оператор, но без базовых hardening‑механизмов он остаётся уязвимым к простым атакам в кластере.
Анализ выполнен автоматически методами статического анализа (SAST) публично доступного репозитория. Активное сканирование и тестирование на проникновение не проводились. Значения обнаруженных секретов, персональные данные и пути эксплуатации уязвимостей не раскрываются. Цитирование кода — в соответствии со ст. 1274 ГК РФ. Результат является оценочным суждением и не заменяет профессиональный аудит безопасности. Пункты помечены: ✓ факт (линтер), ⚠ мнение (AI), ✗ неверно (опровергнуто).