Usar la comprobación de SLSA

En esta página se explica cómo usar la comprobación SLSA de la validación continua (VC) de la autorización binaria, que comprueba la procedencia compatible con SLSA de las imágenes de contenedor asociadas a los pods que se ejecutan en clústeres de GKE en los que la VC está habilitada.

Para usar esta comprobación, debes compilar imágenes con Cloud Build, que genera procedencia compatible con SLSA.

En el ejemplo de esta guía se usa Cloud Source Repositories para el repositorio de código fuente, Artifact Registry para el registro de imágenes y Cloud Build para compilar la imagen y generar la procedencia.

El único compilador de confianza que admite la comprobación de SLSA es Cloud Build.

Costes

En esta guía se utilizan los siguientes servicios de Google Cloud :

  • Artifact Registry
  • Autorización binaria, pero CV está disponible de forma gratuita durante la fase de vista previa
  • Cloud Build
  • Cloud Source Repositories
  • GKE

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Antes de empezar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.

  3. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  4. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Artifact Registry, Binary Authorization, Cloud Build, GKE, Cloud Source Repositories APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com sourcerepo.googleapis.com
  8. Install the Google Cloud CLI.

  9. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  10. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  11. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Verify that billing is enabled for your Google Cloud project.

  13. Enable the Artifact Registry, Binary Authorization, Cloud Build, GKE, Cloud Source Repositories APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com sourcerepo.googleapis.com
  14. Asegúrate de que la CLI de gcloud esté actualizada a la última versión.
  15. Instala la herramienta de línea de comandos kubectl.
  16. Si tus políticas de autorización binaria y tus clústeres de GKE están en proyectos diferentes, asegúrate de que la autorización binaria esté habilitada en ambos proyectos.
  17. Roles obligatorios

    En esta sección se explica cómo definir roles para esta comprobación.

    Información general

    Si ejecutas todos los productos que se mencionan en esta guía en el mismo proyecto, no tienes que definir ningún permiso. Autorización binaria configura los roles correctamente cuando la habilitas. Si ejecuta los productos en proyectos diferentes, debe asignar roles tal como se describe en esta sección.

    Para asegurarte de que el agente de servicio de Autorización Binaria de cada proyecto tiene los permisos necesarios para evaluar la comprobación de CV SLSA, pide a tu administrador que asigne los siguientes roles de gestión de identidades y accesos al agente de servicio de Autorización Binaria de cada proyecto:

    • Lector de Artifact Registry (roles/artifactregistry.reader) en la cuenta de servicio de Compute Engine del proyecto del clúster
    • Si el proyecto del clúster es diferente del proyecto de la política, haz lo siguiente: Evaluador de políticas de autorización binaria (roles/binaryauthorization.policyEvaluator) en el agente de servicio de autorización binaria del proyecto del clúster para que pueda acceder al proyecto de la política.
    • Si tu proyecto de atestación es diferente de tu proyecto de política: Lector de repeticiones de Container Analysis (roles/containeranalysis.occurrences.viewer) en el agente de servicio de autorización binaria del proyecto de política para que pueda acceder al proyecto de atestación.

    Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

    Es posible que tu administrador también pueda conceder los permisos necesarios al agente de servicio de Autorización Binaria en cada proyecto mediante roles personalizados u otros roles predefinidos.

    Otorgar roles con la CLI de gcloud

    Para asegurarte de que las cuentas de servicio de cada proyecto tengan los permisos necesarios para evaluar esta comprobación, otorga a las cuentas de servicio de cada proyecto los siguientes roles de gestión de identidades y accesos:

    1. Si el proyecto en el que ejecutas el clúster es diferente del proyecto en el que reside la política, debes conceder permiso al agente de servicio de Autorización Binaria del proyecto del clúster para acceder a la política en el proyecto de la política.

      1. Obtén el agente de servicio de autorización binaria del proyecto del clúster:

        PROJECT_NUMBER=$(gcloud projects list \
          --filter="projectId:CLUSTER_PROJECT_ID" \
          --format="value(PROJECT_NUMBER)")
        CLUSTER_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
        

        Sustituye CLUSTER_PROJECT_ID por el ID del proyecto del clúster.

      2. Permite que CV evalúe la política en el clúster:

        gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \
            --member="serviceAccount:$CLUSTER_SERVICE_ACCOUNT" \
            --role='roles/binaryauthorization.policyEvaluator'
        

        Sustituye POLICY_PROJECT_ID por el ID del proyecto que contiene tu política.

    2. Permite que el agente de servicio del proyecto de la política acceda a las certificaciones:

      1. Obtén el agente de servicio de autorización binaria asociado al proyecto de la política:

        PROJECT_NUMBER=$(gcloud projects list \
          --filter="projectId:POLICY_PROJECT_ID" \
          --format="value(PROJECT_NUMBER)")
        POLICY_PROJECT_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
        

        Sustituye POLICY_PROJECT_ID por el ID del proyecto que contiene tu política.

      2. Concede el rol:

        gcloud projects add-iam-policy-binding ATTESTATION_PROJECT_ID \
            --member="serviceAccount:$POLICY_PROJECT_SERVICE_ACCOUNT" \
            --role='roles/containeranalysis.occurrences.viewer'
        

        Sustituye ATTESTATION_PROJECT_ID por el ID del proyecto que contiene tus certificaciones.

    3. Permite que la cuenta de servicio predeterminada de Compute Engine extraiga la imagen del repositorio:

      1. Obtén la cuenta de servicio de Compute Engine asociada al proyecto del clúster:

        PROJECT_NUMBER=$(gcloud projects list \
          --filter="projectId:CLUSTER_PROJECT_ID" \
          --format="value(PROJECT_NUMBER)")
        COMPUTE_ENGINE_SERVICE_ACCOUNT="$PROJECT_NUMBER-compute@developer.gserviceaccount.com"
        

        Sustituye CLUSTER_PROJECT_ID por el ID del proyecto del clúster que contiene tu política.

      2. Concede el rol:

        gcloud projects add-iam-policy-binding ARTIFACT_PROJECT_ID \
            --member="serviceAccount:$COMPUTE_ENGINE_SERVICE_ACCOUNT" \
            --role='roles/artifactregistry.reader'
        

        Sustituye ARTIFACT_PROJECT_ID por el ID del proyecto de Artifact Registry que almacena las imágenes que se van a implementar.

    Opcional: Crea y sube una imagen de muestra

    Esta sección se incluye con fines ilustrativos para mostrarte cómo crear una imagen de ejemplo con procedencia conforme a SLSA. La procedencia se usa más adelante en la guía para mostrar la comprobación. Más información sobre la procedencia de Cloud Build

    Crear el repositorio de muestra

    Para crear un repositorio en Cloud Source Repositories, sigue estos pasos:

    1. Crea el repositorio y clónalo de forma local:

      gcloud source repos create SOURCE_REPO_NAME \
          --project=SOURCE_REPO_PROJECT_ID && \
      gcloud source repos clone SOURCE_REPO_NAME \
          --project=SOURCE_REPO_PROJECT_ID && \
      cd SOURCE_REPO_NAME
      

      Haz los cambios siguientes:

      • SOURCE_REPO_NAME: el nombre de tu repositorio de código fuente. Por ejemplo: slsa-check-test-repo
      • SOURCE_REPO_PROJECT_ID: el ID del proyecto del repositorio
    2. Para crear los archivos de origen, configuración y compilación, haz lo siguiente:

      1. Crea la fuente de la imagen:

        cat > quickstart.sh <<EOF
        #!/bin/sh
        echo "Hello, world! The time is $(date)."
        sleep infinity
        EOF
        
      2. Haz que el archivo sea ejecutable:

        chmod +x quickstart.sh
        
      3. Crea el archivo de configuración de Dockerfile:

        cat > Dockerfile <<EOF
        FROM alpine
        COPY quickstart.sh /
        CMD ["/quickstart.sh"]
        EOF
        
      4. Crea el archivo cloudbuild.yaml de Cloud Build, que envía la imagen a Artifact Registry:

        cat > cloudbuild.yaml <<EOF
        steps:
        - name: 'gcr.io/cloud-builders/docker'
          args: [ 'build', '-t', 'LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE', '.' ]
        options:
          requestedVerifyOption: VERIFIED
        images:
        - 'LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE'
        EOF
        

        Haz los cambios siguientes:

        • LOCATION: la ubicación de Artifact Registry. Por ejemplo: us-west2, europe-central2 o asia-east1.
        • ARTIFACT_PROJECT_ID: el ID del proyecto que almacena los artefactos de Artifact Registry
        • ARTIFACT_REPO_NAME: el nombre del repositorio de Artifact Registry, por ejemplo, slsa-check-test-repo
        • DIRECTORY: el directorio. Por ejemplo: slsa-check
        • IMAGE: la ruta a la imagen. Por ejemplo: slsa-check-image
      5. Confirma los archivos en Cloud Source Repositories:

        git add .
        git commit -a
        

    Compilar y subir la imagen de muestra

    Para simplificar el uso de esta guía, te recomendamos que uses el mismo proyecto para SOURCE_REPO_PROJECT_ID y ARTIFACT_PROJECT_ID. Si usas proyectos diferentes, puede que tengas que configurar permisos de gestión de identidades y accesos adicionales. Consulta más información sobre el control de acceso de Artifact Registry. Para obtener más información sobre Cloud Build, consulta la descripción general de Cloud Build.

    Para crear el repositorio, sigue estos pasos:

    1. Crea el repositorio de Artifact Registry:

      gcloud artifacts repositories create ARTIFACT_REPO_NAME \
          --project=ARTIFACT_PROJECT_ID \
          --repository-format=docker \
          --location=LOCATION \
          --description="Docker repository"
      

      Haz los cambios siguientes:

      • ARTIFACT_REPO_NAME: el nombre de tu repositorio
      • ARTIFACT_PROJECT_ID: el ID del proyecto del artefacto
      • LOCATION: la ubicación de Artifact Registry. Por ejemplo: us-west2, europe-central2 o asia-east1.
    2. Crea el activador de compilación de Cloud Build:

      gcloud beta builds triggers create cloud-source-repositories \
          --project=SOURCE_REPO_PROJECT_ID \
          --repo=SOURCE_REPO_NAME \
          --region=LOCATION \
          --branch-pattern=.* \
          --build-config=cloudbuild.yaml
      

      Haz los cambios siguientes:

      • SOURCE_REPO_NAME: el nombre del repositorio de código fuente
      • SOURCE_REPO_PROJECT_ID: el ID de proyecto de Cloud Build
      • LOCATION: la ubicación
    3. Activa una compilación subiendo los archivos que has creado anteriormente en esta guía.

      git push
      

      Cuando la imagen se compila correctamente, Cloud Build genera la procedencia y sube la imagen a tu repositorio de Artifact Registry.

    4. Para comprobar la imagen más reciente y obtener su resumen, haz lo siguiente:

      1. Comprueba que Cloud Build haya compilado tu imagen:

        gcloud artifacts docker images list LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/REPO_NAME/DIRECTORY \
            --project=ARTIFACT_PROJECT_ID \
            --sort-by=create_time
        

        Haz los cambios siguientes:

        • LOCATION: la ubicación de Artifact Registry
        • ARTIFACT_PROJECT_ID: el ID del proyecto de los artefactos
        • ARTIFACT_REPO_NAME: el nombre del repositorio
        • DIRECTORY: el directorio
      2. Copia el resumen de la imagen más reciente. El resumen tiene un aspecto similar al siguiente: sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59

    5. Opcional: Consulta la procedencia de tu imagen:

      gcloud artifacts docker images describe \
        LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE@DIGEST \
          --project=ARTIFACT_PROJECT_ID \
          --show-provenance
      

      Haz los cambios siguientes:

      • ARTIFACT_PROJECT_ID: el ID del proyecto de los artefactos
      • LOCATION: la ubicación de Artifact Registry
      • ARTIFACT_REPO_NAME: el nombre del repositorio de artefactos.
      • DIRECTORY: el directorio
      • IMAGE: la ruta de la imagen
      • DIGEST: el resumen asociado a la imagen

      La salida del comando es similar a la siguiente:

      image_summary:
        digest: sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59
        fully_qualified_digest: us-west2-docker.pkg.dev/my-project/slsa-check-repo/slsa-check-image@sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59
        registry: us-west2-docker.pkg.dev
        repository: slsa-check-repo
        slsa_build_level: 3
      provenance_summary:
        provenance:
        - build:
            intotoStatement:
              _type: https://in-toto.io/Statement/v0.1
              predicateType: https://slsa.dev/provenance/v0.1
              slsaProvenance:
                builder:
                  id: https://cloudbuild.googleapis.com/GoogleHostedWorker
                materials:
                - digest:
                    sha1: de4e4227fff1d00d6f7785a827608627e4a369ea
                  uri: git+https://source.cloud.google.com/my-project/slsa-check-source-repo
                metadata:
                  ...
      envelope:
        payload: eyJfdHlwZSI6I ... taW1hZ2U6dGFnMSJ9XX0=
        payloadType: application/vnd.in-toto+json
        signatures:
        - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/provenanceSigner/cryptoKeyVersions/1
          sig: MEQCIBCCkho_re4EfAT-NBSSmAXOZlv4lU_vWzEru97tU8KmAiAKcAa99umWngzNQADmPixqYjbKjLOKQEUvrI5chSrf7g==
        - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1
          sig: MEUCIFOEq_7RpiZAB4vUlit3hkZ2yI0n37-5Y87l0JbU-EZSAiEA9TNZZcv_MnzKffTnswHWZR2DSLmYiklr5twWfIec-zo=
      

      El resultado debe contener el bloque provenance_summary para que funcione la comprobación de SLSA. Si el resultado no contiene el bloque, comprueba que Cloud Build se haya invocado mediante un activador de compilación. Cloud Build no genera información de procedencia cuando se activa manualmente.

    Crear una política de la plataforma

    Para generar la procedencia, debes usar un activador de Cloud Build para compilar tu imagen, tal como se describe en Compilar y subir la imagen de muestra.

    Para crear una política de plataforma con una comprobación de SLSA, siga estos pasos:

    1. Crea el archivo YAML de la política de la plataforma:

      cat > POLICY_PATH <<EOF
      gkePolicy:
        checkSets:
        - checks:
          - displayName: My SLSA check
            imageAllowlist:
              # This policy exempts images that are in the following artifact registry
              allowPattern:
              - ARTIFACT_LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/EXEMPT_IMAGE_PATH/**
            slsaCheck:
              rules:
              - attestationSource:
                  containerAnalysisAttestationProjects:
                  - projects/ATTESTATION_PROJECT_ID
                configBasedBuildRequired: true
                trustedBuilder: GOOGLE_CLOUD_BUILD
                trustedSourceRepoPatterns:
                - source.cloud.google.com/SOURCE_REPO_PROJECT_ID/SOURCE_REPO_NAME
                customConstraints: CEL_EXPRESSION
          displayName: My check set
      EOF
      

      Haz los cambios siguientes:

      • POLICY_PATH: ruta del archivo de la política.
      • ARTIFACT_LOCATION: la ubicación de tu repositorio en Artifact Registry.
      • ARTIFACT_PROJECT_ID: el ID del proyecto que contiene tus artefactos.
      • ARTIFACT_REPO_NAME: el repositorio que contiene la imagen.
      • EXEMPT_IMAGE_PATH: ruta opcional a una o varias imágenes exentas. Por ejemplo: not-built-by-cloud-build. El bloque de imageAllowlist se incluye en esta política de la plataforma para que puedas eximir las imágenes que no tengan procedencia y, de esta forma, no infrinjan la política de la plataforma. Si quieres registrar las infracciones de estas imágenes, omite este bloque.
      • ATTESTATION_PROJECT_ID: el ID del proyecto que almacena las certificaciones creadas por Cloud Build.
      • SOURCE_REPO_PROJECT_ID: el ID del proyecto que contiene tu código fuente.
      • SOURCE_REPO_NAME: el repositorio que contiene la imagen. Para ilustrarlo, si quieres forzar una infracción de esta comprobación, asigna SOURCE_REPO_NAME a un repositorio de código fuente que no sea el que contiene tu imagen.
      • POLICY_PROJECT_ID: ID del proyecto que contiene la política de CV.
      • POLICY_ID: el ID de esta política.
      • CEL_EXPRESSION: una expresión CEL que proporciona restricciones adicionales en la política de SLSA. Por ejemplo, para añadir una restricción personalizada que requiera que las imágenes procedan de una ruta de directorio específica, sustituye CEL_EXPRESSION por la siguiente expresión:

        payload.predicate.externalParameters.buildConfigSource.path != "" && payload.predicate.externalParameters.buildConfigSource.repository.contains("github.com/my-repo/my-production-repo")
        
    2. Crea la política de la plataforma:

      Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

      • POLICY_ID: ID de política de plataforma que elijas. Si la política está en otro proyecto, puedes usar el nombre de recurso completo: projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID.
      • POLICY_PATH: ruta al archivo de la política.
      • POLICY_PROJECT_ID: ID del proyecto de la política.

      Ejecuta el siguiente comando:

      Linux, macOS o Cloud Shell

      gcloud beta container binauthz policy create POLICY_ID \
          --platform=gke \
          --policy-file=POLICY_PATH \
          --project=POLICY_PROJECT_ID

      Windows (PowerShell)

      gcloud beta container binauthz policy create POLICY_ID `
          --platform=gke `
          --policy-file=POLICY_PATH `
          --project=POLICY_PROJECT_ID

      Windows (cmd.exe)

      gcloud beta container binauthz policy create POLICY_ID ^
          --platform=gke ^
          --policy-file=POLICY_PATH ^
          --project=POLICY_PROJECT_ID

    Habilitar CV

    Puedes crear un clúster o actualizar uno que ya tengas para usar la monitorización de CV con políticas de plataforma basadas en comprobaciones.

    Crear un clúster que use la monitorización de CV

    En esta sección, crearás un clúster que solo use la monitorización de CV con políticas de plataforma basadas en comprobaciones.

    Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

    • CLUSTER_NAME: nombre del clúster.
    • LOCATION: la ubicación (por ejemplo, us-central1 o asia-south1).
    • POLICY_PROJECT_ID: el ID del proyecto en el que se almacena la política.
    • POLICY_ID: el ID de la política.
    • CLUSTER_PROJECT_ID: el ID del proyecto del clúster.

    Ejecuta el siguiente comando:

    Linux, macOS o Cloud Shell

    gcloud beta container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID

    Windows (PowerShell)

    gcloud beta container clusters create CLUSTER_NAME `
        --location=LOCATION `
        --binauthz-evaluation-mode=POLICY_BINDINGS `
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
        --project=CLUSTER_PROJECT_ID

    Windows (cmd.exe)

    gcloud beta container clusters create CLUSTER_NAME ^
        --location=LOCATION ^
        --binauthz-evaluation-mode=POLICY_BINDINGS ^
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
        --project=CLUSTER_PROJECT_ID

    Crear un clúster que use la monitorización de cumplimiento y de CV

    En esta sección, crearás un clúster que utilice tanto la aplicación de la política project-singleton como la monitorización de CV con políticas de plataforma basadas en comprobaciones:

    Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

    • CLUSTER_NAME: nombre del clúster.
    • LOCATION: la ubicación (por ejemplo, us-central1 o asia-south1).
    • POLICY_PROJECT_ID: el ID del proyecto en el que se almacena la política.
    • POLICY_ID: el ID de la política.
    • CLUSTER_PROJECT_ID: el ID del proyecto del clúster.

    Ejecuta el siguiente comando:

    Linux, macOS o Cloud Shell

    gcloud beta container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID

    Windows (PowerShell)

    gcloud beta container clusters create CLUSTER_NAME `
        --location=LOCATION `
        --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE `
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
        --project=CLUSTER_PROJECT_ID

    Windows (cmd.exe)

    gcloud beta container clusters create CLUSTER_NAME ^
        --location=LOCATION ^
        --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
        --project=CLUSTER_PROJECT_ID

    Actualizar un clúster para usar la monitorización de CV

    En esta sección, actualizarás un clúster para que use la monitorización de CV solo con políticas de plataforma basadas en comprobaciones. Si el clúster ya tiene habilitada la aplicación de la política de proyecto único, al ejecutar este comando se inhabilitará. En su lugar, actualiza el clúster con la monitorización de CV y la aplicación habilitadas.

    Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

    • CLUSTER_NAME: el nombre del clúster
    • LOCATION: la ubicación (por ejemplo, us-central1 o asia-south1)
    • POLICY_PROJECT_ID: ID del proyecto en el que se almacena la política
    • POLICY_ID: el ID de la política
    • CLUSTER_PROJECT_ID: el ID del proyecto del clúster

    Ejecuta el siguiente comando:

    Linux, macOS o Cloud Shell

    gcloud beta container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID

    Windows (PowerShell)

    gcloud beta container clusters update CLUSTER_NAME `
        --location=LOCATION `
        --binauthz-evaluation-mode=POLICY_BINDINGS `
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
        --project=CLUSTER_PROJECT_ID

    Windows (cmd.exe)

    gcloud beta container clusters update CLUSTER_NAME ^
        --location=LOCATION ^
        --binauthz-evaluation-mode=POLICY_BINDINGS ^
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
        --project=CLUSTER_PROJECT_ID

    Actualizar un clúster para usar la monitorización de cumplimiento y de CV

    En esta sección, actualizarás un clúster para que use tanto la aplicación de la política de un solo proyecto como la monitorización de versiones con políticas de plataforma basadas en comprobaciones.

    Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

    • CLUSTER_NAME: nombre de un clúster
    • LOCATION: la ubicación (por ejemplo, us-central1 o asia-south1)
    • POLICY_PROJECT_ID: ID del proyecto en el que se almacena la política
    • POLICY_ID: el ID de la política
    • CLUSTER_PROJECT_ID: el ID del proyecto del clúster

    Ejecuta el siguiente comando:

    Linux, macOS o Cloud Shell

    gcloud beta container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID

    Windows (PowerShell)

    gcloud beta container clusters update CLUSTER_NAME `
        --location=LOCATION `
        --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE `
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
        --project=CLUSTER_PROJECT_ID

    Windows (cmd.exe)

    gcloud beta container clusters update CLUSTER_NAME ^
        --location=LOCATION ^
        --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
        --project=CLUSTER_PROJECT_ID

    Desplegar la imagen

    1. Configura kubectl:

      gcloud container clusters get-credentials CLUSTER_NAME \
          --location=LOCATION \
          --project=CLUSTER_PROJECT_ID
      

      Haz los cambios siguientes:

      • CLUSTER_NAME: el nombre de tu clúster
      • LOCATION: la ubicación del clúster
      • CLUSTER_PROJECT_ID: el ID del proyecto del clúster
    2. Despliega el pod:

      kubectl run hello-app \
          --image='LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE@DIGEST'
      

      El pod se ha desplegado. Como la imagen se ha creado con procedencia y a partir de un repositorio de código fuente de confianza, no infringirá la comprobación SLSA de CV y no se generarán entradas de registro.

      Para forzar una infracción de la comprobación de SLSA, puedes asignar SOURCE_REPO_NAME a un repositorio de código fuente que no sea el que contiene tu imagen. También puedes activar la compilación manualmente, lo que omite la generación de procedencia. A continuación, busca entradas de registro.

    Ver registros de entradas de CV

    Puedes buscar entradas de Cloud Logging para encontrar errores de configuración de CV y infracciones de validación de la política de la plataforma de CV.

    CV registra los errores y las infracciones en Cloud Logging en un plazo de 24 horas. Normalmente, las entradas se muestran al cabo de unas horas.

    Ver los registros de errores de configuración de la verificación

    Para ver los registros de errores de configuración de CV, ejecuta el siguiente comando:

    gcloud logging read \
         --order="desc" \
         --freshness=7d \
         --project=CLUSTER_PROJECT_ID \
        'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "configErrorEvent"'
    

    En el siguiente resultado se muestra un error de configuración en el que no se encuentra una política de plataforma de CV:

    {
      "insertId": "141d4f10-72ea-4a43-b3ec-a03da623de42",
      "jsonPayload": {
        "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent",
        "configErrorEvent": {
          "description": "Cannot monitor cluster 'us-central1-c.my-cluster': Resource projects/123456789/platforms/gke/policies/my-policy does not exist."
        }
      },
      "resource": {
        "type": "k8s_cluster",
        "labels": {
          "cluster_name": "my-cluster",
          "location": "us-central1-c",
          "project_id": "my-project"
        }
      },
      "timestamp": "2024-05-28T15:31:03.999566Z",
      "severity": "WARNING",
      "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
      "receiveTimestamp": "2024-05-28T16:30:56.304108670Z"
    }
    

    Ver las infracciones de validación de las políticas de la plataforma de CV

    Si ninguna imagen infringe las políticas de la plataforma que has habilitado, no aparecerá ninguna entrada en los registros.

    Para ver las entradas de registro de CV de los últimos siete días, ejecuta el siguiente comando:

    gcloud logging read \
         --order="desc" \
         --freshness=7d \
         --project=CLUSTER_PROJECT_ID \
        'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "policyName"'
    

    Sustituye CLUSTER_PROJECT_ID por el ID del proyecto del clúster.

    Tipos de comprobación

    Los registros de CV comprueban la información de las infracciones en checkResults. En la entrada, el valor checkType indica la comprobación. Los valores de cada comprobación son los siguientes:

    • ImageFreshnessCheck
    • SigstoreSignatureCheck
    • SimpleSigningAttestationCheck
    • SlsaCheck
    • TrustedDirectoryCheck
    • VulnerabilityCheck

    Registro de ejemplo

    La siguiente entrada de registro de CV describe una imagen no conforme que infringe una comprobación de directorio de confianza:

    {
      "insertId": "637c2de7-0000-2b64-b671-24058876bb74",
      "jsonPayload": {
        "podEvent": {
          "endTime": "2022-11-22T01:14:30.430151Z",
          "policyName": "projects/123456789/platforms/gke/policies/my-policy",
          "images": [
            {
              "result": "DENY",
              "checkResults": [
                {
                  "explanation": "TrustedDirectoryCheck at index 0 with display name \"My trusted directory check\" has verdict NOT_CONFORMANT. Image is not in a trusted directory",
                  "checkSetName": "My check set",
                  "checkSetIndex": "0",
                  "checkName": "My trusted directory check",
                  "verdict": "NON_CONFORMANT",
                  "checkType": "TrustedDirectoryCheck",
                  "checkIndex": "0"
                }
              ],
              "image": "gcr.io/my-project/hello-app:latest"
            }
          ],
          "verdict": "VIOLATES_POLICY",
          "podNamespace": "default",
          "deployTime": "2022-11-22T01:06:53Z",
          "pod": "hello-app"
        },
        "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent"
      },
      "resource": {
        "type": "k8s_cluster",
        "labels": {
          "project_id": "my-project",
          "location": "us-central1-a",
          "cluster_name": "my-test-cluster"
        }
      },
      "timestamp": "2022-11-22T01:44:28.729881832Z",
      "severity": "WARNING",
      "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
      "receiveTimestamp": "2022-11-22T03:35:47.171905337Z"
    }
    

    Limpieza

    En esta sección se describe cómo limpiar la monitorización de CV que has configurado anteriormente en esta guía.

    Puedes inhabilitar la monitorización de CV o tanto Binary Authorization como CV en tu clúster.

    Inhabilitar la autorización binaria en un clúster

    Para inhabilitar la aplicación de CV y de autorización binaria en tu clúster, ejecuta el siguiente comando:

    gcloud beta container clusters update CLUSTER_NAME \
        --binauthz-evaluation-mode=DISABLED \
        --location=LOCATION \
        --project=CLUSTER_PROJECT_ID
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre del clúster
    • LOCATION: la ubicación del clúster
    • CLUSTER_PROJECT_ID: el ID del proyecto del clúster

    Inhabilitar la monitorización de políticas basada en comprobaciones en un clúster

    Para inhabilitar la verificación de versiones con políticas basadas en comprobaciones en el clúster y volver a habilitar la aplicación mediante la política de aplicación de la autorización binaria, ejecuta el siguiente comando:

    gcloud beta container clusters update CLUSTER_NAME  \
        --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
        --location=LOCATION \
        --project="CLUSTER_PROJECT_ID"
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre del clúster
    • LOCATION: la ubicación del clúster
    • CLUSTER_PROJECT_ID: el ID del proyecto del clúster

    Ten en cuenta que --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE es equivalente a la marca anterior --enable-binauthz.

    Eliminar la política

    Para eliminar la política, ejecuta el siguiente comando. No es necesario eliminar la política de plataforma basada en comprobaciones para inhabilitar la auditoría de políticas basada en comprobaciones.

    gcloud beta container binauthz policy delete POLICY_ID \
        --platform=gke \
        --project="POLICY_PROJECT_ID"
    

    Haz los cambios siguientes:

    • POLICY_ID: el ID de la política
    • POLICY_PROJECT_ID: el ID del proyecto de la política

    Siguientes pasos