Crea certificaciones con Voucher

En este instructivo, se describe cómo configurar y usar Voucher para crear certificaciones de autorización binaria.

Descripción general del cupón

El cupón es una herramienta de código abierto que ejecuta un conjunto de verificaciones en imágenes de contenedor antes de crear certificaciones de autorización binaria para las imágenes. El cupón tiene un cliente y un componente de servidor. Debes ejecutar Voucher Client como un paso adicional dentro de tu canalización de compilación, después del paso que compila la imagen. Cuando se ejecuta el paso de compilación del cliente de Voucher, este envía la imagen al servidor del cupón, que realiza las verificaciones. Tú defines qué verificaciones se ejecutan en Voucher, junto con otros criterios, en el archivo de configuración del servidor Voucher.

En este instructivo, se muestra cómo usar la verificación del cupón snakeoil para detectar vulnerabilidades en las imágenes. Para habilitar la verificación en el archivo de configuración, configura la opción fail-on en un límite de vulnerabilidad, como se muestra más adelante en este instructivo.

Una vez que se complete la verificación snakeoil, si todas las vulnerabilidades identificadas caen por debajo del umbral, el servidor de cupones crea la certificación de autorización binaria para la imagen. Si alguna de las vulnerabilidades identificadas alcanza o supera el umbral, el servidor de cupones no crea una certificación.

En el momento de implementar la imagen de contenedor, sin una certificación verificada, el ejecutor de la autorización binaria no permite que se implemente la imagen.

Objetivos

En esta guía, harás lo siguiente:

  1. Configura el servidor de cupones en Cloud Run.
  2. Configura el cliente de cupón.
  3. Usa Voucher en ejemplos de canalizaciones de compilación.

Costos

En esta guía, se usan los siguientes productos de Google Cloud.

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

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

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un proyecto.

  4. Habilita las API de Cloud Build, Container Registry, Container Analysis, Cloud KMS, Cloud Run, and Identity and Access Management.

    Habilita las API

  5. Instala e inicializa el SDK de Cloud.
  6. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  7. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un proyecto.

  8. Habilita las API de Cloud Build, Container Registry, Container Analysis, Cloud KMS, Cloud Run, and Identity and Access Management.

    Habilita las API

  9. Instala e inicializa el SDK de Cloud.
  10. Te recomendamos que configures la autorización binaria con Google Kubernetes Engine. En este instructivo, se describe cómo crear una certificación. Para usar la aplicación en el momento de la implementación a fin de verificar la certificación y, luego, implementar la imagen asociada, se debe configurar la autorización binaria. Asegúrate de configurar la política para solicitar certificaciones. Puedes configurar la política en Google Cloud Console o en la línea de comandos.
  11. Especifica tu proyecto de Google Cloud en una variable de entorno.

      export PROJECT_ID=PROJECT_ID
    

    Reemplaza PROJECT_ID con el ID del proyecto.

  12. Configura el ID del proyecto para los comandos gcloud:

    gcloud config set project ${PROJECT_ID}

  13. Especifica el número de proyecto en una variable de entorno para pasos futuros:

    export PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" \
      --format='value(project_number)')

Configura el servidor de cupones

En los siguientes pasos, configurarás el servidor de cupones.

Crea una clave de firma de Cloud Key Management Service

En esta sección, crearás la clave que el servidor de cupones usa para crear una certificación de autorización binaria.

  1. Crea un llavero de claves

    gcloud kms keyrings create KEY_RING\
       --location global
    

    Reemplaza KEY_RING por un nombre de llavero de claves, como voucher-key-ring.

  2. Crea una clave de firma:

    gcloud kms keys create KEY_NAME \
      --keyring KEY_RING \
      --location global \
      --purpose "asymmetric-signing" \
      --default-algorithm "rsa-sign-pkcs1-4096-sha512"
    

    Reemplaza KEY_NAME por el nombre de una clave, como voucher-key.

  3. Almacena el ID de recurso de la versión de la clave de Cloud Key Management Service:

    export KMS_RESOURCE_ID=projects/$PROJECT_ID/locations/global/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    
  4. Otorga la función cloudkms.signer a la cuenta de servicio del entorno de ejecución de Compute Engine.

    En este paso, otorgas la función cloudkms.signer a la cuenta de servicio que ejecuta el servidor de Voucher. Esto permite que el servidor de cupones firme las certificaciones con las claves de Cloud Key Management Service. Para ello, ejecuta el siguiente comando:

    gcloud kms keys add-iam-policy-binding\
      KEY_NAME --keyring=KEY_RING\
      --location=global\
      --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com\
      --role=roles/cloudkms.signer
    

Crea la nota de Container Analysis

En esta sección, crearás la nota.

  1. Almacena el ID de la nota:

    export NOTE_ID=snakeoil
    
  2. Almacena el URI de la nota:

    export NOTE_URI=projects/$PROJECT_ID/notes/$NOTE_ID
    
  3. Carga útil de la solicitud de creación:

    cat > /tmp/note_payload.json << EOM
    {
      "name": "${NOTE_URI}",
      "attestation": {
        "hint": {
          "human_readable_name": "voucher note for snakeoil check"
        }
      }
    }
    EOM
    
  4. Crea la nota:

    curl -X POST \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer $(gcloud --project ${PROJECT_ID} auth print-access-token)"  \
      -H "x-goog-user-project: ${PROJECT_ID}" \
      --data-binary @/tmp/note_payload.json  \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"
    

Compilar y configurar el servidor de cupones

En esta configuración única, obtendrá, configurará y compilará la imagen del servidor Voucher. Luego, la almacenas en Container Registry.

  1. Clona el repositorio de cupones:

    git clone https://github.com/grafeas/voucher.git
    cd voucher/
    

    Este repositorio contiene lo siguiente:

    • Código fuente para compilar el servidor de cupones.
    • Código fuente para compilar el cliente Voucher.
    • Ejemplos en los que se demuestra el uso de cupón.
  2. Actualiza el archivo de configuración del servidor de cupones.

    Linux

    Crea el archivo de configuración del servidor de cupones a partir de una plantilla y reemplaza y por los valores que definiste antes. Para ello, ejecuta el siguiente comando:

     cat tutorials/cloudrun/config.toml.template \
        | sed -e "s?<PROJECT_ID>?${PROJECT_ID}?g" \
        | sed -e "s?<KMS_KEY_NAME>?${KMS_RESOURCE_ID}?g" \
          > tutorials/cloudrun/config.toml
    

    Otro SO

    1. Edita el archivo tutorials/cloudrun/config.toml.template.

      • Reemplaza <PROJECT_ID> por el valor en ${PROJECT_ID}.
      • Reemplaza <KMS_KEY_NAME> por el valor en ${KMS_RESOURCE_ID}.
    2. Guarda el archivo como tutorials/cloudrun/config.toml.

  3. Visualiza el archivo de configuración del servidor de cupones:

    cat tutorials/cloudrun/config.toml
    

    Verás un resultado que contiene lo siguiente:

    failon = "high"
    

    Ten en cuenta que en el archivo de configuración, la opción failon se configura como high. Esta configuración configura el servidor de cupones para realizar una verificación de vulnerabilidades en una imagen. Si la imagen contiene vulnerabilidades con una gravedad de HIGH, la verificación fallará y el servidor de Voucher no creará la certificación de autorización binaria. Para obtener más información sobre la configuración de fail-on, consulta Error en las vulnerabilidades.

  4. Compile y suba la imagen del contenedor del servidor del cupón:

    En esta sección, debes ejecutar la canalización de Cloud Build que compila la imagen de contenedor del Voucher Server. La compilación también sube la imagen del servidor del cupón a gcr.io/$PROJECT_ID/voucher-server.

    gcloud  builds submit --config ./tutorials/cloudrun/cloudbuild-server.yaml
    

Implementa el servidor de cupones en Cloud Run

  1. Selecciona una región.

    Para ver una lista de regiones disponibles, consulta Consulta una lista de regiones disponibles. Crea una variable para almacenar la región seleccionada:

    export REGION=REGION
    

    Reemplaza REGION por el nombre de la región en la que planeas implementar el servidor de cupones.

  2. Implementa el servidor de cupones en Cloud Run.

    gcloud run deploy --image gcr.io/${PROJECT_ID}/voucher-server \
      --platform managed voucher-server \
      --region ${REGION} \
      --no-allow-unauthenticated
    

    Verás un resultado como el siguiente:

    Service [voucher-server] revision [voucher-server-00001-caw] has been deployed and is serving 100 percent of traffic.
    Service URL: https://voucher-server-4wjtm2amga-uc.a.run.app
    
  3. Almacena la URL de servicio del servidor de cupones:

    export SERVER_SERVICE_URL=$(gcloud run services describe voucher-server --platform managed --region ${REGION} --format='value(status.url)')
    

Configura el cliente Voucher

En los siguientes pasos, configurarás el cliente Voucher.

  1. Crea la cuenta de servicio de invocador para el cupón:

    gcloud iam service-accounts create INVOKER_ACCOUNT_NAME
    

    Reemplaza INVOKER_ACCOUNT_NAME por un nombre para la cuenta de servicio de invocador, como voucher-invoker.

  2. Especifica la cuenta de servicio:

    export INVOKER_SERVICE_ACCOUNT=INVOKER_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
    
  3. Otorga la función run.invoker a la cuenta de servicio de invocador de tu proyecto.

    Otorga permiso a tu cuenta de servicio de invocador para que invoque al servidor del cupón en Cloud Run. Para ello, ingrese el siguiente comando:

    gcloud run services add-iam-policy-binding voucher-server \
      --member serviceAccount:$INVOKER_SERVICE_ACCOUNT \
      --role roles/run.invoker \
      --platform managed \
      --region ${REGION}
    
  4. Otorga la función iam.serviceAccountTokenCreator a la cuenta de servicio del invocador para Cloud Build.

    En esta sección, otorgas a la cuenta de servicio de Cloud Build permiso para actuar en nombre de la cuenta de servicio del invocador a fin de que el cliente de Voucher tenga permiso para enviar solicitudes al servidor de Voucher durante la compilación. Para ello, ingresa el siguiente comando:

    gcloud iam service-accounts add-iam-policy-binding $INVOKER_SERVICE_ACCOUNT \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/iam.serviceAccountTokenCreator
    

Usa el cupón para verificar las imágenes en busca de vulnerabilidades

En esta sección, ejecutarás dos canalizaciones de Cloud Build de ejemplo. En ambas canalizaciones, compilas una imagen y, luego, usas Voucher para verificarla en busca de vulnerabilidades.

Caso de error

En esta sección, la canalización de compilación de ejemplo no crea una certificación. La imagen que compilas según Debian 9 contiene al menos una vulnerabilidad de gravedad HIGH. La opción fail-on en el servidor del cupón config.toml está configurada para fallar en vulnerabilidades de gravedad HIGH. En este caso, el servidor de cupones no crea una certificación de autorización binaria.

  1. Ejecuta la canalización de compilación:

    gcloud builds submit \
      --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT \
      --config=tutorials/cloudrun/examples/cloudbuild-bad.yaml tutorials/cloudrun/examples
    
  2. Busca en el registro de la última compilación los resultados del cupón snakeoil:

    Console

    1. Toma nota del ID de compilación de la última compilación.

    2. En Google Cloud Console, ve a la página Historial de compilación.

      Ir al historial de compilaciones

    3. En Compilar, haz clic en el elemento que contiene los primeros caracteres del ID de compilación.

    4. Haz clic en Ver sin procesar.

    5. Busca snakeoil con tu navegador.

      Verás un resultado como el siguiente:

      "name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
      

    gcloud

    1. Guarda el ID de compilación de la compilación:

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. Ingresa el siguiente comando para buscar tu registro de compilación:

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      El resultado luce de la siguiente manera:

      "name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
      

Caso de éxito

En esta sección, la canalización de compilación de ejemplo tiene éxito en la creación de una certificación. Todas las vulnerabilidades identificadas se clasifican por debajo del umbral fail-on, por lo que la verificación pasa la canalización y crea la certificación.

  1. Ejecuta la canalización:

    gcloud builds submit\
      --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT\
      --config=tutorials/cloudrun/examples/cloudbuild-good.yaml tutorials/cloudrun/examples
    
  2. Busca en el registro de la última compilación los resultados del cupón snakeoil:

    Console

    1. Toma nota del ID de compilación de la última compilación.

    2. En Google Cloud Console, ve a la página Historial de compilación.

      IR AL HISTORIAL DE COMPILACIONES

    3. En Compilar, haz clic en el elemento que contiene los primeros caracteres del ID de compilación.

    4. Haz clic en Ver sin procesar.

    5. Busca snakeoil con tu navegador.

      Verás un resultado como el siguiente:

      "name":"snakeoil","success":true,"attested":true
      

    gcloud

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

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. Ingresa el siguiente comando para buscar tu registro de compilación:

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      El resultado luce de la siguiente manera:

      "name":"snakeoil","success":true,"attested":true
      

Limpia

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

gcloud projects delete ${PROJECT_ID}

¿Qué sigue?