Настройка пользовательского анализатора безопасности в SourceCraft

В этом практическом руководстве вы настроите SourceCraft так, чтобы платформа не только помогала писать код, но и проверяла его на уязвимости и мисконфигурации. Для этого вы подключите к репозиторию анализатор кода и линтер, а также интегрируете результаты сканирования напрямую в предложение изменений (pull request).

Чтобы настроить пользовательский анализатор в репозитории SourceCraft:

  1. Создайте репозиторий.
  2. Настройте анализатор.
  3. Создайте предложение изменений.
  4. Проверьте результат.

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

Создайте репозиторий

Создайте репозиторий в SourceCraft и включите сканирование безопасности.

  1. Откройте главную страницу сервиса.

  2. На панели слева нажмите Создать репозиторий.

  3. В открывшемся окне выберите Пустой репозиторий.

  4. В блоке Сведения о новом репозитории:

    • В поле Владелец выберите организацию.

    • В поле Название укажите название репозитория.

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

      Под названием отображается адрес, по которому репозиторий будет доступен.

  5. В блоке Настройки включите опцию Сразу добавить README.

  6. Нажмите Создать репозиторий.

  7. Дождитесь создания репозитория, затем на его странице в разделе Настройки репозитория перейдите в секцию Безопасность.

  8. Включите опцию Сканирование безопасности.

Настройте анализатор

Настройте CI/CD для запуска пользовательского анализатора безопасности. Для этого создайте конфигурационный файл, который определяет два пайплайна: для запуска линтера Golangci-lint и инструмента статического анализа кода Semgrep.

Для интеграции с SourceCraft результаты работы анализаторов должны быть представлены в формате SARIF (Static Analysis Results Interchange Format). Этот формат позволяет стандартизировать представление результатов статического анализа и интегрировать их в интерфейс платформы.

  1. На вкладке Домой перейдите в раздел Ваша мастерская Репозитории.

  2. Выберите созданный ранее репозиторий.

  3. На странице репозитория в разделе Код перейдите в секцию Обзор.

  4. Нажмите Новый Файл.

  5. В открывшемся окне укажите путь с именем файла .sourcecraft/ci.yaml и нажмите Создать файл.

  6. Вставьте код:

    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:
              - name: env
                script:
                  - env
              # 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:
              - name: env
                script:
                  - env
              # 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
    
  7. В правом верхнем углу нажмите Сохранить изменения.

  8. В открывшемся окне:

    1. В поле Сообщение об изменениях укажите комментарий:

      Настройка анализатора безопасности
      
    2. В блоке Ветка изменений выберите Сохранить непосредственно в ветку: main.

    3. В блоке Действие после сохранения изменений выберите Просто сохранить.

    4. Нажмите Сохранить изменения.

Создайте предложение изменений

Создайте тестовый файл и предложение изменений, которое автоматически запустит проверки безопасности.

В этом примере для теста используется код из проекта OWASP Juice Shop — это намеренно уязвимое веб‑приложение, созданное для обучения информационной безопасности. Вы можете ознакомиться с ним в репозитории juice-shop на GitHub.

  1. На вкладке Домой перейдите в раздел Ваша мастерская Репозитории.

  2. Выберите созданный ранее репозиторий.

  3. На странице репозитория в разделе Код перейдите в секцию Обзор.

  4. Нажмите Новый Файл.

  5. В открывшемся окне укажите имя и путь файла, например, routes/redirect.ts и нажмите Создать файл.

  6. Скопируйте и вставьте код из соответствующего файла репозитория juice-shop.

  7. В правом верхнем углу нажмите Сохранить изменения.

  8. В открывшемся окне:

    1. В поле Сообщение об изменениях укажите комментарий:

      Тестовый код для анализатора безопасности
      
    2. В блоке Ветка изменений выберите Создать новую ветку для этих изменений и укажите название ветки test-analyzer.

    3. В блоке Действие после сохранения изменений выберите Сохранить и создать новое предложение изменений.

    4. Нажмите Сохранить изменения.

  9. На открывшейся странице Предложить изменения в правом верхнем углу нажмите Опубликовать предложение изменений.

    В результате вы увидите страницу предложения изменений с запущенными проверками. Обновите ее и дождитесь завершения проверок security-pipeline1 и security-pipeline2.

Проверьте результат

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

  • Комментарии и предупреждения от имени пользователя, создавшего предложение изменений.
  • Список результатов от настроенных анализаторов и линтеров.
  • Подробное описание найденных ошибок с указанием места в коде.
  1. На вкладке Домой перейдите в раздел Ваша мастерская Репозитории.

  2. Выберите созданный ранее репозиторий.

  3. На странице репозитория в разделе Код перейдите в секцию Предложения изменений.

  4. Выберите предложение изменений test-analyzer.

  5. В разделе Активность изучите комментарии от SourceCraft Security Bot.

    Пример комментария по результатам проверки:

    ...
    res.redirect(toUrl)
    ...
    
    🔒 [Semgrep OSS] has found the potential problem
    
    ⚠️ Problem: The application redirects to a URL specified by user-supplied input query that is not
    validated. This could redirect users to malicious locations. Consider using an allow-list approach
    to validate URLs, or warn users they are being redirected to a third-party website.
    
    Short Description: Semgrep Finding: javascript.express.security.audit.express-open-redirect.express-open-redirect
    
    Full Description: The application redirects to a URL specified by user-supplied input $REQ that is
    not validated. This could redirect users to malicious locations. Consider using an allow-list
    approach to validate URLs, or warn users they are being redirected to a third-party website.
    

Как удалить созданные ресурсы

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

См. также