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.
Preparar o arquivo de origem
Neste tutorial, você vai criar uma imagem usando um Dockerfile. Um Dockerfile é um arquivo de origem que contém instruções para o Docker criar uma imagem.
Abra um terminal, crie um diretório chamado
ods-tutorial
e navegue até ele:mkdir ods-tutorial && cd ods-tutorial
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
Defina o ID do projeto como o mesmo em que você ativou as APIs:
gcloud config set project PROJECT_ID
Crie um repositório do Docker chamado
ods-build-repo
no localus-central1
:gcloud artifacts repositories create ods-build-repo --repository-format=docker \ --location=us-central1 --description="Repository for scan and build"
Verifique se o repositório foi criado:
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.
Na pasta
ods-tutorial/
, crie o arquivocloudbuild.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 dePROJECT_ID
eSEVERITY
são transmitidos ao script no comando de build.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
eHIGH
. Isso instrui o Cloud Build a verificar vulnerabilidades classificadas no nível de gravidadeHIGH
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, a build será concluída 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.