Crea certificaciones con Kritis Signer

En este instructivo, se explica cómo crear 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 Artifact 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 Artifact Analysis y recupera una lista de vulnerabilidades.
  2. Verifica la lista de vulnerabilidades según 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
  • Artifact Analysis
  • 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 los siguientes roles:

  • containeranalysis.notes.editor: Agrega el rol Editor de notas de Artifact Analysis para administrar el certificador.
  • containeranalysis.notes.occurrences.viewer: Agrega el rol Casos de Artifact Analysis para notas a fin de administrar los casos de vulnerabilidades y certificaciones.
  • roles/containeranalysis.occurrences.editor: Agrega el rol Editor de casos de Artifact Analysis para crear casos de certificación en Artifact Analysis.
  • cloudkms.signer: Agrega el rol 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.

En esta sección se muestra cómo realizar las siguientes acciones:

  • 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 es usado por Cloud Build para compilar el compilador personalizado de Kritis Signer
    • Una política de ejemplo que contiene reglas de firma de vulnerabilidades.
    • Ejemplo de un archivo 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 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 Artifact 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 lo siguiente:

  • 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-strict.yaml

La política es similar al siguiente ejemplo:

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

Aquí:

  • maximumUnfixableSeverity y maximumFixableSeverity definen los umbrales de gravedad de vulnerabilidades y riesgos comunes (CVE) en los que Kritis Signer crea certificaciones. maximumUnfixableSeverity define el umbral de gravedad para el cual no hay una corrección disponible actualmente. maximumFixableSeverity define el umbral de gravedad para el cual hay una corrección disponible actualmente. 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 alguna vulnerabilidad.
    • ALLOW_ALL: La certificación siempre se crea.
  • allowlistCVEs es una lista de CVE específicas para incluir en la lista de entidades permitidas. 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 Artifact Analysis para la CVE. Obtén más información sobre las fuentes de vulnerabilidades de Artifact 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 KEY_RING:

    gcloud kms keyrings create KEY_RING \
       --location global
    
  2. Crea una clave de Cloud KMS nueva llamada KEY_NAME dentro del llavero de claves:

    gcloud kms keys create KEY_NAME \
        --keyring 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/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    

Define un nombre de nota

Todas las certificaciones hacen referencia a una nota de Artifact 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 personalizado en la nube 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. Un paso de docker build que compila una imagen de contenedor de Docker.
  2. Un paso de docker push que envía la imagen de contenedor recién compilada a Container Registry.
  3. Un paso de vulnsign que verifica y firma la imagen de contenedor de la siguiente manera:

    1. Se espera a que Artifact 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. Se crea 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: resultado de la vulnerabilidad infringe las reglas de firma de vulnerabilidades. Esta compilación falla y no se crea ninguna certificación.
  • Caso de éxito: El resultado de la vulnerabilidad cumple con las reglas de firma de vulnerabilidades. Esta compilación se realiza de forma correcta y se crea una certificación.

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

En esta sección, compilarás una imagen de contenedor y la analizarás en busca de vulnerabilidades. La compilación falla porque la imagen de contenedor se basa en una instantánea específica de Debian 10, que contiene una cantidad de vulnerabilidades con un nivel de gravedad HIGH. Estas vulnerabilidades infringen la regla de firma de vulnerabilidades. Como resultado, el compilador no produce una certificación.

  1. (Opcional) Consulta el archivo de la política de firma de vulnerabilidades del caso de fallas.

    cat samples/signer/policy-strict.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 esta sección, compilarás una imagen de contenedor que contiene vulnerabilidades que no infringen las reglas de firma de vulnerabilidades. En este caso, 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) Consulta el archivo de la política de firma de vulnerabilidades del caso de éxito.

    cat samples/signer/policy-loose.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 del éxito o la falla del 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. (Opcional) Consulta el archivo de la política de firma de vulnerabilidades del caso de fallas.

    cat samples/policy-check/policy-strict.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. (Opcional) Consulta el archivo de la política de firma de vulnerabilidades del caso de éxito.

    cat samples/policy-check/policy-loose.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
    

Crea un certificador

Para crear una política que requiera las certificaciones que creas con el método descrito en esta guía, primero debes crear un certificador.

Para crear un certificador, haz lo siguiente:

  1. Recupera el material de clave pública de la clave de Cloud KMS que creaste antes en esta guía:

    gcloud kms keys versions get-public-key 1 \
    --key KEY_NAME \
    --keyring KEY_RING \
    --location global \
    --output-file OUTPUT_PATH
    
    • KEY_NAME: el nombre de la clave
    • KEY_RING: es el nombre del llavero de claves
    • OUTPUT_PATH: una ruta de acceso a archivos, por ejemplo, my-key.pem
  2. Crea un certificador mediante el material de clave pública en el archivo y la nota que creaste antes en esta guía. Puedes crear un certificador mediante la consola de Google Cloud o gcloud CLI.

  3. Crea una política que requiera certificaciones y proporciona el certificador que creaste en esta sección. Puedes crear una política a través de la consola de Google Cloud o la gcloud CLI.

Crea una certificación

Para crear una certificación mediante tu certificador, consulta Crea una certificación con Cloud KMS.

Limpia

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

gcloud projects delete ${PROJECT_ID}

¿Qué sigue?