Usa On-Demand Scanning en tu canalización de Cloud Build


El uso de On-Demand Scanning como parte de tu canalización de Cloud Build te permite bloquear compilaciones si la imagen del contenedor tiene vulnerabilidades con una gravedad que coincide con un nivel predefinido.

En este instructivo, se muestra cómo usar Cloud Build para compilar tu imagen de contenedor desde el código fuente, analizarla en busca de vulnerabilidades, verificar 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 nuevo para este instructivo y completes los pasos en un entorno aislado.

Objetivos

  • Compila una imagen con Cloud Build.
  • Analiza la imagen compilada con el análisis On-Demand Scanning.
  • Evalúa los niveles de vulnerabilidad aceptables.
  • Almacena la imagen en Artifact Registry.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  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

Roles obligatorios

La cuenta de servicio que usas con Cloud Build requiere los siguientes roles:

La cuenta de servicio predeterminada de Cloud Build tiene los permisos necesarios para los repositorios de Artifact Registry en el mismo proyecto. Si tus repositorios están en el mismo proyecto que usas para Cloud Build, solo debes otorgar el rol de administrador de análisis on demand.

Si usas una cuenta de servicio proporcionada por el usuario para Cloud Build, debes otorgar ambos roles.

Prepara tu archivo fuente

En este instructivo, compilarás una imagen a partir de un Dockerfile. Un Dockerfile es un archivo fuente que contiene instrucciones para que Docker compile una imagen.

  1. Abre una terminal, crea un directorio nuevo llamado ods-tutorial y navega hasta él:

    mkdir ods-tutorial && cd ods-tutorial
    
  2. 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
    

Crea un repositorio de Artifact Registry

  1. Establece el ID del proyecto en el mismo proyecto en el que habilitaste las APIs:

    gcloud config set project PROJECT_ID
    
  2. Crea un repositorio de Docker llamado ods-build-repo en la ubicación us-central1:

    gcloud artifacts repositories create ods-build-repo --repository-format=docker \
    --location=us-central1 --description="Repository for scan and build"
    
  3. Verifica que se haya creado correctamente el repositorio:

    gcloud artifacts repositories list
    

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 le indica a Cloud Build cómo realizar varias tareas según tus especificaciones.

  1. En la carpeta ods-tutorial/, crea el archivo cloudbuild.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 según corresponda. Los valores de PROJECT_ID y SEVERITY se pasan a la secuencia de comandos en el comando de compilación.

  2. Especifica los niveles de SEVERITY de vulnerabilidad que deseas bloquear y comienza la compilación.

    Puedes usar los siguientes valores para SEVERITY:

    • CRITICAL
    • HIGH
    • MEDIUM
    • LOW

    Puedes especificar varias severidades con una expresión regular.

    En el siguiente ejemplo, especificas los valores de gravedad CRITICAL y HIGH. Esto le indica a Cloud Build que verifique si hay vulnerabilidades clasificadas en el nivel de gravedad HIGH 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 establecer los niveles de gravedad que deseas bloquear. Si el análisis on demand encuentra vulnerabilidades que coinciden con alguno de los niveles de gravedad especificados, la compilación fallará.

Comprende tus resultados

Cuando configuras el valor de SEVERITY en CRITICAL|HIGH, después de que el análisis on demand busque vulnerabilidades, comprobará si hay alguna en el nivel HIGH y en el nivel más grave CRITICAL. Si no se encuentran vulnerabilidades coincidentes en tu imagen, la compilación se realiza correctamente y Cloud Build envía la imagen a Artifact Registry.

El resultado es similar a este:

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 on demand encuentra vulnerabilidades HIGH o CRITICAL en tu imagen, el paso de compilación scan falla, no se inician los pasos de compilación posteriores y Cloud Build no envía una imagen a Artifact Registry.

El resultado es similar a este:

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 instructivo, los resultados pueden variar, ya que el código fuente de muestra es una distribución de Linux disponible de forma pública, debian10:latest. Las distribuciones de Linux y los datos de vulnerabilidades relacionados reciben actualizaciones de forma continua.

Para obtener información sobre herramientas y prácticas recomendadas adicionales de Google Cloud que te ayuden a proteger tu cadena de suministro de software, consulta Seguridad de la cadena de suministro de software.

Para obtener más información sobre las prácticas recomendadas de administración de vulnerabilidades de Linux, puedes usar la capacitación en línea gratuita que proporciona Linux Foundation. Consulta Desarrollo de software seguro.

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

  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.

Borra los recursos individuales

Antes de quitar el repositorio, asegúrate de que las imágenes que quieres conservar estén disponibles en otra ubicación.

Para borrar el repositorio, haz lo siguiente:

Console

  1. Abre la página Repositorios en la consola de Google Cloud.

    Abrir la página Repositorios

  2. En la lista de repositorios, selecciona el repositorio ods-build-repo.

  3. Haz clic en Borrar.

gcloud

Para borrar ods-build-repo el repositorio, ejecuta el siguiente comando:

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

¿Qué sigue?