Crear atestaciones con OpenSSF Scorecard

En este tutorial se muestra cómo usar OpenSSF Scorecard para comprobar si las imágenes de contenedor cumplen las prácticas recomendadas de seguridad de la cadena de suministro. El encargado de la atestación de Scorecard se ejecuta como parte de la canalización de Cloud Build para generar una atestación que la autorización binaria pueda verificar antes del despliegue. Este paso de verificación evita que se implementen en producción artefactos de contenedores vulnerados, lo que puede prevenir varias clases de vulnerabilidades de la cadena de suministro.

Información general

Open Source Security Foundation (OpenSSF) es una organización que proporciona herramientas, servicios e infraestructura para iniciativas de seguridad de código abierto. Scorecard es una herramienta que mantiene OpenSSF y que analiza los repositorios de gestión de código fuente (SCM) para detectar las prácticas recomendadas de seguridad de la cadena de suministro.

Scorecard Attestor es una herramienta integrada en Scorecard que te permite crear certificaciones de Autorización Binaria basadas en una política que configures. Scorecard Attestor ejecuta Scorecard en el repositorio de SCM de una imagen de contenedor, genera resultados, evalúa los resultados en función de la política y genera una certificación si se cumple la política.

En este tutorial, crearás un repositorio de ejemplo y, a continuación, usarás Scorecard Attestor. Cada canalización de ejemplo contiene los siguientes pasos de compilación:

  1. build: crea una imagen de contenedor de ejemplo.
  2. push: envía la imagen a Container Registry.
  3. attest: comprueba y firma la imagen. Para ello, usa Scorecard Attestor para crear una atestación basada en la política.

En el paso attest de cada canalización, Scorecard Attestor hace lo siguiente:

  1. Obtiene datos sobre el repositorio de SCM de la imagen de contenedor recién compilada.
  2. Ejecuta Scorecard en los datos sin procesar y evalúa el repositorio de SCM en función de la política especificada por el usuario.
    1. Si se cumplen todas las políticas, Scorecard Attestor crea la certificación.
    2. Si no se cumplen todas las políticas, Scorecard Attestor no crea la certificación.

En el momento del despliegue, la autorización binaria comprueba si hay una certificación verificable. Si no se incluye, el verificador no permitirá que se implemente la imagen.

Costes

En este tutorial se utilizan los siguientes productos de Google Cloud .

  • Container Registry
  • Artifact Analysis
  • Cloud Build
  • Cloud Key Management Service

Usa la calculadora de precios para generar una estimación de costes en función del uso previsto.

Objetivos

En este tutorial, harás lo siguiente:

  1. Configura Scorecard Attestor como compilador personalizado de Cloud Build.
  2. Ver y configurar la política de Scorecard Attestor.
  3. Ejecuta Scorecard Attestor en un repositorio de ejemplo para crear una certificación basada en una política.
  4. Ejecuta Scorecard Attestor en un repositorio de ejemplo en modo de solo verificación sin crear una certificación. ## Antes de empezar

En esta sección, configurarás el sistema una sola vez.

Configurar un entorno

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

    export PROJECT_ID=PROJECT_ID
    

    Sustituye PROJECT_ID por tu Google Cloud proyecto.

  2. Define el ID de proyecto predeterminado como tu Google Cloud proyecto:

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

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

    Para 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
    

Configurar roles de gestión de identidades y accesos

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

  • containeranalysis.notes.editor: añade el rol Editor de notas de análisis de artefactos para gestionar el attestor.
  • containeranalysis.notes.occurrences.viewer: añade el rol Repeticiones de análisis de artefactos para notas para gestionar las repeticiones de vulnerabilidades y de certificaciones.
  • roles/containeranalysis.occurrences.editor: añade el rol Editor de repeticiones de Artifact Analysis para crear repeticiones de certificación en Artifact Analysis.
  • cloudkms.signer: añade el rol Firmante de CryptoKey de Cloud KMS, que permite a la cuenta de servicio acceder al servicio de firma 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
    

Crear una clave de firma de Cloud KMS

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

  1. Crea un llavero de claves de Cloud KMS con el nombre scorecard-attestor-key-ring:

    gcloud kms keyrings create scorecard-attestor-key-ring \
        --location global
    
  2. Crea una clave de Cloud KMS llamada scorecard-attestor-key en el llavero de claves:

    gcloud kms keys create scorecard-attestor-key \
        --keyring scorecard-attestor-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 posteriores:

    export KMS_DIGEST_ALG=SHA256
    export KMS_KEY_NAME=projects/$PROJECT_ID/locations/global/keyRings/scorecard-attestor-key-ring/cryptoKeys/scorecard-attestor-key/cryptoKeyVersions/1
    
  4. Crea el encargado de la atestación de autorización binaria. Más adelante, Scorecard Attestor crea una nota asociada a este encargado.

    gcloud container binauthz attestors create scorecard-attestor \
        --attestation-authority-note=scorecard-attestation \
        --attestation-authority-note-project=$PROJECT_ID \
        --description="Attest that ossf/scorecard policy checks pass"
    
  5. Asocia el encargado de la atestación de autorización binaria con la clave de KMS:

    gcloud container binauthz attestors public-keys add \
        --attestor=scorecard-attestor \
        --keyversion=1 \
        --keyversion-key=scorecard-attestor-key \
        --keyversion-keyring=scorecard-attestor-key-ring \
        --keyversion-location=global \
        --keyversion-project=$PROJECT_ID
    

Para consultar otros algoritmos de firma, consulta Crear claves asimétricas.

Crear atestaciones con Scorecard Attestor en una canalización de Cloud Build

Enviar la compilación de prueba del caso de error

En esta sección, crearás una imagen de contenedor y comprobarás sus prácticas de seguridad de la cadena de suministro con OpenSSF Scorecard. La imagen se compila correctamente, pero no crea una certificación. El repositorio base contiene algunas prácticas de seguridad de la cadena de suministro desaconsejadas, como una dependencia no fijada de Debian 10 en el Dockerfile y un artefacto binario compilado registrado en el repositorio de origen. Se trata de infracciones de la política de certificación del repositorio.

  1. Clona el repositorio de prueba: scorecard-binauthz-test-bad.

  2. Consulta el archivo de política de atestación del caso de fallo.

    cat policy-binauthz.yaml
    
  3. (Opcional) Consulta el archivo de configuración de compilación del caso de fallo.

    cat samples/signer/cloudbuild.yaml
    
  4. Envía la compilación:

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    

Deberías ver un resultado como el siguiente:

time="2022-12-20T22:30:14Z" level=info msg="image failed scorecard attestation policy check"
  1. Guarda el ID de compilación de la última compilación:

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

    gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "failed scorecard attestation policy check"
    

Enviar la compilación de prueba del caso de éxito

En esta sección, crearás una imagen de contenedor que cumpla su política de certificación de Scorecard. En este caso, el encargado de la atestación de Scorecard crea una atestación.

Para enviar la compilación de ejemplo de caso de éxito a Cloud Build, haz lo siguiente:

  1. Clona el repositorio de prueba: scorecard-binauthz-test-good.

  2. Consulta el archivo de política de atestación en caso de fallo. sh cat policy-binauthz.yaml

  3. (Opcional) Consulta el archivo de configuración de compilación del caso de fallo.

    cat samples/signer/cloudbuild.yaml
    
  4. Envía la compilación:

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    
  5. Verifica el resultado:

    gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
    
  6. Obtener la URL de la imagen del contenedor que ha creado y comprobado la tarjeta de puntuación

    export IMAGE_URI=$(gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep -o "Attestation for image .* is successfully uploaded" txt | cut -d' ' -f4 | tr -d '"')
    
  7. Confirma que se ha creado una certificación para la imagen de contenedor. Scorecard Attestor usa el ID de la nota ossf-scorecard-attestation y el nombre de la nota projects/${PROJECT_ID}/notes/ossf-scorecard-attestation.

    gcloud container binauthz attestations list \
        --attestor="projects/${PROJECT_ID}/attestors/ossf-scorecard-attestor" \
        --filter="resourceUri='https://${IMAGE_URI}'"
    

Limpieza

Para eliminar los recursos utilizados en este documento, puedes eliminar el proyecto:

gcloud projects delete $PROJECT_ID

Siguientes pasos