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.
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.
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
- 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.
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.
In Cloud Shell, imposta la regione e la località:
export REGION=us-central1 export LOCATION=us
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.
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.
Crea l'account di servizio
malware-scanner
:gcloud iam service-accounts create malware-scanner export SERVICE_ACCOUNT="malware-scanner@${PROJECT_ID}.iam.gserviceaccount.com"
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}"
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 efreshclam
all'avvio del container.
In Cloud Shell, clona il repository GitHub che contiene i file di codice:
git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
Passa alla directory
cloudrun-malware-scanner
:cd docker-clamav-malware-scanner/cloudrun-malware-scanner
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}"
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
.
Se utilizzi un progetto esistente creato prima dell'8 aprile 2021, configura Pub/Sub per le notifiche push.
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"
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"
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.
Crea un file di testo di esempio o utilizza un file pulito esistente per testare i processi della pipeline.
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 bucketclean-PROJECT_ID
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}"
Il documento è stato rimosso dal bucket non analizzato:
gsutil ls -r "gs://unscanned-${PROJECT_ID}"
In Cloud Shell, carica un file denominato
eicar-infected.txt
contenente la firma di test anti-malware standard EICAR nel tuo 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"
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}"
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
Nella console Google Cloud, vai alla pagina Explorer log di Cloud Logging.
Se il filtro Campi log non è visualizzato, fai clic sul pulsante Campi log.
Nel filtro Campi log, fai clic su Revisione Cloud Run
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.
Nella console Google Cloud, vai alla pagina Explorer metriche di Cloud Monitoring.
Fai clic sul campo Metrica e inserisci la stringa di filtro
malware
.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:
Creare i vari bucket Cloud Storage non sottoposti a scansione, puliti e messi in quarantena.
Concedi i ruoli appropriati all'account di servizio
malware-scanner
nei vari bucket.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" } ] }
Esegui il deployment del servizio
malware-scanner
, specificando la variabile di ambienteCONFIG_FILE=./config.json
al posto delle tre variabiliXXX_BUCKET=...
, in modo che venga utilizzata la configurazione nel file.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
- 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.
Passaggi successivi
- Esplora la documentazione di Cloud Storage.
- Esplora architetture di riferimento, diagrammi, tutorial e best practice su Google Cloud. Consulta il nostro Centro di architettura cloud.