Usar el análisis bajo demanda en tu flujo de procesamiento de Cloud Build

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.

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.

  1. Abre un terminal, crea un directorio llamado ods-tutorial y accede a é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
    

Crear un repositorio de Artifact Registry

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

    gcloud config set project PROJECT_ID
    
  2. Crea un repositorio 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 el repositorio se haya creado correctamente:

    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 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 en consecuencia. Los valores de PROJECT_ID y SEVERITY se transfieren a la secuencia de comandos en el comando de compilación.

  2. Especifica los SEVERITYniveles 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 y HIGH. De esta forma, se indica a Cloud Build que busque vulnerabilidades clasificadas con un 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 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á.

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.