Utilizzare la scansione on demand nella pipeline di Cloud Build


L'utilizzo della scansione on demand all'interno della pipeline Cloud Build ti consente di bloccare le build se l'immagine del contenitore presenta vulnerabilità con una gravità corrispondente a un livello predefinito.

Questo tutorial mostra come utilizzare Cloud Build per creare l'immagine del contenitore dal codice sorgente, analizzarla per rilevare eventuali vulnerabilità, controllare i livelli di gravità delle vulnerabilità ed eseguire il push dell'immagine in Artifact Registry se non sono presenti vulnerabilità di un livello di gravità specifico.

Ti consigliamo di creare un nuovo progetto Google Cloud per questo tutorial e di completare i passaggi in un ambiente isolato.

Obiettivi

  • Crea un'immagine con Cloud Build.
  • Scansiona l'immagine creata con la scansione on demand.
  • Valuta i livelli di vulnerabilità accettabili.
  • Archivia l'immagine in Artifact Registry.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.

Prima di iniziare

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

Ruoli obbligatori

L'account di servizio che utilizzi con Cloud Build richiede i seguenti ruoli:

L'account di servizio Cloud Build predefinito dispone delle autorizzazioni richieste per i repository Artifact Registry nello stesso progetto. Se i tuoi repository si trovano nello stesso progetto che utilizzi per Cloud Build, devi solo concedere il ruolo di amministratore di scansione on demand.

Se utilizzi un account di servizio fornito dall'utente per Cloud Build, devi concedere entrambi i ruoli.

Prepara il file di origine

Per questo tutorial, creerai un'immagine da un Dockerfile. Un Dockerfile è un file sorgente che contiene istruzioni per la creazione di un'immagine da parte di Docker.

  1. Apri un terminale, crea una nuova directory denominata ods-tutorial e vai al suo interno:

    mkdir ods-tutorial && cd ods-tutorial
    
  2. Crea un file denominato Dockerfile con i seguenti contenuti:

    # Debian10 image
    FROM gcr.io/google-appengine/debian10:latest
    
    # Ensures that the built image is always unique
    RUN apt-get update && apt-get -y install uuid-runtime && uuidgen > /IAMUNIQUE
    

Crea un repository Artifact Registry

  1. Imposta l'ID progetto sullo stesso progetto in cui hai attivato le API:

    gcloud config set project PROJECT_ID
    
  2. Crea un repository Docker denominato ods-build-repo nella località us-central1:

    gcloud artifacts repositories create ods-build-repo --repository-format=docker \
    --location=us-central1 --description="Repository for scan and build"
    
  3. Verifica che il repository sia stato creato correttamente:

    gcloud artifacts repositories list
    

Crea e scansiona

In questa sezione eseguirai la pipeline di compilazione utilizzando un file di configurazione della build. Un file di configurazione di compilazione indica a Cloud Build come eseguire diverse attività in base alle tue specifiche.

  1. Nella cartella ods-tutorial/, crea il file cloudbuild.yaml con il seguente contenuto:

    steps:
       - id: build
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker build -t us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest -f ./Dockerfile . &&
           docker image inspect us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest --format \
           '{{index .RepoTags 0}}@{{.Id}}' > /workspace/image-digest.txt &&
           cat image-digest.txt
       - id: scan
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images scan us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest \
           --format='value(response.scan)' > /workspace/scan_id.txt
       - id: severity check
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images list-vulnerabilities $(cat /workspace/scan_id.txt) \
           --format='value(vulnerability.effectiveSeverity)' | if grep -Exq $_SEVERITY; \
           then echo 'Failed vulnerability check' && exit 1; else exit 0; fi
       - id: push
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker push us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest
    images: ['us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest']
    
    

    Questo file include la posizione e il repository creati in precedenza in Artifact Registry. Se decidi di utilizzare valori diversi, modifica di conseguenza il file cloudbuild.yaml. I valori di PROJECT_ID e SEVERITY vengono passati allo script nel comando di compilazione.

  2. Specifica i livelli di vulnerabilità SEVERITY che vuoi bloccare e avvia la compilazione.

    Per SEVERITY puoi utilizzare i seguenti valori:

    • CRITICAL
    • HIGH
    • MEDIUM
    • LOW

    Puoi specificare più severità utilizzando un'espressione regolare.

    Nell'esempio seguente, specifichi sia i valori di gravità CRITICAL che HIGH. In questo modo, Cloud Build viene incaricato di verificare la presenza di vulnerabilità classificate con un livello di gravità pari o superiore a HIGH.

    gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \
    --config cloudbuild.yaml
    

    Dove

    • PROJECT_ID è l'ID progetto.
    • SEVERITY ti consente di impostare i livelli di gravità che vuoi bloccare. Se la scansione on demand rileva vulnerabilità corrispondenti a uno dei livelli di gravità specificati, la compilazione non va a buon fine.

Comprendere i risultati

Quando imposti il valore SEVERITY su CRITICAL|HIGH, dopo che la ricerca di vulnerabilità on demand ha rilevato eventuali vulnerabilità, viene controllato se sono presenti a livello HIGH e al livello più grave CRITICAL. Se non vengono rilevate vulnerabilità corrispondenti nell'immagine, la build va a buon fine e Cloud Build esegue il push dell'immagine in Artifact Registry.

L'output è simile al seguente:

DONE
--------------------------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES                                                                        STATUS
abb3ce73-6ae8-41d1-9080-7d74a7ecd7bc  2021-03-15T06:50:32+00:00  1M48S     gs://ods-tests_cloudbuild/source/1615791031.906807-a648d10faf4a46d695c163186a6208d5.tgz  us-central1-docker.pkg.dev/ods-tests/ods-build-repo/ods-test (+1 more)  SUCCESS

Se la scansione on demand rileva vulnerabilità HIGH o CRITICAL nell'immagine, il passaggio di compilazione scan non va a buon fine, i passaggi di compilazione successivi non vengono avviati e Cloud Build non esegue il push di un'immagine in Artifact Registry.

L'output è simile al seguente:

Step #2 - "severity check": Failed vulnerability check
Finished Step #2 - "severity check"
ERROR
ERROR: build step 2 "gcr.io/cloud-builders/gcloud" failed: step exited with non-zero status: 1

In questo tutorial, i risultati potrebbero variare perché il codice sorgente di esempio è una distribuzione Linux disponibile pubblicamente, debian10:latest. Le distribuzioni Linux e i relativi dati sulle vulnerabilità ricevono aggiornamenti in modo continuativo.

Per scoprire altri strumenti e best practice di Google Cloud per proteggere la tua catena di fornitura del software, consulta Sicurezza della catena di fornitura del software.

Per ulteriori informazioni sulle best practice per la gestione delle vulnerabilità di Linux, puoi utilizzare la formazione online gratuita fornita dalla Linux Foundation. Consulta la sezione Sviluppo di software sicuro.

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Elimina singole risorse

Prima di rimuovere il repository, assicurati che tutte le immagini che vuoi conservare siano disponibili in un'altra posizione.

Per eliminare il repository:

Console

  1. Apri la pagina Repositories (Repositoi) nella console Google Cloud.

    Apri la pagina Repository

  2. Nell'elenco dei repository, seleziona il repository ods-build-repo.

  3. Fai clic su Elimina.

gcloud

Per eliminare il repository ods-build-repo, esegui questo comando:

gcloud artifacts repositories delete ods-build-repo --location=us-central1

Passaggi successivi