L'utilizzo della scansione on demand come parte della pipeline di Cloud Build consente di bloccare le build se l'immagine container presenta vulnerabilità con un livello di gravità corrispondente a un livello predefinito.
Questo tutorial mostra come utilizzare Cloud Build per creare l'immagine container dal codice sorgente, eseguirne la scansione alla ricerca di 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 Google Cloud progetto per questo tutorial e di completare i passaggi in un ambiente isolato.
Obiettivi
- Creare un'immagine con Cloud Build.
- Eseguire la scansione dell'immagine creata con la scansione on demand.
- Valutare i livelli di vulnerabilità accettabili.
- Archiviare l'immagine in Artifact Registry.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.
Prima di iniziare
- Accedi al tuo Google Cloud account. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init
Ruoli obbligatori
Il account di servizio che utilizzi con Cloud Build richiede i seguenti ruoli:
Amministratore della scansione on demand (
roles/ondemandscanning.admin)Writer di Artifact Registry (
roles/artifactregistry.writer)
Il account di servizio Cloud Build predefinito dispone delle autorizzazioni richieste per i repository Artifact Registry nello stesso progetto. Se i repository si trovano nello stesso progetto che utilizzi per Cloud Build, devi solo concedere il ruolo di amministratore della 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 di origine che contiene le istruzioni per Docker per creare un'immagine.
Apri un terminale, crea una nuova directory denominata
ods-tutoriale accedi alla directory:mkdir ods-tutorial && cd ods-tutorialCrea un file denominato
Dockerfilecon 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_IDCrea un repository Docker denominato
ods-build-reponella 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 ed esegui la scansione
In questa sezione eseguirai la pipeline di build utilizzando un file di configurazione della build. Un file di configurazione della build indica a Cloud Build come eseguire diverse attività in base alle tue specifiche.
Nella cartella
ods-tutorial/, crea il filecloudbuild.yamlcon i seguenti contenuti: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 località e il repository creati in precedenza in Artifact Registry. Se decidi di utilizzare valori diversi, modifica il file
cloudbuild.yamldi conseguenza. I valori diPROJECT_IDeSEVERITYvengono passati allo script nel comando di build.Specifica i livelli
SEVERITYdelle vulnerabilità che vuoi bloccare e avvia la build.Puoi utilizzare i seguenti valori per
SEVERITY:CRITICALHIGHMEDIUMLOW
Puoi specificare più gravità utilizzando un'espressione regolare.
Nell'esempio seguente, specifichi i valori di gravità
CRITICALeHIGH. In questo modo, Cloud Build controlla le vulnerabilità classificate con un livello di gravitàHIGHo superiore.gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \ --config cloudbuild.yamlDove
- PROJECT_ID è l'ID progetto.
- SEVERITY 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 riesce.
Comprendere i risultati
Quando imposti il valore SEVERITY su CRITICAL|HIGH, dopo che la scansione on demand ha eseguito la scansione alla ricerca di vulnerabilità, verifica se ne sono presenti a livello HIGH e a livello CRITICAL, che è 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 la scansione 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 possono 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 altri Google Cloud strumenti e best practice per proteggere la 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 senza costi fornita dalla Linux Foundation. Consulta Sviluppo di software sicuro.
Libera spazio
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
- Nella Google Cloud console, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID progetto e fai clic su Chiudi per eliminare il progetto.
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
Apri la pagina Repository nella Google Cloud console.
Nell'elenco dei repository, seleziona il repository
ods-build-repo.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