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 Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. 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 gcloud CLI 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 Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. 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 gcloud CLI 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, você só precisará conceder 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, que é 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 continuamente.

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.

Liberar espaço

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