Scansionare le immagini Docker in una pipeline di integrazione continua (CI) GitLab

GitLab consente ai propri utenti di scansionare un container in una CI tramite uno scanner esterno. Ciò consente di includere nella CI un passaggio durante il quale Cyberwatch genera l’elenco delle vulnerabilità e lo SBOM di un’immagine Docker. Consente inoltre agli utenti che hanno accesso alle funzionalità GitLab Ultimate di visualizzare direttamente nell’interfaccia GitLab le vulnerabilità rilevate sull’immagine scansionata e l’elenco dei pacchetti rilevati.

Cyberwatch può essere utilizzato per scansionare le immagini in una CI GitLab. Di seguito viene descritto come configurare e utilizzare questa funzionalità.

Configurare lo scanner di container

Per consentire a GitLab di connettersi a Cyberwatch, è necessario configurare uno scanner di container:

  1. Cliccare su Amministrazione
  2. Cliccare su Strumenti esterni
  3. Cliccare sulla scheda Scanner di container
  4. Cliccare sul pulsante Aggiungi
  5. Scegliere un nome e selezionare il target «GitLab»
  6. Scegliere l’origine
  7. Salvare

Si ottengono così i dati necessari per aggiungere Cyberwatch come scanner di container in GitLab. Si consiglia di salvare questi dati, poiché non saranno più accessibili in seguito.

È possibile creare più set di credenziali e definire così più scanner in più CI. Ciò consente di configurare a livello di ciascun progetto lo scanner da utilizzare. È così possibile ripartire le scansioni delle immagini Docker tra i nodi in un’istanza multi-nodo o aggiungere concorrenza su uno stesso nodo.

È inoltre possibile regolare l’intervallo tra due richieste all’API. Questo tempo corrisponde all’intervallo tra due richieste all’API durante la creazione del report delle vulnerabilità di un’immagine Docker.

Un tempo troppo breve può causare problemi di sovraccarico dell’API, mentre un tempo troppo lungo allunga inutilmente il tempo necessario per scansionare un’immagine. Il valore predefinito è di 30 secondi.

Aggiungere Cyberwatch come scanner di container

È ora possibile aggiungere Cyberwatch come scanner di container per le CI GitLab.

Per indicare a GitLab di utilizzare Cyberwatch come scanner di container, è necessario modificare il file gitlab-ci.yml del progetto e integrarvi il frammento seguente, o una sua variante:

stages:
  - test # Requis

include:
  - template: Jobs/Container-Scanning.gitlab-ci.yml # Requis

container_scanning: # Le nom NE DOIT PAS être modifié
  stage: test # Requis
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Modifiable
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Modifiable
  variables:
    CS_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG # Modifiable
    CS_ANALYZER_IMAGE: cyberwatch/ci-container-scanner # Requis

È necessario configurare alcune variabili d’ambiente affinché lo scanner di immagini Docker possa contattare Cyberwatch:

  • CYBERWATCH_SCANNER_ENDPOINT: endpoint configurato in precedenza
  • CYBERWATCH_SCANNER_USER: nome utente associato all’endpoint
  • CYBERWATCH_SCANNER_PASSWORD: password associata all’utente

Oltre alle variabili necessarie a Cyberwatch, è possibile utilizzare altre variabili per configurare l’accesso a Cyberwatch:

  • CYBERWATCH_SCANNER_INSECURE: (predefinito: non impostata). Se la variabile è configurata, la connessione tra il container scanner e Cyberwatch avverrà in modalità non protetta. Si sconsiglia di utilizzare questa opzione

Ulteriori informazioni sono disponibili nella documentazione di GitLab sulle variabili (in inglese).

Il registry Docker viene dedotto automaticamente dall’immagine scansionata. L’accesso al registry avviene tramite le credenziali passate come variabili d’ambiente alla CI GitLab, come segue:

  • CS_REGISTRY_USER: nome utente utilizzato per la connessione al registry
  • CS_REGISTRY_PASSWORD: password utilizzata per la connessione al registry

La procedura per aggiungere queste variabili d’ambiente al progetto è la seguente:

  1. Accedere a GitLab con un account che abbia accesso alla pagina delle impostazioni del progetto interessato
  2. Nella pagina del progetto, espandere la sezione «Impostazioni» e accedere alla sezione CI/CD
  3. Espandere la sezione «Variabili»
  4. Aggiungere le variabili CYBERWATCH_SCANNER_ENDPOINT, CYBERWATCH_SCANNER_USER, CYBERWATCH_SCANNER_PASSWORD e, se necessario, CS_REGISTRY_USER e CS_REGISTRY_PASSWORD

Una volta salvate le variabili d’ambiente e aggiunto il file gitlab-ci.yml, l’immagine designata da $CS_IMAGE verrà scansionata da Cyberwatch. Negli artefatti del job «container_scanning» sono disponibili due file:

  • gl-container-scanning-report.json: il report delle vulnerabilità interpretabile da GitLab secondo la specifica disponibile qui
  • gl-sbom-report-cdx.json: lo SBOM dell’immagine Docker in formato CycloneDX, la cui specifica è disponibile qui

Scansionare le immagini Docker in una pipeline di integrazione continua (CI) GitHub

Seguendo una procedura simile a quella utilizzata per GitLab, è possibile integrare Cyberwatch in una pipeline GitHub tramite GitHub Actions. Le principali differenze riguardano la dichiarazione delle variabili e il modo di strutturare la pipeline.

Dichiarazione delle variabili d’ambiente

Dopo aver configurato uno scanner di container da Cyberwatch, verranno visualizzate 3 variabili per stabilire il collegamento tra l’istanza Cyberwatch e il repository GitHub.

  1. Recuperare quindi CYBERWATCH_SCANNER_ENDPOINT, CYBERWATCH_SCANNER_USER e CYBERWATCH_SCANNER_PASSWORD
  2. Aggiungerle come segreti nel repository in «Settings», quindi nella scheda «Secrets and variables» e «Actions»

Queste 3 variabili sono obbligatorie per il corretto funzionamento dell’integrazione. Esistono tuttavia altre variabili facoltative che consentono ad esempio di autenticarsi presso un registry privato, descritte in precedenza.

Creazione della pipeline GitHub Action

Per creare una pipeline CI con GitHub, cliccare su «Action», quindi su «set up a workflow yourself» (o «Simple Workflow» per disporre di una struttura di partenza). Di seguito è riportato un esempio di pipeline minima che consente la scansione dell’immagine pubblica Ruby durante un push sul repository:

name: GitHub Actions CI Scan Container
on: [push]
jobs:
  CI-Container-Scanner:
    runs-on: ubuntu-latest
    container:
      image: cyberwatch/ci-container-scanner
    env:
      CYBERWATCH_SCANNER_ENDPOINT: ${{ secrets.CYBERWATCH_SCANNER_ENDPOINT }}
      CYBERWATCH_SCANNER_USER: ${{ secrets.CYBERWATCH_SCANNER_USER }}
      CYBERWATCH_SCANNER_PASSWORD: ${{ secrets.CYBERWATCH_SCANNER_PASSWORD }}
      CS_IMAGE: library/ruby:3.0
    steps:
      - run: gtcs 

Per la definizione di una pipeline più complessa, è possibile consultare la documentazione di GitHub.