Proteger implementações de imagens no Cloud Run e no Google Kubernetes Engine

Esta página fornece instruções sobre como pode proteger as implementações de imagens no Cloud Run e no Google Kubernetes Engine através do Cloud Build.

Saiba como configurar a autorização binária para verificar as atestações de compilação e bloquear implementações de imagens que não são geradas pelo Cloud Build. Este processo pode reduzir o risco de implementação de software não autorizado.

Antes de começar

  1. Enable the Cloud Build, Binary Authorization, and Artifact Registry APIs.

    Enable the APIs

  2. Para usar os exemplos de linha de comandos neste guia, instale e configure o SDK do Google Cloud.

  3. Configure a autorização binária para a sua plataforma.

Controle implementações com a Autorização binária

Uma política na autorização binária é um conjunto de regras que regem a implementação de imagens. Pode configurar uma regra para exigir atestados com assinatura digital.

O Cloud Build gera e assina atestações no momento da compilação. Com a autorização binária, pode usar o built-by-cloud-build atestador para validar as atestações e implementar apenas imagens criadas pelo Cloud Build.

Para criar o atestador built-by-cloud-build no seu projeto, execute uma compilação nesse projeto.

Para permitir a implementação apenas de imagens criadas pelo Cloud Build, siga os passos seguintes:

Consola

  1. Aceda à página Autorização binária na Google Cloud consola:

    Aceda à autorização binária

  2. No separador Política, clique em Editar política.

  3. Na caixa de diálogo Editar política, selecione Permitir apenas imagens que tenham sido aprovadas por todos os seguintes atestadores.

  4. Clique em Adicionar atestantes.

  5. Na caixa de diálogo Adicionar atestadores, faça o seguinte:

    1. Selecione Adicionar por projeto e nome do atestador e siga os seguintes passos:
      1. No campo Nome do projeto, introduza o projeto onde executa o Cloud Build.
      2. Clique no campo Nome do atestador e repare que o atestador built-by-cloud-build está disponível.
      3. Clique em built-by-cloud-build.
    2. Em alternativa, selecione Adicionar por ID do recurso do atestador. Em ID do recurso do atestador, introduza

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

      Substitua PROJECT_ID pelo projeto onde executa o Cloud Build.

  6. Clique em Adicionar 1 atestante.

  7. Clique em Guardar política.

gcloud

  1. Exporte a política existente para um ficheiro através do seguinte comando:

    gcloud container binauthz policy export > /tmp/policy.yaml
    
  2. Edite o ficheiro de políticas.

  3. Edite uma das seguintes regras:

    • defaultAdmissionRule
    • clusterAdmissionRules
    • istioServiceIdentityAdmissionRules
    • kubernetesServiceAccountAdmissionRules
  4. Adicione um bloco requireAttestationsBy à regra se ainda não existir.

  5. No bloco requireAttestationsBy, adicione

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

    Substituir PROJECT_ID pelo projeto onde executa o Cloud Build.

  6. Guarde o ficheiro de política.

  7. Importe o ficheiro de políticas.

    gcloud container binauthz policy import /tmp/policy.yaml
    

    Segue-se um exemplo de um ficheiro de política que contém a referência a built-by-cloud-build-attestor:

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

    Substitua PROJECT_ID pelo ID do projeto onde executa o Cloud Build.

Pode ver erros de políticas nas mensagens de registo da Autorização binária para o GKE ou o Cloud Run

Usar o modo de execução de ensaio

No modo de execução de ensaio, a autorização binária verifica a conformidade com as políticas sem bloquear efetivamente a implementação. Em alternativa, as mensagens de estado de conformidade com as políticas são registadas no Cloud Logging. Pode usar estes registos para determinar se a sua política de bloqueio está a funcionar corretamente e para identificar falsos positivos.

Para ativar o teste de execução, faça o seguinte:

Consola

  1. Aceda à página Binary Authorization na Google Cloud consola.

    Aceda à Autorização binária.

  2. Clique em Editar política.

  3. Na Regra predefinida ou numa regra específica, selecione Modo de teste.

  4. Clique em Guardar política.

gcloud

  1. Exporte a política de autorização binária para um ficheiro YAML:

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. Num editor de texto, defina enforcementMode como DRYRUN_AUDIT_LOG_ONLY e guarde o ficheiro.

  3. Para atualizar a política, importe o ficheiro executando o seguinte comando:

    gcloud container binauthz policy import /tmp/policy.yaml
    

Pode ver erros de políticas nas mensagens de registo da autorização binária para o GKE ou o Cloud Run

Limitações

  • O Cloud Build e a Binary Authorization têm de estar no mesmo projeto. Se executar a sua plataforma de implementação noutro projeto, configure as funções do IAM para uma configuração com vários projetos e consulte o projeto do Cloud Build quando adicionar o atestador built-by-cloud-build na autorização binária.

  • O Cloud Build não gera atestações quando envia imagens para o Artifact Registry através de um passo de compilação docker push explícito. Certifique-se de que envia para o Artifact Registry através do campo images no passo de compilação docker build. Para mais informações sobre o images, consulte o artigo Diferentes formas de armazenar imagens no Artifact Registry.

  • Tem de usar ficheiros de configuração de compilação separados para o pipeline de compilação e o pipeline de implementação. Isto deve-se ao facto de o Cloud Build produzir atestações apenas após a conclusão bem-sucedida do pipeline de compilação. Em seguida, a autorização binária verifica a atestação antes de implementar a imagem.

Ative as atestações em pools privados

Por predefinição, o Cloud Build não gera atestações da autorização binária para compilações em pools privados. Para gerar atestações, adicione a opção requestedVerifyOption: VERIFIED ao ficheiro de configuração de compilação:

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

Depois de adicionar o requestedVerifyOption, o Cloud Build ativa a geração de atestação e os metadados de proveniência para a sua imagem.

Veja os metadados do atestador

Um atestador é criado na primeira vez que executa uma compilação num projeto. O ID do atestador tem o formato projects/PROJECT_ID/attestors/built-by-cloud-build, em que PROJECT_ID é o ID do seu projeto.

Pode verificar os metadados do atestador de compilação através do seguinte comando:

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

Substitua PROJECT_ID pelo projeto onde executa o Cloud Build.

A saída contém informações sobre o atestador e as chaves públicas correspondentes. Por exemplo:

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

O que se segue?