Сведения о создании результатов сканирования кода с помощью CodeQL CLI
После того как вы обеспечили доступ к CodeQL CLI для серверов в системе непрерывной интеграции и удостоверились, что они могут проходить проверку подлинности с помощью GitHub, можно приступить к созданию данных.
Для создания результатов и их отправки в GitHub используются три разных команды:
database createдля создания базы данных CodeQL для представления иерархической структуры каждого поддерживаемого языка программирования в репозитории.database analyzeдля выполнения запросов по анализу каждой базы данных CodeQL и суммирования результатов в файле SARIF.github upload-resultsдля загрузки полученных файлов SARIF в GitHub, где результаты сопоставляются с ветвью или запросом на вытягивание и отображаются в виде оповещений code scanning.
Вы можете отобразить справку командной строки для любой команды, используя параметр --help
Примечание. Передача данных SARIF для отображения как code scanning приводит к тому, что GitHub поддерживается для репозиториев, принадлежащих организации, с включенными GitHub Advanced Security и для общедоступных репозиториев на GitHub.com. Дополнительные сведения см. в разделе Управление параметрами безопасности и анализа для репозитория.
Создание баз данных CodeQL для анализа
-
Извлеките код, который нужно проанализировать:
- Для ветви извлеките заголовок ветви, которую необходимо проанализировать.
- Для запроса на вытягивание извлеките фиксацию заголовка запроса на вытягивание или фиксацию слияния запроса на вытягивание, сгенерированную с помощью GitHub.
-
Настройте среду для базы кода, убедившись, что все зависимости доступны. Дополнительные сведения см. в разделах Создание базы данных CodeQL и Создание базы данных CodeQL.
-
Найдите команду сборки (если таковая имеется) для базы кода. Обычно она доступна в файле конфигурации в системе CI.
-
Запустите
codeql database createиз корня извлечения вашего репозитория и выполните сборку базы кода.# Single supported language - create one CodeQL database codeql database create <database> --command<build> --language=<language-identifier> # Multiple supported languages - create one CodeQL database per language codeql database create <database> --command<build> \ --db-cluster --language=<language-identifier>,<language-identifier>Примечание. Если вы используете контейнерную сборку, вам нужно запустить CodeQL CLI в контейнере, где выполняется задача сборки.
| Параметр | Обязательно | Использование |
|---|---|---|
<database> | Укажите имя и расположение каталога, который необходимо создать для базы данных CodeQL. Команда завершится ошибкой, если вы попытаетесь перезаписать существующий каталог. Если также указать --db-cluster, это родительский каталог, а для каждого проанализированного языка создается подкаталог. | |
--language | Укажите идентификатор языка, для которого нужно создать базу данных, один из следующих: cpp`, `csharp`, `go`, `java`, `javascript`, `python`и `ruby (используйте javascript для анализа кода TypeScript и java для анализа кода Kotlin). При использовании с --db-cluster | |
--command | Рекомендуется. Используйте для указания команды сборки или скрипта, вызывающего процесс сборки для базы кода. Команды запускаются из текущей папки или, если она определена, из --source-root | |
--db-cluster | Используйте в многоязычных базах кода для создания одной базы данных для каждого языка, заданного --language | |
--no-run-unnecessary-builds | Рекомендуется. Используйте, чтобы подавлять команду сборки для языков, где CodeQL CLI не нужно отслеживать сборку (например, Python и JavaScript/TypeScript). | |
--source-root | Используйте, если вы запускаете CLI за пределами корневого элемента извлечения репозитория. По умолчанию командой database create предполагается, что текущий каталог является корневым каталогом для исходных файлов. Используйте этот параметр, чтобы указать другое местоположение. | |
--codescanning-config | Расширенный Используйте этот вариант, если у вас есть файл конфигурации, указывающий, как создавать базы данных CodeQL и какие запросы будут выполняться на последующих шагах. Дополнительные сведения см. в разделах Настройка сканирования кода и Database Create. |
Дополнительные сведения см. в разделе Создание базы данных CodeQL.
Пример использования одного языка
В этом примере создается база данных CodeQL для репозитория, извлеченного в папку /checkouts/example-repo. Он использует средство извлечения JavaScript для создания иерархического представления кода JavaScript и TypeScript в репозитории. Результирующая база данных хранится в /codeql-dbs/example-repo.
$ codeql database create /codeql-dbs/example-repo --language=javascript \
--source-root /checkouts/example-repo
> Initializing database at /codeql-dbs/example-repo.
> Running command [/codeql-home/codeql/javascript/tools/autobuild.cmd]
in /checkouts/example-repo.
> [build-stdout] Single-threaded extraction.
> [build-stdout] Extracting
...
> Finalizing database at /codeql-dbs/example-repo.
> Successfully created database at /codeql-dbs/example-repo.
Пример с несколькими языками
В этом примере создаются две базы данных CodeQL для репозитория, извлеченного в папку /checkouts/example-repo-multi. Он использует следующую информацию:
--db-clusterдля запроса анализа более чем одного языка.--languageдля указания, для каких языков следует создавать базы данных.--command, чтобы сообщить инструменту команду сборки для базы кода. Здесь этоmake.--no-run-unnecessary-buildsчтобы сообщить инструменту о необходимости пропустить команду сборки для языков, где она не требуется (например, Python).
Результирующие базы данных хранятся в подкаталогах python и cpp в /codeql-dbs/example-repo-multi.
$ codeql database create /codeql-dbs/example-repo-multi \
--db-cluster --language python,cpp \
--command make --no-run-unnecessary-builds \
--source-root /checkouts/example-repo-multi
Initializing databases at /codeql-dbs/example-repo-multi.
Running build command: [make]
[build-stdout] Calling python3 /codeql-bundle/codeql/python/tools/get_venv_lib.py
[build-stdout] Calling python3 -S /codeql-bundle/codeql/python/tools/python_tracer.py -v -z all -c /codeql-dbs/example-repo-multi/python/working/trap_cache -p ERROR: 'pip' not installed.
[build-stdout] /usr/local/lib/python3.6/dist-packages -R /checkouts/example-repo-multi
[build-stdout] [INFO] Python version 3.6.9
[build-stdout] [INFO] Python extractor version 5.16
[build-stdout] [INFO] [2] Extracted file /checkouts/example-repo-multi/hello.py in 5ms
[build-stdout] [INFO] Processed 1 modules in 0.15s
[build-stdout] <output from calling 'make' to build the C/C++ code>
Finalizing databases at /codeql-dbs/example-repo-multi.
Successfully created databases at /codeql-dbs/example-repo-multi.
$
Анализ базы данных CodeQL
- Создайте базу данных CodeQL (см. выше).
- Запустите
codeql database analyzeв базе данных и укажите, какие пакеты и (или) запросы нужно использовать.codeql database analyze <database> --format=<format> \ --output=<output> --download <packs,queries>
Примечание. Если вы анализируете более одной базы данных CodeQL для одной фиксации, необходимо указать категорию SARIF для каждого набора результатов, создаваемых этой командой. При отправке результатов в GitHub code scanning использует эту категорию для хранения результатов для каждого языка отдельно. Если вы забыли это сделать, то при каждой отправке будут перезаписаны предыдущие результаты.
codeql database analyze <database> --format=<format> \
--sarif-category=<language-specifier> --output=<output> \
<packs,queries>
| Параметр | Обязательно | Использование |
|---|---|---|
<database> | Укажите путь к каталогу, содержащему базу данных CodeQL для анализа. | |
<packs,queries> | Укажите пакеты или запросы CodeQL для выполнения. Чтобы выполнить стандартные запросы, используемые для code scanning, опустите этот параметр. Чтобы просмотреть другие наборы запросов, включенные в пакет CodeQL CLI, выполните поиск в /<extraction-root>/qlpacks/codeql/<language>-queries/codeql-suites. Сведения о создании собственного набора запросов см. в статье Создание наборов запросов CodeQL в документации по CodeQL CLI. | |
--format | Укажите формат для файла результатов, созданного командой. Для отправки в GitHub это должен быть: sarif-latest. Дополнительные сведения см. в разделе Поддержка SARIF для проверки кода. | |
--output | Укажите, где следует сохранить файл результатов SARIF. | |
--sarif-category | Необязательно для анализа отдельных баз данных. Требуется для определения языка при анализе нескольких баз данных для одной фиксации в репозитории. Укажите категорию для включения в файл результатов SARIF для этого анализа. Категория используется для различения нескольких анализов для одного и того же средства и фиксации, но для разных языков или различных частей кода. | |
--sarif-add-query-help | Используйте, если хотите включить доступную справку по запросам на языке разметки markdown для пользовательских запросов, используемых при анализе. Любая справка по пользовательским запросам, содержащимся в выходных данных SARIF, будет отображаться в пользовательском интерфейсе проверки кода, если соответствующий запрос создает предупреждение. Дополнительные сведения см. в разделе Анализ баз данных с помощью интерфейса командной строки CodeQL. | |
<packs> | Используйте, если необходимо включить пакеты запросов CodeQL в анализ. Дополнительные сведения см. в разделе Скачивание и использование пакетов данных CodeQL. | |
--download | Используйте, если некоторые из ваших пакетов запросов CodeQL еще не находятся на диске и их необходимо скачать перед выполнением запросов. | |
--threads | Используйте, если требуется использовать более одного потока для выполнения запросов. Значение по умолчанию — 1. Можно указать больше потоков для ускорения выполнения запросов. Чтобы задать число потоков, равное числу логических процессоров, укажите 0. | |
--verbose | Используйте для получения более подробных сведений о процессе анализа и диагностических данных из процесса создания базы данных. |
Дополнительные сведения см. в статье Анализ баз данных с помощью CodeQL CLI".
Базовый пример анализа базы данных CodeQL
В этом примере анализируется база данных CodeQL, хранящаяся в папке /codeql-dbs/example-repo, и результаты сохраняются в виде файла SARIF: /temp/example-repo-js.sarif. Он использует --sarif-category, чтобы включить в файл SARIF дополнительные сведения, определяющие результаты в виде JavaScript. Это критически важно при наличии нескольких баз данных CodeQL для анализа отдельной фиксации в репозитории.
$ codeql database analyze /codeql-dbs/example-repo \
javascript-code-scanning.qls --sarif-category=javascript \
--format=sarif-latest --output=/temp/example-repo-js.sarif
> Running queries.
> Compiling query plan for /codeql-home/codeql/qlpacks/codeql-javascript/AngularJS/DisablingSce.ql.
...
> Shutting down query evaluator.
> Interpreting results.
Загрузка результатов в GitHub
Вы можете убедиться, что свойства SARIF имеют поддерживаемый размер для отправки и что файл совместим с сканированием кода. Дополнительные сведения см. в разделе Поддержка SARIF для проверки кода.
Перед отправкой результатов в GitHub необходимо определить оптимальный способ передачи созданных ранее GitHub App или personal access token в CodeQL CLI (см. раздел Установка CodeQL CLI в системе CI). Рекомендуется проанализировать руководство по использованию системы CI для безопасного использования хранилища секретов. CodeQL CLI поддерживает следующие действия:
- Передача маркера в CLI через стандартный ввод с помощью параметра
--github-auth-stdin(рекомендуется). - Сохранение секрета в переменной среды
GITHUB_TOKENи запуск интерфейса командной строки без включения параметра--github-auth-stdin.
Если вы выбрали наиболее безопасный и надежный метод для сервера CI, выполните команду codeql github upload-results в каждом файле результатов SARIF и включите --github-auth-stdin, если только маркер не доступен в переменной среды GITHUB_TOKEN.
echo "$UPLOAD_TOKEN" | codeql github upload-results --repository=<repository-name> \
--ref=<ref> --commit=<commit> --sarif=<file> \
--github-auth-stdin
| Параметр | Обязательно | Использование |
|---|---|---|
--repository | Укажите ВЛАДЕЛЬЦА/ИМЯ репозитория, в который будут отправлены данные. Владельцем должна быть организация в пределах предприятия, имеющая лицензию на GitHub Advanced Security. Вам необходимо включить GitHub Advanced Security для репозитория, если только репозиторий не является общедоступным. Дополнительные сведения см. в разделе Управление параметрами безопасности и анализа для репозитория. | |
--ref | Укажите имя извлеченного и проанализированного ref, чтобы результаты можно было сопоставить с правильным кодом. Для ветки используйте: refs/heads/BRANCH-NAME, для фиксации заголовка запроса на вытягивание используйте refs/pull/NUMBER/head или для созданной GitHub фиксации слияния запроса на вытягивание используйте refs/pull/NUMBER/merge. | |
--commit | Укажите полный SHA для проанализированной фиксации. | |
--sarif | Укажите файл SARIF для загрузки. | |
--github-auth-stdin | Используйте для передачи интерфейса командной строки GitHub App или personal access token, созданного для проверки подлинности с помощью REST API GitHub, через стандартные входные данные. Это не требуется, если команда имеет доступ к переменной среды GITHUB_TOKEN, заданной с помощью этого маркера. |
Дополнительные сведения см. в статье Результаты загрузки GitHub в документации по CodeQL CLI.
Базовый пример отправки результатов в GitHub
В этом примере выполняется загрузка результатов из файла SARIF temp/example-repo-js.sarif в репозиторий my-org/example-repo. Для API code scanning сообщается, что результаты необходимы для фиксации deb275d2d5fe9a522a0b7bd8b6b6a1c939552718 в ветви main.
$ echo $UPLOAD_TOKEN | codeql github upload-results --repository=my-org/example-repo \
--ref=refs/heads/main --commit=deb275d2d5fe9a522a0b7bd8b6b6a1c939552718 \
--sarif=/temp/example-repo-js.sarif --github-auth-stdin
Эта команда ничего не выводит, если загрузка не удалась. Командная строка возвращается после завершения загрузки и начала обработки данных. В небольших базах кода вскоре после этого вы сможете изучить оповещения code scanning в GitHub. Оповещения можно просмотреть непосредственно в запросе на вытягивание или на вкладке Безопасность для ветвей в зависимости от извлеченного кода. Дополнительные сведения см. в разделах Рассмотрение оповещений проверки кода в запросах на вытягивание и Управление оповещениями проверки кода для репозитория.
Скачивание и использование пакетов запросов CodeQL
Примечание. Функция управления пакетами CodeQL, включая пакеты CodeQL в настоящее время доступна в бета-версии и может быть изменена.
Пакет CodeQL CLI включает запросы, которые обслуживают эксперты GitHub, исследователи безопасности и участники сообщества. Если вам необходимо выполнять запросы, разработанные другими организациями, пакеты запросов CodeQL предоставляют эффективный и надежный способ загрузки и выполнения запросов. Дополнительные сведения см. в разделе О проверке кода с помощью CodeQL.
Прежде чем использовать пакет данных CodeQL для анализа базы данных, необходимо скачать все необходимые пакеты из GitHub Container registry. Это можно сделать с помощью флага --download в рамках команды codeql database analyze. Если пакет не является общедоступным, для проверки подлинности необходимо использовать GitHub App или personal access token. Дополнительные сведения и пример см. выше в разделе GitHub.
| Параметр | Обязательно | Использование |
|---|---|---|
<scope/name@version:path> | Укажите область и имя одного или нескольких пакетов запросов CodeQL для скачивания с помощью списка, разделенного запятыми. При необходимости включите версию для скачивания и распаковки. По умолчанию скачивается последняя версия пакета. При необходимости добавьте путь к запросу, каталогу или набору запросов для выполнения. Если путь не включен, выполните запросы этого пакета по умолчанию. | |
--github-auth-stdin | Передайте GitHub App или personal access token, созданные для проверки подлинности с помощью REST API GitHub, в интерфейс командной строки через стандартные входные данные. Это не требуется, если команда имеет доступ к переменной среды GITHUB_TOKEN, заданной с помощью этого маркера. |
Примечание: Если вы укажете определенную версию пакета запросов, имейте в виду, что указанная версия может стать слишком старой для последней версии CodeQL для эффективного использования. Чтобы обеспечить оптимальную производительность, если необходимо указать точные версии пакета запросов, необходимо повторно оценить версии, к которым вы закрепите при каждом обновлении используемого интерфейса командной строки CodeQL.
Дополнительные сведения о совместимости пакетов см. в разделе Публикация и использование пакетов CodeQL.
Базовый пример скачивания и использования пакетов запросов
В этом примере выполняется команда codeql database analyze с параметром --download, чтобы:
- Скачать последнюю версию пакета
octo-org/security-queries. - Скачать версию
octo-org/optional-security-queriesпакета, которая была бы совместима с версией 1.0.1 (в данном случае это версия 1.0.2). Дополнительные сведения о совместимости SemVer см. в документации по семантическому диапазону версий npm. - Выполните все запросы по умолчанию в
octo-org/security-queries. - Выполнение только запроса
queries/csrf.qlизocto-org/optional-security-queries
$ echo $OCTO-ORG_ACCESS_TOKEN | codeql database analyze --download /codeql-dbs/example-repo \
octo-org/security-queries \
octo-org/optional-security-queries@~1.0.1:queries/csrf.ql \
--format=sarif-latest --output=/temp/example-repo-js.sarif
> Download location: /Users/mona/.codeql/packages
> Installed fresh octo-org/security-queries@1.0.0
> Installed fresh octo-org/optional-security-queries@1.0.2
> Running queries.
> Compiling query plan for /Users/mona/.codeql/packages/octo-org/security-queries/1.0.0/potential-sql-injection.ql.
> [1/2] Found in cache: /Users/mona/.codeql/packages/octo-org/security-queries/1.0.0/potential-sql-injection.ql.
> Starting evaluation of octo-org/security-queries/query1.ql.
> Compiling query plan for /Users/mona/.codeql/packages/octo-org/optional-security-queries/1.0.2/queries/csrf.ql.
> [2/2] Found in cache: /Users/mona/.codeql/packages/octo-org/optional-security-queries/1.0.2/queries/csrf.ql.
> Starting evaluation of octo-org/optional-security-queries/queries/csrf.ql.
> [2/2 eval 694ms] Evaluation done; writing results to octo-org/security-queries/query1.bqrs.
> Shutting down query evaluator.
> Interpreting results.
Прямое скачивание пакетов CodeQL
Если вы хотите скачать пакет CodeQL без его немедленного запуска, можно использовать команду codeql pack download. Это полезно, если вы хотите избежать доступа к Интернету при выполнении запросов CodeQL. При выполнении анализа CodeQL можно указать пакеты, версии и пути так же, как и в предыдущем примере:
echo $OCTO-ORG_ACCESS_TOKEN | codeql pack download <scope/name@version:path> <scope/name@version:path> ...
Скачивание пакетов CodeQL из нескольких реестров контейнеров GitHub
Если ваши пакеты CodeQL находятся в нескольких реестрах контейнеров, необходимо указать CodeQL CLI, где найти каждый пакет. Дополнительные сведения см. в разделе Настройка сканирования кода.
Пример конфигурации непрерывной интеграции для анализа CodeQL
Это пример серии команд, которые можно использовать для анализа базы кодов с двумя поддерживаемыми языками, а затем загрузить результаты в GitHub.
# Create CodeQL databases for Java and Python in the 'codeql-dbs' directory
# Call the normal build script for the codebase: 'myBuildScript'
codeql database create codeql-dbs --source-root=src \
--db-cluster --language=java,python --command=./myBuildScript
# Analyze the CodeQL database for Java, 'codeql-dbs/java'
# Tag the data as 'java' results and store in: 'java-results.sarif'
codeql database analyze codeql-dbs/java java-code-scanning.qls \
--format=sarif-latest --sarif-category=java --output=java-results.sarif
# Analyze the CodeQL database for Python, 'codeql-dbs/python'
# Tag the data as 'python' results and store in: 'python-results.sarif'
codeql database analyze codeql-dbs/python python-code-scanning.qls \
--format=sarif-latest --sarif-category=python --output=python-results.sarif
# Upload the SARIF file with the Java results: 'java-results.sarif'
echo $UPLOAD_TOKEN | codeql github upload-results --repository=my-org/example-repo \
--ref=refs/heads/main --commit=deb275d2d5fe9a522a0b7bd8b6b6a1c939552718 \
--sarif=java-results.sarif --github-auth-stdin
# Upload the SARIF file with the Python results: 'python-results.sarif'
echo $UPLOAD_TOKEN | codeql github upload-results --repository=my-org/example-repo \
--ref=refs/heads/main --commit=deb275d2d5fe9a522a0b7bd8b6b6a1c939552718 \
--sarif=python-results.sarif --github-auth-stdin
Устранение неполадок CodeQL CLI в системе CI
Просмотр журналов и сведений по диагностике
При анализе базы данных CodeQL с помощью набора запросов code scanning в дополнение к созданию подробной информации об оповещениях интерфейс командной строки сообщает диагностические данные с этапа создания базы данных и сводные метрики. Для репозиториев с небольшим количеством предупреждений эта информация может оказаться полезной для определения того, действительно ли в коде мало проблем или возникали ли ошибки при создании базы данных CodeQL. Для более подробного вывода из codeql database analyze используйте параметр --verbose.
Дополнительные сведения о типе доступных диагностических сведений см. в разделе Просмотр журналов проверки кода.
отображает только результаты анализа на одном из проанализированных языков
По умолчанию code scanning ожидается один файл результатов SARIF по каждому анализу для репозитория. Следовательно, когда вы загружаете второй файл результатов SARIF для фиксации, он рассматривается как замена исходного набора данных.
Если вы хотите загрузить более одного набора результатов в API code scanning для фиксации в репозитории, необходимо идентифицировать каждый набор результатов как уникальный. Для репозиториев, в которых вы создаете более одной базы данных CodeQL для анализа каждой фиксации, используйте параметр --sarif-category, чтобы указать язык или другую уникальную категорию для каждого файла SARIF, который вы создаете для этого репозитория.
Проблемы с извлечением Python
Мы не рекомендуем использовать поддержку Python 2 для CodeQL CLI, в частности для этапа создания базы данных CodeQL (извлечение кода).
Если вы используете CodeQL CLI для запуска CodeQL code scanning в коде, написанном на Python, необходимо убедиться, что в системе CI установлен Python 3.