Análisis de vulnerabilidades basado en listas de anunciantes permitidos con Container Analysis

En este instructivo, se describe cómo compilar y usar Kritis Signer con Container Analysis para verificar si existen vulnerabilidades en las imágenes de contenedores compiladas con Cloud Build. Kritis Signer verifica las vulnerabilidades identificadas en función de una política de vulnerabilidades. El paso de compilación de Cloud Build falla si una vulnerabilidad identificada infringe la política de vulnerabilidad.

Descripción general

Cuando proteges tu cadena de suministro de software basada en contenedores, puede ser muy importante evitar que se implemente una imagen de contenedor vulnerable. Container Analysis proporciona servicios de análisis de vulnerabilidades para imágenes de contenedores. Kritis Signer es un compilador personalizado de código abierto para Cloud Build que se ejecuta como un paso de compilación y usa Container Analysis a fin de identificar vulnerabilidades en una imagen de contenedor. Luego, esas vulnerabilidades se verifican con una política de vulnerabilidades. La compilación fallará si alguna de las vulnerabilidades identificadas infringe la política de vulnerabilidades de Kritis Signer. En el contexto de la autorización binaria, puedes agregar un paso de compilación de Kritis Signer a una canalización de compilación de imagen de contenedor a fin de que un incumplimiento de política genere que la compilación falle antes de que se cree una certificación.

En este instructivo, harás lo siguiente:

  1. Clonarás el repositorio de Kritis.
  2. Compilarás el creador personalizado de Kritis Signer que analiza vulnerabilidades con Container Analysis.
  3. Visualizarás una política de vulnerabilidades.
  4. Enviarás compilaciones de muestra a Cloud Build que compilen una imagen de contenedor y verifiquen si hay vulnerabilidades.

    • La primera compilación de imagen de contenedor de muestra, cloudbuild-bad.yaml, es un caso de error. En este caso, Kritis Signer encuentra vulnerabilidades en la imagen de contenedor que infringen la política de vulnerabilidades. El paso de compilación falla y finaliza la canalización de compilación.

    • La segunda compilación de imagen de contenedor de muestra, cloudbuild-good.yaml, es un caso de éxito. En este caso, Kritis Signer no debería encontrar una vulnerabilidad en la imagen de contenedor que infrinja la política de vulnerabilidades. El paso de compilación debería funcionar de forma correcta.

Productos que se usaron en esta compilación

En este instructivo, se usan los siguientes productos de Google Cloud y de código abierto:

  • Cloud Build es un producto de Google Cloud que ejecuta las compilaciones en la infraestructura de Google Cloud. Cloud Build ejecuta tu compilación como una serie de pasos de la compilación, en los que cada paso de la compilación se ejecuta en un contenedor de Docker. En este instructivo, Kritis Signer se integra en un compilador personalizado de Cloud Build que, de ahí en adelante, puede usarse en las canalizaciones de compilación. Cloud Build también se usa para compilar los ejemplos de casos de éxito y de error, lo que demuestra cómo incluir el análisis de vulnerabilidades en las canalizaciones de compilación.

  • Kritis es una solución de código abierto que protege la cadena de suministro de software para aplicaciones de Kubernetes. Kritis Signer es un compilador personalizado de Cloud Build que verifica con una política de vulnerabilidades las vulnerabilidades que Container Analysis identificó.

  • Container Registry es un registro de imágenes de contenedor privado de Google Cloud que se ejecuta en Google Cloud. En este instructivo, el compilador personalizado de Kritis Signer y las imágenes de contenedor de muestra se almacenan en Container Registry.

  • Container Analysis es un producto de Google Cloud que proporciona análisis de vulnerabilidades y almacenamiento de metadatos para artefactos de software. El servicio realiza análisis de vulnerabilidades en artefactos de software compilados, como las imágenes de Container Registry. Luego, almacena los metadatos resultantes y los pone a disposición para el consumo mediante una API. En este instructivo, Kritis Signer llama a Container Analysis para identificar vulnerabilidades en las imágenes de contenedores.

Realiza la configuración

En esta sección, realizarás una configuración única del sistema. Esta configuración incluye los siguientes pasos:

  1. Configurar el entorno
  2. Habilitar las API
  3. Configurar los permisos en la cuenta de servicio que usa Cloud Build para leer desde Container Analysis
  4. Clonar el repositorio de Kritis
  5. Compilar el compilador personalizado de Kritis Signer para Cloud Build
  6. Editar una política de vulnerabilidades

En la siguiente sección, ejecutarás canalizaciones de compilación de muestra con Cloud Build.

Configura el entorno

Primero, establece el PROJECT_ID en el proyecto de Google Cloud. Este proyecto se usa en todo el instructivo.

export PROJECT_ID=PROJECT-ID

En el ejemplo anterior, PROJECT-ID es el ID del proyecto de Google Cloud.

export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")

Habilita las API

gcloud --project=$PROJECT_ID services enable cloudbuild.googleapis.com
gcloud --project=$PROJECT_ID services enable containerregistry.googleapis.com
gcloud --project=$PROJECT_ID services enable containeranalysis.googleapis.com
gcloud --project=$PROJECT_ID services enable containerscanning.googleapis.com

Configura los permisos

Ejecuta el siguiente comando para otorgar a la cuenta de servicio de Cloud Build acceso de lectura a la información de vulnerabilidad de Container Analysis.

gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.occurrences.viewer

Crea el compilador personalizado de Kritis Signer

Ejecuta los siguientes comandos para obtener el código y los archivos de configuración que se usaron en este instructivo.

  1. Clona el repositorio de Kritis

    git clone --branch policy-check-v1.0.0 https://github.com/grafeas/kritis.git
    

    Este repositorio contiene lo siguiente:

    • El código abierto para Kritis
    • Los archivos de configuración de compilación que usa Cloud Build para compilar el compilador personalizado de Kritis Signer
    • Una política de vulnerabilidades de ejemplo
    • Ejemplos de archivos de configuración de compilación de Cloud Build que demuestran el análisis de vulnerabilidades de Kritis Signer en una canalización de compilación
  2. Ve al directorio /kritis:

    cd kritis
    
  3. Envía el compilador personalizado de Kritis Signer a tu proyecto

    En este paso único, se compila un compilador personalizado que se usa en las canalizaciones de vulnerabilidades.

    gcloud --project=$PROJECT_ID builds submit . --config deploy/kritis-signer/cloudbuild.yaml
    

Edita la política de firma de vulnerabilidades

En esta sección, se describe la política de vulnerabilidades que aplica Kritis Signer. Edita esta política para determinar los niveles de gravedad permitidos y enumera las vulnerabilidades permitidas específicas.

Para ver la política de vulnerabilidades, ejecuta el siguiente comando:

cat samples/policy-check/policy.yaml

Se verá de la siguiente manera:

apiVersion: kritis.grafeas.io/v1beta1
kind: VulnzSigningPolicy
metadata:
  name: my-vsp
spec:
  imageVulnerabilityRequirements:
    maximumFixableSeverity: MEDIUM
    maximumUnfixableSeverity: MEDIUM
    allowlistCVEs:
    - projects/goog-vulnz/notes/CVE-2020-10543
    - projects/goog-vulnz/notes/CVE-2020-10878
    - projects/goog-vulnz/notes/CVE-2020-14155

En el ejemplo anterior, se ilustra lo siguiente:

  • allowlistCVEs es una lista de vulnerabilidades. Ten en cuenta que cada entrada debe ser una concordancia exacta del nombre de la nota.
  • maximumUnfixableSeverity y maximumFixableSeverity pueden ser alguno de los siguientes valores:

    • CRÍTICO
    • ALTO
    • MEDIO
    • BAJO
    • BLOCK_ALL: Falla si se identifica alguna vulnerabilidad.
    • ALLOW_ALL: Siempre se realiza de forma correcta.

Prueba el compilador personalizado de Kritis Signer

En esta sección enviarás compilaciones de ejemplo a Cloud Build.

En los siguientes pasos, se envían dos compilaciones de imagen de contenedor a Cloud Build:

  • Caso de error: La primera compilación crea una imagen de contenedor que contiene una vulnerabilidad que activa un incumplimiento de la política de vulnerabilidades. Esta compilación debería fallar.
  • Caso de éxito: La segunda compilación crea una imagen de contenedor que contiene vulnerabilidades que la política de vulnerabilidades debería permitir. Esta compilación no debería tener errores.

En ambos archivos de configuración de compilación de ejemplo, se incluyen los siguientes pasos:

  1. Paso de build: Se compila una imagen de contenedor de Docker.
  2. Paso de push: Se envía la imagen de contenedor recién compilada a Container Registry.
  3. Paso de vulnsign: Se analiza la imagen del contenedor de la siguiente manera:
    1. Se espera a que Container Analysis muestre los resultados de la búsqueda de vulnerabilidades en la imagen de contenedor recién compilada.
    2. Se verifican los resultados con la política de vulnerabilidades.
    3. Se determina el éxito o la falla en función del cumplimiento de las políticas.

Envía la compilación de muestra de un caso de error

En este ejemplo, se compila una imagen de contenedor basada en Debian 9. En este momento, el contenedor tiene una vulnerabilidad que la política de vulnerabilidades descrita antes no permite. El compilador personalizado de Kritis Signer hará que el paso de compilación vulnsign falle.

Para ver el contenido del archivo de compilación, ingresa el siguiente comando:

cat samples/policy-check/cloudbuild-bad.yaml

Ejecuta la canalización de compilación

gcloud  --project=$PROJECT_ID builds submit --config=samples/policy-check/cloudbuild-bad.yaml samples/policy-check

Deberías ver un resultado similar al siguiente:

ERROR: (gcloud.builds.submit) build [BUILD-ID] completed with status "FAILURE"

Toma nota del valor [BUILD-ID] y establece la variable de entorno $BUILD_ID para el siguiente paso.

export BUILD_ID=BUILD-ID

También puedes encontrar el ID de compilación de tu última compilación mediante la ejecución del siguiente comando:

gcloud builds list --limit 1

El ID de compilación es el primer campo que se muestra. Modifica el valor --limit para ver más compilaciones, o quita la marca si deseas ver todas las compilaciones.

Verifica el resultado

gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "does not pass VulnzSigningPolicy"

Envía la compilación de caso de éxito de muestra

Para enviar la compilación de caso de éxito de muestra a Cloud Build, ejecuta el siguiente comando:

gcloud --project=$PROJECT_ID builds submit --config=samples/policy-check/cloudbuild-good.yaml samples/policy-check

Asegúrate de anotar el ID de compilación y almacenarlo en la variable de entorno $BUILD_ID:

export BUILD_ID=BUILD-ID

Por último, para verificar el resultado, ingresa el siguiente comando:

gcloud --project=$PROJECT_ID builds describe $BUILD_ID | grep status

Próximos pasos