Use a verificação a pedido no seu pipeline do Cloud Build


A utilização da análise a pedido como parte do pipeline do Cloud Build permite-lhe bloquear compilações se a imagem do contentor tiver vulnerabilidades com uma gravidade correspondente a um nível predefinido.

Este tutorial mostra como usar o Cloud Build para criar a sua imagem de contentor a partir do código-fonte, analisá-la quanto a vulnerabilidades, verificar os níveis de gravidade das vulnerabilidades e enviar a imagem para o Artifact Registry se não existirem vulnerabilidades de um nível de gravidade específico.

Recomendamos que crie um novo Google Cloud projeto para este tutorial e conclua os passos num ambiente isolado.

Objetivos

  • Crie uma imagem com o Cloud Build.
  • Analise a imagem criada com a análise a pedido.
  • Avalie os níveis de vulnerabilidade aceitáveis.
  • Armazene a imagem no Artifact Registry.

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

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. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a 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.

    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. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.

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

    gcloud init
  14. Funções necessárias

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

    A conta de serviço predefinida do Cloud Build tem as autorizações necessárias para os repositórios do Artifact Registry no mesmo projeto. Se os seus repositórios estiverem no mesmo projeto que usa para o Cloud Build, só tem de conceder a função de administrador da análise a pedido.

    Se estiver a usar uma conta de serviço fornecida pelo utilizador para o Cloud Build, tem de conceder ambas as funções.

    Prepare o ficheiro de origem

    Neste tutorial, vai criar uma imagem a partir de um Dockerfile. Um Dockerfile é um ficheiro de origem que contém instruções para o Docker criar uma imagem.

    1. Abra um terminal, crie um novo diretório com o nome ods-tutorial e navegue até ele:

      mkdir ods-tutorial && cd ods-tutorial
      
    2. Crie um ficheiro denominado 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 para o mesmo projeto onde ativou as APIs:

      gcloud config set project PROJECT_ID
      
    2. Crie um repositório do Docker com o nome ods-build-repo na localização 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 êxito:

      gcloud artifacts repositories list
      

    Crie e analise

    Nesta secção, vai executar o pipeline de compilação através de um ficheiro de configuração de compilação. Um ficheiro de configuração de compilação indica ao Cloud Build como realizar várias tarefas com base nas suas especificações.

    1. Na pasta ods-tutorial/, crie o ficheiro 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']
      
      

      Este ficheiro inclui a localização e o repositório criados anteriormente no Artifact Registry. Se decidir usar valores diferentes, modifique o ficheiro cloudbuild.yaml em conformidade. Os valores de PROJECT_ID e SEVERITY são transmitidos ao script no comando de compilação.

    2. Especifique os SEVERITYníveis de vulnerabilidade que quer bloquear e comece a compilação.

      Pode usar os seguintes valores para SEVERITY:

      • CRITICAL
      • HIGH
      • MEDIUM
      • LOW

      Pode especificar várias gravidades através de uma expressão regular.

      No exemplo seguinte, especifica os valores de gravidade CRITICAL e HIGH. Isto indica ao Cloud Build que verifique se existem vulnerabilidades classificadas no nível de gravidade HIGH ou superior.

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

      Onde

      • PROJECT_ID é o ID do seu projeto.
      • SEVERITY permite-lhe definir os níveis de gravidade que quer bloquear. Se a análise a pedido encontrar vulnerabilidades que correspondam a qualquer um dos níveis de gravidade especificados, a compilação falha.

    Compreenda os seus resultados

    Quando define o valor de SEVERITY como CRITICAL|HIGH, depois de a análise a pedido procurar vulnerabilidades, verifica se existem alguma ao nível de HIGH e ao nível mais grave de CRITICAL. Se não forem encontradas vulnerabilidades correspondentes na sua imagem, a compilação é bem-sucedida e o Cloud Build envia a imagem para o Artifact Registry.

    O resultado é semelhante ao seguinte:

    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 análise a pedido encontrar vulnerabilidades HIGH ou CRITICAL na sua imagem, o passo de compilação scan falha, os passos de compilação subsequentes não são iniciados e o Cloud Build não envia uma imagem para o Artifact Registry.

    O resultado é semelhante ao seguinte:

    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 seus resultados podem variar, uma vez que o código-fonte de exemplo é 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 acerca de Google Cloud ferramentas e práticas recomendadas adicionais para ajudar a proteger a sua cadeia de abastecimento de software, consulte o artigo Segurança da cadeia de abastecimento de software.

    Para mais informações sobre as práticas recomendadas de gestão de vulnerabilidades do Linux, pode usar a formação online gratuita fornecida pela Linux Foundation. Consulte o artigo Desenvolver software seguro.

    Limpar

    Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

    Elimine 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.

    Elimine recursos individuais

    Antes de remover o repositório, certifique-se de que as imagens que quer manter estão disponíveis noutra localização.

    Para eliminar o repositório:

    Consola

    1. Abra a página Repositórios na Google Cloud consola.

      Abra a página Repositórios

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

    3. Clique em Eliminar.

    gcloud

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

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

    O que se segue?