Gymterview
senior

Как обеспечить безопасность CI/CD пайплайна?

Безопасность CI/CD пайплайна — это комплекс мер по защите секретов, контролю доступа, верификации зависимостей и артефактов, аудиту действий и защите самого пайплайна от несанкционированных изменений.

Представьте, что CI/CD пайплайн — это конвейер на фармацевтическом заводе. Каждый этап (смешивание, упаковка, маркировка) должен быть защищён от подмены ингредиентов, контролироваться камерами, а доступ к конвейеру имеют только авторизованные сотрудники. Если кто-то подменит ингредиент на одном из этапов — последствия критические. Так же и с CI/CD: компрометация пайплайна может привести к деплою вредоносного кода в production.

1. Управление секретами

Секреты (пароли, токены, ключи, сертификаты) — самая уязвимая часть пайплайна.

Правила:

  • Никогда не хранить секреты в коде или Jenkinsfile.
  • Использовать Jenkins Credentials Store или внешние хранилища (HashiCorp Vault).
  • Ротация секретов по расписанию.
  • Секреты маскируются в логах как ****.
Пример
// Правильно: секреты из Credentials
withCredentials([string(credentialsId: 'db-password', variable: 'DB_PASS')]) {
    sh 'flyway -password=$DB_PASS migrate'
}

// НЕПРАВИЛЬНО: секреты в коде
// sh 'flyway -password=MySecret123 migrate'  // НИКОГДА!

2. Контроль доступа

  • RBAC (Role-Based Access Control) — разделение прав по ролям (разработчик, DevOps, release manager).
  • Принцип наименьших привилегий — агенты и процессы имеют только необходимые права.
  • Ограничение, кто может редактировать Jenkinsfile и конфигурацию пайплайнов.
  • LDAP/AD интеграция для единой аутентификации.

3. Безопасность агентов

  • Агенты не должны иметь доступ к данным Jenkins master.
  • Использование эфемерных (временных) агентов — Docker-контейнеры уничтожаются после сборки. Никаких остатков от предыдущих сборок.
  • Изоляция сборок разных проектов — один проект не может повлиять на другой.

4. Проверка зависимостей (Supply Chain Security)

Атаки на цепочку поставок (supply chain attacks) — растущая угроза.

Пример
stage('Security Scan') {
    steps {
        sh 'mvn dependency-check:check -DfailBuildOnCVSS=7'
        // Сборка упадет при обнаружении уязвимости с CVSS >= 7
    }
}
  • OWASP Dependency Check — поиск известных уязвимостей (CVE) в зависимостях.
  • Nexus IQ — анализ лицензий и уязвимостей (Pro-версия).
  • Запрет использования зависимостей с критическими уязвимостями.
  • Фиксация версий зависимостей (не использовать LATEST или диапазоны версий).

5. Подпись и верификация артефактов

  • Подпись Docker-образов (Docker Content Trust / Cosign).
  • Подпись JAR-файлов (GPG, jarsigner).
  • Проверка целостности артефактов перед деплоем — артефакт не был подменён между сборкой и деплоем.

6. Аудит и мониторинг

  • Jenkins Audit Trail Plugin — журнал всех действий (кто запустил сборку, кто подтвердил деплой).
  • Мониторинг аномальных активностей (неожиданные сборки, деплой в нерабочее время).
  • Хранение логов сборок длительное время (compliance-требование).
  • Алертинг при подозрительных событиях.

7. Защита пайплайна как кода

  • Jenkinsfile хранится в Git и проходит code review — изменение пайплайна = изменение кода, требующее PR и аппрува.
  • Запрет выполнения произвольных Groovy-скриптов (Script Security Plugin).
  • Использование Shared Libraries, проверенных командой DevOps — разработчики не могут произвольно менять стадии пайплайна.

Сводная таблица мер безопасности

Угроза Мера защиты Инструмент
Утечка секретов Credentials Store, Vault Jenkins Credentials, HashiCorp Vault
Несанкционированный доступ RBAC, LDAP Role Strategy Plugin, LDAP Plugin
Уязвимые зависимости Сканирование CVE OWASP Dependency Check, Nexus IQ
Подмена артефакта Подпись и верификация Docker Content Trust, Cosign
Несанкционированное изменение пайплайна Code review для Jenkinsfile Git, Pull Request
Остатки данных на агенте Эфемерные агенты Docker, Kubernetes
Отсутствие прослеживаемости Аудит-логи Audit Trail Plugin

Вывод

Безопасность CI/CD — это не отдельный этап, а сквозная практика на каждом уровне: секреты, доступ, зависимости, артефакты, агенты, аудит. В банковской среде нарушение безопасности пайплайна может привести к компрометации production-систем, поэтому каждый аспект должен быть проработан.

На собеседовании: этот вопрос часто задают на Senior-позиции. Не ограничивайтесь фразой «не хранить пароли в коде». Перечислите категории угроз: утечка секретов, supply chain атаки, несанкционированный доступ, компрометация агентов — и для каждой назовите конкретную меру защиты. Это показывает зрелое понимание DevSecOps.