Crea una certificación de autorización binaria en una canalización de Cloud Build

En este instructivo, se muestra cómo crear una certificación de autorización binaria en una canalización de Cloud Build. Esta configuración ayuda a garantizar que solo las imágenes de contenedor compiladas y firmadas como parte del proceso de compilación de Cloud Build se autoricen de forma automática para ejecutarse en tu entorno de implementación.

Para obtener información sobre cómo usar el análisis de vulnerabilidades de Artifact Analysis en tu canalización de compilación de Cloud Build, consulta Crea certificaciones con Voucher o Crea certificaciones con Kritis Signer.

Descripción general de Cloud Build

Cloud Build (descripción general) toma el código fuente almacenado en Cloud Source Repositories o en otro repositorio alojado, ejecuta tus compilaciones y pruebas, y almacena las salidas de software en Container Registry o cualquier otro servicio de almacenamiento en Google Cloud Platform.

Descripción general de la autorización binaria

La autorización binaria (descripción general) es un producto de Google Cloud que aplica restricciones en el momento de la implementación en las aplicaciones. Su integración en Google Kubernetes Engine (GKE) permite que los usuarios establezcan que los contenedores implementados en un clúster de Kubernetes estén firmados de forma criptográfica por una autoridad confiable y verificados por un certificador de autorización binaria.

Puedes configurar la autorización binaria para requerir certificaciones según la ubicación del código fuente a fin de evitar que se implementen las imágenes de contenedor compiladas a partir de fuentes no autorizadas.

Obtén más información:

Arquitectura

En el siguiente diagrama, se muestran los componentes de una configuración de autorización binaria de Cloud Build:

Canalización de certificación de autorización binaria de Cloud Build.
Figura 1.Canalización de Cloud Build que crea una certificación de autorización binaria.

En esta canalización, sucede lo siguiente:

  1. El código para compilar la imagen del contenedor se envía a un repositorio de código fuente, como Cloud Source Repositories.

  2. Una herramienta de integración continua (CI), Cloud Build, compila y prueba el contenedor.

  3. La compilación envía la imagen del contenedor a Container Registry o a otro registro que almacena tus imágenes compiladas.

  4. Cloud Key Management Service, que proporciona administración de claves para el par de claves criptográficas, firma la imagen de contenedor. La firma resultante se almacena en una certificación recién creada.

  5. En el momento de la implementación, el certificador verifica la certificación mediante la clave pública del par de claves. La autorización binaria aplica la política mediante la solicitud de certificaciones firmadas para implementar la imagen de contenedor.

Crea una certificación con Cloud Build con Cloud Key Management Service

En esta sección, se muestra cómo implementar la arquitectura anterior. Se usa un paso de compilación personalizado de código abierto de la comunidad de Cloud Build. En el paso de compilación personalizado, se firma una imagen de contenedor, se crea la certificación y se sube a la autorización binaria.

Configura la administración de identidades y accesos

Para usar este paso de compilación, la cuenta de servicio de Cloud Build necesita las siguientes funciones de IAM:

  • Visualizador de certificadores de autorización binaria
    • roles/binaryauthorization.attestorsViewer
  • Verificador y firmante de CryptoKey de Cloud KMS (si se usa la clave en KMS para firmar la certificación)
    • roles/cloudkms.signerVerifier
  • Vinculador de notas de Artifact Analysis
    • roles/containeranalysis.notes.attacher

Los siguientes comandos se pueden usar para agregar las funciones a la cuenta de servicio de Cloud Build de tu proyecto:

  1. Habilita Cloud Build:

    Habilita la API de Cloud Build en el proyecto de Cloud de Google Cloud.

  2. Guarda el ID del proyecto en una variable de entorno:

    PROJECT_ID=PROJECT_ID
    

    En el ejemplo anterior, PROJECT_ID es el ID del proyecto de Google Cloud.

  3. Configura Google Cloud CLI para el proyecto:

    gcloud config set project ${PROJECT_ID}
    
  4. Obtén el número de proyecto:

    PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")
    
  5. Agrega la función de visualizador de certificadores de autorización binaria a la cuenta de servicio de Cloud Build:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/binaryauthorization.attestorsViewer
    
  6. Agrega la función de verificador y firmante de CryptoKey de Cloud KMS a la cuenta de servicio de Cloud Build (firma basada en KMS):

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/cloudkms.signerVerifier
    
  7. Agrega el rol de vinculador de notas de Artifact Analysis a la cuenta de servicio de Cloud Build:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/containeranalysis.notes.attacher
    

Compila y registra el paso de compilación personalizado con Cloud Build

  1. Clona el repositorio de la comunidad de compilación de Google Cloud:

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  2. Configura el firmante de autorización binaria para Cloud Build:

    Antes de usarlo, el código para el paso de compilación personalizado se debe compilar en un contenedor y enviar a Cloud Build. Para ello, ejecuta los siguientes comandos:

    cd cloud-builders-community/binauthz-attestation
    gcloud builds submit . --config cloudbuild.yaml
    

    El paso de compilación personalizado se envió al Google Container Registry de tu proyecto actual y ya está listo para usarse.

Crea un certificador en la autorización binaria

Crea un certificador que la autorización binaria usará en el momento de la implementación para verificar la certificación.

Configura un par de claves del certificador y de Cloud Key Management Service en la autorización binaria:

Consulta Crea un certificador mediante la CLI.

Verifica que se haya creado el certificador

   gcloud --project="${ATTESTOR_PROJECT_ID}" container binauthz attestors list
   

Agrega un paso “create-attestation” a tu cloudbuild.yaml

Si quieres usar el paso binauthz-attestation, debes actualizar cloudbuild.yaml. Para ello, agrega el paso que firmará la compilación que se envió a Container Registry.

A continuación, se proporcionan dos métodos:

  • Actualiza tu cloudbuild.yaml de forma manual.

  • Ejecuta una canalización de ejemplo con las variables de entorno que configuraste antes.

Actualiza tu cloudbuild.yaml de forma manual

  1. Para actualizar cloudbuild.yaml de forma manual, agrega el paso de compilación que aparece a continuación después del paso en el que el contenedor se sube a Container Registry. Nota: Debes reemplazar de forma manual ATTESTOR_NAME, KMS_KEY_LOCATION, KMS_KEYRING_NAME, KMS_KEY_NAME, y KMS_KEY_VERSION por tus propios valores:

    - id: 'create-attestation'
      name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
      args:
        - '--artifact-url'
        - 'gcr.io/${PROJECT_ID}/helloworld:latest'
        - '--attestor'
        - 'projects/${PROJECT_ID}/attestors/ATTESTOR_NAME'
        - '--keyversion'
        - 'projects/${PROJECT_ID}/locations/KMS_KEY_LOCATION/keyRings/KMS_KEYRING_NAME/cryptoKeys/KMS_KEY_NAME/cryptoKeyVersions/KMS_KEY_VERSION'
    

    Lo siguiente también es válido:

    - id: 'create-attestation'
      name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
      args:
        - '--artifact-url'
        - 'gcr.io/${PROJECT_ID}/helloworld:latest'
        - '--attestor'
        - 'ATTESTOR_NAME'
        - '--attestor-project'
        - '${PROJECT_ID}'
        - '--keyversion'
        - 'KEY_VERSION'
        - '--keyversion-project'
        - '${PROJECT_ID}'
        - '--keyversion-location'
        - 'KEY_LOCATION'
        - '--keyversion-keyring'
        - 'KEYRING_NAME'
        - '--keyversion-key'
        - 'KEY_NAME'
    

Prueba la canalización (opcional)

Para probar una canalización de certificación de Cloud Build de ejemplo, sigue estos pasos:

  1. Crea un archivo cloudbuild.yaml con las variables de entorno que configuraste antes:

    cd example
    cat <<EOM > cloudbuild_example.yaml
    steps:
      - id: 'build'
        name: 'gcr.io/cloud-builders/docker'
        args:
          - 'build'
          - '-t'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
          - '.'
      - id: 'publish'
        name: 'gcr.io/cloud-builders/docker'
        args:
          - 'push'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
      - id: 'create-attestation'
        name: 'gcr.io/$PROJECT_ID/binauthz-attestation:latest'
        args:
          - '--artifact-url'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
          - '--attestor'
          - 'projects/$PROJECT_ID/attestors/${ATTESTOR_NAME}'
          - '--keyversion'
          - 'projects/${PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION}'
    tags: ['cloud-builders-community']
    
    EOM
    
  2. Ejecuta Cloud Build con el cloudbuild_example.yaml de ejemplo:

    Desde el directorio cloud-builders-community/binauthz-attestation/example, ejecuta los siguientes comandos:

    gcloud builds submit . --config cloudbuild_example.yaml
    

¿Qué sigue?