Usar a verificação sob demanda no pipeline do Cloud Build

Usar a verificação sob demanda como parte do pipeline do Cloud Build permite bloquear builds se a imagem do contêiner tiver vulnerabilidades com uma gravidade correspondente a um nível predefinido.

Este tutorial mostra como usar o Cloud Build para criar a imagem do contêiner com base no código-fonte, verificar se há vulnerabilidades, conferir os níveis de gravidade das vulnerabilidades e enviar a imagem para o Artifact Registry se não houver vulnerabilidades de um nível de gravidade específico.

Recomendamos que você crie um novo Google Cloud projeto para este tutorial e conclua as etapas em um ambiente isolado.

Objetivos

  • Criar uma imagem com o Cloud Build.
  • Verificar a imagem criada com a verificação sob demanda.
  • Avaliar níveis de vulnerabilidade aceitáveis.
  • Armazenar a imagem no Artifact Registry.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso, use a calculadora de preços.

Novos Google Cloud usuários podem estar qualificados para um teste sem custo financeiro.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpeza.

Antes de começar

  1. Faça login na sua Google Cloud conta do. Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também recebem US $300 em créditos para executar, testar e implantar cargas de trabalho.
  2. In the Google Cloud console, on the project selector page, select or create 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.

    Go to project selector

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

  4. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  5. Instale a Google Cloud CLI.

  6. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

  7. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create 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.

    Go to project selector

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

  10. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  11. Instale a Google Cloud CLI.

  12. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

  13. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init

Funções exigidas

A conta de serviço que você usa com o Cloud Build requer as seguintes funções:

A conta de serviço padrão do Cloud Build tem as permissões necessárias para repositórios do Artifact Registry no mesmo projeto. Se os repositórios estiverem no mesmo projeto usado para o Cloud Build, será necessário conceder apenas a função de administrador da verificação sob demanda.

Se você estiver usando uma conta de serviço fornecida pelo usuário para o Cloud Build, será necessário conceder as duas funções.

Preparar o arquivo de origem

Para este tutorial, você vai criar uma imagem de um Dockerfile. Um Dockerfile é um arquivo de origem que contém instruções para o Docker criar uma imagem.

  1. Abra um terminal, crie um diretório chamado ods-tutorial e navegue até ele:

    mkdir ods-tutorial && cd ods-tutorial
    
  2. Crie um arquivo chamado Dockerfile com o seguinte conteúdo:

    # Debian10 image
    FROM gcr.io/google-appengine/debian10:latest
    
    # Ensures that the built image is always unique
    RUN apt-get update && apt-get -y install uuid-runtime && uuidgen > /IAMUNIQUE
    

Crie um repositório do Artifact Registry

  1. Defina o ID do projeto como o mesmo em que você ativou as APIs:

    gcloud config set project PROJECT_ID
    
  2. Crie um repositório do Docker chamado ods-build-repo no local us-central1:

    gcloud artifacts repositories create ods-build-repo --repository-format=docker \
    --location=us-central1 --description="Repository for scan and build"
    
  3. Verifique se o repositório foi criado:

    gcloud artifacts repositories list
    

Criar e verificar

Nesta seção, você vai executar o pipeline de build usando um arquivo de configuração de build. Um arquivo de configuração de build instrui o Cloud Build a realizar várias tarefas com base nas suas especificações.

  1. Na pasta ods-tutorial/, crie o arquivo cloudbuild.yaml com o seguinte conteúdo:

    steps:
       - id: build
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker build -t us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest -f ./Dockerfile . &&
           docker image inspect us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest --format \
           '{{index .RepoTags 0}}@{{.Id}}' > /workspace/image-digest.txt &&
           cat image-digest.txt
       - id: scan
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images scan us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest \
           --format='value(response.scan)' > /workspace/scan_id.txt
       - id: severity check
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images list-vulnerabilities $(cat /workspace/scan_id.txt) \
           --format='value(vulnerability.effectiveSeverity)' | if grep -Exq $_SEVERITY; \
           then echo 'Failed vulnerability check' && exit 1; else exit 0; fi
       - id: push
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker push us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest
    images: ['us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest']
    
    

    Esse arquivo inclui o local e o repositório criados anteriormente no Artifact Registry. Se você decidir usar valores diferentes, modifique o arquivo cloudbuild.yaml de acordo com isso. Os valores de PROJECT_ID e SEVERITY são transmitidos ao script no comando de build.

  2. Especifique os níveis de vulnerabilidade SEVERITY que você quer bloquear e inicie o build.

    Você pode usar os seguintes valores para SEVERITY:

    • CRITICAL
    • HIGH
    • MEDIUM
    • LOW

    É possível especificar várias gravidades usando uma expressão regular.

    No exemplo a seguir, você especifica os valores de gravidade CRITICAL e HIGH. Isso instrui o Cloud Build a verificar vulnerabilidades classificadas no nível de gravidade HIGH ou acima dele.

    gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \
    --config cloudbuild.yaml
    

    Onde

    • PROJECT_ID é o ID do projeto;
    • SEVERITY permite definir os níveis de gravidade que você quer bloquear. Se a verificação sob demanda encontrar vulnerabilidades que correspondam a qualquer um dos níveis de gravidade especificados, o build falhará.

Entender os resultados

Quando você define o valor SEVERITY como CRITICAL|HIGH, depois que a verificação sob demanda procura vulnerabilidades, ela verifica se há alguma no nível HIGH e no nível CRITICAL mais grave. Se nenhuma vulnerabilidade correspondente for encontrada na imagem, o build será bem-sucedido e o Cloud Build enviará a imagem para o Artifact Registry.

O resultado será assim:

DONE
--------------------------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES                                                                        STATUS
abb3ce73-6ae8-41d1-9080-7d74a7ecd7bc  2021-03-15T06:50:32+00:00  1M48S     gs://ods-tests_cloudbuild/source/1615791031.906807-a648d10faf4a46d695c163186a6208d5.tgz  us-central1-docker.pkg.dev/ods-tests/ods-build-repo/ods-test (+1 more)  SUCCESS

Se a verificação sob demanda encontrar vulnerabilidades HIGH ou CRITICAL na imagem, a etapa de build scan falhará, as etapas de build subsequentes não serão iniciadas e o Cloud Build não enviará uma imagem para o Artifact Registry.

O resultado será assim:

Step #2 - "severity check": Failed vulnerability check
Finished Step #2 - "severity check"
ERROR
ERROR: build step 2 "gcr.io/cloud-builders/gcloud" failed: step exited with non-zero status: 1

Neste tutorial, os resultados podem variar, porque o código-fonte de amostra é uma distribuição Linux disponível publicamente, debian10:latest. As distribuições Linux e os dados de vulnerabilidade relacionados recebem atualizações de forma contínua.

Para saber mais sobre outras Google Cloud ferramentas e práticas recomendadas para ajudar a proteger sua cadeia de suprimentos de software, consulte Segurança da cadeia de suprimentos de software.

Para mais informações sobre as práticas recomendadas de gestão de vulnerabilidades do Linux, use o treinamento on-line sem custo financeiro fornecido pela Linux Foundation. Consulte Desenvolvimento de software seguro.

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Excluir o projeto

  1. No Google Cloud console, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir.
  3. Na caixa de diálogo, digite o ID do projeto e clique em Desligar para excluir o projeto.

Excluir recursos individuais

Antes de remover o repositório, verifique se as imagens que você quer manter estão disponíveis em outro local.

Para excluir o repositório:

Console

  1. Abra a página Repositórios no Google Cloud console.

    Abrir a página Repositórios

  2. Na lista de repositórios, selecione o repositório ods-build-repo.

  3. Clique em Excluir.

gcloud

Para excluir o repositório ods-build-repo, execute o seguinte comando:

gcloud artifacts repositories delete ods-build-repo --location=us-central1

A seguir