L'utilizzo della scansione on demand come parte della pipeline di Cloud Build ti consente di bloccare le build se l'immagine container presenta vulnerabilità con una gravità corrispondente a un livello predefinito.
Questo tutorial mostra come utilizzare Cloud Build per creare l'immagine container 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.
Prepara il file di origine
Per questo tutorial creerai un'immagine da un Dockerfile. Un Dockerfile è un file di origine che contiene le istruzioni per Docker per creare un'immagine.
Apri un terminale, crea una nuova directory denominata
ods-tutorial
e vai alla directory:mkdir ods-tutorial && cd ods-tutorial
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
Imposta l'ID progetto sullo stesso progetto in cui hai abilitato le API:
gcloud config set project PROJECT_ID
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"
Verifica che il repository sia stato creato correttamente:
gcloud artifacts repositories list
Crea e scansiona
In questa sezione eseguirai la pipeline di build 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.
Nella cartella
ods-tutorial/
, crea il filecloudbuild.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 il file
cloudbuild.yaml
di conseguenza. I valori diPROJECT_ID
eSEVERITY
vengono passati allo script nel comando di build.Specifica i livelli di vulnerabilità
SEVERITY
che vuoi bloccare e avvia la build.Puoi utilizzare i seguenti valori per
SEVERITY
:CRITICAL
HIGH
MEDIUM
LOW
Puoi specificare più gravità utilizzando un'espressione regolare.
Nell'esempio seguente, specifichi sia i valori di gravità
CRITICAL
cheHIGH
. In questo modo, Cloud Build controlla le vulnerabilità classificate al livello di gravitàHIGH
o superiore.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à che corrispondono a uno dei livelli di gravità specificati, la build non viene eseguita.
Comprendere i risultati
Quando imposti il valore di SEVERITY
su CRITICAL|HIGH
, dopo che la scansione on demand cerca le vulnerabilità, verifica se ce ne sono a livello HIGH
e a livello CRITICAL
più grave. Se non vengono trovate vulnerabilità corrispondenti nell'immagine, la build ha esito positivo 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 l'analisi on demand rileva vulnerabilità HIGH
o CRITICAL
nell'immagine, il passaggio di build scan
non riesce, i passaggi di build 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à vengono aggiornati continuamente.
Per scoprire ulteriori Google Cloud strumenti e best practice per proteggere la tua catena di fornitura del software, consulta la sezione Sicurezza della catena di fornitura del software.
Per ulteriori informazioni sulle best practice per la gestione delle vulnerabilità di Linux, puoi utilizzare i corsi di formazione online gratuiti forniti dalla Linux Foundation. Consulta la sezione Sviluppo di software sicuro.