Automazione della scansione di malware per i documenti caricati su Cloud Storage

Last reviewed 2021-10-10 UTC

Questo tutorial mostra come creare una pipeline basata su eventi che può aiutarti ad automatizzare la valutazione dei documenti per rilevare eventuali codici dannosi.

La valutazione manuale del grande numero di documenti caricati in Cloud Storage richiede troppo tempo per la maggior parte delle app.

Questa pipeline viene creata utilizzando i prodotti Google Cloud insieme a un motore antivirus open source chiamato ClamAV. Per questo tutorial, ClamAV viene eseguito in un container Docker ospitato in Cloud Run. La pipeline scrive anche le voci di log in Cloud Logging e registra le metriche in Cloud Monitoring.

Puoi attivare gli avvisi basati su log per i documenti infetti utilizzando queste voci di log di logging, ma la configurazione di questi avvisi non rientra nell'ambito di questo tutorial.

Il termine malware viene utilizzato in questo tutorial come termine generico con cui descrivere i trojan, i virus e altri codici dannosi.

Questo tutorial presuppone che tu abbia dimestichezza con le funzionalità di base di Cloud Storage, Cloud Run, Eventarc, Docker e Node.js.

Architettura

Il seguente diagramma illustra i passaggi della pipeline.

Architettura della pipeline di scansione di malware.

I passaggi seguenti definiscono la pipeline di architettura:

  • Carichi i file in Cloud Storage.
  • L'evento di caricamento attiva automaticamente il servizio di scansione del malware.
  • Il servizio di scansione del malware scansiona il documento caricato per individuare eventuale malware.
  • Se il documento è infetto, il servizio lo sposta in un bucket in quarantena, altrimenti viene spostato in un altro bucket che contiene documenti scansionati non infetti.

Obiettivi

  • Crea un servizio di scansione malware di Cloud Run per eseguire la scansione dei documenti alla ricerca di malware utilizzando ClamAV e sposta i documenti scansionati in bucket puliti o messi in quarantena in base ai risultati della scansione.

  • Creare un trigger Eventarc per attivare il servizio di scansione antimalware quando un documento viene caricato in Cloud Storage.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.

Prima di iniziare

  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. In questo tutorial, esegui tutti i comandi di Cloud Shell.

Configurazione dell'ambiente

In questa sezione assegnerai le impostazioni per i valori utilizzati in tutto il tutorial, ad esempio area geografica e zona. In questo tutorial, utilizzerai us-central1 come area geografica per il servizio Cloud Run e us come località per il trigger Eventarc e i bucket Cloud Storage.

  1. In Cloud Shell, imposta la regione e la località:

    export REGION=us-central1
    export LOCATION=us
    
  2. Inizializza l'ambiente gcloud con il tuo ID progetto e imposta una variabile di ambiente:

    export PROJECT_ID=PROJECT_ID
    gcloud config set project "${PROJECT_ID}"
    

    Imposta PROJECT_ID sull'ID progetto.

  3. Crea tre bucket Cloud Storage con nomi univoci:

    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} viene utilizzato per garantire che i nomi dei bucket siano univoci.

I tre bucket che crei mantengono il documento in diverse fasi della pipeline:

  • unscanned-PROJECT_ID: blocca i documenti prima che vengano elaborati. È il bucket in cui carichi i documenti.

  • quarantined-PROJECT_ID: contiene i documenti che il servizio di scansione del malware analizza e ritiene di contenere malware.

  • clean-PROJECT_ID: contiene i documenti che il servizio di scansione del malware scansiona e che risultano non infetti.

Creazione di un account di servizio per il servizio di scansione malware e concessione delle autorizzazioni

In questa sezione creerai un account di servizio da utilizzare per il servizio di scansione antimalware e concedi i ruoli appropriati all'account di servizio in modo che abbia le autorizzazioni per leggere e scrivere nei bucket Cloud Storage. Questo serve a garantire che l'account disponga di autorizzazioni minime e abbia accesso solo alle risorse di cui ha bisogno.

  1. Crea l'account di servizio malware-scanner:

    gcloud iam service-accounts create malware-scanner
    export SERVICE_ACCOUNT="malware-scanner@${PROJECT_ID}.iam.gserviceaccount.com"
    
  2. Concedi il ruolo di amministratore oggetti ai bucket, consentendo al servizio di leggere ed eliminare documenti dal bucket non analizzato e di scrivere documenti nei bucket messi in quarantena e puliti.

    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. Concedi il ruolo Writer metrica consentendo al servizio di scrivere metriche in Monitoring:

    gcloud projects add-iam-policy-binding \
          "${PROJECT_ID}" \
          --member="serviceAccount:${SERVICE_ACCOUNT}" \
          --role=roles/monitoring.metricWriter
    

Creazione del servizio di scansione malware in Cloud Run

In questa sezione eseguirai il deployment del servizio di scansione malware in Cloud Run. Il servizio viene eseguito in un container Docker e contiene quanto segue:

  • I file Node.js per il servizio di scansione malware.
  • Un Dockerfile per creare un'immagine con il servizio e i programmi binari ClamAV.
  • Uno script shell bootstrap.sh per eseguire i daemon clamAV e freshclam all'avvio del container.
  1. In Cloud Shell, clona il repository GitHub che contiene i file di codice:

    git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
    
  2. Passa alla directory cloudrun-malware-scanner:

    cd docker-clamav-malware-scanner/cloudrun-malware-scanner
    
  3. Crea ed esegui il deployment del servizio Cloud Run utilizzando l'account di servizio creato in precedenza:

    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 richiesto, inserisci Y.

Al termine del deployment, verrà visualizzato un messaggio:

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

Il servizio Cloud Run richiede che tutte le chiamate siano autenticate e le identità di autenticazione devono avere l'autorizzazione run.routes.invoke sul servizio.

Puoi controllare il servizio in esecuzione e la versione di ClamAV eseguendo il comando seguente:

curl -D - -H "Authorization: Bearer $(gcloud auth print-identity-token)"  \
     SERVICE_URL

SERVICE_URL è l'URL segnalato nell'output del deployment visto in precedenza.

Crea un trigger Eventarc Cloud Storage

In questa sezione aggiungerai le autorizzazioni per consentire a Eventarc di acquisire eventi Cloud Storage e un trigger per inviare questi eventi al servizio Cloud Run malware-scanner.

  1. Se utilizzi un progetto esistente creato prima dell'8 aprile 2021, configura Pub/Sub per le notifiche push.

  2. In Cloud Shell, concedi il ruolo roles/pubsub.publisher all'account di servizio 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. Consenti all'account di servizio malware-scanner di richiamare il servizio Cloud Run e agire come destinatario di un evento 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. Crea un trigger Eventarc per acquisire l'evento finalizzato degli oggetti nel bucket Cloud Storage non analizzato e inviarlo al servizio Cloud Run. Il trigger utilizzerà l'account di servizio malware-scanner per l'autenticazione:

    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 ricevi il seguente errore, attendi un minuto ed esegui di nuovo il comando:

    ERROR: (gcloud.eventarc.triggers.create) INVALID_ARGUMENT: The request was invalid: Bucket "unscanned-PROJECT_ID" was not found. Please verify that the bucket exists.

Test della pipeline mediante il caricamento di file

Carica un file pulito (senza malware) e un file infetto per testare la pipeline.

  1. Crea un file di testo di esempio o utilizza un file pulito esistente per testare i processi della pipeline.

  2. Copia il file di dati di esempio nel bucket dei file non scansionati:

    gsutil cp filename "gs://unscanned-${PROJECT_ID}"
    

    Sostituisci filename con il nome del file di testo pulito. Il servizio di scansione antimalware analizza ogni documento e lo sposta in un bucket appropriato. Questo documento è stato spostato nel bucket clean-PROJECT_ID

  3. Attendi qualche secondo per la pipeline di elaborazione del documento, quindi controlla il bucket clean-PROJECT_ID per vedere se il documento elaborato è presente:

    gsutil ls -r "gs://clean-${PROJECT_ID}"
    
  4. Il documento è stato rimosso dal bucket non analizzato:

    gsutil ls -r "gs://unscanned-${PROJECT_ID}"
    
  5. In Cloud Shell, carica un file denominato eicar-infected.txt contenente la firma di test anti-malware standard EICAR nel tuo 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. Attendi qualche secondo e controlla il tuo bucket quarantined-PROJECT_ID per vedere se il documento ha completato la pipeline. Il servizio registra anche una voce di log di Logging quando viene rilevato un documento infetto da malware.

    gsutil ls -r "gs://quarantined-${PROJECT_ID}"
    
  7. Il documento è stato rimosso dal bucket non analizzato:

    gsutil ls -r "gs://unscanned-${PROJECT_ID}"
    

Monitoraggio del servizio

Il servizio può essere monitorato utilizzando Cloud Logging e Cloud Monitoring.

Visualizzazione dei log

  1. Nella console Google Cloud, vai alla pagina Explorer log di Cloud Logging.

    Vai a Esplora log

  2. Se il filtro Campi log non è visualizzato, fai clic sul pulsante Campi log.

  3. Nel filtro Campi log, fai clic su Revisione Cloud Run

  4. Nella sezione Nome servizio del filtro Campi log, fai clic su malware-scanner

I risultati della query di log mostreranno i log del servizio, incluse diverse righe che mostrano le richieste di scansione e lo stato dei due file che hai caricato, ad esempio:

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)"

Puoi notare che sono riportati la versione di ClamAV e la revisione della firma del virus, insieme al nome del virus per il file di test infetto.

Puoi utilizzare questi messaggi di log per configurare gli avvisi relativi al rilevamento di un virus o al verificarsi di errori durante la scansione.

Visualizzazione delle metriche

Il servizio genera le seguenti metriche a scopo di monitoraggio e avviso:

  • Numero di file puliti elaborati:
    custom.googleapis.com/opencensus/malware-scanning/clean_files
  • Numero di file infetti elaborati:
    custom.googleapis.com/opencensus/malwares-canning/infected_files
  • Tempo impiegato per la scansione dei file:
    custom.googleapis.com/opencensus/malware-scanning/scan_duration
  • Numero totale di byte scansionati:
    custom.googleapis.com/opencensus/malware-scanning/bytes_scanned
  • Numero di scansioni di malware non riuscite:
    custom.googleapis.com/opencensus/malwares-canning/scans_failed

Queste metriche possono essere visualizzate in Metrics Explorer di Cloud Monitoring.

  1. Nella console Google Cloud, vai alla pagina Explorer metriche di Cloud Monitoring.

    Vai a Metrics Explorer

  2. Fai clic sul campo Metrica e inserisci la stringa di filtro malware.

  3. Seleziona la metrica OpenCensus/malware-scanning/clean_files. Il grafico mostra un punto dati che indica quando è stato scansionato il file pulito.

Le metriche possono essere utilizzate per monitorare la pipeline e creare avvisi in caso di rilevamento di un virus o di mancata elaborazione dei file.

Per ulteriori dettagli, le metriche possono essere suddivise in base a diverse etichette di metriche:

  • bucket_origine
  • bucket_destinazione
  • versione_clam
  • revisione_cloud_run

Gestione di più bucket

Il servizio di analisi dei malware è in grado di analizzare i file da più bucket di origine, inviandoli a bucket separati puliti e messi in quarantena.

La configurazione avanzata non rientra nell'ambito di questo tutorial, ma i passaggi da seguire sono riassunti come segue:

  1. Creare i vari bucket Cloud Storage non sottoposti a scansione, puliti e messi in quarantena.

  2. Concedi i ruoli appropriati all'account di servizio malware-scanner nei vari bucket.

  3. Modifica il file di configurazione config.json per specificare i nomi dei bucket di ciascuna configurazione:

    {
      "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. Esegui il deployment del servizio malware-scanner, specificando la variabile di ambiente CONFIG_FILE=./config.json al posto delle tre variabili XXX_BUCKET=..., in modo che venga utilizzata la configurazione nel file.

  5. Per ciascuno dei bucket non analizzati, crea un trigger Eventarc, modificando ogni volta il nome del bucket e il nome del bucket.

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

  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.

Passaggi successivi