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 vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API Artifact Registry, Cloud Run, Eventarc, Logging, and Cloud Build.

    Abilita le API

  5. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  7. Abilita le API Artifact Registry, Cloud Run, Eventarc, Logging, and Cloud Build.

    Abilita le API

  8. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.

  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. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi