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.
Este tutorial mostra como usar o Cloud Build para criar a imagem do contêiner com base no código-fonte, verificar se há 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 Google Cloud projeto para este tutorial e conclua as etapas em um ambiente isolado.
Objetivos
- Criar uma imagem com o Cloud Build.
- Verificar a imagem criada com a verificação sob demanda.
- Avaliar níveis de vulnerabilidade aceitáveis.
- Armazenar 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,
use a calculadora de preços.
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
- Faça login na sua Google Cloud conta do. Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também recebem US $300 em créditos para executar, testar e implantar cargas de trabalho.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Instale a Google Cloud CLI.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Instale a Google Cloud CLI.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
Funções exigidas
A conta de serviço que você usa com o Cloud Build requer as seguintes funções:
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 usado para o Cloud Build, você só precisará conceder 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 as duas funções.
Preparar o arquivo de origem
Para este 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.
Abra um terminal, crie um diretório chamado
ods-tutoriale navegue até ele:mkdir ods-tutorial && cd ods-tutorialCrie um arquivo chamado
Dockerfilecom 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_IDCrie um repositório do Docker chamado
ods-build-repono 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.yamlcom 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.yamlde acordo com isso. Os valores dePROJECT_IDeSEVERITYsão transmitidos ao script no comando de build.Especifique os níveis de vulnerabilidade
SEVERITYque você quer bloquear e inicie o build.Você pode usar os seguintes valores para
SEVERITY:CRITICALHIGHMEDIUMLOW
É possível especificar várias gravidades usando uma expressão regular.
No exemplo a seguir, você especifica os valores de gravidade
CRITICALeHIGH. Isso instrui o Cloud Build a verificar vulnerabilidades classificadas no nível de gravidadeHIGHou acima dele.gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \ --config cloudbuild.yamlOnde
- PROJECT_ID é o ID do projeto;
- SEVERITY permite definir os níveis de gravidade que você quer bloquear. Se a verificação sob demanda encontrar vulnerabilidades que correspondam a qualquer um dos níveis de gravidade especificados, o build 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, que é mais grave. Se nenhuma vulnerabilidade correspondente for encontrada na imagem, o build será bem-sucedido e o Cloud Build 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 falhará, as etapas de build subsequentes não serão iniciadas e o Cloud Build não 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 amostra é uma distribuição Linux disponível publicamente, debian10:latest. As distribuições Linux e os dados de vulnerabilidade relacionados recebem atualizações continuamente.
Para saber mais sobre outras Google Cloud ferramentas e práticas recomendadas 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 gestão de vulnerabilidades do Linux, use o treinamento on-line sem custo financeiro fornecido pela Linux Foundation. Consulte Desenvolvimento de software seguro.
Liberar espaço
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
- No Google Cloud console, acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir.
- Na caixa de diálogo, digite o ID do projeto e clique em Desligar para excluir o projeto.
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 Google Cloud console.
Na lista de repositórios, selecione o repositório
ods-build-repo.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