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.

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