Použití rozhraní příkazového řádku CodeQL
Kromě grafického uživatelského rozhraní na GitHub.com můžete také přistupovat k mnoha stejným primárním funkcím CodeQL prostřednictvím rozhraní příkazového řádku.
Tato lekce se zabývá vytvářením databází, analýzou databází a nahráváním výsledků do GitHubu pomocí rozhraní příkazového řádku CodeQL.
Příkazy rozhraní příkazového řádku CodeQL
Jakmile zpřístupníte rozhraní příkazového řádku CodeQL pro servery ve vašem systému CI a zajistíte, že se můžou ověřit pomocí GitHubu, jste připraveni vygenerovat data.
K vygenerování výsledků a jejich nahrání na GitHub můžete použít tři různé příkazy:
-
database createvytvoření databáze CodeQL, která představuje hierarchickou strukturu každého podporovaného programovacího jazyka v úložišti. -
database analyzepro spouštění dotazů za účelem analýzy jednotlivých databází CodeQL a shrnutí výsledků v souboru SARIF. -
github upload-resultsnahrajte výsledné soubory SARIF na GitHub, kde jsou výsledky svázány s větví nebo pull requestem a zobrazí se jako výstrahy kontroly kódu.
Nápovědu k příkazovému řádku můžete zobrazit pro libovolný příkaz pomocí příkazu --help option.
Nahrání dat SARIF tak, aby se zobrazovala jako výsledky kontroly kódu na GitHubu, se podporuje pro úložiště vlastněná organizací s povoleným GitHub Advanced Security a veřejnými úložišti na GitHub.com.
Vytvoření databází CodeQL pro analýzu
Následujícím postupem vytvoříte databáze CodeQL k analýze.
- Podívejte se na kód, který chcete analyzovat:
- Pro větev se podívejte na hlavu větve, kterou chcete analyzovat.
- U žádosti o přijetí změn se podívejte buď na hlavní potvrzení žádosti o přijetí změn, nebo si prohlédněte potvrzení žádosti o přijetí změn vygenerované GitHubem.
- Nastavte prostředí pro základ kódu a ujistěte se, že jsou k dispozici všechny závislosti.
- Vyhledejte příkaz sestavení, pokud existuje, pro základ kódu. Obvykle je to k dispozici v konfiguračním souboru v systému CI.
- Spusťte
codeql database createz kořenového adresáře vašeho úložiště a sestavte kódovou základnu:Pokud chcete vytvořit jednu databázi CodeQL pro jeden podporovaný jazyk, použijte následující příkaz:
codeql database create <database> --command <build> --language=<language-identifier>Pokud chcete vytvořit jednu databázi CodeQL pro každý jazyk pro více podporovaných jazyků, použijte následující příkaz:
codeql database create <database> --command <build> \ --db-cluster --language=<language-identifier>,<language-identifier>
Poznámka:
Pokud používáte kontejnerizované sestavení, musíte v kontejneru, kde probíhá úloha sestavení, spustit rozhraní příkazového řádku CodeQL.
Úplný seznam parametrů příkazu database create je uvedený v následující tabulce:
| Možnost | Požadované využití |
|---|---|
<database> |
Zadejte název a umístění adresáře, který se má vytvořit pro databázi CodeQL. Příkaz selže, pokud se pokusíte přepsat existující adresář. Pokud zadáte také --db-cluster, jedná se o nadřazený adresář a pro každý analyzovaný jazyk se vytvoří podadresář. |
--language |
Zadejte identifikátor jazyka pro vytvoření databáze pro jeden z cpp, csharp, go, java, javascript, python a ruby (použijte JavaScript k analýze kódu TypeScript). Při použití s --db-cluster možnost přijímá seznam oddělený čárkami nebo může být zadána vícekrát. |
--command |
Doporučeno. Slouží k zadání příkazu sestavení nebo skriptu, který vyvolá proces sestavení pro základ kódu. Příkazy se spouštějí z aktuální složky nebo z definované složky .--source-root Není potřeba pro analýzu Pythonu a JavaScriptu nebo TypeScriptu. |
--db-cluster |
Nepovinné. Používá se v základech kódu ve více jazycích k vygenerování jedné databáze pro každý jazyk určený --language. |
--no-run-unnecessary-builds |
Doporučeno. Slouží k potlačení příkazu sestavení pro jazyky, ve kterých rozhraní příkazového řádku CodeQL nemusí monitorovat sestavení (například Python a JavaScript/TypeScript). |
--source-root |
Nepovinné. Použijte, pokud spustíte příkazovou řádku mimo kořenovou složku úložiště. Ve výchozím nastavení příkaz create databáze předpokládá, že aktuální adresář je kořenovým adresářem pro zdrojové soubory; tuto možnost použijte k určení jiného umístění. |
Příklad s jedním jazykem
Tento příklad vytvoří databázi CodeQL pro úložiště rezervovanou na adrese /checkouts/example-repo. Pomocí extraktoru JavaScriptu vytvoří hierarchickou reprezentaci kódu JavaScriptu a TypeScriptu v úložišti. Výsledná databáze je uložena v /codeql-dbs/example-reposouboru .
$ 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.
Příklad více jazyků
Tento příklad vytvoří dvě databáze CodeQL pro úložiště rezervované na adrese /checkouts/example-repo-multi. Používá:
-
--db-clusterpožadovat analýzu více než jednoho jazyka. -
--languageurčit, pro které jazyky se mají vytvářet databáze. -
--commanda řekněte nástroji příkaz pro sestavení pro kódovou základnu, zde make. -
--no-run-unnecessary-buildsříct nástroji, aby přeskočil příkaz sestavení pro jazyky, ve kterých není potřeba (například Python).
Výsledné databáze jsou uloženy v python podadresářích 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.
$
Analýza databáze CodeQL
Po vytvoření databáze CodeQL ji analyzujte následujícím postupem:
- Volitelně spusťte
codeql pack download <packs>ke stažení libovolných balíčků CodeQL (beta), které chcete spustit během analýzy. - Spusťte
codeql database analyzev databázi a určete, které balíčky nebo dotazy se mají použít.
codeql database analyze <database> --format=<format> \
--output=<output> <packs,queries>
Poznámka:
Pokud analyzujete více než jednu databázi CodeQL pro jedno potvrzení, musíte pro každou sadu výsledků, kterou tento příkaz vygeneruje, zadat kategorii SARIF. Když výsledky nahrajete do GitHubu, vyhledávání kódu použije tuto kategorii k uložení výsledků pro každý jazyk samostatně. Pokud na to zapomenete, každé nahrání přepíše předchozí výsledky.
codeql database analyze <database> --format=<format> \
--sarif-category=<language-specifier> --output=<output> \
<packs,queries>
Úplný seznam parametrů příkazu database analyze je uvedený v následující tabulce:
| Možnost | Požadované využití |
|---|---|
<database> |
Zadejte cestu k adresáři, který obsahuje databázi CodeQL k analýze. |
<packs,queries> |
Zadejte balíčky CodeQL nebo dotazy, které se mají spustit. Pokud chcete spustit standardní dotazy používané ke kontrole kódu, vynechte tento parametr. Další sady dotazů, které jsou součástí CodeQL CLI, najdete v /<extraction-root>/codeql/qlpacks/codeql-<language>/codeql-suites. Informace o vytváření vlastní sady dotazů najdete v části Vytváření sad dotazů CodeQL v dokumentaci k rozhraní příkazového řádku CodeQL. |
--format |
Zadejte formát souboru výsledků vygenerovaného příkazem. Pro nahrání na GitHub by to mělo být: sarif-latest. |
--output |
Určete, kam se má uložit soubor výsledků SARIF. |
--sarif-category |
Volitelné pro analýzu izolované databáze. Vyžaduje se k definování jazyka při analýze více databází pro jedno potvrzení v úložišti. Zadejte kategorii, která se má zahrnout do souboru výsledků SARIF pro tuto analýzu. Kategorie se používá k rozlišení více analýz pro stejný nástroj a potvrzení, ale provádí se v různých jazycích nebo v různých částech kódu. |
--sarif-add-query-help |
Nepovinné. Použijte, pokud chcete zahrnout veškerou dostupnou nápovědu k dotazům, která je vykreslena ve formátu markdown, pro vlastní dotazy použité ve vaší analýze. Pokud příslušný dotaz vygeneruje výstrahu, zobrazí se v uživatelském rozhraní pro kontrolu kódu veškerá nápověda k vlastním dotazům zahrnutým ve výstupu SARIF. |
<packs> |
Nepovinné. Použijte, pokud jste stáhli balíčky dotazů CodeQL a chcete spustit výchozí dotazy nebo sady dotazů zadané v balíčcích. |
--threads |
Nepovinné. Použijte, pokud chcete ke spouštění dotazů použít více než jedno vlákno. Výchozí hodnota je 1. Můžete zadat více vláken pro urychlení provádění dotazů. Pokud chcete nastavit počet vláken na počet logických procesorů, zadejte 0. |
--verbose |
Nepovinné. Umožňuje získat podrobnější informace o procesu analýzy a diagnostických datech z procesu vytváření databáze. |
Základní příklad
Tento příklad analyzuje databázi CodeQL uloženou na /codeql-dbs/example-repo a uloží výsledky jako soubor SARIF: /temp/example-repo-js.sarif. Používá se --sarif-category k zahrnutí dalších informací do souboru SARIF, který identifikuje výsledky jako JavaScript. To je nezbytné, pokud máte více než jednu databázi CodeQL k analýze jednoho potvrzení v úložišti.
$ 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.
Nahrání výsledků do GitHubu
Nahrávání SARIF podporuje maximálně 25 000 výsledků na nahrání. Zobrazí se však pouze prvních 5 000 výsledků s prioritou podle závažnosti. Pokud nástroj generuje příliš mnoho výsledků, měli byste aktualizovat konfiguraci tak, aby se zaměřila na výsledky pro nejdůležitější pravidla nebo dotazy.
Při každém nahrávání souboru SARIF gzip podporujeme maximální velikost 10 MB. Všechna nahrání nad tímto limitem budou odmítnuta. Pokud je soubor SARIF příliš velký, protože obsahuje příliš mnoho výsledků, měli byste aktualizovat konfiguraci tak, aby se zaměřila na výsledky pro nejdůležitější pravidla nebo dotazy. Další informace o omezeních a validaci souborů SARIF naleznete v dokumentaci[6].
Než budete moct nahrát výsledky do GitHubu, musíte určit nejlepší způsob předání tokenu aplikace GitHub nebo osobního přístupového tokenu, který jste vytvořili dříve, do rozhraní příkazového řádku CodeQL. Doporučujeme, abyste si prostudovali pokyny k zabezpečenému použití úložiště tajných kódů ve vašem systému CI. Rozhraní příkazového řádku CodeQL podporuje:
- Propojení s úložištěm tajných kódů pomocí možnosti --github-auth-stdin Toto je doporučený způsob ověřování.
- Uložení tajného kódu do proměnné
GITHUB_TOKENprostředí a spuštění rozhraní příkazového řádku bez zahrnutí možnosti--github-auth-stdin. - Předejte možnost příkazového řádku --github-auth-stdin a zadejte dočasný token prostřednictvím standardního vstupu. To se doporučuje pro účely testování.
Když jste se rozhodli pro nejbezpečnější a nejspolehlivější metodu serveru CI, spusťte codeql github upload-results na každém souboru výsledků SARIF a zahrňte --github-auth-stdin ho, pokud není token k dispozici v proměnné GITHUB_TOKENprostředí .
# GitHub App or personal access token available from a secret store
<call-to-retrieve-secret> | codeql github upload-results \
--repository=<repository-name> \
--ref=<ref> --commit=<commit> \
--sarif=<file> --github-auth-stdin
# GitHub App or personal access token available in GITHUB_TOKEN
codeql github upload-results \
--repository=<repository-name> \
--ref=<ref> --commit=<commit> \
--sarif=<file>
Úplný seznam parametrů pro github upload-results příkaz se zobrazí v tabulce následujícím způsobem.
| Možnost | Požadované využití |
|---|---|
--repository |
Zadejte VLASTNÍK/NÁZEV úložiště, do kterého chcete nahrát data. Vlastníkem musí být organizace v rámci podniku, která má licenci pro GitHub Advanced Security, a GitHub Advanced Security musí být pro úložiště povolená, pokud není úložiště veřejné. |
--ref |
Zadejte název reference, kterou jste si vybrali a analyzovali, aby se výsledky mohly shodovat se správným kódem. Pro větev použijte refs/heads/BRANCH-NAME, pro hlavní potvrzení žádosti o přijetí změn, použijte refs/pulls/NUMBER/head; nebo pro potvrzení sloučení vygenerované GitHubem žádosti o přijetí změn použijte refs/pulls/NUMBER/merge. |
--commit |
Zadejte plné SHA analyzovaného commitu. |
--sarif |
Zadejte soubor SARIF, který se má načíst. |
--github-auth-stdin |
Nepovinné. Slouží k předání rozhraní příkazového řádku nebo osobního přístupového tokenu vytvořeného pro ověřování pomocí rozhraní REST API od GitHubu prostřednictvím standardního vstupu. To není potřeba, pokud má příkaz přístup k GITHUB_TOKEN proměnné prostředí nastavené tímto tokenem. |