Como automatizar a verificação de malware em documentos enviados ao Cloud Storage

Last reviewed 2021-10-10 UTC

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.

Arquitetura do pipeline de verificação de malware.

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. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

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

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Run, Eventarc, Logging, and Cloud Build APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Artifact Registry, Cloud Run, Eventarc, Logging, and Cloud Build APIs.

    Enable the APIs

  8. In the Google Cloud console, activate Cloud Shell.

    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.

  9. 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.

  1. No Cloud Shell, defina a região e a local:

    export REGION=us-central1
    export LOCATION=us
    
  2. 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.

  3. 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.

  1. 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"
    
  2. 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}"
    
  3. 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 e freshclam ao iniciar o contêiner.
  1. 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
    
  2. Altere para o diretório cloudrun-malware-scanner:

    cd docker-clamav-malware-scanner/cloudrun-malware-scanner
    
  3. 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}"
    
  4. 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.

  1. Se você estiver usando um projeto criado antes de 8 de abril de 2021, configure o Pub/Sub para notificações push.

  2. 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"
    
  3. 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"
    
  4. 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.

  1. Crie um arquivo de texto de amostra ou use um atual não infectado para testar os processos do pipeline.

  2. 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 bucket clean-PROJECT_ID.

  3. 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}"
    
  4. O documento foi removido do bucket não verificado:

    gsutil ls -r "gs://unscanned-${PROJECT_ID}"
    
  5. 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 bucket unscanned-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"
    
  6. 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}"
    
  7. 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

  1. No console do Google Cloud, acesse a página "Explorador de registros" do Cloud Logging.

    Acessar o Explorador de registros

  2. Se o filtro Campos de registro não for exibido, clique no botão Campos de registro.

  3. No filtro Campos de registro, clique em Revisão do Cloud Run.

  4. 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.

  1. No console do Google Cloud, acesse a página "Metrics Explorer" do Cloud Monitoring.

    Acessar o Metrics Explorer

  2. Clique no campo Métrica e insira a string de filtro malware.

  3. 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:

  1. Crie os vários buckets do Cloud Storage não verificados, limpos e em quarentena.

  2. Conceda os papéis apropriados à conta de serviço malware-scanner nos vários buckets.

  3. 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"
        }
      ]
    }
    
  4. Implante o serviço malware-scanner especificando a variável de ambiente CONFIG_FILE=./config.json no lugar das três variáveis XXX_BUCKET=... para que a configuração no arquivo é usado.

  5. 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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

A seguir