1. Introdução

Vulnerabilidades de software são pontos fracos que podem causar uma falha acidental do sistema ou entregar aos usuários de má-fé um meio de comprometer seu software. O Container Analysis oferece dois tipos de verificação de SO para encontrar vulnerabilidades em contêineres:
- A API On-Demand Scanning permite verificar manualmente se há vulnerabilidades do SO nas imagens de contêiner, seja localmente no seu computador ou remotamente no Container Registry ou no Artifact Registry.
- A API Container Scanning permite automatizar a detecção de vulnerabilidades do SO, verificando cada vez que você envia uma imagem para o Container Registry ou o Artifact Registry. Ao ativar essa API, você também ativa as verificações de pacotes de linguagens em busca de vulnerabilidades em Go e Java.
Com a API On-Demand Scanning, é possível verificar imagens armazenadas localmente no seu computador ou remotamente no Container Registry ou no Artifact Registry. Isso oferece controle granular sobre os contêineres que você quer verificar se há vulnerabilidades. Você pode usar a On-Demand Scanning para verificar imagens no seu pipeline de CI/CD antes de decidir se vai armazená-las em um registro.
O que você vai aprender
Neste laboratório, você aprenderá a:
- Criar imagens com o Cloud Build
- Usar o Artifact Registry para contêineres
- Utilizar a verificação de vulnerabilidades automatizada
- Configurar a verificação sob demanda
- Adicionar verificação de imagens em CI/CD no Cloud Build
2. Configuração e requisitos
Configuração de ambiente personalizada
- Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.



- O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google É possível atualizar o local a qualquer momento.
- O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como
PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto. - Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
- Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para desligar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.
Configuração do ambiente
No Cloud Shell, defina o ID e o número do projeto. Salve-as como variáveis PROJECT_ID e PROJECT_ID.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
Ativar serviços
Ative todos os serviços necessários:
gcloud services enable \
cloudkms.googleapis.com \
cloudbuild.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
artifactregistry.googleapis.com \
containerscanning.googleapis.com \
ondemandscanning.googleapis.com \
binaryauthorization.googleapis.com
3. Como criar imagens com o Cloud Build
Nesta seção, você vai criar um pipeline de build automatizado para criar sua imagem de contêiner, verificá-la e avaliar os resultados. Se nenhuma vulnerabilidade CRÍTICA for encontrada, a imagem será enviada para o repositório. Se vulnerabilidades CRÍTICAS forem encontradas, o build vai falhar e será encerrado.
Fornecer acesso à conta de serviço do Cloud Build
O Cloud Build vai precisar de direitos para acessar a API On-Demand Scanning. Forneça acesso com os comandos a seguir.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
Crie e acesse um diretório de trabalho
mkdir vuln-scan && cd vuln-scan
Definir uma imagem de amostra
Crie um arquivo chamado Dockerfile com o conteúdo a seguir.
cat > ./Dockerfile << EOF
FROM gcr.io/google-appengine/debian9@sha256:ebffcf0df9aa33f342c4e1d4c8428b784fc571cdf6fbab0b31330347ca8af97a
# System
RUN apt update && apt install python3-pip -y
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==1.1.4
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
EOF
Crie um arquivo chamado main.py com o seguinte conteúdo:
cat > ./main.py << EOF
import os
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
name = os.environ.get("NAME", "Worlds")
return "Hello {}!".format(name)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
EOF
Criar o pipeline do Cloud Build
O comando a seguir vai criar um arquivo cloudbuild.yaml no seu diretório que será usado no processo automatizado. Neste exemplo, as etapas são limitadas ao processo de build de contêineres. Na prática, no entanto, você incluiria instruções e testes específicos do aplicativo, além das etapas do contêiner.
Crie o arquivo com o seguinte comando:
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
EOF
Executar o pipeline de CI
Enviar o build para processamento
gcloud builds submit
Analisar detalhes do build
Depois que o processo de build for iniciado, revise o progresso no painel do Cloud Build.
- Abra o Cloud Build no Console do Cloud.
- Clique no build para ver o conteúdo.
4. Artifact Registry para contêineres
Criar repositório do Artifact Registry
Neste laboratório, você vai usar o Artifact Registry para armazenar e verificar suas imagens. Crie o repositório com o seguinte comando.
gcloud artifacts repositories create artifact-scanning-repo \
--repository-format=docker \
--location=us-central1 \
--description="Docker repository"
Configure o Docker para usar suas credenciais do gcloud ao acessar o Artifact Registry.
gcloud auth configure-docker us-central1-docker.pkg.dev
Atualizar o pipeline do Cloud Build
Modificar o pipeline de build para enviar a imagem resultante ao Artifact Registry
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
# push to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image']
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
Executar o pipeline de CI
Enviar o build para processamento
gcloud builds submit
5. Verificação de vulnerabilidades automatizada
A verificação de artefatos é acionada automaticamente sempre que você envia uma nova imagem para o Artifact Registry ou o Container Registry. As informações de vulnerabilidade são atualizadas continuamente quando novas vulnerabilidades são descobertas. Nesta seção, você vai analisar a imagem que acabou de criar e enviar para o Artifact Registry e conferir os resultados da verificação de vulnerabilidades.
Analisar detalhes da imagem
Depois que o processo de build anterior for concluído, revise os resultados da imagem e da vulnerabilidade no painel do Artifact Registry.
- Abra o Artifact Registry no console do Cloud.
- Clique em "artifact-scanning-repo" para ver o conteúdo.
- Clique nos detalhes da imagem
- Clique no resumo mais recente da sua imagem.
- Quando a verificação terminar, clique na guia "Vulnerabilidades" da imagem.
Na guia "Vulnerabilidades", veja os resultados da verificação automática da imagem que acabou de criar.

A automação da verificação é ativada por padrão. Acesse as configurações do Artifact Registry para saber como ativar ou desativar a verificação automática.
6. On Demand Scanning
Em vários cenários pode ser necessário realizar uma verificação antes de enviar a imagem para um repositório. Por exemplo, um desenvolvedor de contêineres pode verificar uma imagem e corrigir os problemas antes de enviar o código para o controle de origem. No exemplo abaixo, você vai criar e analisar a imagem localmente antes de tomar medidas com base nos resultados.
Criar uma imagem
Nesta etapa, você vai usar o Docker local para criar a imagem no cache local.
docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image .
Digitalizar a imagem
Depois que a imagem for criada, solicite uma verificação dela. Os resultados da verificação são armazenados em um servidor de metadados. O job é concluído com um local dos resultados no servidor de metadados.
gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--format="value(response.scan)" > scan_id.txt
Analisar arquivo de saída
Analise a saída da etapa anterior, que foi armazenada no arquivo scan_id.txt. Observe o local do relatório dos resultados da verificação no servidor de metadados.
cat scan_id.txt
Analisar os resultados detalhados da verificação
Para ver os resultados reais da verificação, use o comando list-vulnerabilities no local do relatório indicado no arquivo de saída.
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt)
A saída contém uma quantidade significativa de dados sobre todas as vulnerabilidades na imagem.
Sinalizar problemas críticos
Os humanos raramente usam os dados armazenados no relatório diretamente. Normalmente, os resultados são usados por um processo automatizado. Use os comandos abaixo para ler os detalhes do relatório e registrar se alguma vulnerabilidade CRÍTICA foi encontrada:
export SEVERITY=CRITICAL
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq ${SEVERITY}; then echo "Failed vulnerability check for ${SEVERITY} level"; else echo "No ${SEVERITY} Vulnerabilities found"; fi
A saída desse comando será
Failed vulnerability check for CRITICAL level
7. Verificação em CI/CD com o Cloud Build
Fornecer acesso à conta de serviço do Cloud Build
O Cloud Build vai precisar de direitos para acessar a API On-Demand Scanning. Forneça acesso com os comandos a seguir.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
Atualizar o pipeline do Cloud Build
O comando a seguir vai criar um arquivo cloudbuild.yaml no seu diretório que será usado no processo automatizado. Neste exemplo, as etapas são limitadas ao processo de build de contêineres. Na prática, no entanto, você incluiria instruções e testes específicos do aplicativo, além das etapas do contêiner.
Crie o arquivo com o seguinte comando:
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
#Run a vulnerability scan at _SECURITY level
- id: scan
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
(gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--location us \
--format="value(response.scan)") > /workspace/scan_id.txt
#Analyze the result of the scan
- id: severity check
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud artifacts docker images list-vulnerabilities \$(cat /workspace/scan_id.txt) \
--format="value(vulnerability.effectiveSeverity)" | if grep -Fxq CRITICAL; \
then echo "Failed vulnerability check for CRITICAL level" && exit 1; else echo "No CRITICAL vulnerability found, congrats !" && exit 0; fi
#Retag
- id: "retag"
name: 'gcr.io/cloud-builders/docker'
args: ['tag', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
#pushing to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
Executar o pipeline de CI
Envie o build para processamento e verifique se ele é interrompido quando uma vulnerabilidade de gravidade CRÍTICA é encontrada.
gcloud builds submit
Analisar falha de build
O build que você acabou de enviar vai falhar porque a imagem contém vulnerabilidades CRÍTICAS.
Analise a falha de build na página Histórico do Cloud Build.
Corrigir a vulnerabilidade
Atualize o Dockerfile para usar uma imagem de base que não contenha vulnerabilidades CRÍTICAS.
Substitua o Dockerfile para usar a imagem Debian 10 com o seguinte comando:
cat > ./Dockerfile << EOF
from python:3.8-slim
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==2.1.0
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :\$PORT --workers 1 --threads 8 main:app
EOF
Executar o processo de CI com a imagem correta
Envie o build para processamento e verifique se ele será concluído quando nenhuma vulnerabilidade de gravidade CRÍTICA for encontrada.
gcloud builds submit
Analisar o sucesso da build
O build que você acabou de enviar será concluído porque a imagem atualizada não contém vulnerabilidades CRÍTICAS.
Analise o sucesso do build na página Histórico do Cloud Build.
Analisar os resultados da verificação
Analisar a imagem boa no Artifact Registry
- Abra o Artifact Registry no console do Cloud.
- Clique em "artifact-scanning-repo" para ver o conteúdo.
- Clique nos detalhes da imagem
- Clique no resumo mais recente da sua imagem.
- Clique na guia "Vulnerabilidades" da imagem.
8. Parabéns!
Parabéns, você concluiu o codelab.
O que aprendemos:
- Como criar imagens com o Cloud Build
- Artifact Registry para contêineres
- Verificação de vulnerabilidades automatizada
- On Demand Scanning
- Verificação em CI/CD com o Cloud Build
Qual é a próxima etapa?
- Como proteger implantações de imagens no Cloud Run e no Google Kubernetes Engine | Documentação do Cloud Build
- Guia de início rápido: configurar uma política de autorização binária com o GKE | Google Cloud
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto ou mantenha o projeto e exclua cada um dos recursos.
Excluir o projeto
O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para este tutorial.
—
Última atualização: 21/03/23