Neste tutorial, você aprenderá a criar um pipeline baseado em eventos para automatizar a verificação de códigos maliciosos em documentos.
Na maioria dos apps, a avaliação manual da grande quantidade de documentos enviados ao Cloud Storage é muito demorada.
Para criar esse pipeline, são usados os produtos do Google Cloud, além de um antivírus de código aberto chamado ClamAV (em inglês). Para este tutorial, o ClamAV é executado em um contêiner do Docker hospedado no Cloud Run. O pipeline também grava entradas de registro no Cloud Logging e grava métricas no Cloud Monitoring.
É possível acionar alertas baseados em registros para documentos infectados usando as entradas de registro do Logging. No entanto, a configuração desses alertas não é abordada neste tutorial.
O termo malware usado aqui descreve diversas ameaças, como cavalos de Tróia, vírus e outros códigos maliciosos.
Neste tutorial, presumimos que você conheça a funcionalidade básica do Cloud Storage, Cloud Run, Eventarc (links em inglês). Docker e Node.js.
Arquitetura
Veja no diagrama a seguir os passos no pipeline.
Estes passos descrevem o pipeline da arquitetura:
- Você faz upload de arquivos para o Cloud Storage.
- O evento de upload aciona automaticamente o serviço de verificação de malware.
- Esse serviço verifica se há malware no documento enviado.
- Se o documento estiver infectado, ele será transferido pelo serviço para um bucket de quarentena. Caso contrário, o documento será movido para outro bucket que contenha documentos verificados não infectados.
Objetivos
Criar um serviço de verificação de malware do Cloud Run para verificar documentos com malware usando o ClamAV e mover os documentos verificados para limpar os buckets ou colocá-los em quarentena com base no resultado da verificação.
Crie um gatilho do Eventarc para acionar o serviço de verificação de malware quando um documento for enviado ao Cloud Storage.
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 Artifact Registry, Cloud Run, Eventarc, Logging, and Cloud Build APIs.
-
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 Artifact Registry, Cloud Run, Eventarc, Logging, and Cloud Build APIs.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Neste tutorial, todos os comandos serão executados no Cloud Shell.
Como configurar o ambiente
Nesta seção, você atribui configurações aos valores usados no tutorial, como região e zona.
Neste tutorial, você usa us-central1
como a região do
serviço do Cloud Run e us
como o local do gatilho do
Eventarc e dos buckets do Cloud Storage.
No Cloud Shell, defina a região e a local:
export REGION=us-central1 export LOCATION=us
Inicialize o ambiente
gcloud
com o ID do projeto e defina uma variável de ambiente:export PROJECT_ID=PROJECT_ID gcloud config set project "${PROJECT_ID}"
Defina PROJECT_ID como o ID do projeto.
Crie três buckets do Cloud Storage com nomes exclusivos:
gsutil mb -l "${LOCATION}" "gs://unscanned-${PROJECT_ID}" gsutil mb -l "${LOCATION}" "gs://quarantined-${PROJECT_ID}" gsutil mb -l "${LOCATION}" "gs://clean-${PROJECT_ID}"
${PROJECT_ID}
é usado para garantir que os nomes dos buckets sejam exclusivos.
Os três buckets criados armazenam o documento em vários estágios do pipeline:
unscanned-PROJECT_ID
: armazena os documentos antes de serem processados. Você faz upload dos documentos para esse bucket.quarantined-PROJECT_ID
: armazena os documentos infectados que foram avaliados pelo serviço de verificação de malware.clean-PROJECT_ID
: armazena os documentos não infectados que foram avaliados pelo serviço de verificação de malware.
Como criar uma conta de serviço para o serviço de verificação de malware e conceder permissões.
Nesta seção, você cria uma conta de serviço para usar no serviço de verificação de malware e concede os papéis apropriados à conta de serviço para que ela tenha permissões para ler e gravar nos buckets do Cloud Storage. Isso garante que a conta tenha permissões mínimas e acesso apenas aos recursos necessários.
Crie a conta de serviço
malware-scanner
:gcloud iam service-accounts create malware-scanner export SERVICE_ACCOUNT="malware-scanner@${PROJECT_ID}.iam.gserviceaccount.com"
Conceda o papel Administrador de objetos aos buckets, permitindo que o serviço leia e exclua documentos do bucket não verificado e grave documentos nos buckets em quarentena e limpos.
gsutil iam ch \ "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \ "gs://unscanned-${PROJECT_ID}" gsutil iam ch \ "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \ "gs://clean-${PROJECT_ID}" gsutil iam ch \ "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \ "gs://quarantined-${PROJECT_ID}"
Conceda o papel de gravador de métricas permitindo que o serviço grave métricas no Monitoring:
gcloud projects add-iam-policy-binding \ "${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role=roles/monitoring.metricWriter
Como criar o serviço de verificação de malware no Cloud Run
Nesta seção, você implantará o serviço de verificação de malware no Cloud Run. O serviço é executado em um contêiner do Docker e contém o seguinte:
- Arquivos Node.js para o serviço de verificação de malware.
- Um Dockerfile para criar uma imagem com o serviço e os binários do ClamAV.
- Um script de shell
bootstrap.sh
para executar os daemons clamAV efreshclam
ao iniciar o contêiner.
No Cloud Shell, clone o repositório do GitHub que contém os arquivos de código:
git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
Altere para o diretório
cloudrun-malware-scanner
:cd docker-clamav-malware-scanner/cloudrun-malware-scanner
Crie e implante o serviço do Cloud Run usando a conta de serviço criada anteriormente:
export SERVICE_NAME=malware-scanner gcloud beta run deploy "${SERVICE_NAME}" \ --source . \ --region "${REGION}" \ --no-allow-unauthenticated \ --memory 4Gi \ --min-instances 1 \ --no-cpu-throttling \ --service-account="${SERVICE_ACCOUNT}" \ --set-env-vars \ "UNSCANNED_BUCKET=unscanned-${PROJECT_ID}, CLEAN_BUCKET=clean-${PROJECT_ID}, QUARANTINED_BUCKET=quarantined-${PROJECT_ID}"
Quando solicitado, digite
Y
.
Quando a implantação estiver concluída, você verá uma mensagem:
Service [malware-scanner] revision [malware-scanner-NNNNN-XXX] has been deployed and is serving 100 percent of traffic. Service URL: https://malware-scanner-XXXXXXXX-XX.a.run.app
O serviço do Cloud Run requer que todas as invocações sejam autenticadas e as identidades de autenticação precisam ter a permissão run.routes.invoke
sobre o serviço.
Verifique o serviço em execução e a versão do ClamAV executando o seguinte comando:
curl -D - -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ SERVICE_URL
SERVICE_URL é o URL informado na saída da implantação vista anteriormente.
Criar um gatilho do Eventarc no Cloud Storage
Nesta seção, você adicionará permissões para permitir que o Eventarc capture eventos do Cloud Storage e um gatilho para enviar esses eventos para o serviço malware-scanner
do Cloud Run.
Se você estiver usando um projeto criado antes de 8 de abril de 2021, configure o Pub/Sub para notificações push.
No Cloud Shell, conceda o papel
roles/pubsub.publisher
à conta de serviço do Cloud Storage:STORAGE_SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p "${PROJECT_ID}") gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member "serviceAccount:${STORAGE_SERVICE_ACCOUNT}" \ --role "roles/pubsub.publisher"
Permita que a conta de serviço
malware-scanner
invoque o serviço do Cloud Run e atue como um receptor de eventos do Eventarc:gcloud run services add-iam-policy-binding malware-scanner \ --region="${REGION}" \ --member "serviceAccount:${SERVICE_ACCOUNT}" \ --role roles/run.invoker gcloud projects add-iam-policy-binding "${PROJECT_ID}" --member "serviceAccount:${SERVICE_ACCOUNT}" --role "roles/eventarc.eventReceiver"
Crie um gatilho do Eventarc para capturar o evento do objeto finalizado no bucket do Cloud Storage não verificado e enviá-lo ao serviço do Cloud Run. O gatilho usará a conta de serviço
malware-scanner
para autenticação:gcloud eventarc triggers create trigger-gcs-malware-scanner \ --destination-run-service="${SERVICE_NAME}" \ --destination-run-region="${REGION}" \ --location="${LOCATION}" \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=unscanned-${PROJECT_ID}" \ --service-account="${SERVICE_ACCOUNT}"
Se você receber o seguinte erro, aguarde um minuto e execute o comando novamente:
ERROR: (gcloud.eventarc.triggers.create) INVALID_ARGUMENT: The request was invalid: Bucket "unscanned-PROJECT_ID" was not found. Please verify that the bucket exists.
Como fazer upload de arquivos para testar o pipeline
Faça upload de um arquivo sem malware e de outro infectado para testar o pipeline.
Crie um arquivo de texto de amostra ou use um atual não infectado para testar os processos do pipeline.
Copie o arquivo de dados de amostra para o bucket de arquivos não verificados:
gsutil cp filename "gs://unscanned-${PROJECT_ID}"
Substitua
filename
pelo nome do arquivo de texto não infectado. O serviço de verificação de malware inspeciona cada documento e o transfere para um bucket apropriado. Esse documento é movido para o bucketclean-PROJECT_ID
.Aguarde alguns segundos para o pipeline processar o documento e verificar o bucket
clean-PROJECT_ID
para ver se o documento processado está lá:gsutil ls -r "gs://clean-${PROJECT_ID}"
O documento foi removido do bucket não verificado:
gsutil ls -r "gs://unscanned-${PROJECT_ID}"
No Cloud Shell, faça o upload de um arquivo chamado
eicar-infected.txt
com a assinatura de teste antimalware padrão da EICAR para seu bucketunscanned-PROJECT_ID
:echo -e 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' \ | gsutil cp - "gs://unscanned-${PROJECT_ID}/eicar-infected.txt"
Aguarde alguns segundos e verifique o bucket
quarantined-PROJECT_ID
para ver se o documento passou pelo pipeline. O serviço também registra uma entrada do Logging quando um documento infectado por malware é detectado.gsutil ls -r "gs://quarantined-${PROJECT_ID}"
O documento foi removido do bucket não verificado:
gsutil ls -r "gs://unscanned-${PROJECT_ID}"
Como monitorar o serviço
O serviço pode ser monitorado usando o Cloud Logging e o Cloud Monitoring.
Como visualizar os registros
No console do Google Cloud, acesse a página "Explorador de registros" do Cloud Logging.
Se o filtro Campos de registro não for exibido, clique no botão Campos de registro.
No filtro Campos de registro, clique em Revisão do Cloud Run.
Na seção Nome do serviço do filtro Campos de registro, clique em scanner de malware.
Os resultados da consulta de registros mostrarão os registros do serviço, incluindo várias linhas que mostram as solicitações de verificação e o status dos dois arquivos enviados, por exemplo:
Info: "Scan request for gs://unscanned-PROJECT_ID/filename, (##### bytes) scanning with clam ClamAV 0.103.3/26347/Mon Nov 8 09:19:39 2021" Info: "Scan status for gs://unscanned-PROJECT_ID/filename: CLEAN (##### bytes in #### ms)" ... Info: "Scan request for gs://unscanned-PROJECT_ID/eicar-infected.txt, (69 bytes) scanning with clam ClamAV 0.103.3/26347/Mon Nov 8 09:19:39 2021" Warning: "Scan status for gs://unscanned-PROJECT_ID/eicar-infected.txt: INFECTED stream: Eicar-Signature FOUND (69 bytes in ### ms)"
Observe que a versão do ClamAV e a revisão da assinatura do vírus são informadas, além do nome do vírus, do arquivo de teste infectado.
Você pode usar essas mensagens de registro para configurar alertas quando um vírus for encontrado ou para quando houver falhas durante a verificação.
Como visualizar métricas
O serviço gera as seguintes métricas para fins de monitoramento e alerta:
- Número de arquivos limpos processados:
custom.googleapis.com/opencensus/malware-scanning/clean_files
- Número de arquivos infectados processados:
custom.googleapis.com/opencensus/malwares-canning/infected_files
- Tempo gasto na verificação de arquivos:
custom.googleapis.com/opencensus/malware-scanning/scan_duration
- Número total de bytes verificados:
custom.googleapis.com/opencensus/malware-scanning/bytes_scanned
- Número de verificações de malware com falha:
custom.googleapis.com/opencensus/malwares-canning/scans_failed
Essas métricas podem ser visualizadas no Metrics Monitoring do Cloud Monitoring.
No console do Google Cloud, acesse a página "Metrics Explorer" do Cloud Monitoring.
Clique no campo Métrica e insira a string de filtro
malware
.Selecione a métrica OpenCensus/malware-scanning/clean_files. O gráfico mostrará um ponto de dados que indica quando o arquivo limpo foi verificado.
As métricas podem ser usadas para monitorar o pipeline e criar alertas para quando um vírus for detectado ou quando os arquivos falharem no processamento.
Para ver mais detalhes, é possível detalhar as métricas por vários rótulos:
- source_bucket
- destination_bucket
- clam_version
- cloud_run_revision
Como processar vários buckets
O serviço de verificação de malware pode verificar arquivos de vários buckets de origem, enviando-os para separar buckets limpos e em quarentena.
Embora essa configuração avançada esteja fora do escopo deste tutorial, as etapas envolvidas estão resumidas da seguinte maneira:
Crie os vários buckets do Cloud Storage não verificados, limpos e em quarentena.
Conceda os papéis apropriados à conta de serviço
malware-scanner
nos vários buckets.Edite o arquivo de configuração
config.json
para especificar os nomes dos buckets de cada configuração:{ "buckets": [ { "unscanned": "unscanned-bucket-1", "clean": "clean-bucket-1", "quarantined": "quarantined-bucket-1" }, { "unscanned": "unscanned-bucket-2", "clean": "clean-bucket-2", "quarantined": "quarantined-bucket-2" } ] }
Implante o serviço
malware-scanner
especificando a variável de ambienteCONFIG_FILE=./config.json
no lugar das três variáveisXXX_BUCKET=...
para que a configuração no arquivo é usado.Para cada um dos buckets não verificados, crie um gatilho do Eventarc, alterando o nome do gatilho e o nome do bucket todas as vezes.
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.
Exclua 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.
A seguir
- Veja a documentação do Cloud Storage.
- Explore arquiteturas de referência, diagramas, tutoriais e práticas recomendadas sobre o Google Cloud. Confira o Centro de arquitetura do Cloud.