Usar a verificação on demand 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 com base no código-fonte, verificar se há vulnerabilidades, conferir os níveis de gravidade delas 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.
Objetivos
- Crie uma imagem com o Cloud Build.
- Verifique a imagem criada com a On-Demand Scanning.
- Avaliar os níveis de vulnerabilidade aceitáveis.
- Armazene a imagem no Artifact Registry.
Custos
Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na sua 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 conta do Google Cloud . Se você começou a usar o Google Cloudagora, 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 sem custos financeiros.
-
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, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
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.
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, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
Funções exigidas
A conta de serviço que você usa 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 usado para o Cloud Build, basta conceder o papel de Administrador da verificação on demand.
Se você estiver usando uma conta de serviço fornecida pelo usuário para o Cloud Build, será necessário conceder os dois papéis.
Preparar o arquivo de origem
Neste 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 novo 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 seu pipeline de build usando um arquivo de configuração de build. Um arquivo de configuração de build instrui o Cloud Build a executar 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. Os valores dePROJECT_IDeSEVERITYsão transmitidos para o script no comando de build.Especifique os níveis de vulnerabilidade
SEVERITYque você quer bloquear e inicie o build.É possível 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 vai falhar.
Entenda seus resultados
Quando você define o valor de 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 mais grave CRITICAL. Se nenhuma vulnerabilidade correspondente for encontrada na sua imagem, o build será concluído e o Cloud Build vai enviar a imagem para o Artifact Registry.
O resultado será o 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 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á o 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, seus 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 Google Cloud ferramentas e práticas recomendadas que ajudam 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 oferecido pela Linux Foundation. Consulte Desenvolvimento de software seguro.
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
- No console Google Cloud , 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 Encerrar para excluí-lo.
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 o repositório ods-build-repo, execute o seguinte
comando:
gcloud artifacts repositories delete ods-build-repo --location=us-central1