Como proteger implantações de imagem no Cloud Run e no Google Kubernetes Engine

Nesta página, fornecemos instruções sobre como proteger as implantações de imagem no Cloud Run e no Google Kubernetes Engine usando o Cloud Build.

Saiba como configurar a autorização binária para verificar se há atestados de versão e bloquear implantações de imagens que não são geradas pelo Cloud Build. Esse processo pode reduzir o risco de implantar software não autorizado.

Antes de começar

  1. Ative as APIs Cloud Build, Binary Authorization, and Artifact Registry.

    Ative as APIs

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

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

Controlar implantações com autorização binária

Uma política na autorização binária é um conjunto de regras que regem a implantação de imagens. É possível configurar uma regra para exigir attestations assinados digitalmente.

O Cloud Build gera e assina atestados no momento da criação. Com a autorização binária, é possível usar o atestador built-by-cloud-build para verificar os atestados e implantar somente imagens criadas pelo Cloud Build.

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

Para permitir que apenas as imagens criadas pelo Cloud Build sejam implantadas, execute estas etapas:

Console

  1. Acesse a página Autorização binária no Console do Google Cloud:

    Acesse Autorização binária

  2. Na guia Política, clique em Editar política.

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

  4. Clique em Adicionar atestadores.

  5. Na caixa de diálogo Adicionar atestadores:

    1. Selecione Adicionar por projeto e nome do atestador e execute estas etapas:
      1. No campo Nome do projeto, insira o projeto em que você executa o Cloud Build.
      2. Clique no campo Nome do atestador e veja se o atestador built-by-cloud-build está disponível.
      3. Clique em built-by-cloud-build.
    2. Como alternativa, selecione Adicionar por ID do recurso de atestador. Em ID de recurso do atestador, digite:

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

      Substitua PROJECT_ID pelo projeto em que você executa o Cloud Build.

  6. Clique em Adicionar um atestador.

  7. Clique em Save Policy.

gcloud

  1. Exporte a política atual para um arquivo usando este comando:

    gcloud container binauthz policy export > /tmp/policy.yaml
    
  2. Edite o arquivo da política.

  3. Edite uma destas regras:

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

  5. No bloco requireAttestationsBy, adicione:

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

    Substitua PROJECT_ID pelo projeto em que você executa o Cloud Build.

  6. Salve o arquivo de política.

  7. Importe o arquivo de política.

    gcloud container binauthz policy import /tmp/policy.yaml
    

    Veja a seguir um exemplo de arquivo de política que contém a referência ao 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 em que você executa o Cloud Build.

É possível ver os erros de política nas mensagens do registro de autorização binária para GKE ou Cloud Run.

Como usar o modo de teste

No modo de simulação, a autorização binária verifica a conformidade da política sem realmente bloquear a implantação. Em vez disso, as mensagens de status de conformidade com a política são registradas no Cloud Logging. É possível usar esses registros para determinar se a política de bloqueio está funcionando corretamente e identificar falsos positivos.

Para ativar a simulação, faça o seguinte:

Console

  1. Acesse a página "Autorização binária" no Console do Google Cloud.

    Acesse Autorização binária.

  2. Clique em Editar política.

  3. Em Regra padrão ou em uma regra específica, selecione Modo de teste.

  4. Clique em Save Policy.

gcloud

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

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. Em um editor de texto, defina enforcementMode como DRYRUN_AUDIT_LOG_ONLY e salve o arquivo.

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

    gcloud container binauthz policy import /tmp/policy.yaml
    

É possível conferir os erros de política nas mensagens de registro da autorização binária do GKE ou do Cloud Run.

Limitações

  • O Cloud Build e a autorização binária precisam estar no mesmo projeto. Se você executar sua plataforma de implantação em outro projeto, configure os papéis do IAM para uma configuração de vários projetos e faça referência ao projeto do Cloud Build ao adicionar o atestador built-by-cloud-build na autorização binária.

  • O Cloud Build não gera atestados quando você envia imagens para o Artifact Registry usando uma etapa de build docker push explícita. Não se esqueça de enviar para o Artifact Registry usando o campo images na etapa de build docker build. Para mais informações sobre images, consulte Diferentes maneiras de armazenar imagens no Artifact Registry.

  • É preciso usar arquivos de configuração da versão separados para os pipelines de compilação e de implantação. Isso ocorre porque o Cloud Build produz atestados somente após o pipeline de compilação ser concluído com sucesso. A autorização binária verificará o atestado antes de implantar a imagem.

Ativar atestados em pools particulares

Por padrão, o Cloud Build não gera atestados de autorização binária para builds em pools privados. Para gerar atestados, adicione a opção requestedVerifyOption: VERIFIED ao arquivo de configuração do build:

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 atestado e os metadados de Proveniência para sua imagem.

Ver metadados do atestador

Um atestador é criado na primeira vez que você executa um build em um projeto. O ID do atestador tem o formato projects/PROJECT_ID/attestors/built-by-cloud-build, em que PROJECT_ID é o ID do projeto.

Verifique os metadados do atestador do build usando o 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 em que você executa o Cloud Build.

A saída contém informações sobre o atestador e as chaves públicas correspondentes. 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"

A seguir