TGViewer
DevOps DevOps @devopsitsec · 23.7K subscribers
Post #1540 4.16K
🧠 Задача: Безопасный CI/CD для Docker-образов в GitLab

Условие:
У вас есть следующий пайплайн:


build_and_push:
image: docker:latest
services:
- docker:dind
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
- docker build -t "$CI_REGISTRY_IMAGE:latest" .
- docker push "$CI_REGISTRY_IMAGE:latest"


Он работает, но содержит серьёзные проблемы безопасности и архитектурные ошибки.

🚨 Проблемы:

1. `docker:dind` и `tcp://docker:2375` — критически уязвимы.
Это значит, что любой процесс может получить root-доступ к Docker-демону, а значит и к хосту раннера.

2. Нет валидации образов или сканирования.
В репозиторий может попасть уязвимый образ.

3. Использование тега `latest`.
Тег можно перезаписать в любой момент — нарушает идемпотентность и аудит.

4. Пароли в переменных среды.
Лучше использовать безопасные токены (например, OIDC).

5. Нет изоляции сборки.
Образ может использовать --privileged, --network=host, и не быть sandboxed.

✅ Цель: Переделать пайплайн

Переход от DIND → kaniko, добавить проверку безопасности и стабильную версификацию.

🛡️ Обновлённый .gitlab-ci.yml


variables:
IMAGE_TAG: "${CI_COMMIT_SHORT_SHA}"

build_and_push:
image:
name: gcr.io/kaniko-project/executor:latest
entrypoint: [""]
script:
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
- /kaniko/executor \
--context $CI_PROJECT_DIR \
--dockerfile $CI_PROJECT_DIR/Dockerfile \
--destination $CI_REGISTRY_IMAGE:$IMAGE_TAG \
--destination $CI_REGISTRY_IMAGE:stable \
--snapshotMode=redo \
--single-snapshot

scan_image:
image: aquasec/trivy:latest
stage: test
script:
- trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$IMAGE_TAG


🔍 Разбор улучшений:

• Kaniko — работает без привилегий, не требует docker.sock
• `IMAGE_TAG` = SHA — версии стабильны, audit-friendly
• Trivy — автоматическое сканирование уязвимостей
• Удаление `latest` — используем stable и SHA
• Нет `docker:dind` — безопаснее, проще и быстрее
• Безопасная аутентификация — можно заменить username/password на OIDC в GitLab

📌 Дополнительно:

1. Добавьте rules: в пайплайн, чтобы запускать сборку только по main или тэгам.
2. Используйте readonly контейнеры и fsGroup если применимо.
3. Ограничьте доступ к runner через protected: true.

💣 Бонус: почему docker:dind = уязвимость?

Если runner запускается в privileged режиме, то docker:dind даёт возможность выполнять произвольные команды от root внутри и вне контейнера — включая монтирование хостовых директорий. Это делает возможным побег из контейнера.

💡 Такой пайплайн не только безопаснее, но и более прозрачен, масштабируем и предсказуем.
  • 🔥 18
  • ❤ 6
  • 👎 6
  • 👍 2
  • 🤔 2
More from @devopsitsec
  1. Sep 28, 2026Фильтр Блума: миллион элементов в 1,2 МБ - как это работает? Почему алгоритм «помнит» то,…
  2. Sep 26, 2026Согласны ?
  3. Sep 26, 2026📌Fable 5.1 рассчитала амплитуду рассеяния в девяти петлях Модель в среде Claude Science р…
  4. Sep 25, 2026Как строить инфраструктуру, когда часть сервисов — on-prem, а часть — в cloud Гибридная ин…
  5. Sep 24, 2026Снёс коммиты? Как вернуть код после git reset -hard Одна команда - и три коммита исчезли и…
  6. Sep 24, 2026⚡️ В Kubernetes соединения случайно обрываются под нагрузкой? Проверьте conntrack. Если та…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →