Внедрение DevSecOps: как встроить проверки безопасности в CI/CD и не остановить релизы

Внедрение DevSecOps — это автоматические проверки безопасности в вашем конвейере сборки и правила, что делать с их результатом. Поиск секретов, проверка зависимостей, образов и кода работают на вашем сервере сборки, находки попадают в запрос на слияние, а блокируется только то, что действительно опасно. Мы настраиваем конвейер так, чтобы релизы не встали в первый день, и передаём вам исходники настроек и инструкции.

Обследование конвейера — 200 000 ₽, вычитается из первого этапаПроверки работают на вашем сервере сборки, код не покидает контурСначала показываем находки, блокируем позже и только серьёзное

С чем приходят

Когда в сборку нужно добавить безопасность

Клиент спрашивает, какие проверки у вас в сборке

В опросниках по безопасности просят описать автоматические проверки кода, зависимостей и секретов. Сейчас ответить нечем: релиз собирается и уходит без них.

Ключи и пароли лежат в репозитории

Тестовый ключ «на время» остался в истории, а рабочий скопирован из старого проекта. Никто не проверял, что именно хранится в коде и в переменных сборки.

Сканер купили или поставили, но никто не читает

Отчёт на сотни строк приходит на почту и закрывается. Серьёзное смешано с шумом, а владельца результата нет. Такая проверка создаёт ощущение безопасности, а не саму безопасность.

Ручная проверка тормозит релизы

Перед выкладкой кто-то вручную просматривает изменения, и поток упирается в одного человека. Хочется переложить типовое на автоматику, а ручной взгляд оставить для рискованных мест.

Конвейер

Шесть точек конвейера: что проверяется, чем и что происходит с находкой

Набор зависит от вашего конвейера и языка. Это заготовка для разбора: на обследовании мы заменяем примеры вашими системами. Отличие подхода от безопасной разработки в целом описано на странице Secure SDLC.

Точка конвейера
Что проверяем
Чем (примеры)
Что происходит с находкой
Точка конвейераПеред коммитомна машине разработчика
Что проверяемСекреты в изменениях: пароли, ключи, токены
Чем (примеры)Gitleaks или аналог в pre-commit
Что происходит с находкойКоммит не создаётся; обход виден в сборке, где проверка повторяется
Точка конвейераЗапрос на слияниепосле публикации изменений
Что проверяемОпасные конструкции в коде правилами: склейка запросов, жёстко заданные ключи, небезопасные функции
Чем (примеры)Semgrep, SonarQube Community или аналог
Что происходит с находкойКомментарий в запросе на слияние; блокирует только серьёзное и только новое
Точка конвейераСборка зависимостейкаждый запуск
Что проверяемБиблиотеки с известными уязвимостями, список состава (SBOM)
Чем (примеры)OSV-Scanner, OWASP Dependency-Check, Trivy; Syft для списка состава
Что происходит с находкойЗадача на обновление с указанием версии; критичное блокирует релиз
Точка конвейераОбраз контейнерапосле сборки образа
Что проверяемУстаревший базовый образ, лишние пакеты, запуск от администратора, ошибки в файле сборки
Чем (примеры)Trivy, Grype, hadolint
Что происходит с находкойОтчёт у образа; публикация образа блокируется при серьёзных находках
Точка конвейераОписание инфраструктурыперед выкладкой
Что проверяемОткрытые порты, публичные хранилища, лишние права в конфигурации развёртывания
Чем (примеры)Checkov, Trivy в режиме конфигурации
Что происходит с находкойПредупреждение; блокировка для явно опасных настроек
Точка конвейераТестовый стендпосле выкладки на стенд
Что проверяемОтсутствие защитных заголовков, видимые ошибки конфигурации, часть типовых уязвимостей
Чем (примеры)OWASP ZAP в базовом режиме
Что происходит с находкойОтчёт стенда; на старте только информирует
Режимы

Как не остановить релизы: три режима одной проверки

Чаще всего внедрение умирает на втором месяце: проверку включили сразу в блокировке, нашлись старые замечания, релиз встал, и её отключили. Мы вводим каждую проверку в три шага.

Информирует, предупреждает, блокирует

  • Информирует. Сборка проходит, отчёт сохраняется, находки видны в запросе на слияние. Так держим одну-две недели, пока не разобран первый отчёт.
  • Предупреждает о новом. Красная отметка в комментарии, если находка появилась в изменённом коде. Старые замечания пока не трогаем.
  • Блокирует серьёзное. Сборка останавливается при новой серьёзной находке. Остальное остаётся предупреждением.

Накопленные замечания не чинятся одним днём. Мы раскладываем их по группам: исправить сейчас, исключить с причиной, отложить со сроком. Исключения записываются в файл в репозитории, а не в интерфейсе сканера, и у каждого есть владелец и срок. Без срока исключение становится вечным.

Что блокирует всегда

Короткий список, с которым спорить не приходится: секрет в коде или в истории изменений, библиотека с критической уязвимостью в используемой функции, образ с запуском от администратора без причины. Любая блокировка сопровождается понятным текстом: что найдено, где, и что сделать. Сообщение «сборка не прошла проверку безопасности» без подробностей разработчика раздражает и приводит к желанию проверку обойти.

Что с ложными срабатываниями

Сканеры ошибаются, и это нормально. Мы разбираем первый отчёт вместе с вашими разработчиками и выносим типовые ложные срабатывания в правила: тестовые ключи, код, который не запускается, библиотеки, уязвимая функция которых не вызывается. Через пару недель отчёт содержит в основном то, на что стоит реагировать.

Порядок

В каком порядке включаем проверки

Порядок определяется шумом и пользой. Сначала то, что точно и дёшево, потом то, что требует настройки под ваш код.

Шаг
Что включаем
Шум в начале
Когда переходим к блокировке
ШагШаг 1поиск секретов
Что включаемПоиск секретов в репозитории и в сборке
Шум в началеНемного: тестовые значения и примеры в документации
Когда переходим к блокировкеСразу после первого разбора, для новых изменений
ШагШаг 2зависимости
Что включаемПроверка библиотек и список состава
Шум в началеМного на старых проектах: десятки находок у давно не обновлявшегося кода
Когда переходим к блокировкеДля критичных находок в используемых функциях, после плана обновления
ШагШаг 3образы
Что включаемПроверка образов и файла сборки
Шум в началеУмеренный: устаревшие базовые образы
Когда переходим к блокировкеКогда обновлены базовые образы и есть расписание их обновления
ШагШаг 4правила кода
Что включаемНебольшой набор правил по знакомым вам классам ошибок
Шум в началеЗаметный: часть правил придётся отключить или настроить
Когда переходим к блокировкеДля правил, которые команда признала точными
ШагШаг 5инфраструктура
Что включаемПроверка описания развёртывания
Шум в началеУмеренный, зависит от состояния конфигурации
Когда переходим к блокировкеДля явно опасных настроек
ШагШаг 6стенд
Что включаемДинамическая проверка на тестовом стенде
Шум в началеВысокий без настроенных учётных записей и сценариев
Когда переходим к блокировкеОбычно не блокирует, а информирует
Закрытый контур

Что меняется, если сборка не выходит в интернет

Проверки зависимостей и образов опираются на базы известных уязвимостей, которые обычно обновляются из внешних источников. Если ваш сервер сборки изолирован, мы настраиваем это иначе.

  • Зеркало баз уязвимостей. Базы обновляются в одном месте через разрешённый канал и раздаются внутрь контура. В отчёте видна дата базы, чтобы никто не принимал устаревшую проверку за свежую.
  • Внутренний репозиторий пакетов. Сборка скачивает библиотеки из внутреннего прокси, а проверка идёт по тем версиям, которые действительно используются.
  • Раннеры внутри контура. Проверки запускаются на ваших серверах сборки: GitLab CI, Jenkins или другой системе, которая у вас уже есть.
  • Облачные сканеры исключены. Исходный код не передаётся третьим сторонам. Для данных ограниченного доступа внешние сервисы проверки кода чаще всего не подходят по требованиям заказчика, поэтому используем открытые инструменты на вашем оборудовании.

Если контур строится на отечественных системах, список совместимых инструментов уточняем на обследовании; про сопутствующие задачи см. страницу импортозамещения ПО.

Результат

Как понять, что DevSecOps у вас работает

Проверки запускаются в каждой сборке

На всех активных репозиториях, без ручного запуска. Репозиторий, который обходит проверки, виден в списке.

Находки закрываются в срок

Срок зависит от серьёзности и записан в правилах команды. Критичное устраняется до следующего релиза, остальное идёт в планах.

Исключения под контролем

У каждого есть владелец, причина и срок. Раз в месяц исключения с истёкшим сроком пересматриваются, их список не растёт без причины.

Отчёт читают

Находки обсуждаются в ревью, а не закрываются автоматически. Это главный признак: инструменты можно заменить, привычку смотреть результат заменить нечем.

Что делаем

Из чего состоит работа и сколько она стоит

Цены — по тарифам. Сумма следующих этапов называется по итогам предыдущих, остановиться можно после любой ступени.

Обследование конвейера: один-два репозитория

Как собираете и выкладываете, где секреты, как обновляются зависимости. На выходе схема конвейера с точками проверок, порядок подключения и вилка бюджета. Вычитается из первого этапа.

200 000 ₽ · 2–3 недели

Обследование: несколько систем и команд

Несколько систем сборки, разные языки, репозитории подрядчиков. Плюс схема доступа к секретам и таблица ответственных.

350 000 ₽ · 3–4 недели

Пилот: первые проверки на одном-двух продуктах

Поиск секретов, проверка зависимостей и образов, правила для находок и исключений. Разбираем первый отчёт вместе с вашей командой.

150 000–400 000 ₽ · 2–8 недель

Распространение на остальные продукты

Готовые настройки подключаются к другим репозиториям, добавляются проверка кода и конфигурации, часть проверок переводится в блокировку. Этапы с приёмкой.

этапами по 300 000–700 000 ₽

Сопровождение

Обновление правил и баз, разбор спорных находок, помощь с исключениями. Пакет на 60 000 ₽ в месяц — до 12 часов. Сверх пакета — 5 000 ₽ в час.

20 000 / 60 000 / 120 000 ₽ в месяц
Процесс

Как идёт работа

2–4 недели — Обследование: схема конвейера

Смотрим конфигурацию сборки, места хранения секретов, процесс обновления библиотек и права сервисных учётных записей. Решаем, что подключать первым.

Неделя — Подготовка стенда

Создаём тестовую копию конвейера, чтобы пробовать проверки, не рискуя боевым. Подготавливаем зеркала баз и внутренний репозиторий пакетов, если контур закрытый.

2–8 недель — Пилот в режиме «только информирует»

Подключаем первые проверки, собираем отчёты, разбираем их вместе с вашими разработчиками и вносим исключения.

1–2 недели — Переход в блокировку

Включаем блокировку для новых серьёзных находок. Проверяем на тестовой ветке, что блокировка понятна, а сообщения подсказывают исправление.

Дальше — Распространение

Тиражируем готовые настройки на остальные репозитории, добавляем проверку кода и конфигурации, закрываем накопленный долг по плану.

Ежемесячно — Сопровождение

Обновляем правила и базы, пересматриваем исключения, разбираем спорные находки. Объём часов записан в договоре.

Цена

Что двигает цену внутри вилки

Число репозиториев и систем сборки

Один репозиторий с одним GitLab CI и пять репозиториев с тремя разными системами сборки — разный объём настройки. Работа растёт по числу различий, а не по числу строк кода.

Разнообразие языков и сборок

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

Состояние зависимостей

Проект с давно не обновлявшимися библиотеками даст длинный первый отчёт, и время уйдёт на план обновления, а не на настройку проверки.

Закрытый контур

Зеркало баз уязвимостей, внутренний репозиторий пакетов и согласование доступов требуют отдельной работы и сопровождения.

Контроль

Что остаётся у вас и чего мы не делаем

Остаётся у вас

  • Настройки проверок, правила и описание конвейера в вашем репозитории с первого коммита.
  • Инструменты на вашем сервере сборки; подписки на наш сервис нет.
  • Файл исключений с владельцами и сроками, правила для находок разной серьёзности.
  • Инструкция для разработчиков: как читать отчёт, как исправлять типовые находки, как просить исключение.
  • Право остановиться после любой ступени: сделанное остаётся у вас по акту.

Мы этого не делаем

  • Не предоставляем SIEM, WAF и IDS как услугу и не защищаем от DDoS.
  • Не дежурим круглосуточно и не разбираем находки в режиме 24/7.
  • Не атакуем боевые системы и не проводим пентест; не проводим аттестацию, лицензии ФСТЭК у нас нет.
  • Не обучаем разработчиков в формате курсов: показываем на ваших находках, как их исправлять.
  • Не берём работы дешевле 150 000 ₽ и не обещаем, что после внедрения уязвимостей не останется: автоматика находит типовое, а логические ошибки доступа ищет человек.
Граница

DevSecOps, безопасная разработка или аудит: что выбрать

DevSecOps — автоматическая часть большого процесса. Если у вас не определены требования к безопасности, не разбираются угрозы при проектировании и в ревью смотрят только на стиль, начинать стоит с безопасной разработки веб-приложений: автоматика без процесса находит ошибки, но не отвечает на вопрос, кто их исправляет.

Если нужно независимо узнать, что в продукте не так сейчас, а не выстроить процесс, это аудит безопасности веб-приложения: ревью кода и конфигурации с отчётом. Он хорошо сочетается с DevSecOps: аудит показывает накопленное, а проверки в сборке не дают ему вернуться. Вопросы про устройство системы в целом, а не про безопасность, разбирает аудит кода и архитектуры.

Если проблема не в коде, а в доступе сотрудников к системам, это единый вход и второй фактор. Если в разработке участвуют подрядчики, часть проверок записывается в договор и приёмку, подробности есть в статье «DevSecOps: с чего начать небольшой команде».

Инструменты

На чём собираем

Конвейер и проверки
  • GitLab CI, GitHub Actions или Jenkins: что уже есть у вас
  • Gitleaks, OSV-Scanner, OWASP Dependency-Check, Trivy, Grype
  • Semgrep, SonarQube Community, hadolint, Checkov
  • OWASP ZAP для проверки стенда
Данные и отчётность
  • Syft и форматы списка состава CycloneDX или SPDX
  • Хранилище отчётов в вашем репозитории или артефактах сборки
  • Зеркало баз уязвимостей и внутренний репозиторий пакетов
  • Интеграция с трекером задач: GitLab, Jira, Redmine
Материалы

Материалы по теме

Статья

DevSecOps: с чего начать небольшой команде

Три проверки для старта, режимы подключения, работа с шумом и исключениями.

  • Первая тройка
  • Три режима
  • Исключения
Читать →
Статья

Как встроить безопасность в разработку: Secure SDLC

Шесть этапов процесса, проверяемые требования и порядок внедрения на три месяца.

  • Шесть этапов
  • Требования
  • Ревью
Читать →
Статья

OWASP Top 10 простыми словами для заказчика

Классы ошибок, которые ловит автоматика, и те, что находит только человек.

  • Десять классов
  • Что видит автоматика
  • Как читать отчёт
Читать →
Заявка

Расскажите, как у вас собирается и выкладывается код

Сорок минут созвона: на чём собираете, сколько репозиториев, где хранятся секреты и есть ли уже проверки. По итогам скажем, с какой ступени начинать и в какую вилку это укладывается.

Спасибо, заявка отправлена. Ответим в течение рабочего дня.

Не удалось отправить. Напишите в телеграм или позвоните.

Вопросы

Частые вопросы: внедрение DevSecOps

Сколько стоит внедрение DevSecOps?

Обследование конвейера стоит 200 000 ₽ за один-два репозитория и 350 000 ₽ за несколько систем, оно вычитается из первого этапа. Пилот на первых проверках — 150 000–400 000 ₽ за 2–8 недель. Распространение на остальные продукты идёт этапами по 300 000–700 000 ₽, их цена называется после пилота.

С чего начинается внедрение?

С обследования конвейера: смотрим, как вы собираете и выкладываете, где лежат секреты и как обновляются библиотеки. Первыми подключаем поиск секретов, проверку зависимостей и образов, потому что они дают мало ложных срабатываний. Проверку кода правилами и динамические тесты добавляем позже.

Не остановятся ли релизы после внедрения?

Мы вводим каждую проверку в три режима: сначала только информирует, затем предупреждает о новом, затем блокирует новое серьёзное. Накопленные замечания разбираем по плану отдельно. Блокировка не включается, пока не разобран первый отчёт и не отлажены исключения.

Работает ли это в закрытом контуре?

Да. Инструменты запускаются на вашем сервере сборки, базы известных уязвимостей зеркалируются внутрь контура, пакеты берутся из внутреннего репозитория. Код не передаётся третьим сторонам. Для данных ограниченного доступа внешние сервисы проверки чаще всего не подходят по требованиям заказчика.

Какие инструменты вы используете?

Открытые, которые работают на вашем оборудовании: для поиска секретов, проверки зависимостей и образов, правил для кода и конфигурации. Конкретный набор зависит от вашего языка, системы сборки и того, что уже есть. Если у вас куплен сканер, подключаем его, а не заменяем.

Заменяет ли DevSecOps аудит безопасности?

Нет. Автоматика находит типовое: секреты, известные уязвимости, опасные конструкции. Логические ошибки доступа, например чужой заказ по прямой ссылке, находит человек. Аудит и проверки в сборке дополняют друг друга.

Кто будет читать результаты проверок?

Ваша команда. Мы помогаем назначить ответственного, настроить срок реакции по серьёзности и убрать шум. На время сопровождения можем разбирать спорные находки, но круглосуточного дежурства у нас нет.

Кому принадлежат настройки и правила?

Вам. Настройки проверок, правила, файл исключений и инструкции лежат в вашем репозитории с первого коммита и передаются по акту. Подписки на доступ к собственному конвейеру нет, открытые компоненты остаются под своими лицензиями, их список входит в документацию.

Вы работаете только в Ростове-на-Дону?

Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.