Tilpas arbejdsprocessen for kodescanning med CodeQL – del 2

Fuldført

Arbejdsprocesser til kodescanning, der bruger CodeQL, har forskellige konfigurationsindstillinger, som du kan justere, så de passer bedre til organisationens behov.

I dette undermodul gennemgår vi, hvordan du refererer til yderligere forespørgsler i en brugerdefineret konfigurationsfil.

Yderligere forespørgsler i en brugerdefineret konfigurationsfil

En brugerdefineret konfigurationsfil er en alternativ måde at angive yderligere pakker og forespørgsler, der skal køres. Du kan også bruge filen til at deaktivere standardforespørgslerne og til at angive, hvilke mapper der skal scannes under analysen.

I arbejdsprocesfilen skal du bruge parameteren config-file for handlingen init til at angive stien til den konfigurationsfil, du vil bruge. I dette eksempel indlæses konfigurationsfilen ./.github/codeql/codeql-config.yml.

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

Konfigurationsfilen kan findes i det lager, du analyserer, eller i et eksternt lager. Hvis du bruger et eksternt lager, kan du angive konfigurationsindstillinger for flere lagre på et enkelt sted. Når du refererer til en konfigurationsfil, der er placeret i et eksternt lager, kan du bruge syntaksen OWNER/REPOSITORY/FILENAME@BRANCH. For eksempel: octo-org/shared/codeql-config.yml@main.

Hvis konfigurationsfilen er placeret i et eksternt privat lager, skal du bruge parameteren external-repository-token for handlingen init til at angive et token, der har adgang til det private lager.

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

Indstillingerne i konfigurationsfilen skrives i YAML-format.

Angiv CodeQL-forespørgselspakker i brugerdefinerede konfigurationsfiler

Seddel

Funktionerne til administration af CodeQL-pakker, herunder CodeQL-pakker, er i øjeblikket i betaversion og kan ændres.

Du kan angive CodeQL-forespørgselspakker i en matrix. Formatet er forskelligt fra det format, der bruges af arbejdsprocesfilen.

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

Det fulde format for angivelse af en forespørgselspakke er scope/name[@version][:path]. Både version og path er valgfrie. version er semver-versionsområdet. Hvis den mangler, bruges den nyeste version.

Hvis du har en arbejdsproces, der genererer mere end én CodeQL-database, kan du angive alle CodeQL-forespørgselspakker, der skal køres i en brugerdefineret konfigurationsfil ved hjælp af et indlejret kort over pakker.

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

Angiv yderligere forespørgsler i en brugerdefineret konfiguration

Du kan angive yderligere forespørgsler i en queries matrix. Hvert element i matrixen indeholder en uses parameter med en værdi, der identificerer en enkelt forespørgselsfil, en mappe, der indeholder forespørgselsfiler, eller en forespørgselspakkedefinitionsfil.

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

Du kan eventuelt give hvert matrixelement et navn, som vist i følgende eksempelkonfigurationsfil:

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'

Deaktiver standardforespørgslerne

Hvis du kun vil køre brugerdefinerede forespørgsler, kan du deaktivere standardsikkerhedsforespørgslerne ved hjælp af disable-default-queries: true. Du skal også bruge dette flag, hvis du forsøger at oprette en brugerdefineret forespørgselspakke, der udelukker en bestemt regel. Derved undgår du, at alle forespørgsler kører to gange.

Udelader bestemte forespørgsler fra analysen

Du kan føje exclude og include filtre til din brugerdefinerede konfigurationsfil for at angive de forespørgsler, du vil udelade eller medtage i analysen, f.eks.:

  • Specifikke forespørgsler fra standardpakkerne (security, security-extended og security-and-quality).
  • Specifikke forespørgsler, hvis resultater ikke interesserer dig.
  • Alle de forespørgsler, der genererer advarsler og anbefalinger.

Du kan bruge exclude filtre, der ligner dem i konfigurationen, i følgende fil til at udelade forespørgsler, som du vil fjerne fra standardanalysen. I eksemplet på en konfigurationsfil, der følger efter, udelukkes både forespørgslerne js/redundant-assignmentjs/useless-assignment-to-local og fra analysen.

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

Hvis du vil finde id'et for en forespørgsel, kan du klikke på beskeden på listen over beskeder under fanen Sikkerhed. Dette åbner siden med beskedoplysninger. Feltet Regel-id indeholder forespørgsels-id'et.

Ting, du skal være opmærksom på, når du arbejder med filteret excludes:

  • Rækkefølgen af filtrene er vigtig. Den første filterinstruktion, der vises efter instruktionerne om forespørgslerne og forespørgselspakkerne, bestemmer, om forespørgslerne er inkluderet eller udeladt som standard.
  • Efterfølgende instruktioner udføres i rækkefølge, og de instruktioner, der vises senere i filen, tilsidesætter de tidligere instruktioner.

Angiv mapper, der skal scannes

For de fortolkede sprog, som CodeQL understøtter (Python, Ruby og JavaScript/TypeScript), kan du begrænse kodescanning til filer i bestemte mapper ved at føje en paths matrix til konfigurationsfilen. Du kan udelade filerne i bestemte mapper fra analysen ved at tilføje en paths-ignore matrix.

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

Seddel

  • Nøgleordene paths og paths-ignore , der bruges i forbindelse med konfigurationsfilen til kodescanning, må ikke forveksles on.<push|pull_request>.paths med de samme nøgleord, når de bruges i en arbejdsproces. Når de bruges til at ændre on.<push|pull_request> i en arbejdsproces, bestemmer de, om handlingerne skal køres, når nogen ændrer kode i de angivne mapper.
  • Filtermønstertegnene ?, +, [, ]og ! understøttes ikke og matches bogstaveligt talt.
  • ** tegn kan kun være i starten eller slutningen af en linje eller omgivet af skråstreger, og du kan ikke blande ** og andre tegn. For eksempel: foo/**, **/fooog foo/**/bar er alle tilladt syntaks, men det er **foo ikke. Du kan dog bruge enkelte stjerner sammen med andre tegn, som vist i eksemplet. Du skal citere alt, der indeholder et * tegn.

Hvis du vil begrænse kodescanning til bestemte mapper i projektet for kompilerede sprog, skal du angive de relevante buildtrin i arbejdsprocessen. De kommandoer, du skal bruge til at udelade en mappe fra buildet, afhænger af dit buildsystem.

Du kan hurtigt analysere små dele af et monorepo, når du ændrer kode i bestemte mapper. Du skal begge udelade mapper i dine buildtrin og bruge nøgleordene paths-ignore og paths til on.<push|pull_request> i arbejdsprocessen.