Crea certificaciones con Kritis Signer

En este instructivo, se explica cómo compilar Kritis Signer y usarlo para verificar las imágenes de contenedores en busca de vulnerabilidades antes de crear certificaciones de autorización binaria.

Descripción general

Kritis Signer es una herramienta de línea de comandos de código abierto que puede crear certificaciones de autorización binaria según la política que configures. También puedes usar Kritis Signer para crear certificaciones después de verificar una imagen en busca de vulnerabilidades identificadas por Container Analysis.

Además, Cloud Build puede ejecutar Kritis Signer como un compilador personalizado en una canalización de compilación.

En este instructivo, realizarás una compilación única del compilador personalizado de Kritis Signer y, luego, ejecutarás canalizaciones de compilación de muestra. Cada canalización de muestra contiene los siguientes pasos de compilación:

  1. Compilar una imagen de contenedor de muestra
  2. Envía la imagen a Container Registry.
  3. Verifica y firma la imagen: Usa Kritis Signer para crear una certificación basada en la política.

En el paso de compilación de verificación y firma de cada canalización, Kritis Signer hace lo siguiente:

  1. Analiza la imagen recién compilada con Container Analysis y recupera una lista de vulnerabilidades.
  2. Verifica la lista de vulnerabilidades contra las reglas de firma de vulnerabilidades en la política y, luego, haz lo siguiente:
    1. Si todas las vulnerabilidades identificadas satisfacen las reglas de firma de vulnerabilidades, Kritis Signer crea la certificación.
    2. Si alguna de las vulnerabilidades identificadas infringe las reglas de firma de vulnerabilidades, Kritis Signer no crea la certificación.

En el momento de la implementación, el ejecutor de la autorización binaria verifica la certificación verificable. Sin una, el ejecutor no permite la implementación de la imagen.

En este instructivo, también se explica cómo ejecutar Kritis Signer en modo de solo verificación en una canalización de Cloud Build. En este modo, Kritis Signer no crea una certificación, solo verifica si los resultados de la vulnerabilidad cumplen con las reglas de firma de vulnerabilidades de la política. Si lo hace, el paso de compilación de Kritis Signer se realiza de forma correcta y la canalización continúa ejecutándose, de lo contrario, el paso falla y la canalización se cierra.

Objetivos

En este instructivo, harás lo que se indica a continuación:

  1. Configura Kritis Signer como compilador personalizado de Cloud Build.
  2. Visualiza una política que contenga reglas de firma de vulnerabilidades.
  3. Ejecuta Kritis Signer para crear certificaciones basadas en los resultados del análisis de vulnerabilidades.
  4. Ejecuta Kritis Signer en modo de solo verificación.

Costos

En este instructivo, se usan los siguientes productos de Google Cloud.

  • Container Registry
  • Análisis del contenedor
  • Cloud Build
  • Cloud Key Management Service

Usa la calculadora de precios para estimar los costos según el uso previsto.

Antes de comenzar

En esta sección, realizarás una configuración única del sistema.

Configure su entorno

  1. Almacena tu proyecto de Google Cloud en una variable de entorno.

    export PROJECT_ID=PROJECT_ID
    

    Reemplaza PROJECT_ID con el proyecto de Google Cloud.

  2. Establece el ID del proyecto predeterminado en tu proyecto de Google Cloud:

    gcloud config set project $PROJECT_ID
    
  3. Almacena el número de proyecto en una variable de entorno para los pasos futuros:

    export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" \
     --format="value(PROJECT_NUMBER)")
    
  4. Habilita las API:

    A fin de asegurarte de que los servicios necesarios para esta guía estén habilitados, ejecuta el siguiente comando:

    gcloud services enable \
      cloudbuild.googleapis.com \
      containerregistry.googleapis.com \
      containerscanning.googleapis.com \
      cloudkms.googleapis.com
    

Configura las funciones de IAM

Ejecuta los siguientes comandos para configurar la cuenta de servicio de Cloud Build con las siguientes funciones:

  • containeranalysis.notes.editor: Agrega la función Editor de notas de Container Analysis para administrar el certificador.
  • containeranalysis.notes.occurrences.viewer: agrega la función Casos de Container Analysis para notas a fin de administrar los casos de vulnerabilidades y certificaciones.
  • roles/containeranalysis.occurrences.editor: agrega la función de editor de casos de Container Analysis para crear casos de certificación en Container Analysis.
  • cloudkms.signer: Agrega la función Firmante de CryptoKey de Cloud KMS que permite que la cuenta de servicio acceda al servicio de firmas de Cloud KMS.

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

Configura el compilador personalizado de Kritis Signer

En esta sección, realizarás una configuración única del compilador personalizado de Kritis Signer. Una vez que obtienes, compilas y envías Kritis Signer, se puede usar en cualquier canalización de Cloud Build.

Esta sección te muestra cómo hacer lo siguiente:

  • Clonar el repositorio de Kritis.
  • Compilar el compilador personalizado de Kritis Signer para Cloud Build
  • Enviar Kritis Signer a Container Registry para que esté disponible como paso de compilación de Cloud Build.

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

  1. Clonar el repositorio de Kritis:

    git clone https://github.com/grafeas/kritis.git
    

    Este repositorio contiene lo siguiente:

    • Código fuente de Kritis que también incluye Kritis Signer.
    • Un archivo de configuración de Cloud Build que usa Cloud Build para compilar el compilador personalizado de Kritis Signer
    • Una política de ejemplo que contiene reglas de firma de vulnerabilidades.
    • Ejemplos de archivos de configuración de Cloud Build Cada archivo de configuración usa Kritis Signer en una canalización de análisis de vulnerabilidades.
  2. Navega al directorio kritis/.

    cd kritis
    
  3. Compila y registra el compilador personalizado de Kritis Signer.

    En este paso de configuración único, se compila el compilador personalizado de Kritis Signer y se lo registra con Cloud Build. Una vez registrado, el compilador personalizado estará disponible para su uso en cualquier canalización de Cloud Build.

    gcloud builds submit . --config deploy/kritis-signer/cloudbuild.yaml
    

Visualiza una política existente

En esta sección, se muestra un ejemplo de la política de Kritis Signer.

Esta política configura Kritis Signer para solicitar a Container Analysis que analice la imagen en busca de vulnerabilidades. Una vez que se completa el análisis, Kritis Signer verifica los resultados de la vulnerabilidad que se muestran en las reglas de firma de vulnerabilidades de la política.

Puedes editar las reglas de firma de vulnerabilidades en esta política para crear una certificación basada en las siguientes opciones:

  • Niveles de gravedad de las vulnerabilidades identificadas.
  • Vulnerabilidades específicas.

También puedes configurar la política para crear de forma incondicional (ALLOW_ALL) o no crear una certificación (BLOCK_ALL).

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

cat samples/signer/policy.yaml

La política se parece a lo siguiente:

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

Aquí:

  • maximumUnfixableSeverity y maximumFixableSeverity definen los umbrales de gravedad y vulnerabilidades comunes (CVE) en los que Kritis Signer crea certificaciones. maximumUnfixableSeverity define el umbral para la gravedad que no está disponible una corrección. maximumFixableSeverity define el umbral de gravedad para el que está disponible una corrección. maximumUnfixableSeverity y maximumFixableSeverity se pueden establecer en uno de los siguientes niveles de gravedad:

    • CRITICAL
    • HIGH
    • MEDIUM
    • LOW

    Para obtener más información sobre los niveles de gravedad, consulta Niveles de gravedad.

    Como alternativa, puedes establecer maximumUnfixableSeverity y maximumFixableSeverity de la siguiente manera:

    • BLOCK_ALL: La certificación no se crea si se identifica cualquier vulnerabilidad.
    • ALLOW_ALL: La certificación siempre se crea.
  • allowlistCVEs es una lista de CVE específicas para incluir en la lista de anunciantes permitidos. Kritis Signer ignora las CVE de esta lista cuando evalúa si crea una certificación. Cada entrada en la lista de anunciantes permitidos debe coincidir con exactitud con el nombre de la nota de Container Analysis para la CVE. Obtén más información sobre las fuentes de vulnerabilidades de Container Analysis. Para obtener más información sobre las notas, consulta Almacenamiento de metadatos.

Crea una clave de firma de Cloud KMS

Las claves de Cloud Key Management Service se usan para crear la certificación.

  1. Crea un nuevo llavero de claves de Cloud KMS con el nombre kritis-signer-key-ring:

    gcloud kms keyrings create kritis-signer-key-ring \
       --location global
    
  2. Crea una clave de Cloud KMS nueva llamada kritis-signer-key dentro del llavero de claves:

    gcloud kms keys create kritis-signer-key \
        --keyring kritis-signer-key-ring \
        --location global \
        --purpose "asymmetric-signing" \
        --default-algorithm "rsa-sign-pkcs1-2048-sha256"
    
  3. Almacena el algoritmo de resumen y Cloud KMS en una variable de entorno para los pasos futuros:

    export KMS_DIGEST_ALG=SHA256
    export KMS_KEY_NAME=projects/$PROJECT_ID/locations/global/keyRings/kritis-signer-key-ring/cryptoKeys/kritis-signer-key/cryptoKeyVersions/1
    

Define un nombre de nota

Todas las certificaciones hacen referencia a una nota de Container Analysis. Kritis Signer crea de forma automática una nota para un nombre determinado. También puedes volver a usar los nombres de las notas existentes.

export NOTE_ID=my-signer-note
export NOTE_NAME=projects/${PROJECT_ID}/notes/${NOTE_ID}

Crea certificaciones con Kritis Signer en una canalización de Cloud Build

En esta sección, se muestra cómo usar el compilador de nube personalizado de Kritis Signer para crear certificaciones de autorización binaria basadas en los resultados del análisis de vulnerabilidades.

En los siguientes pasos, se muestra cómo funciona Kritis Signer con los archivos de configuración de compilación de ejemplo en el repositorio de Kritis Signer. Cada archivo de configuración de ejemplo contiene los siguientes pasos de compilación:

  1. Es un paso docker build que compila una imagen de contenedor de Docker.
  2. Un paso docker push que envía la imagen de contenedor recién compilada a Container Registry.
  3. Un paso vulnsign que verifica y firma la imagen de 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 las reglas de firma de vulnerabilidades en la política.
    3. Crear la certificación si los resultados cumplen con las reglas de vulnerabilidad

Debes enviar cada una de las compilaciones de ejemplo a Cloud Build. Cada compilación produce un resultado de vulnerabilidad:

  • Caso de falla: En la primera compilación, el resultado de la vulnerabilidad infringe las reglas de firma de vulnerabilidades. Esta compilación falla.
  • Caso de éxito: en la segunda compilación, el resultado de la vulnerabilidad cumple con las reglas de firma de vulnerabilidades. Esta compilación tiene éxito.

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 la actualidad, la imagen contiene una vulnerabilidad que infringe las reglas de firma de vulnerabilidades. El compilador personalizado de Kritis Signer no produce una certificación.

  1. Consulta el archivo de configuración de compilación para el caso de falla (opcional).

    cat samples/signer/cloudbuild-bad.yaml
    
  2. Envía la compilación:

    gcloud builds submit \
      --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG,_NOTE_NAME=$NOTE_NAME \
      --config=samples/signer/cloudbuild-bad.yaml samples/signer
    

    Verás un resultado como el siguiente:

    "ERROR: (gcloud.builds.submit) build BUILD_ID completed with status "FAILURE"
    
  3. Guarda el ID de compilación de la última compilación:

    export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
    
  4. 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

En este ejemplo, se compila una imagen de contenedor que contiene vulnerabilidades que no infringen las reglas de firma de vulnerabilidades. El compilador personalizado de Kritis Signer crea una certificación.

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

  1. (Opcional) Visualiza el archivo de configuración de compilación para el caso de éxito

    cat samples/signer/cloudbuild-good.yaml
    
  2. Envía la compilación:

    gcloud builds submit \
      --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG,_NOTE_NAME=$NOTE_NAME \
      --config=samples/signer/cloudbuild-good.yaml samples/signer
    
  3. Guarda el ID de compilación de la última compilación:

    export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
    
  4. Verifica el resultado

    gcloud builds describe $BUILD_ID | grep status
    

Usa Kritis Signer en modo de solo verificación

En esta sección, se muestra cómo usar Kritis Signer en modo check-only. En este modo, Kritis Signer no crea una certificación. Solo verifica que la imagen no tenga vulnerabilidades antes de realizar de forma correcta o fallar el paso de compilación según las reglas de firma de vulnerabilidades.

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

  1. Consulta el archivo de configuración de compilación para el caso de falla (opcional).

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

    En el paso de compilación de Kritis Signer, ten en cuenta que la marca mode se establece en check-only.

  2. Envía la compilación:

    gcloud builds submit \
      --config=samples/policy-check/cloudbuild-bad.yaml samples/policy-check
    

    Ten en cuenta que la compilación falla.

  3. Guarda el ID de compilación de la última compilación:

    export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
    
  4. 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

  1. Consulta el archivo de configuración de compilación para el caso de falla (opcional).

    cat samples/policy-check/cloudbuild-good.yaml
    
  2. Envía la compilación:

    gcloud builds submit \
     --config=samples/policy-check/cloudbuild-good.yaml samples/policy-check
    
  3. Guarda el ID de compilación de la última compilación:

    export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
    
  4. Verifica el resultado

    gcloud builds describe $BUILD_ID | grep status
    

Limpia

Para limpiar los recursos que se usan en este documento, puedes borrar el proyecto:

gcloud projects delete ${PROJECT_ID}

¿Qué sigue?