Usar la comprobación de certificación de firma sencilla

En esta página se explica cómo usar la comprobación de atestación de firma simple de la validación continua (VC) de la autorización binaria. La comprobación verifica las certificaciones de las imágenes de contenedor asociadas a los pods que se ejecutan en un clúster de Google Kubernetes Engine (GKE) en el que está habilitada la verificación de contenedores.

Costes

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

  • Autorización binaria, pero CV está disponible de forma gratuita durante la fase de vista previa
  • GKE
  • Cloud Key Management Service

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 Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine 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 binaryauthorization.googleapis.com cloudkms.googleapis.com container.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 Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine 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 binaryauthorization.googleapis.com cloudkms.googleapis.com container.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 tenga los permisos necesarios para evaluar la comprobación de atestación de firma simple de CV, pide a tu administrador que conceda al agente de servicio de Autorización binaria de cada proyecto los siguientes roles de gestión de identidades y accesos:

    • 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 el agente de servicio de Autorización binaria de cada proyecto tenga los permisos necesarios para evaluar la comprobación de atestación de firma simple de CV, concede al agente de servicio de Autorización binaria de cada proyecto los siguientes roles de gestión de identidades y accesos:

    1. Concede permiso al agente de servicio de Autorización binaria del proyecto del clúster para acceder a la política del 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 de autorización binaria del proyecto de la política acceda a las atestaciones de tu proyecto de atestación:

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

        PROJECT_NUMBER=$(gcloud projects list \
          --filter="projectId:POLICY_PROJECT_ID" \
          --format="value(PROJECT_NUMBER)")
        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:$SERVICE_ACCOUNT" \
            --role='roles/containeranalysis.occurrences.viewer'
        

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

    Crear un par de claves

    En esta sección, crearás un par de claves asimétricas con el algoritmo de firma digital de curva elíptica (ECDSA).

    Usas la clave privada para firmar la imagen, lo que crea la certificación. Incluye la clave pública en una política de plataforma. Cuando CV comprueba la atestación, utiliza la clave pública para verificarla.

    Puedes usar Cloud Key Management Service o claves locales, pero te recomendamos que uses claves de Cloud KMS en producción.

    PKIX Cloud KMS

    Para crear el par de claves en Cloud KMS, sigue estos pasos:

    1. Configura las variables de entorno necesarias para crear el par de claves. Para ello, te recomendamos que rellenes los marcadores de posición del siguiente comando y, a continuación, lo ejecutes.

      KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID
      KMS_KEYRING_NAME=KMS_KEYRING_NAME
      KMS_KEY_NAME=KMS_KEY_NAME
      KMS_KEY_LOCATION=global
      KMS_KEY_PURPOSE=asymmetric-signing
      KMS_KEY_ALGORITHM=ec-sign-p256-sha256
      KMS_PROTECTION_LEVEL=software
      KMS_KEY_VERSION=1
      KEY_FILE=KEY_FILE
      

      Haz los cambios siguientes:

      • KMS_KEY_PROJECT_ID: tu ID de proyecto
      • KMS_KEYRING_NAME: nombre del conjunto de claves de Cloud KMS
      • KMS_KEY_NAME: nombre de la clave de Cloud KMS
      • KEY_FILE: ruta local para guardar tu clave de Cloud KMS
    2. Crea el conjunto de claves:

      gcloud kms keyrings create ${KMS_KEYRING_NAME} \
          --location=${KMS_KEY_LOCATION} \
          --project=${KMS_KEY_PROJECT_ID}
      
    3. Crea la clave:

      gcloud kms keys create ${KMS_KEY_NAME} \
          --location=${KMS_KEY_LOCATION} \
          --keyring=${KMS_KEYRING_NAME}  \
          --purpose=${KMS_KEY_PURPOSE} \
          --default-algorithm=${KMS_KEY_ALGORITHM} \
          --protection-level=${KMS_PROTECTION_LEVEL} \
          --project=${KMS_KEY_PROJECT_ID}
      
    4. Exporta el material de clave pública a un archivo:

      gcloud kms keys versions get-public-key ${KMS_KEY_VERSION} \
          --key=${KMS_KEY_NAME} \
          --keyring=${KMS_KEYRING_NAME} \
          --location=${KMS_KEY_LOCATION} \
          --output-file=${KEY_FILE} \
          --project=${KMS_KEY_PROJECT_ID}
      

    Clave local

    Para crear el par de claves de forma local, sigue estos pasos:

    1. Crea la clave privada:

      PRIVATE_KEY_FILE="/tmp/ec_private.pem"
      openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
      
    2. Obtén la clave pública a partir de la clave privada:

      PUBLIC_KEY_FILE="/tmp/ec_public.pem"
      openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
      

    Crear una política de la plataforma

    Para crear una política de plataforma de CV con una comprobación de atestación de firma simple, haz lo siguiente:

    1. Crea el archivo YAML de la política de plataforma de comprobación de atestación de firma simple:

      PKIX Cloud KMS

      cat > /tmp/my-policy.yaml << EOF
      gkePolicy:
        checkSets:
        - checks:
          - simpleSigningAttestationCheck:
              containerAnalysisAttestationProjects:
              - projects/ATTESTATION_PROJECT_ID
              attestationAuthenticators:
                pkixPublicKeySet:
                  pkixPublicKeys:
                    publicKeyPem: |
      $(awk '{printf "                %s\n", $0}' ${KEY_FILE})
                    signatureAlgorithm: ECDSA_P256_SHA256
                    keyId: |-
                      //cloudkms.googleapis.com/v1/projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION}
      EOF
      

      Sustituye ATTESTATION_PROJECT_ID por el ID del proyecto que almacena las certificaciones creadas con esta clave de Cloud KMS.

      Clave local

      cat > /tmp/my-policy.yaml <<EOF
      gkePolicy:
        checkSets:
        - checks:
          - simpleSigningAttestationCheck:
              containerAnalysisAttestationProjects:
              - projects/ATTESTATION_PROJECT_ID
              attestationAuthenticators:
                pkixPublicKeySet:
                  pkixPublicKeys:
                    publicKeyPem: |
      $(awk '{printf "                %s\n", $0}' /tmp/ec_public.pem)
                    signatureAlgorithm: ECDSA_P256_SHA256
                    keyId: |
                      PUBLIC_KEY_ID
      EOF
      

      Haz los cambios siguientes:

      • ATTESTATION_PROJECT_ID: el ID del proyecto que almacena las certificaciones creadas con tu clave local.
      • PUBLIC_KEY_ID: un ID que identifica de forma única tu clave local.
    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

    3. Guarda el valor del ID para usarlo más adelante:

      PUBLIC_KEY_ID="PUBLIC_KEY_ID"
      

      Sustituye PUBLIC_KEY_ID por el ID que has especificado en el campo keyId del archivo de política de la plataforma anteriormente en esta guía.

      La clave privada se usa cuando se crean las certificaciones, tal como se describe más adelante en esta guía.

    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

    Crear la nota de Artifact Analysis

    En esta sección, creará una nota de análisis de artefactos de ejemplo para vincular certificaciones. Para crear la nota, sigue estos pasos:

    1. Crea las variables de la nota:

      NOTE_PROJECT_ID=NOTE_PROJECT_ID
      NOTE_ID="test-note"
      NOTE_URI="projects/${NOTE_PROJECT_ID}/notes/${NOTE_ID}"
      DESCRIPTION="CV test note"
      

      Sustituye NOTE_PROJECT_ID por el ID del proyecto que contiene la nota.

    2. Crea el archivo de contenido de la nota:

      cat > /tmp/note_payload.json << EOM
      {
        "name": "${NOTE_URI}",
        "attestation": {
          "hint": {
            "human_readable_name": "${DESCRIPTION}"
          }
        }
      }
      EOM
      
    3. Crea la nota:

      curl -X POST \
          -H "Content-Type: application/json" \
          -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
          -H "x-goog-user-project: ${NOTE_PROJECT_ID}" \
          --data-binary @/tmp/note_payload.json "https://containeranalysis.googleapis.com/v1/projects/${NOTE_PROJECT_ID}/notes/?noteId=${NOTE_ID}"
      

      Sustituye NOTE_PROJECT_ID por el ID del proyecto que contiene la nota.

    4. Opcional: Para verificar que has creado la nota, sigue estos pasos:

      curl \
          -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
          -H "x-goog-user-project: NOTE_PROJECT_ID" \
      "https://containeranalysis.googleapis.com/v1/projects/NOTE_PROJECT_ID/notes/"
      

      Sustituye NOTE_PROJECT_ID por el ID del proyecto que contiene la nota.

    Prueba de CV

    En esta sección, probarás la verificación de la versión desplegando la imagen para la que has creado una certificación. En este caso, la comprobación de atestación de firma simple de CV verifica la atestación y no genera ninguna entrada de registro.

    Después, intentas implementar otra imagen que no tiene certificación. En este caso, la comprobación de CV no puede encontrar la certificación y registra la infracción en Cloud Logging.

    Para crear las variables que usas para probar la conversión de valor, ejecuta los siguientes comandos:

    IMAGE_PATH="us-docker.pkg.dev/google-samples/containers/gke/hello-app"
    IMAGE_DIGEST="sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567"
    IMAGE_TO_ATTEST="${IMAGE_PATH}@${IMAGE_DIGEST}"
    

    Crear una atestación

    Para superar la comprobación de atestación de firma simple, la imagen necesita una atestación válida.

    Puedes crear una certificación mediante la CLI de gcloud o la API REST.

    PKIX Cloud KMS

    gcloud

    Para crear una certificación con gcloud CLI, haz lo siguiente:

    1. Firma la imagen y crea la certificación mediante la codificación previa a la autenticación (PAE) (recomendada):

      gcloud beta container binauthz attestations sign-and-create \
          --artifact-url=${IMAGE_TO_ATTEST} \
          --keyversion=${KMS_KEY_VERSION} \
          --keyversion-key=${KMS_KEY_NAME} \
          --keyversion-keyring=${KMS_KEYRING_NAME} \
          --keyversion-location=${KMS_KEY_LOCATION} \
          --note=${NOTE_URI} \
          --pae-encode-payload \
          --dsse-type=DSSE_TYPE
      

      Sustituye DSSE_TYPE por el tipo de DSSE de la codificación PAE. El valor predeterminado de la marca es application/vnd.dev.cosign.simplesigning.v1+json.

    API REST

    Para crear una certificación mediante la API REST, sigue estos pasos:

    1. Crea un archivo de carga útil de firma:

      cat > /tmp/generated_payload.json << EOM
      {
        "critical": {
          "identity": {
            "docker-reference": "${IMAGE_PATH}"
          },
          "image": {
            "docker-manifest-digest": "${IMAGE_DIGEST}"
          },
          "type": "Google Cloud BinAuthz container signature"
        }
      }
      EOM
      
    2. Firma la carga útil:

      gcloud kms asymmetric-sign \
          --version=${KMS_KEY_VERSION} \
          --key=${KMS_KEY_NAME} \
          --keyring=${KMS_KEYRING_NAME} \
          --location=${KMS_KEY_LOCATION} \
          --digest-algorithm=sha256 \
          --input-file=/tmp/generated_payload.json \
          --signature-file=/tmp/ec_signature \
          --project=${KMS_KEY_PROJECT_ID}
      
    3. Crea el contenido de la atestación:

      cat > /tmp/attestation.json << EOM
      {
      "resourceUri": "${IMAGE_TO_ATTEST}",
      "note_name": "${NOTE_URI}",
      "attestation": {
        "serialized_payload": "$(base64 --wrap=0 /tmp/generated_payload.json)",
        "signatures": [{
          "public_key_id": "${PUBLIC_KEY_ID}",
          "signature": "$(base64 --wrap=0 /tmp/ec_signature)"
        }]
      }
      }
      EOM
      
    4. Crea la atestación:

      curl -X POST "https://containeranalysis.googleapis.com/v1/projects/${NOTE_PROJECT_ID}/occurrences/" \
        -H "Content-Type: application/json" \
        -H "X-Goog-User-Project: ${NOTE_PROJECT_ID}" \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        --data-binary @/tmp/attestation.json
      

      Sustituye NOTE_PROJECT_ID por el ID del proyecto que contiene la nota.

    Clave local

    gcloud

    1. Crea un archivo de carga útil de firma:

      cat > /tmp/generated_payload.json << EOM
      {
        "critical": {
          "identity": {
            "docker-reference": "${IMAGE_PATH}"
          },
          "image": {
            "docker-manifest-digest": "${IMAGE_DIGEST}"
          },
          "type": "Google Cloud BinAuthz container signature"
        }
      }
      EOM
      
    2. Crea el archivo de carga útil de la firma:

      openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signature
      
    3. Crea la atestación:

      gcloud container binauthz attestations create \
          --project=ATTESTATION_PROJECT_ID \
          --artifact-url=${IMAGE_TO_ATTEST} \
          --note=${NOTE_URI} \
          --signature-file=/tmp/ec_signature \
          --public-key-id=PUBLIC_KEY_ID
      

    API REST

    1. Crea un archivo de carga útil de firma:

      cat > /tmp/generated_payload.json << EOM
      {
        "critical": {
          "identity": {
            "docker-reference": "${IMAGE_PATH}"
          },
          "image": {
            "docker-manifest-digest": "${IMAGE_DIGEST}"
          },
          "type": "Google Cloud BinAuthz container signature"
        }
      }
      EOM
      
    2. Crea el archivo de carga útil de la firma:

      openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signature
      
    3. Crea el contenido de la atestación:

      cat > /tmp/attestation.json << EOM
      {
      "resourceUri": "${IMAGE_TO_ATTEST}",
      "note_name": "${NOTE_URI}",
      "attestation": {
        "serialized_payload": "$(base64 --wrap=0 /tmp/generated_payload.json)",
        "signatures": [{
          "public_key_id": "${PUBLIC_KEY_ID}",
          "signature": "$(base64 --wrap=0 /tmp/ec_signature)"
        }]
      }
      }
      EOM
      
    4. Crea la atestación:

      curl -X POST "https://containeranalysis.googleapis.com/v1/projects/${NOTE_PROJECT_ID}/occurrences/" \
        -H "Content-Type: application/json" \
        -H "X-Goog-User-Project: ${NOTE_PROJECT_ID}" \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        --data-binary @/tmp/attestation.json
      

    Despliega la imagen que tiene una certificación

    Para implementar una imagen para la que se ha creado una certificación, haga lo siguiente:

    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. Implementa un servicio y comprueba la implementación con la política de autorización binaria:

      kubectl run hello-app-with-attestation --image=$IMAGE_PATH@$IMAGE_DIGEST
      

      Se ha desplegado el pod. Como la imagen tiene una certificación, CV no genera entradas de registro relacionadas con este pod.

    Desplegar una imagen sin una certificación

    En esta sección, implementará una imagen que no tenga una certificación asociada.

    Como la política requiere certificaciones y esta imagen no tiene ninguna, el CV registra periódicamente la infracción mientras el contenedor está en ejecución.

    Para desplegar la imagen, ejecuta el siguiente comando:

    kubectl run hello-app-without-attestation \
       --image=$IMAGE_PATH@$IMAGE_DIGEST
    

    Se ha desplegado el pod. Como la imagen no tiene una certificación, CV genera entradas de registro mientras se ejecuta el pod.

    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