Použití rozhraní příkazového řádku CodeQL

Dokončeno

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 create vytvoření databáze CodeQL, která představuje hierarchickou strukturu každého podporovaného programovacího jazyka v úložišti.
  • database analyze pro spouštění dotazů za účelem analýzy jednotlivých databází CodeQL a shrnutí výsledků v souboru SARIF.
  • github upload-results nahrajte 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.

  1. 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.
  2. Nastavte prostředí pro základ kódu a ujistěte se, že jsou k dispozici všechny závislosti.
  3. 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.
  4. Spusťte codeql database create z 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-cluster požadovat analýzu více než jednoho jazyka.
  • --language určit, pro které jazyky se mají vytvářet databáze.
  • --command a ř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:

  1. Volitelně spusťte codeql pack download <packs> ke stažení libovolných balíčků CodeQL (beta), které chcete spustit během analýzy.
  2. Spusťte codeql database analyze v 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_TOKEN prostř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.