Crea certificaciones con Scorecard de OpenSSF

En este instructivo, se muestra cómo usar el cuadro de evaluación de OpenSSF para verificar las imágenes de contenedor a fin de obtener prácticas recomendadas de seguridad de la cadena de suministro. Scorecard Attestor se ejecuta como parte de la canalización de Cloud Build para generar una certificación que la autorización binaria pueda verificar antes de la implementación. Este paso de verificación evita que se implementen artefactos de contenedor vulnerados en la producción, lo que puede evitar varias clases de vulnerabilidades de la cadena de suministro.

Descripción general

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

Scorecard Attestor es una herramienta integrada en Scorecard que te permite crear certificaciones de Autorización Binaria en función de 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 instructivo, compilarás un repositorio de muestra y, luego, usarás Scorecard Attestor. Cada canalización de muestra contiene los siguientes pasos de compilación:

  1. build: Compilar una imagen de contenedor de muestra.
  2. push: Envía la imagen a Container Registry.
  3. attest: Verifica y firma la imagen con Scorecard Attestor para crear una certificación basada en la política.

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

  1. Recupera datos sobre el repositorio de SCM para la imagen de contenedor recién compilada.
  2. Ejecuta Scorecard en los datos sin procesar y evalúa el repositorio de SCM con 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 cumple alguna de las políticas, Scorecard Attestor no crea la certificación.

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

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.

Objetivos

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

  1. Configura Scorecard Attestor como compilador personalizado de Cloud Build.
  2. Visualiza y configura la política de Scorecard Attestor.
  3. Ejecuta Scorecard Attestor en un repositorio de muestra para crear una certificación basada en una política.
  4. Ejecuta Scorecard Attestor en un repositorio de muestra en modo de solo verificación sin crear una certificación. ## 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
    

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 scorecard-attestor-key-ring:

    gcloud kms keyrings create scorecard-attestor-key-ring \
        --location global
    
  2. Crea una clave de Cloud KMS nueva llamada scorecard-attestor-key dentro del 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 futuros:

    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 certificador de Autorización Binaria. Más adelante, Scorecard Attestor crea una nota asociada con este certificador.

    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 certificador 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 explorar otros algoritmos de firma, consulta Crea claves asimétricas.

Crea certificaciones con Scorecard Attestor en una canalización de Cloud Build

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

En esta sección, compilarás una imagen de contenedor y verificarás las prácticas de seguridad de la cadena de suministro con Scorecard de OpenSSF. 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 no recomendadas, como una dependencia no fijada en Debian 10 en el Dockerfile, y un artefacto binario compilado en el repositorio de origen. Estos son incumplimientos de la política de certificación en el repositorio.

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

  2. Consulta el archivo de la política de certificación para el caso de falla.

    cat policy-binauthz.yaml
    
  3. Consulta el archivo de configuración de compilación para el caso de falla (opcional).

    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:

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

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

En esta sección, compilarás una imagen de contenedor que cumpla con la política de certificación de Scorecard. En este caso, Scorecard Attestor crea una certificación.

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

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

  2. Consulta el archivo de la política de certificación para el caso de falla.sh cat policy-binauthz.yaml

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

    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:

    gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
    
  6. Obtén la URL de la imagen de contenedor que se compiló y verificó mediante Scorecard

    export IMAGE_URI=$(gsutil 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 creó una certificación para la imagen de contenedor. El certificador de cuadro de evaluación usa el ID de nota ossf-scorecard-attestation y el nombre de 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}'"
    

Limpia

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

gcloud projects delete $PROJECT_ID

¿Qué sigue?