Как работать с пользовательскими анализаторами безопасности в CI

Сегодня безопасность кода в разработке становится приоритетом для каждой команды. Рассказываем как настроить SourceCraft, чтобы платформа не только помогала писать код, но и проверяла его на уязвимости и мисконфигурации. Даём инструкции, как подключить анализаторы кода и линтеры, а также интегрировать результаты сканирования напрямую в Pull Request (PR).

Подключение анализаторов и отображение результатов

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

Важная задача безопасности кода — предотвратить попадание секретов в публичные или совместно используемые репозитории. SourceCraft автоматически ищет секреты в каждом коммите и PR. Для улучшения поиска используются сразу несколько движков, которые одновременно сканируют код.

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

Пример интеграции:

  • Подключение SAST (Static Application Security Testing) анализаторов, таких как Semgrep
  • Использование линтеров для языков программирования, например, GoLint для Go
  • Добавление пользовательских правил и сигнатур вместе с пользовательскими анализаторами

Главное требование: результаты работы анализаторов должны быть представлены в формате для представления результатов статического анализа (SARIF, Static Analysis Results Interchange Format). Корректное заполнение SARIF-отчёта позволяет интегрировать результаты анализа непосредственно в интерфейс.

Ключевые поля SARIF отчёта:

  • Описание инструмента, который провёл анализ
  • Информация о конкретном правиле или проверке, по которому обнаружена проблема
  • Указание точного местоположения дефекта: путь к файлу (абсолютный и относительный), номер строки начала и конца
  • Рекомендуется включать Поле Snippet с фрагментом проблемного кода

Создание CI Workflow для запуска анализаторов кода

Для автоматизации запуска анализаторов кода необходимо создать CI Workflow в формате YAML, расположенный в папке SourceCraft в корне репозитория. В CI-файле описываются несколько пайплайнов, каждый из которых отвечает за запуск определённого инструмента. Посмотреть, как это работает можно на платформе прямо в нашем примере.

Пример структуры CI Workflow:

  • Security Pipeline 1: запуск линтера GoLint с указанием Docker-образа
  • Security Pipeline 2: запуск Semgrep для статического анализа безопасности
  • Использование стандартного кубика для загрузки результатов анализа в формате SARIF
on:
  pull_request:
    - workflows: [ security-pipeline1, security-pipeline2 ]
      filter:
        source_branches: [ "**" ]
        target_branches: [ "main", "develop" ]

  push:
    - workflows: [ security-pipeline ]
      filter:
        branches: [ "main", "develop" ]

workflows:
  security-pipeline1:
    tasks:
      - name: golangci-lint-security-scan
        cubes:
          # Step 1: Run your security scanner
          - name: run-security-scanner
            image:
              name: golangci/golangci-lint:v2.5.0-alpine
            script:
              - cd $SOURCECRAFT_WORKSPACE
              - golangci-lint run --output.sarif.path $SOURCECRAFT_WORKSPACE/result.sarif || true

          # Step 2: Optional - Debug/validate results
          - name: validate-scan-results
            script:
              - cat $SOURCECRAFT_WORKSPACE/result.sarif

          # Step 3: Upload results to SourceCraft
          - name: upload-sarif-to-sourcecraft
            image:
              name: sourcecraft/scan-result-uploader:0.6.0
            script:
              - export APPSEC_CUSTOM_ENGINE_NAME="golangci-lint"
              - /app/bin/scan-result-uploader

  security-pipeline2:
    tasks:
      - name: semgrep-security-scan
        cubes:
          # Step 1: Run your security scanner
          - name: semgrep-scan
            image:
              name: semgrep/semgrep:latest
            script:
              - semgrep --config=auto --sarif --output $SOURCECRAFT_WORKSPACE/result.sarif $SOURCECRAFT_WORKSPACE || true

          # Step 2: Optional - Debug/validate results
          - name: validate-scan-results
            script:
              - cat $SOURCECRAFT_WORKSPACE/result.sarif

          # Step 3: Upload results to SourceCraft
          - name: scan-result-uploader
            image:
              name: sourcecraft/scan-result-uploader:0.6.0
            script:
              - export APPSEC_CUSTOM_ENGINE_NAME="Semgrep OSS"
              - /app/bin/scan-result-uploader

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

Полноэкранное изображение

Использование компонента Scan Result Uploader для загрузки результатов сканирования

После запуска анализаторов и генерации SARIF-отчёта, необходимо загрузить результаты в SourceCraft. Для этого используется специальный инструмент — Scan Result Uploader (кубик), который выполняет следующие действие:

  • Принимает и валидирует SARIF-отчёт
  • Опционально указывает название анализатора
  • Классифицирует результаты по категориям решений: SAST, SC, Static Analysis, Secrets

Этот инструмент (кубик) размещен в опенсорсе у нас на платформе. Пример работы с ним также можно найти на SourceCraft.

Полноэкранное изображение

Загрузка результатов с помощью этого компонента позволяет получить централизованный и структурированный обзор уязвимостей.

Просмотр результатов в PR

Результаты сканирования отображаются в интерфейсе PR и содержат следующую информацию:

  • Комментарии и предупреждения от имени пользователя, создавшего PR
  • Список результатов от нескольких анализаторов и линтеров
  • Подробное описание найденных ошибок с указанием месте в коде
Полноэкранное изображение

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

Как использовать в своем проекте

  1. Включите сканирование во вкладке «Безопасность» в настройках репозитория
  2. Добавьте в Workflow запуск анализаторов и загрузку SARIF-отчётов через Scan Result Uploader
  3. Проверьте, как находки отображаются в PR
Как работать с пользовательскими анализаторами безопасности в CI
Войдите, чтобы сохранить пост