Конкуренты5 мин чтения2026-03-06

GitLab и Semgrep: как интегрировать статический анализ в CI/CD

Когда я впервые настраивал SAST в GitLab, потратил полтора дня на то, чтобы понять разницу между встроенным анализом и Semgrep. Сейчас видел десятки проектов, к

Когда я впервые настраивал SAST в GitLab, потратил полтора дня на то, чтобы понять разницу между встроенным анализом и Semgrep. Сейчас видел десятки проектов, которые делают то же самое. Давайте разберёмся, что где работает и зачем это нужно.

Что такое Semgrep и почему о нём говорят все

Semgrep — это инструмент статического анализа кода, который ищет уязвимости и ошибки с помощью паттернов. На первый взгляд — просто ещё один linter. На самом деле это совсем другой подход.

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

# Semgrep найдёт эту уязвимость
password = request.GET['password']
execute_query(password)  # SQL injection!

# А обычный linter просто скажет "переменная не используется красиво"

Semgrep написан на OCaml, очень быстрый (анализирует большие репозитории за секунды) и поддерживает кучу языков: Python, JavaScript, TypeScript, Java, Go, PHP, C, C++, Ruby, Kotlin и другие. Главное — он работает без компиляции, прямо с исходниками.

GitLab встроил Semgrep в свой SAST (Static Application Security Testing) ещё в версии 13.12. То есть если у вас есть GitLab CI, вы можете запустить анализ буквально в несколько строк.

Как интегрировать Semgrep в GitLab CI

Честно? Это проще, чем кажется. Вот базовая конфигурация:

# .gitlab-ci.yml
stages:
  - test
  - sast

semgrep-sast:
  stage: sast
  image: returntocorp/semgrep
  script:
    - semgrep --config=p/owasp-top-ten --json --output=semgrep-report.json .
  artifacts:
    reports:
      sast: semgrep-report.json
  allow_failure: true

Готово. На следующем push в MR появятся замечания прямо в коде.

Но если вы используете встроенный GitLab SAST, то конфиг ещё проще:

include:
  - template: Security/SAST.gitlab-ci.yml

variables:
  SAST_EXCLUDED_PATHS: tests, node_modules

GitLab сам запустит все доступные анализаторы, включая Semgrep. Замечания будут в отчёте "Security" на странице MR.

Я видел проекты, которые просто добавили эту строку и забыли про неё. Потом через месяц обнаружили, что находится кучу настоящих багов.

Плюсы и минусы Semgrep в GitLab

Что работает хорошо:

Semgrep очень быстрый. На проекте с 50 тысячами строк кода анализ занимает 3-5 секунд. Это значит, что вы можете запускать его на каждый commit, а не только на ночь.

Правила написаны на YAML, а не на регулярных выражениях. Это значит, что их легко читать и модифицировать. Вот правило для поиска hardcoded паролей:

rules:
  - id: hardcoded-password
    patterns:
      - pattern-either:
          - pattern: password = "..."
          - pattern: password = '...'
    message: Hardcoded password detected
    languages: [python]
    severity: HIGH

Библиотека правил огромная. Semgrep поддерживает готовые наборы для OWASP Top 10, CWE, MISRA и других стандартов. Можно просто включить нужный и всё работает.

Интеграция с GitLab встроена. Не нужно ничего дополнительного — просто добавил в CI и готово.

Где подводит:

False positives. Да, Semgrep лучше, чем обычные linter'ы, но он всё равно может ругаться на безопасный код. На одном проекте мы внедрили стандартный набор правил и получили 200 предупреждений. Половину пришлось отключить.

Правила нужно настраивать под проект. Если у вас своя архитектура и свои соглашения, стандартные наборы могут быть бесполезны.

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

Бесплатный Semgrep имеет ограничения. Для работы с приватными репозиториями и advanced features нужна подписка.

Альтернативы и когда их использовать

Встроенный GitLab SAST

GitLab включает несколько анализаторов: Semgrep, SpotBugs (для Java), Gosec (для Go), Bandit (для Python). Если вы используете стандартный стек и вам хватает базовых проверок — просто включите встроенный SAST. Дополнительных затрат нет.

Но если нужна гибкость и кастомные правила — Semgrep лучше.

Sonarqube

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

OWASP Dependency-Check

Ищет уязвимости в зависимостях. Semgrep анализирует исходный код, а Dependency-Check — ваши библиотеки. Лучше использовать оба.

Российские альтернативы

Честно, на рынке не много локальных решений. Distiq — это AI-бот для code review, который находит баги, уязвимости и проблемы с производительностью. Интегрируется в GitLab за 2 минуты, анализирует каждый MR и оставляет инлайн-комментарии. Данные остаются в РФ, поддерживает все популярные языки. Если вам нужен автоматический code review без лишних движений — вот это работает.

Таблица сравнения

Параметр Semgrep GitLab SAST Sonarqube Distiq
Скорость анализа Очень быстро (3-5 сек) Быстро Медленно Быстро
Кастомные правила Да, на YAML Ограниченно Да, на Java Нет (но не нужны)
Анализ потока данных Нет Нет Да Да (AI)
Интеграция с GitLab Встроена Встроена Через плагин Встроена
Цена Бесплатно / 50$/мес Встроено в GitLab 100+ $/год 99-199 $/мес
Русские серверы Нет Можно selfhosted Можно selfhosted Да
Поддержка языков 20+ 10+ 20+ 20+

Практический пример: настройка для реального проекта

У вас есть Python-приложение с API. Вам нужно:

  1. Ловить SQL injection и XSS
  2. Проверять безопасность зависимостей
  3. Находить логические ошибки в бизнес-логике
  4. Не задалбливать разработчиков false positives

Вот конфиг:

# .gitlab-ci.yml
include:
  - template: Security/SAST.gitlab-ci.yml
  - template: Security/Dependency-Scanning.gitlab-ci.yml

semgrep-sast:
  variables:
    SEMGREP_RULES: >
      p/owasp-top-ten
      p/cwe-top-25
      p/django
  allow_failure: false  # Будем ругаться на серьёзное

sast:
  allow_failure: true  # А встроенный SAST — только информация

Запустите это и увидите замечания в MR. Если что-то ложное — добавьте # nosemgrep над строкой кода.

Итого: выбирать или не выбирать Semgrep?

Semgrep имеет смысл, если:

Если вы просто хотите быстро включить анализ и забыть — используйте встроенный GitLab SAST. Этого хватит для большинства проектов.

Если же вам нужен анализ, который реально находит баги (а не просто ругается на стиль), попробуйте Distiq. Это AI-бот, который понимает контекст кода и оставляет инлайн-комментарии прямо в MR. Работает с GitLab, GitHub и GitVerse, данные в РФ. За 2 минуты интеграции вы получаете полноценный code review автоматом.

Попробуйте Distiq для автоматического code review

AI-бот анализирует каждый MR/PR и оставляет комментарии с замечаниями. Интеграция за 2 минуты.

Попробовать бесплатно

Похожие статьи