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.

Neste tutorial, mostramos como usar o Cloud Build para criar sua imagem de contêiner com base no código-fonte, verificar 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 projeto Google Cloud para este tutorial e conclua as etapas em um ambiente isolado.

Objetivos

  • Crie uma imagem com o Cloud Build.
  • Verifique a imagem criada com a verificação sob demanda.
  • Avalie os níveis de vulnerabilidade aceitáveis.
  • Armazene a imagem no Artifact Registry.

Custos

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

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

Novos usuários do Google Cloud podem estar qualificados para um teste gratuito.

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

    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.

    Enable the APIs

  5. Install the 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 gcloud CLI, execute o seguinte comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    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.

    Enable the APIs

  11. Install the 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 gcloud CLI, execute o seguinte comando:

    gcloud init
  14. Funções exigidas

    A conta de serviço usada com o Cloud Build precisa ter os seguintes papéis:

    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 que você usa para o Cloud Build, conceda 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 os dois papéis.

    Preparar o arquivo de origem

    Neste 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 com sucesso:

      gcloud artifacts repositories list
      

    Criar e verificar

    Nesta seção, você vai executar seu 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. 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 on demand encontrar vulnerabilidades que correspondam a qualquer um dos níveis de gravidade especificados, o build vai falhar.

    Entenda seus 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 sua imagem, o build será concluído, e o Cloud Build vai 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 sua imagem, a etapa de build scan vai falhar, as etapas de build subsequentes não serão iniciadas, e o Cloud Build não vai 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, seus resultados podem variar porque o código-fonte de amostra é uma distribuição do Linux disponível publicamente, debian10:latest. As distribuições do Linux e os dados de vulnerabilidade relacionados recebem atualizações continuamente.

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

    Para mais informações sobre as práticas recomendadas de gerenciamento de vulnerabilidades do Linux, use o treinamento on-line gratuito oferecido 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. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    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 console do Google Cloud .

      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