1. Introdução
Vulnerabilidades de software são pontos fracos que podem causar uma falha acidental do sistema ou fornecer a usuários de má-fé uma maneira de comprometer seu software. O Container Analysis oferece dois tipos de verificação de SO para encontrar vulnerabilidades em contêineres:
- Com a API On-Demand Scanning, você pode verificar manualmente imagens de contêiner em busca de vulnerabilidades do SO, localmente no computador ou remotamente no Container Registry ou no Artifact Registry.
- A API Container Scanning permite automatizar a detecção de vulnerabilidades do SO, verificando sempre que você envia uma imagem para o Container Registry ou o Artifact Registry. Ativar essa API também ativa a verificação de pacotes de linguagem para vulnerabilidades do Go e do Java.
Com a API On-Demand Scanning, você pode verificar imagens armazenadas localmente no computador ou remotamente no Container Registry ou no Artifact Registry. Isso permite um controle granular sobre os contêineres que você quer verificar quanto a vulnerabilidades. Você pode usar a verificação sob demanda para verificar imagens no seu pipeline de CI/CD antes de decidir se elas serão armazenadas 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
- Usar a verificação de vulnerabilidades automatizada
- Configurar a verificação sob demanda
- Adicionar a verificação de imagem no CICD 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 encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou exclua 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 que vai criar a imagem do contêiner, fazer a verificação e avaliar os resultados. Se nenhuma vulnerabilidade CRITICAL for encontrada, a imagem será enviada para o repositório. Se vulnerabilidades CRITICAL forem encontradas, o build vai falhar e sair.
Conceder acesso à conta de serviço do Cloud Build
O Cloud Build vai precisar de direitos para acessar a API de verificação sob demanda. 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"
Criar e mudar para um diretório de trabalho
mkdir vuln-scan && cd vuln-scan
Definir uma imagem de amostra
Crie um arquivo chamado Dockerfile com o seguinte conteúdo.
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 cria um arquivo cloudbuild.yaml no diretório que será usado para o processo automatizado. Neste exemplo, as etapas são limitadas ao processo de build do contêiner. 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 comando a seguir.
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
Revisar os detalhes do build
Quando 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 conferir 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 comando abaixo.
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 de vulnerabilidade.
Revisar detalhes da imagem
Depois que o processo de build anterior for concluído, revise a imagem e os resultados de vulnerabilidade no painel do Artifact Registry.
- Abra o Artifact Registry no console do Cloud.
- Clique em artifact-scanning-repo para conferir 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", você vai encontrar os resultados da verificação automática da imagem que acabou de criar.
A automação da verificação é ativada por padrão. Confira as configurações do Artifact Registry para saber como ativar/desativar a verificação automática.
6. Verificação sob demanda
Há vários cenários em que talvez seja necessário fazer 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 agir 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 conferir 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
As pessoas 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 foram encontradas vulnerabilidades CRITÉRICAS.
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. Como fazer a verificação em CICD com o Cloud Build
Conceder acesso à conta de serviço do Cloud Build
O Cloud Build vai precisar de direitos para acessar a API de verificação sob demanda. 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 cria um arquivo cloudbuild.yaml no diretório que será usado para o processo automatizado. Neste exemplo, as etapas são limitadas ao processo de build do contêiner. 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 comando a seguir.
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 para verificar se o build é interrompido quando uma vulnerabilidade de gravidade CRITICAL é encontrada.
gcloud builds submit
Falha na análise do build
O build que você acabou de enviar vai falhar porque a imagem contém vulnerabilidades CRITÉRICAS.
Analise a falha de build na página Histórico do Cloud Build.
Corrigir a vulnerabilidade
Atualize o Dockerfile para usar uma imagem base que não contenha vulnerabilidades CRITÉRICAS.
Substitua o Dockerfile para usar a imagem do 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
Execute o processo de CI com a imagem boa
Envie o build para processamento e verifique se o build vai ser bem-sucedido quando nenhuma vulnerabilidade de gravidade CRÍTICA for encontrada.
gcloud builds submit
Revisar a conclusão da build
O build que você acabou de enviar vai ser bem-sucedido porque a imagem atualizada não contém vulnerabilidades CRITÉRICAS.
Confira 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 conferir 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
- Verificação sob demanda
- Como fazer a verificação em CICD com o Cloud Build
O que vem em seguida:
- 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