O uso da 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 sua imagem de contêiner a partir do código-fonte, verificar se há vulnerabilidades, verificar 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 do 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ê 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.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.
Antes de começar
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
Funções exigidas
A conta de serviço usada com o Cloud Build requer os seguintes papéis:
Administrador da verificação sob demanda (
roles/ondemandscanning.admin
)Gravador do Artifact Registry (
roles/artifactregistry.writer
)
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, basta conceder o papel 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
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 novo 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 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.
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 para o script no comando de build.Especifique os níveis de
SEVERITY
de vulnerabilidade 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 severidades usando uma expressão regular.
No exemplo abaixo, você especifica os valores de severidade
CRITICAL
eHIGH
. Isso instrui o Cloud Build a verificar vulnerabilidades classificadas no nível de gravidadeHIGH
ou acima.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.
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
mais grave. Se nenhuma vulnerabilidade correspondente for encontrada na imagem, o build será bem-sucedido 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 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, os resultados podem variar, porque o código-fonte de exemplo é 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 do Google Cloud 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 gerenciamento de vulnerabilidades do Linux, use o treinamento on-line gratuito fornecido pela Linux Foundation. Consulte Como desenvolver softwares seguros.
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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- 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
Abra a página Repositórios no console do Google Cloud.
Na lista de repositórios, selecione o repositório
ods-build-repo
.Clique em Excluir.
gcloud
Para excluir ods-build-repo
do repositório, execute o seguinte
comando:
gcloud artifacts repositories delete ods-build-repo --location=us-central1