Crear una atestación de autorización binaria en una canalización de Cloud Build

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

Información general de Cloud Build

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

Información general sobre la autorización binaria

La autorización binaria (información general) es un Google Cloud producto que aplica restricciones en el momento de la implementación de las aplicaciones. Su integración con Google Kubernetes Engine (GKE) permite a los usuarios asegurarse de que los contenedores desplegados en un clúster de Kubernetes estén firmados criptográficamente por una autoridad de confianza y verificados por un attestor de autorización binaria.

Puedes configurar la autorización binaria para que requiera atestaciones basadas en la ubicación del código fuente para evitar que se desplieguen imágenes de contenedor creadas a partir de una fuente no autorizada.

Para obtener más información al respecto:

Arquitectura

En el siguiente diagrama se muestran los componentes de una configuración de Binary Authorization y Cloud Build:

Pipeline de atestación de autorización binaria de Cloud Build.
Figura 1. Pipeline de Cloud Build que crea una atestación de Binary Authorization.

En este flujo de trabajo:

  1. El código para compilar la imagen de contenedor se envía a un repositorio de origen, 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 de contenedor a Container Registry u otro registro que almacene las imágenes compiladas.

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

  5. En el momento de la implementación, el attestor verifica la certificación mediante la clave pública del par de claves. La autorización binaria aplica la política. Para ello, requiere atestaciones firmadas para desplegar la imagen de contenedor.

Crear una atestación con Cloud Build y Cloud Key Management Service

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

Configurar la gestión de identidades y accesos

Para usar este paso de compilación, la cuenta de servicio de Cloud Build necesita los siguientes roles de gestión de identidades y accesos:

  • Lector del encargado de la atestación de autorización binaria
    • roles/binaryauthorization.attestorsViewer
  • Firmante o verificador de CryptoKey de Cloud KMS (si se usa una clave de KMS para firmar una atestación)
    • roles/cloudkms.signerVerifier
  • Encargado de vincular las notas de Artifact Analysis
    • roles/containeranalysis.notes.attacher

Puedes usar los siguientes comandos para añadir los roles 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 destino Google Cloud .

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

    PROJECT_ID=PROJECT_ID
    

    donde PROJECT_ID es el Google Cloud ID de tu proyecto.

  3. Configura el proyecto de Google Cloud CLI:

    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. Añade el rol Lector del encargado de la atestación 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. Añade el rol Firmante o verificador 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. Añade el rol Artifact Analysis Notes Attacher 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
    

Compilar y registrar 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 del paso de compilación personalizado debe compilarse en un contenedor y enviarse 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 ha enviado al registro de contenedores de Google de tu proyecto actual y ya se puede usar.

Crear un encargado de la atestación en Autorización binaria

Crea un atestador que la autorización binaria usará en el momento del despliegue para verificar la atestación.

Configura un attestor y un par de claves de Cloud Key Management Service en Autorización Binaria:

Consulta Crear un attestor con la CLI.

Verificar que se ha creado el encargado de la atestación

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

Añade un paso "create-attestation" a tu cloudbuild.yaml.

Para usar el paso binauthz-attestation, debes actualizar tu cloudbuild.yaml añadiendo el paso que firmará la compilación que se ha enviado a Container Registry.

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

  • Actualiza tu cloudbuild.yaml manualmente.

  • Ejecuta una canalización de ejemplo con las variables de entorno que has definido anteriormente.

Actualizar manualmente tu cloudbuild.yaml

  1. Actualiza tu cloudbuild.yaml manualmente añadiendo el paso de compilación que se indica a continuación después del paso en el que se sube tu contenedor a Container Registry. Nota: Debe sustituir manualmente ATTESTOR_NAME, KMS_KEY_LOCATION, KMS_KEYRING_NAME, KMS_KEY_NAME y KMS_KEY_VERSION por sus 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'
    

    También es válido lo siguiente:

    - 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'
    

Opcional: Probar la canalización

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 has definido anteriormente:

    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 ejemplo cloudbuild_example.yaml:

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

    gcloud builds submit . --config cloudbuild_example.yaml
    

Siguientes pasos