Настройка сканирования кодов

Сканирование кода в GitHub Advanced Security для Azure DevOps позволяет анализировать код в репозитории Azure DevOps, чтобы найти уязвимости безопасности и ошибки кода. Вам потребуется GitHub Advanced Security для Azure DevOps или, если вы используете автономную версию, GitHub Code Security для Azure DevOps включить. Все проблемы, выявленные в процессе анализа, регистрируются как оповещения. Сканирование кода использует CodeQL для выявления уязвимостей.

CodeQL — это подсистема анализа кода, разработанная GitHub для автоматизации проверок безопасности. Вы можете анализировать код с помощью CodeQL и отображать результаты в виде оповещений проверки кода. Дополнительные сведения о CodeQL см. в документации CodeQL.

GitHub Advanced Security for Azure DevOps работает с Azure Repos. Чтобы использовать GitHub Advanced Security с репозиториями GitHub, см. GitHub Advanced Security.

Предпосылки

Категория Требования
Разрешения — Чтобы просмотреть сводку всех оповещений для репозитория, нужны разрешения участника для репозитория.
— Чтобы закрыть оповещения в расширенной безопасности: Администратор проекта разрешения.
— Управление разрешениями в дополнительной безопасности: член группы Администраторы собраний проектов или Дополнительная безопасность: управление параметрами при наличии набора разрешений, установленного на Разрешить.

Дополнительные сведения о разрешениях расширенной безопасности см. в разделе Управление разрешениями расширенной безопасности.

Сведения о типах установки сканирования кода

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

Настройка по умолчанию Расширенная настройка
Configuration Автоматическая, конфигурация конвейера не требуется Вручную требуется добавление задач CodeQL в конвейер
Распознавание языка Автоматически обнаруживает и сканирует поддерживаемые языки CodeQL Вы указываете языки в задаче конвейера
Покрытие ветви Сканирует только ветвь по умолчанию Сканирует любую ветвь, которая активирует конвейер
Настройка сборки Нет пользовательских шагов сборки — использует none режим сборки Полный контроль над этапами сборки для скомпилированных языков
лучше всего подходит для Быстрая активация, стандартные потребности в сканировании Проверка нескольких ветвей, настраиваемый пул агентов или частота сканирования

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

Advanced setup предоставляет полный контроль путем добавления задач CodeQL непосредственно в Azure Pipelines. Используйте расширенную настройку при необходимости:

  • Управление конкретными пулами агентов для различных языков или вычислительных потребностей
  • Настройка шагов сборки для скомпилированных языков
  • Сканирование ветвей за пределами ветви по умолчанию
  • Интеграция сканирования кода в существующий конвейер CI/CD
  • Использование определенного набора запросов CodeQL или пользовательских запросов

Совет

Вы можете начать с установки по умолчанию и переключиться на расширенную настройку позже, если вам потребуется больше элементов управления или использовать оба. Сведения о настройке настройки по умолчанию см. в разделе Configure GitHub расширенные функции безопасности.

Настройка параметров установки по умолчанию

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

Чтобы получить доступ к настраиваемым параметрам, перейдите в репозитории параметров организациии разверните раскрывающийся список >параметров настройки CodeQL по умолчанию.

Снимок экрана: развернутые параметры настройки CodeQL по умолчанию, показывающие пул агентов и параметры расписания сканирования.

Пул агентов

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

  • Azure Pipelines — использует Microsoft размещенные агенты. Использование пула агентов Azure Pipelines использует параллелизм конвейера.
  • Пулы локальных агентов — используют собственные агенты. Выберите автономный пул, если репозитории требуют доступа к частным сетям, определенным средствам сборки или другим ресурсам, недоступным для размещенных агентов.
  • Managed DevOps Pools — использует управляемые Azure пулы с пользовательскими образами виртуальных машин.

Расписание сканирования

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

Отмените выполняющиеся или запланированные сканирования

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

Расширенная настройка для сканирования кода

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

Совет

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

Добавьте задачи в следующем порядке:

  1. Advanced Security Initialize CodeQL (AdvancedSecurity-Codeql-Init@1)
  2. Шаги сборки на заказ
  3. Расширенный анализ безопасности CodeQL (AdvancedSecurity-Codeql-Analyze@1)

Снимок экрана: настройка конвейера сканирования кода для YAML.

Кроме того, укажите язык Initialize CodeQL, который вы анализируете в задаче. Вы можете использовать разделенный запятыми список для анализа нескольких языков одновременно. Поддерживаемые языки.csharp, cpp, go, java, javascript, python, ruby, swift Если вы используете локальные агенты, вы также можете добавить enableAutomaticCodeQLInstall: true переменную, чтобы автоматически установить последние биты CodeQL для агента.

Ниже приведен пример начального конвейера:

trigger:
  - main

pool:
  # Additional hosted image options are available: https://dori-uw-1.kuma-moon.com/en-us/azure/devops/pipelines/agents/hosted#software
  vmImage: ubuntu-latest

steps:

  - task: AdvancedSecurity-Codeql-Init@1
    inputs:
      languages: "java"
      # Supported languages: csharp, cpp, go, java, javascript, python, ruby, swift
      # You can customize the initialize task: https://dori-uw-1.kuma-moon.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-codeql-init-v1?view=azure-pipelines
      # If you're using a self-hosted agent to run CodeQL, use `enableAutomaticCodeQLInstall` to automatically use the latest CodeQL bits on your agent:
      enableAutomaticCodeQLInstall: true

#   Add your custom build steps here
# - Ensure that all code to be scanned is compiled (often using a `clean` command to ensure you're building from a clean state).
# - Disable the use of any build caching mechanisms as this can interfere with CodeQL's ability to capture all the necessary data during the build.
# - Disable the use of any distributed/multithreaded/incremental builds as CodeQL needs to monitor executions of the compiler to construct an accurate representation of the application.
# - For dependency scanning, ensure you have a package restore step for more accurate results.

# If you had a Maven app:
#   - task: Maven@4
#     inputs:
#       mavenPomFile: 'pom.xml'
#       goals: 'clean package'
#       publishJUnitResults: true
#       testResultsFiles: '**/TEST-*.xml'
#       javaHomeOption: 'JDKVersion'
#       jdkVersionOption: '1.17'
#       mavenVersionOption: 'Default'

# Or a general script:
#   - script: |
#       echo "Run, Build Application using script"
#       ./location_of_script_within_repo/buildscript.sh

  - task: AdvancedSecurity-Dependency-Scanning@1 # More details on this task: https://dori-uw-1.kuma-moon.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-dependency-scanning-v1?view=azure-pipelines

  - task: AdvancedSecurity-Codeql-Analyze@1 # More details on this task: https://dori-uw-1.kuma-moon.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-codeql-analyze-v1?view=azure-pipelines

Кроме того, укажите язык Initialize CodeQL, который вы анализируете в задаче. Если указан язык swift, необходимо выполнить пользовательские действия сборки.

Совет

  • Используйте java для анализа кода, написанного Java, Kotlin или обоих.
  • Используется javascript для анализа кода, написанного в JavaScript, TypeScript или обоих.

Если вы работаете на локальном агенте, выберите Enable automatic CodeQL detection and installation, чтобы автоматически использовать самую последнюю версию CodeQL на вашем агенте, если вы не установили последний пакет CodeQL в кэш инструментов агента.

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

Дополнительные конфигурации для сканирования кода

Поддержка языка и запросов

GitHub эксперты, исследователи безопасности и участники сообщества записывают и поддерживают запросы CodeQL по умолчанию, используемые для сканирования кода. Запросы регулярно обновляются для улучшения анализа и уменьшения количества ложноположительных результатов. Запросы open source, поэтому вы можете просматривать и вносить вклад в запросы в репозитории github/codeql.

CodeQL поддерживает и использует следующие идентификаторы языка:

Язык Идентификатор
C/C++ cpp
C# csharp
Поехали go
Java/Котлин java
JavaScript/TypeScript javascript
Python python
Руби ruby
Свифт swift

Совет

  • Используется cpp для анализа кода, написанного на языке C, C++ или обоих.
  • Используйте java для анализа кода, написанного Java, Kotlin или обоих.
  • Используется javascript для анализа кода, написанного на JavaScript, TypeScript или обоих.

Дополнительные сведения см. в разделе "Поддерживаемые языки и платформы".

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

Снимок экрана: задача публикации результатов сканирования кода.

Настройка режима сборки сканирования кода

Сканирование кода поддерживает два режима сборки при настройке конвейера для сканирования:

  • none — база данных CodeQL создается непосредственно из базы кода, не создавая базу кода (поддерживается для всех интерпретированных языков и дополнительно поддерживается для cpp, javaи csharp).
  • manual — вы определяете шаги сборки, используемые для базы кода в рабочем процессе (поддерживается для всех скомпилированных языков).

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

Совет

Режим сборки none можно использовать с другими интерпретируемыми языками, например JavaScript, Python, Ruby. Если для C# или Java задан режим сборки none в сочетании с другими скомпилированными языками, которые не поддерживают режим сборки none, задача конвейера завершается ошибкой.

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

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# and Java, and JavaScript is an interpreted language
# and build mode `none` has no impact on JavaScript analysis
    languages: 'csharp, java, javascript' 
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

В следующем коде показан пример недопустимой конфигурации с несколькими языками и режимом сборки none:

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# but build mode `none` is NOT supported for Swift
# so this pipeline definition will result in a failed run
    languages: 'csharp, swift'
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

Оповещения о проверке кода

GitHub Расширенная безопасность для Azure DevOps оповещения о сканировании кода включают флаги сканирования кода по репозиториям, которые предупреждают об уязвимостях на уровне кода приложения.

Чтобы использовать сканирование кода, необходимо сначала настроить GitHub расширенную безопасность для Azure DevOps.

Вкладка "Расширенная безопасность" в Repos в Azure DevOps — это концентратор для просмотра оповещений сканирования кода. Выберите вкладку "Сканирование кода" для просмотра оповещений сканирования. Вы можете фильтровать по ветви, состоянию, конвейеру, типу правила и степени серьезности. В настоящее время центр оповещений не отображает оповещения о сканировании, завершенном в ветвях PR.

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

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

Снимок экрана оповещений о сканировании кода для репозитория.

Если отключить расширенную безопасность для репозитория, вы потеряете доступ к результатам на вкладке "Расширенная безопасность" и задаче сборки. Задача сборки не проваливается, но любые результаты сборок, выполненных с задачей, пока расширенная безопасность отключена, скрыты и не сохраняются.

Сведения об оповещении

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

Снимок экрана с подробностями о предупреждении по сканированию кода.

Раздел Описание
Расположение В разделе "Расположения" подробно описан конкретный экземпляр, в котором CodeQL обнаружил уязвимость. Если в вашем коде несколько случаев нарушения одного и того же правила, создается новое оповещение для каждого отдельного местоположения. Карточка "Расположения" содержит прямую ссылку на затронутый фрагмент кода, чтобы можно было выбрать фрагмент кода, который будет направлен на веб-интерфейс Azure DevOps для редактирования.
Описание Описание предоставляется средством CodeQL, основанным на проблеме.
Рекомендация Рекомендация — это предлагаемое исправление для заданного оповещения проверки кода.
Пример В разделе примера показан упрощенный пример обнаруженной слабости в коде.
Тяжесть Уровни серьезности могут быть низкими, средними, высокими или критическими. Оценка серьезности основана на заданной оценке распространенных уязвимостей (CVSS) для идентифицированного перечня распространенных уязвимостей (CWE). Узнайте больше о том, как серьезность оценивается в этом посте блога GitHub.

Просмотр оповещений для репозитория

Любой пользователь с разрешениями участника для репозитория может просмотреть сводку всех оповещений для репозитория на вкладке "Расширенная безопасность" в Repos. Перейдите на вкладку "Сканирование кода", чтобы просмотреть все оповещения о сканировании секретов.

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

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

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

Закрытие оповещений сканирования кода

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

Чтобы закрыть оповещение:

  1. Перейдите к оповещению, которое вы хотите закрыть, и нажмите на него.
  2. Выберите раскрывающийся список "Закрыть оповещение".
  3. Если этот параметр еще не выбран, выберите "Риск принят " или "Ложный положительный результат " в качестве причины закрытия.
  4. Добавьте необязательный комментарий в текстовое поле "Комментарий ".
  5. Нажмите кнопку "Закрыть", чтобы отправить и закрыть оповещение.
  6. Состояние оповещения изменяется с открыто на закрыто, и отображается причина отклонения.

Снимок экрана: как закрыть оповещение сканирования кода.

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

Управление оповещениями сканирования кода в пулреквестах

Если оповещения создаются для изменения нового кода в запросе на вытягивание, оповещение сообщается как заметка в разделе комментариев вкладки "Обзор" запроса на вытягивание и в качестве оповещения на вкладке "Расширенный репозиторий безопасности". Существует новая запись средства выбора ветви для ветви запроса на вытягивание.

Вы можете просмотреть затронутые строки кода, увидеть сводку по обнаружению и разрешить аннотацию в разделе "Обзор".

Скриншот аннотации активного pull request кода.

Чтобы закрыть оповещения о pull request'ах, необходимо перейти к представлению сведений об оповещении, чтобы закрыть оповещение и разрешить аннотацию. В противном случае простое изменение состояния комментария (1) решает вопрос комментария, но ни закрывает, ни исправляет основное предупреждение.

Снимок экрана: аннотация закрытого pull request кода.

Чтобы просмотреть весь набор результатов для ветви запроса на вытягивание, перейдите к Repos>Advanced Security и выберите ветвь запроса на вытягивание. При нажатии кнопки "Показать дополнительные сведения " (2) на заметке отображается представление сведений об оповещении на вкладке "Расширенная безопасность".

Совет

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