Use a verificação de assinatura do Sigstore

Esta página mostra como usar a validação contínua (CV) da autorização binária Verificação da assinatura do Sigstore. A verificação valida as assinaturas geradas pelo Sigstore de imagens de contentores associadas a pods executados em clusters do GKE onde a CV está ativada. A principal diferença entre esta verificação e a verificação de atestação de assinatura simples é que o fluxo de trabalho de assinatura do Sigstore não usa notas de análise de artefactos para associar assinaturas a imagens. Todas as assinaturas são armazenadas juntamente com a imagem que assinam.

Esta verificação só suporta repositórios do Artifact Registry.

Custos

Este guia usa os seguintes Google Cloud serviços:

  • Autorização binária, mas a CV está disponível sem custo financeiro durante a fase de pré-visualização
  • GKE
  • Cloud Key Management Service
  • Artifact Registry

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Antes de começar

  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. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  4. Para inicializar a CLI gcloud, execute o seguinte 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 role (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, Artifact Registry 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 artifactregistry.googleapis.com
  8. Install the Google Cloud CLI.

  9. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  10. Para inicializar a CLI gcloud, execute o seguinte 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 role (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, Artifact Registry 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 artifactregistry.googleapis.com
  14. Certifique-se de que a CLI gcloud está atualizada para a versão mais recente.
  15. Instale a ferramenta de linha de comandos kubectl.
  16. Se as suas políticas de autorização binária e clusters do GKE estiverem em projetos diferentes, certifique-se de que a autorização binária está ativada em ambos os projetos.
  17. Instale a ferramenta de linha de comandos cosign.
  18. Funções necessárias

    Esta secção mostra como definir funções para esta verificação.

    Vista geral

    Se executar todos os produtos mencionados neste guia no mesmo projeto, não tem de definir autorizações. A autorização binária configura as funções corretamente quando a ativa. Se executar os produtos em projetos diferentes, tem de definir funções conforme descrito nesta secção.

    Para garantir que o agente do serviço de autorização binária em cada projeto tem as autorizações necessárias para avaliar a verificação da assinatura da CV Sigstore, peça ao administrador para conceder ao agente do serviço de autorização binária em cada projeto as seguintes funções de IAM:

    • Se o projeto do cluster for diferente do projeto da política: Binary Authorization Policy Evaluator (roles/binaryauthorization.policyEvaluator) no agente do serviço de autorização binária do projeto do cluster
    • Se o seu projeto de repositório de imagens for diferente do seu projeto de políticas: Leitor do Artifact Registry (roles/artifactregistry.reader) no agente de serviço de autorização binária do projeto de políticas

    Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

    O administrador também pode conceder ao agente do serviço de autorização binária em cada projeto as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

    Conceda funções através da CLI gcloud

    Para garantir que o agente do serviço de autorização binária em cada projeto tem as autorizações necessárias para avaliar a verificação da assinatura do CV Sigstore, conceda ao agente do serviço de autorização binária em cada projeto as seguintes funções do IAM:

    1. Conceda autorização ao agente do serviço de autorização binária do projeto do cluster para aceder à política no projeto da política.

      1. Obtenha o agente do serviço de Autorização binária do projeto do cluster:

        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"
        

        Substitua CLUSTER_PROJECT_ID pelo ID do projeto do cluster.

      2. Permitir que o CV avalie a política no cluster:

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

        Substitua POLICY_PROJECT_ID pelo ID do projeto que contém a sua política.

    2. Permita que o agente do serviço de autorização binária do projeto de políticas aceda às assinaturas no seu repositório:

      1. Obtenha o agente do serviço de autorização binária do projeto de políticas:

        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"
        

        Substitua POLICY_PROJECT_ID pelo ID do projeto que contém a sua política.

      2. Conceda a função:

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

        Substitua REPOSITORY_PROJECT_ID pelo ID do projeto que contém o seu repositório.

    Crie um par de chaves

    Nesta secção, cria um par de chaves assimétricas do algoritmo de assinatura digital de curva elíptica (ECDSA).

    Utiliza a chave privada para assinar a imagem, o que cria a atestação. Inclui a chave pública na política da plataforma. Quando o CV verifica a atestação, usa a chave pública para a validar.

    Pode usar o Cloud Key Management Service (Cloud KMS) ou chaves locais, mas recomendamos que use chaves do Cloud KMS para produção.

    PKIX Cloud KMS Cosign

    1. Configure as variáveis de ambiente necessárias para criar o par de chaves. Para o fazer, recomendamos que preencha os marcadores de posição no seguinte comando e, em seguida, execute o comando.

      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
      

      Substitua o seguinte:

      • KMS_KEY_PROJECT_ID: o ID do seu projeto
      • KMS_KEYRING_NAME: um nome para o seu conjunto de chaves do Cloud KMS
      • KMS_KEY_NAME: um nome para a sua chave do Cloud KMS
    2. Gere a chave com a CLI do Cosign:

      cosign generate-key-pair \
        --kms gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}
      
    3. Registe a localização da chave pública:

      O Cosign guarda automaticamente a chave pública gerada como cosign.pub no diretório em que o comando generate-key-pair foi executado. Guarde esta localização do ficheiro numa variável para comandos futuros.

      PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
      

    PKIX Cloud KMS gcloud

    Para criar o par de chaves no Cloud KMS, faça o seguinte:

    1. Configure as variáveis de ambiente necessárias para criar o par de chaves. Para o fazer, recomendamos que preencha os marcadores de posição no seguinte comando e, em seguida, execute o comando.

      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
      

      Substitua o seguinte:

      • KMS_KEY_PROJECT_ID: o ID do seu projeto
      • KMS_KEYRING_NAME: um nome para o seu conjunto de chaves do Cloud KMS
      • KMS_KEY_NAME: um nome para a sua chave do Cloud KMS
    2. Crie o conjunto de chaves:

      gcloud kms keyrings create ${KMS_KEYRING_NAME} \
          --location=${KMS_KEY_LOCATION} \
          --project=${KMS_KEY_PROJECT_ID}
      
    3. Crie a chave:

      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. Exporte o material da chave pública para um ficheiro:

      PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
      gcloud kms keys versions get-public-key 1 \
          --key=${KMS_KEY_NAME} \
          --keyring=${KMS_KEYRING_NAME} \
          --location=${KMS_KEY_LOCATION} \
          --output-file=${PUBLIC_KEY_FILE} \
          --project=${KMS_KEY_PROJECT_ID}
      

    Chave local

    Para criar o par de chaves localmente, faça o seguinte:

      cosign generate-key-pair
      PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
      PRIVATE_KEY_FILE="$(pwd)/cosign.key"
    

    Crie a política da plataforma

    Para criar a política da plataforma de CV com uma verificação de assinatura do Sigstore, faça o seguinte:

    1. Crie o ficheiro de política da plataforma de verificação de assinatura do Sigstore:

      cat > POLICY_PATH <<EOF
      gkePolicy:
        checkSets:
        - checks:
          - displayName: sigstore-signature-check
            sigstoreSignatureCheck:
              sigstoreAuthorities:
              - displayName: sigstore-authority
                publicKeySet:
                  publicKeys:
                    publicKeyPem: |
      $(awk '{printf "                %s\n", $0}' ${PUBLIC_KEY_FILE})
      EOF
      

      Substitua POLICY_PATH pelo caminho para o ficheiro de política.

    2. Crie a política da plataforma:

      Antes de usar qualquer um dos dados de comandos abaixo, faça as seguintes substituições:

      • POLICY_ID: Um ID de política da plataforma à sua escolha. Se a política estiver noutro projeto, pode usar o nome completo do recurso: projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID.
      • POLICY_PATH: um caminho para o ficheiro de política.
      • POLICY_PROJECT_ID: o ID do projeto da política.

      Execute o seguinte comando:

      Linux, macOS ou 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

    Ative o CV

    Pode criar um novo cluster ou atualizar um cluster existente para usar a monitorização de CV com políticas da plataforma baseadas em verificações.

    Crie um cluster que use a monitorização de CV

    Nesta secção, cria um cluster que usa apenas a monitorização de CV com políticas da plataforma baseadas em verificações.

    Antes de usar qualquer um dos dados de comandos abaixo, faça as seguintes substituições:

    • CLUSTER_NAME: um nome do cluster.
    • LOCATION: a localização, por exemplo, us-central1 ou asia-south1.
    • POLICY_PROJECT_ID: o ID do projeto onde a política está armazenada.
    • POLICY_ID: o ID da política.
    • CLUSTER_PROJECT_ID: o ID do projeto do cluster.

    Execute o seguinte comando:

    Linux, macOS ou 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

    Crie um cluster que use a aplicação e a monitorização de CV

    Nesta secção, cria um cluster que usa a aplicação de políticas project-singleton e a monitorização de CV com políticas da plataforma baseadas em verificações:

    Antes de usar qualquer um dos dados de comandos abaixo, faça as seguintes substituições:

    • CLUSTER_NAME: um nome do cluster.
    • LOCATION: a localização, por exemplo, us-central1 ou asia-south1.
    • POLICY_PROJECT_ID: o ID do projeto onde a política está armazenada.
    • POLICY_ID: o ID da política.
    • CLUSTER_PROJECT_ID: o ID do projeto do cluster.

    Execute o seguinte comando:

    Linux, macOS ou 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

    Atualize um cluster para usar a monitorização de CV

    Nesta secção, atualiza um cluster para usar a monitorização de CV apenas com políticas da plataforma baseadas em verificações. Se o cluster já tiver a aplicação de políticas de instância única do projeto ativada, a execução deste comando desativa-a. Em alternativa, considere atualizar o cluster com a aplicação e a monitorização de CV ativadas.

    Antes de usar qualquer um dos dados de comandos abaixo, faça as seguintes substituições:

    • CLUSTER_NAME: o nome do cluster
    • LOCATION: a localização, por exemplo: us-central1 ou asia-south1
    • POLICY_PROJECT_ID: o ID do projeto onde a política está armazenada
    • POLICY_ID: o ID da política
    • CLUSTER_PROJECT_ID: o ID do projeto do cluster

    Execute o seguinte comando:

    Linux, macOS ou 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

    Atualize um cluster para usar a aplicação e a monitorização de CV

    Nesta secção, atualiza um cluster para usar a aplicação da política de singleton do projeto e a monitorização de CV com políticas da plataforma baseadas em verificações.

    Antes de usar qualquer um dos dados de comandos abaixo, faça as seguintes substituições:

    • CLUSTER_NAME: um nome de cluster
    • LOCATION: a localização, por exemplo: us-central1 ou asia-south1
    • POLICY_PROJECT_ID: o ID do projeto onde a política está armazenada
    • POLICY_ID: o ID da política
    • CLUSTER_PROJECT_ID: o ID do projeto do cluster

    Execute o seguinte comando:

    Linux, macOS ou 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

    Teste de CV

    Nesta secção, testa a CV implementando uma imagem assinada. Neste caso, a verificação da assinatura do CV Sigstore valida a assinatura e não produz nenhuma entrada de registo.

    Em seguida, tenta implementar uma imagem não assinada diferente. Neste caso, a verificação de CV não consegue encontrar uma assinatura válida e regista a violação no Cloud Logging.

    Assine uma imagem

    Para satisfazer a verificação, a imagem precisa de uma assinatura válida. Para criar a assinatura, faça o seguinte:

    1. Crie as variáveis que usa para assinar a imagem:

      IMAGE_PATH=IMAGE_PATH
      IMAGE_DIGEST=sha256:IMAGE_DIGEST_SHA
      IMAGE_TO_SIGN="${IMAGE_PATH}@${IMAGE_DIGEST}"
      

      Substitua o seguinte:

      • IMAGE_PATH: o caminho para a sua imagem
      • IMAGE_DIGEST_SHA: o hash SHA do resumo da imagem
    2. Assine a imagem e envie a assinatura para o Artifact Registry:

      PKIX Cloud KMS

      Assine a imagem com uma chave alojada no Cloud KMS e envie a assinatura para o Artifact Registry:

      cosign sign \
          --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \
          ${IMAGE_TO_SIGN}
      

      Chave local

      Assine a imagem com uma chave privada local e envie a assinatura para o Artifact Registry.

      cosign sign --key ${PRIVATE_KEY_FILE} ${IMAGE_TO_SIGN}
      
    3. Responda ao comando do Cosign:

      Depois de executar o comando cosign sign, o Cosign pergunta se quer carregar a assinatura para o registo de transparência Rekor. Responda y ou n às perguntas. Para saber mais sobre o Rekor, consulte a documentação do Rekor.

    Valide manualmente a assinatura

    Para validar manualmente a assinatura, faça o seguinte:

    1. Certifique-se de que a assinatura existe no Artifact Registry:

      Google Cloud consola

      1. Aceda à página do Artifact Registry na Google Cloud consola.

        Aceda ao Artifact Registry

      2. Na lista de repositórios, clique no nome do repositório que contém a sua imagem.

      3. Clique no nome da imagem que assinou.

      4. Localize o item que contém a assinatura. Este item tem a etiqueta: sha256-[image digest].sig. Deve existir apenas um item com a etiqueta.

      5. Clique em Manifesto.

      6. Deve ver um ficheiro formatado em JSON com vários campos. Cada assinatura reside num elemento da lista layers, no mapa annotations. As assinaturas estão localizadas na chave dev.cosignproject.cosign/signature.

        Segue-se um exemplo de um manifesto:

        {
              "schemaVersion": 2,
              "mediaType": "application/vnd.oci.image.manifest.v1+json",
              "config": {
                  "mediaType": "application/vnd.oci.image.config.v1+json",
                  "size": SIZE_OF_LAYERS,
                  "digest": "DIGEST_OF_LAYERS"
              },
              "layers": [
                  {
                      "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json",
                      "size": SIZE_OF_ANNOTATIONS,
                      "digest": "DIGEST_OF_ANNOTATIONS",
                      "annotations": {
                          "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE",
                          "dev.sigstore.cosign/bundle": "BUNDLE"
                      }
                  }
              ]
        }

      O manifesto de exemplo inclui o seguinte:

      • SIZE_OF_LAYERS: tamanho da matriz layers em bytes
      • DIGEST_OF_LAYERS: o resumo da matriz layers
      • SIZE_OF_ANNOTATIONS: tamanho do dicionário annotations em bytes
      • DIGEST_OF_ANNOTATIONS: resumo do dicionário annotations
      • BASE64_SIGNATURE: a assinatura não processada codificada no formato base64. Esta é a assinatura que vai ser usada para validação
      • BUNDLE: metadados específicos do Sigstore

      Pode encontrar mais detalhes sobre o formato do manifesto na especificação da assinatura do cosign da Sigstore.

      Linha de comandos

      1. Encontre o artefacto correto:

        Indique os artigos armazenados com a imagem:

        gcloud artifacts docker tags list ${IMAGE_PATH}
        

        Um exemplo de resultado tem o seguinte aspeto:

        Listing items under project PROJECT_ID, location REPOSITORY_LOCATION, repository REPOSITORY_NAME.
        TAG                         IMAGE                                                         DIGEST
        latest                      us-east1-docker.pkg.dev/my-project/my-repo/my-image           sha256:abc123
        sha256-abc123.sig           us-east1-docker.pkg.dev/my-project/my-repo/my-image           sha256:def456
        

        No resultado, o artefacto com a etiqueta sha256-abc123.sig contém a assinatura no respetivo manifesto.

      2. Obtenha o manifesto

        Para obter o manifesto do artefacto com a etiqueta sha256-IMAGE_DIGEST_SHA.sig, execute o seguinte comando:

        curl -X GET -H "Content-Type: application/json" \
                    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
                    -H "X-Goog-User-Project: REPOSITORY_PROJECT_ID" \
                    "https://REPOSITORY_LOCATION-docker.pkg.dev/v2/REPOSITORY_PROJECT_ID/REPOSITORY_NAME/IMAGE_NAME/manifests/sha256-IMAGE_DIGEST_SHA.sig"
        

        Substitua o seguinte:

        • REPOSITORY_PROJECT_ID: o ID do projeto que contém o repositório
        • REPOSITORY_LOCATION: a localização do repositório
        • REPOSITORY_NAME: o nome do repositório
        • IMAGE_NAME: o nome da imagem

        Deve ver um ficheiro formatado em JSON com vários campos. Cada assinatura reside num elemento da lista layers, no mapa annotations. As assinaturas estão localizadas na chave dev.cosignproject.cosign/signature.

        Aqui pode ver um exemplo de manifesto:

        {
            "schemaVersion": 2,
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "config": {
                "mediaType": "application/vnd.oci.image.config.v1+json",
                "size": SIZE_OF_LAYERS,
                "digest": "DIGEST_OF_LAYERS"
            },
            "layers": [
                {
                    "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json",
                    "size": SIZE_OF_ANNOTATIONS,
                    "digest": "DIGEST_OF_ANNOTATIONS",
                    "annotations": {
                        "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE",
                        "dev.sigstore.cosign/bundle": "BUNDLE"
                    }
                }
            ]
        }

      O manifesto de exemplo inclui o seguinte:

      • SIZE_OF_LAYERS: tamanho da matriz layers em bytes
      • DIGEST_OF_LAYERS: o resumo da matriz layers
      • SIZE_OF_ANNOTATIONS: tamanho do dicionário annotations em bytes
      • DIGEST_OF_ANNOTATIONS: resumo do dicionário annotations
      • BASE64_SIGNATURE: a assinatura não processada codificada no formato base64. Esta é a assinatura que vai ser usada para validação
      • BUNDLE: metadados específicos do Sigstore

      Pode encontrar mais detalhes sobre o formato do manifesto na especificação da assinatura do cosign da Sigstore.

    2. Valide manualmente a assinatura:

      Use cosign verify para validar a assinatura carregada:

      PKIX Cloud KMS

      cosign verify --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \
            ${IMAGE_PATH}@${IMAGE_DIGEST}
      

      Chave local

      cosign verify --key {PUBLIC_KEY_FILE} ${IMAGE_PATH}@${IMAGE_DIGEST}
      

      O resultado do comando indica The signatures were verified against the specified public key se a validação foi bem-sucedida.

    Implemente a imagem assinada

    Para implementar uma imagem assinada, faça o seguinte:

    1. Configure o dispositivo kubectl:

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

      Substitua o seguinte:

      • CLUSTER_NAME: o nome do seu cluster
      • LOCATION: a localização do cluster
      • CLUSTER_PROJECT_ID: o ID do projeto do cluster
    2. Implemente uma imagem e verifique a implementação em relação à política de autorização binária:

      kubectl run hello-app-signed --image=${IMAGE_PATH}@${IMAGE_DIGEST}
      

      O agrupamento foi implementado. Uma vez que a imagem está assinada, o CV não produz entradas de registo relacionadas com este pod.

    Implemente uma imagem não assinada

    Nesta secção, implementa uma imagem não assinada.

    Uma vez que a política requer assinaturas e esta imagem não tem nenhuma, o CV regista regularmente a violação enquanto o contentor está em execução.

    Para implementar a imagem, execute o seguinte comando:

      kubectl run hello-app-unsigned \
          --image=UNSIGNED_IMAGE_PATH@UNSIGNED_IMAGE_DIGEST
    

    O agrupamento foi implementado. Uma vez que a imagem não tem uma atestação, o CV produz entradas de registo enquanto o pod está em execução.

    Veja os registos das entradas de CV

    Pode pesquisar entradas do Cloud Logging para encontrar erros de configuração do CV e violações de validação de políticas da plataforma do CV.

    O CV regista erros e violações no Cloud Logging no prazo de 24 horas. Normalmente, pode ver as entradas no prazo de algumas horas.

    Veja os registos de erros de configuração do CV

    Para ver os registos de erros de configuração de CV, execute o seguinte comando:

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

    A saída seguinte mostra um erro de configuração em que não é encontrada uma política da 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"
    }
    

    Veja as violações de validação da política da plataforma CV

    Se nenhuma imagem violar as políticas da plataforma que ativou, não são apresentadas entradas nos registos.

    Para ver as entradas do registo de CV dos últimos sete dias, execute o seguinte comando:

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

    Substitua CLUSTER_PROJECT_ID pelo ID do projeto do cluster.

    Tipos de verificações

    Os registos de CV verificam as informações de violação para checkResults. Na entrada, o valor checkType indica a verificação. Os valores de cada verificação são os seguintes:

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

    Exemplo de registo

    A seguinte entrada de registo de CV descreve uma imagem não conforme que viola uma verificação de diretório fidedigno:

    {
      "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"
    }
    

    Limpar

    Esta secção descreve como limpar a monitorização de CV que configurou anteriormente neste guia.

    Pode desativar a monitorização de CV ou a autorização binária e a CV no seu cluster.

    Desative a Autorização binária num cluster

    Para desativar a aplicação da CV e da autorização binária no seu cluster, execute o seguinte comando:

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

    Substitua o seguinte:

    • CLUSTER_NAME: o nome do cluster
    • LOCATION: a localização do cluster
    • CLUSTER_PROJECT_ID: o ID do projeto do cluster

    Desative a monitorização de políticas baseada em verificações num cluster

    Para desativar a CV com políticas baseadas em verificações no cluster e reativar a aplicação através da política de aplicação da autorização binária, execute o seguinte comando:

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

    Substitua o seguinte:

    • CLUSTER_NAME: o nome do cluster
    • LOCATION: a localização do cluster
    • CLUSTER_PROJECT_ID: o ID do projeto do cluster

    Tenha em atenção que --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE é equivalente à flag mais antiga --enable-binauthz.

    Elimine a política

    Para eliminar a política, execute o seguinte comando. Não é necessário eliminar a política da plataforma baseada em verificações para desativar a auditoria de políticas baseadas em verificações.

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

    Substitua o seguinte:

    • POLICY_ID: o ID da política
    • POLICY_PROJECT_ID: o ID do projeto da política

    O que se segue?