Cómo proteger implementaciones de imágenes en Cloud Run y Google Kubernetes Engine

En esta página, se proporcionan instrucciones para proteger las implementaciones de imágenes en Cloud Run y Google Kubernetes Engine mediante Cloud Build.

Aprende a configurar la autorización binaria para verificar certificaciones de compilación y bloquear implementaciones de imágenes que Cloud Build no genera. Este proceso puede reducir el riesgo de implementar software no autorizado.

Antes de comenzar

  1. Habilita las API de Cloud Build, Binary Authorization, and Artifact Registry.

    Habilita las API

  2. Para usar los ejemplos de la línea de comandos de esta guía, instala y configura el SDK de Google Cloud.

  3. Configura la autorización binaria para tu plataforma.

Controla implementaciones con la autorización binaria

En la autorización binaria, una política es un conjunto de reglas que rigen la implementación de imágenes. Puedes configurar una regla para que requiera certificaciones firmadas de manera digital.

Cloud Build genera y firma certificaciones en el momento de la compilación. Con la autorización binaria, puedes usar el certificador built-by-cloud-build para verificar las certificaciones y solo implementar imágenes compiladas por Cloud Build.

Para crear el certificador built-by-cloud-build en tu proyecto, ejecuta una compilación en ese proyecto.

Para permitir que solo se implementen imágenes compiladas por Cloud Build, sigue estos pasos:

Console

  1. Ve a la página Autorización binaria en Google Cloud Console.

    Ve a Autorización binaria

  2. En la pestaña Política, haz clic en Editar política.

  3. En el cuadro de diálogo Editar política, selecciona Permitir solo las imágenes aprobadas por todos los certificadores que se indican a continuación.

  4. Haz clic en Agregar certificadores.

  5. En el cuadro de diálogo Agregar certificadores, haz lo siguiente:

    1. Selecciona Agregar por proyecto y nombre del certificador y realiza los siguientes pasos:
      1. En el campo Nombre del proyecto, ingresa el proyecto en el que ejecutas Cloud Build.
      2. Haz clic en el campo Nombre del certificador y verifica que el certificador built-by-cloud-build esté disponible.
      3. Haga clic en built-by-cloud-build.
    2. Como alternativa, selecciona Agregar por ID de recurso del certificador. En ID del recurso del certificador, ingresa

      projects/PROJECT_ID/attestors/built-by-cloud-build
      

      Reemplaza PROJECT_ID por el proyecto en el que ejecutas Cloud Build.

  6. Haz clic en Agregar 1 certificador.

  7. Haga clic en Save Policy.

gcloud

  1. Exporta tu política existente a un archivo con el siguiente comando:

    gcloud container binauthz policy export > /tmp/policy.yaml
    
  2. Edita el archivo de política.

  3. Edita una de las siguientes reglas:

    • defaultAdmissionRule
    • clusterAdmissionRules
    • istioServiceIdentityAdmissionRules
    • kubernetesServiceAccountAdmissionRules
  4. Agrega un bloque requireAttestationsBy a la regla si aún no hay uno.

  5. En el bloque requireAttestationsBy, agrega lo siguiente:

    projects/PROJECT_ID/attestors/built-by-cloud-build
    

    Reemplaza PROJECT_ID por el proyecto en el que ejecutas Cloud Build.

  6. Guarda el archivo de políticas.

  7. Importa el archivo de políticas.

    gcloud container binauthz policy import /tmp/policy.yaml
    

    El siguiente es un archivo de política de ejemplo que contiene la referencia a built-by-cloud-build-attestor:

    defaultAdmissionRule:
      evaluationMode: REQUIRE_ATTESTATION
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
      requireAttestationsBy:
        - projects/PROJECT_ID/attestors/built-by-cloud-build
    name: projects/PROJECT_ID/policy
    

    Reemplaza PROJECT_ID por el ID del proyecto en el que ejecutas Cloud Build.

Puedes ver los errores de la política en los mensajes de registro de autorización binaria para GKE o Cloud Run.

Usa el modo de ejecución de prueba

En el modo de ejecución de prueba, la autorización binaria verifica el cumplimiento de la política sin bloquear la implementación. En cambio, los mensajes de estado del cumplimiento de políticas se registran en Cloud Logging. Puedes usar estos registros para determinar si la política de bloqueo funciona correctamente y, también, para identificar falsos positivos.

Para habilitar la ejecución de prueba, haz lo siguiente:

Console

  1. Ve a la página Autorización binaria en Google Cloud Console.

    Ve a Autorización binaria

  2. Haz clic en Editar política.

  3. En Regla predeterminada o en una regla específica, selecciona Modo de ejecución de prueba.

  4. Haga clic en Save Policy.

gcloud

  1. Exporta la política de autorización binaria a un archivo YAML:

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. En un editor de texto, configura enforcementMode como DRYRUN_AUDIT_LOG_ONLY y guarda el archivo.

  3. Para actualizar la política, ejecuta el siguiente comando a fin de importar el archivo:

    gcloud container binauthz policy import /tmp/policy.yaml
    

Puedes ver los errores de la política en los mensajes de registro de autorización binaria para GKE o Cloud Run.

Limitaciones

  • Cloud Build y la autorización binaria deben estar en el mismo proyecto. Si ejecutas tu plataforma de implementación en otro proyecto, consulta el proyecto de Cloud Build cuando agregues el certificador built-by-cloud-build en la autorización binaria.

  • Cloud Build no genera certificaciones cuando envías imágenes a Artifact Registry mediante un paso de compilación docker push explícito. Asegúrate de enviar a Artifact Registry mediante el campo images en el paso de compilación de docker build. Para obtener más información sobre images, consulta Almacena imágenes en Container Registry.

  • Debes usar archivos de configuración de compilación independientes para la canalización de compilación y la canalización de implementación. Esto se debe a que Cloud Build produce certificaciones solo después de que la canalización de compilación se completa con éxito. La autorización binaria verificará la certificación antes de implementar la imagen.

Habilita las certificaciones en grupos privados

De forma predeterminada, Cloud Build no genera certificaciones de autorización binaria para compilaciones en grupos privados. Para generar certificaciones, agrega la opción requestedVerifyOption: VERIFIED a tu archivo de configuración de compilación:

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1', '.' ]
images:
- 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1'
options:
  requestedVerifyOption: VERIFIED

Después de agregar la requestedVerifyOption, Cloud Build habilita la generación de certificación y los metadatos de origen para tu imagen.

Ver metadatos del certificador

Los certificadores se crean la primera vez que ejecutas una compilación en un proyecto. El ID del certificador tiene el formato projects/PROJECT_ID/attestors/built-by-cloud-build, en el que PROJECT_ID es el ID del proyecto.

Puedes verificar los metadatos del certificador de compilación con el siguiente comando:

curl -X GET -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://binaryauthorization.googleapis.com/v1beta1/projects/PROJECT_ID/attestors/built-by-cloud-build

Reemplaza PROJECT_ID por el proyecto en el que ejecutas Cloud Build.

El resultado contiene información sobre el certificador y las claves públicas correspondientes. Por ejemplo:

name": "projects/PROJECT_ID/attestors/built-by-cloud-build",
  "userOwnedDrydockNote": {
    "noteReference": "projects/PROJECT_ID/notes/built-by-cloud-build",
    "publicKeys": [
      {
        "id": "//cloudkms.googleapis.com/v1/projects/verified-builder/locations/asia/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1",
        "pkixPublicKey": {
          "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEMMvFxZLgIiWOLIXsaTkjTmOKcaK7\neIZrgpWHpHziTFGg8qyEI4S8O2/2wh1Eru7+sj0Sh1QxytN/KE5j3mTvYA==\n-----END PUBLIC KEY-----\n",
          "signatureAlgorithm": "ECDSA_P256_SHA256"
        }
      },
...
      }
    ],
    "delegationServiceAccountEmail": "service-942118413832@gcp-binaryauthorization.iam.gserviceaccount.com"
  },
  "updateTime": "2021-09-24T15:26:44.808914Z",
  "description": "Attestor autogenerated by build ID fab07092-30f4-4f70-caf7-4545cbc404d6"

¿Qué sigue?