Přizpůsobení pracovního postupu skenování kódu pomocí CodeQL – část 2

Dokončeno

Pracovní postupy kontroly kódu, které používají CodeQL, mají různé možnosti konfigurace, které můžete upravit tak, aby lépe vyhovovaly potřebám vaší organizace.

V této lekci si projdeme, jak odkazovat na další dotazy ve vlastním konfiguračním souboru.

Další dotazy ve vlastním konfiguračním souboru

Vlastní konfigurační soubor je alternativní způsob, jak zadat další balíčky a dotazy, které se mají spustit. Soubor můžete také použít k zakázání výchozích dotazů a k určení adresářů, které se mají kontrolovat během analýzy.

V souboru pracovního postupu použijte parametr akce config-file, abyste určili cestu ke konfiguračnímu souboru, který chcete použít. Tento příklad načte konfigurační soubor ./.github/codeql/codeql-config.yml.

- uses: github/codeql-action/init@v3
  with:
    config-file: ./.github/codeql/codeql-config.yml

Konfigurační soubor se může nacházet v úložišti, které analyzujete, nebo v externím úložišti. Použití externího úložiště umožňuje zadat možnosti konfigurace pro více úložišť na jednom místě. Když odkazujete na konfigurační soubor umístěný v externím úložišti, můžete použít OWNER/REPOSITORY/FILENAME@BRANCH syntaxi. Například: octo-org/shared/codeql-config.yml@main.

Pokud se konfigurační soubor nachází v externím privátním úložišti, použijte external-repository-token parametr init akce k určení tokenu, který má přístup k privátnímu úložišti.

- uses: github/codeql-action/init@v3
  with:
    external-repository-token: ${{ secrets.ACCESS_TOKEN }}

Nastavení v konfiguračním souboru se zapisují ve formátu YAML.

Určení balíčků dotazů CodeQL ve vlastních konfiguračních souborech

Poznámka:

Funkce správy balíčků CodeQL, včetně balíčků CodeQL, je aktuálně v beta verzi a může se změnit.

V poli můžete zadat balíčky dotazů CodeQL. Formát se liší od formátu používaného souborem pracovního postupu.

packs:
packs:
  # Use the latest version of 'pack1' published by 'scope'
  - scope/pack1
  # Use version 1.2.3 of 'pack2'
  - scope/pack2@1.2.3
  # Use the latest version of 'pack3' compatible with 3.2.1
  - scope/pack3@~3.2.1
  # Use pack4 and restrict it to queries found in the 'path/to/queries' directory
  - scope/pack4:path/to/queries
  # Use pack5 and restrict it to the query 'path/to/single/query.ql'
  - scope/pack5:path/to/single/query.ql
  # Use pack6 and restrict it to the query suite 'path/to/suite.qls'
  - scope/pack6:path/to/suite.qls

Úplný formát pro zadání balíčku dotazů je scope/name[@version][:path]. Obě version a path jsou volitelné. version je rozsah verzí semver. Pokud chybí, použije se nejnovější verze.

Pokud máte pracovní postup, který generuje více než jednu databázi CodeQL, můžete určit všechny balíčky dotazů CodeQL, které se mají spustit ve vlastním konfiguračním souboru pomocí vnořené mapy balíčků.

packs:
  # Use these packs for JavaScript and TypeScript analysis
  javascript:
    - scope/js-pack1
    - scope/js-pack2
  # Use these packs for Java and Kotlin analysis
  java:
    - scope/java-pack1
    - scope/java-pack2@v1.0.0

Zadání dalších dotazů ve vlastní konfiguraci

Do pole queries můžete zadat další dotazy. Každý prvek pole obsahuje uses parametr s hodnotou, která identifikuje jeden soubor dotazu, adresář obsahující soubory dotazů nebo definiční soubor sady dotazů.

queries:
  - uses: ./my-basic-queries/example-query.ql
  - uses: ./my-advanced-queries
  - uses: ./query-suites/my-security-queries.qls

Volitelně můžete každému prvku pole dát název, jak je znázorněno v následujícím příkladu konfiguračního souboru:

name: "My CodeQL config"

disable-default-queries: true

queries:
  - name: Use an in-repository QL pack (run queries in the my-queries directory)
    uses: ./my-queries
  - name: Use an external JavaScript QL pack (run queries from an external repo)
    uses: octo-org/javascript-qlpack@main
  - name: Use an external query (run a single query from an external QL pack)
    uses: octo-org/python-qlpack/show_ifs.ql@main
  - name: Use a query suite file (run queries from a query suite in this repo)
    uses: ./codeql-qlpacks/complex-python-qlpack/rootAndBar.qls

paths:
  - src
paths-ignore:
  - src/node_modules
  - '**/*.test.js'

Zakázání výchozích dotazů

Pokud chcete spouštět pouze vlastní dotazy, můžete výchozí bezpečnostní dotazy zakázat pomocí .disable-default-queries: true Tento příznak byste měli použít také v případě, že se pokoušíte vytvořit vlastní sadu dotazů, která vylučuje konkrétní pravidlo. Tím se zabrání, aby se všechny dotazy spouštěly dvakrát.

Vyloučení konkrétních dotazů z analýzy

Do vlastního konfiguračního souboru můžete přidat exclude filtry a include zadat dotazy, které chcete vyloučit nebo zahrnout do analýzy, například:

  • Konkrétní dotazy z výchozích sad (securitysecurity-extendedasecurity-and-quality)
  • Konkrétní dotazy, jejichž výsledky vás nezajímají.
  • Všechny dotazy, které generují upozornění a doporučení.

Pomocí filtrů podobných filtrům v konfiguraci následujícího souboru můžete exclude vyloučit dotazy, které chcete odebrat z výchozí analýzy. V příkladu konfiguračního souboru, uvedeném níže, jsou dotazy js/redundant-assignment i js/useless-assignment-to-local vyloučeny z analýzy.

query-filters:
  - exclude:
      id: js/redundant-assignment
  - exclude:
      id: js/useless-assignment-to-local

Pokud chcete zjistit ID dotazu, můžete kliknout na výstrahu v seznamu výstrah na kartě Zabezpečení. Otevře se stránka s podrobnostmi výstrahy. Pole ID pravidla obsahuje ID dotazu.

Při práci s filtrem excludes je potřeba mít na paměti:

  • Pořadí filtrů je důležité. První instrukce filtru, která se zobrazí po pokynech k dotazům a balíčkům dotazů, určuje, jestli jsou dotazy zahrnuté nebo vyloučené ve výchozím nastavení.
  • Další pokyny se spustí v pořadí a pokyny, které se zobrazí později v souboru, mají přednost před předchozími pokyny.

Určení adresářů, které se mají prohledávat

Pro interpretované jazyky, které CodeQL podporuje (Python, Ruby a JavaScript/TypeScript), můžete omezit kontrolu kódu na soubory v konkrétních adresářích přidáním paths pole do konfiguračního souboru. Soubory v konkrétních adresářích můžete vyloučit z analýzy přidáním paths-ignore pole.

paths:
  - src
paths-ignore:
  - src/node_modules
  - '**/*.test.js'

Poznámka:

  • Klíčová paths slova a paths-ignore klíčová slova použitá v kontextu konfiguračního souboru prohledávání kódu by se neměla zaměňovat se stejnými klíčovými slovy při použití on.<push|pull_request>.paths v pracovním postupu. Když jsou použity k úpravě on.<push|pull_request> v rámci pracovního postupu, určují, jestliže se akce spustí, když někdo změní kód ve specifikovaných adresářích.
  • Znaky vzoru filtru ?, +, [, ] a ! nejsou podporovány a budou doslova odpovídat.
  • ** znaky mohou být pouze na začátku nebo na konci řádku nebo ohraničeny lomítky a nemůžete kombinovat ** a další znaky. Například: foo/**, **/fooa foo/**/bar jsou všechny povolené syntaxe, ale **foo nejsou. Můžete ale použít jednu hvězdičku spolu s dalšími znaky, jak je znázorněno v příkladu. Budete muset uvozovat cokoli, co obsahuje * znak.

Pokud chcete v kompilovaných jazycích omezit kontrolu kódu na konkrétní adresáře v projektu, musíte v pracovním postupu zadat příslušné kroky sestavení. Příkazy, které potřebujete použít k vyloučení adresáře z sestavení, budou záviset na vašem systému sestavení.

Při úpravě kódu v konkrétních adresářích můžete rychle analyzovat malé části monorepo. V krocích sestavení budete muset vyloučit adresáře a ve vašem pracovním postupu používat klíčová slova paths-ignore a paths pro on.<push|pull_request>.