Si usas el análisis bajo demanda como parte de tu flujo de procesamiento de Cloud Build, puedes bloquear las compilaciones si la imagen de contenedor tiene vulnerabilidades con una gravedad que coincida con un nivel predefinido.
En este tutorial se muestra cómo usar Cloud Build para crear una imagen de contenedor a partir del código fuente, analizarla en busca de vulnerabilidades, comprobar los niveles de gravedad de las vulnerabilidades y enviar la imagen a Artifact Registry si no hay vulnerabilidades de un nivel de gravedad específico.
Te recomendamos que crees un proyecto de Google Cloud para este tutorial y que sigas los pasos en un entorno aislado.
Objetivos
- Crea una imagen con Cloud Build.
- Analiza la imagen compilada con On-Demand Scanning.
- Evalúa los niveles de vulnerabilidad aceptables.
- Almacena la imagen en Artifact Registry.
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.
Antes de empezar
- 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.
-
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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. 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.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente 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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. 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.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
Administrador de On-Demand Scanning (
roles/ondemandscanning.admin
)Escritor de Artifact Registry (
roles/artifactregistry.writer
)Abre un terminal, crea un directorio llamado
ods-tutorial
y accede a él:mkdir ods-tutorial && cd ods-tutorial
Crea un archivo llamado
Dockerfile
con el siguiente contenido:# 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
Define el ID del proyecto en el mismo proyecto en el que habilitaste las APIs:
gcloud config set project PROJECT_ID
Crea un repositorio de Docker llamado
ods-build-repo
en la ubicaciónus-central1
:gcloud artifacts repositories create ods-build-repo --repository-format=docker \ --location=us-central1 --description="Repository for scan and build"
Verifica que el repositorio se haya creado correctamente:
gcloud artifacts repositories list
En la carpeta
ods-tutorial/
, crea el archivocloudbuild.yaml
con el siguiente contenido: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']
Este archivo incluye la ubicación y el repositorio creados anteriormente en Artifact Registry. Si decides usar valores diferentes, modifica el archivo
cloudbuild.yaml
en consecuencia. Los valores dePROJECT_ID
ySEVERITY
se transfieren a la secuencia de comandos en el comando de compilación.Especifica los
SEVERITY
niveles de vulnerabilidad que quieras bloquear e inicia la compilación.Puede usar los siguientes valores para
SEVERITY
:CRITICAL
HIGH
MEDIUM
LOW
Puede especificar varias gravedades mediante una expresión regular.
En el siguiente ejemplo, se especifican los valores de gravedad
CRITICAL
yHIGH
. De esta forma, se indica a Cloud Build que busque vulnerabilidades clasificadas con un nivel de gravedadHIGH
o superior.gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \ --config cloudbuild.yaml
Dónde
- PROJECT_ID es el ID del proyecto.
- SEVERITY te permite definir los niveles de gravedad que quieres bloquear. Si el análisis bajo demanda detecta vulnerabilidades que coinciden con alguno de los niveles de gravedad especificados, la compilación fallará.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Abre la página Repositorios en la consola de Google Cloud .
En la lista de repositorios, selecciona el repositorio
ods-build-repo
.Haz clic en Eliminar.
Roles obligatorios
La cuenta de servicio que uses con Cloud Build debe tener los siguientes roles:
La cuenta de servicio predeterminada de Cloud Build tiene los permisos necesarios para los repositorios de Artifact Registry del mismo proyecto. Si tus repositorios están en el mismo proyecto que usas para Cloud Build, solo tienes que conceder el rol Administrador de análisis bajo demanda.
Si usas una cuenta de servicio proporcionada por el usuario para Cloud Build, debes asignar ambos roles.
Preparar el archivo de origen
En este tutorial, vas a crear una imagen a partir de un Dockerfile. Un Dockerfile es un archivo de origen que contiene instrucciones para que Docker cree una imagen.
Crear un repositorio de Artifact Registry
Compilación y análisis
En esta sección, ejecutarás tu canalización de compilación con un archivo de configuración de compilación. Un archivo de configuración de compilación indica a Cloud Build cómo realizar varias tareas según tus especificaciones.
Interpretar los resultados
Si asignas el valor CRITICAL|HIGH
a SEVERITY
, después de que el análisis bajo demanda busque vulnerabilidades, comprobará si hay alguna en el nivel HIGH
y en el nivel CRITICAL
, que es más grave. Si no se encuentran vulnerabilidades coincidentes en tu imagen, la compilación se completará correctamente y Cloud Build enviará la imagen a Artifact Registry.
El resultado debería ser similar al siguiente:
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
Si el análisis bajo demanda detecta vulnerabilidades HIGH
o CRITICAL
en tu imagen, el scan
paso de compilación falla, los pasos de compilación posteriores no se inician y Cloud Build no envía una imagen a Artifact Registry.
El resultado debería ser similar al siguiente:
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
En este tutorial, los resultados pueden variar, ya que el código fuente de ejemplo es una distribución de Linux disponible públicamente, debian10:latest
. Las distribuciones de Linux y los datos de vulnerabilidades relacionados se actualizan de forma continua.
Para obtener más información sobre las Google Cloud herramientas y las prácticas recomendadas que te ayudarán a proteger tu cadena de suministro de software, consulta el artículo Seguridad de la cadena de suministro de software.
Para obtener más información sobre las prácticas recomendadas de gestión de vulnerabilidades de Linux, puede usar la formación online gratuita que ofrece Linux Foundation. Consulta Desarrollo de software seguro.
Limpieza
Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.
Eliminar el proyecto
Eliminar recursos concretos
Antes de quitar el repositorio, asegúrate de que las imágenes que quieras conservar estén disponibles en otra ubicación.
Para eliminar el repositorio, sigue estos pasos:
Consola
gcloud
Para eliminar ods-build-repo
el repositorio, ejecuta el siguiente comando:
gcloud artifacts repositories delete ods-build-repo --location=us-central1