Questo documento descrive come implementare l'architettura in Automatizzare la scansione antimalware per i file caricati in Cloud Storage.
Questa guida all'implementazione presuppone che tu abbia familiarità con le funzionalità di base delle seguenti tecnologie:
Architettura
Il seguente diagramma mostra l'architettura di deployment che crei in questo documento:
Il diagramma mostra le due pipeline seguenti gestite da questa architettura:
- Pipeline di scansione dei file, che verifica se un file caricato contiene malware.
- Pipeline di aggiornamento del mirror del database di malware ClamAV, che gestisce un mirror aggiornato del database di malware utilizzato da ClamAV.
Per ulteriori informazioni sull'architettura, consulta Automatizzare la scansione antimalware per i file caricati in Cloud Storage.
Obiettivi
Crea un mirror del database delle definizioni di malware ClamAV in un bucket Cloud Storage.
Crea un servizio Cloud Run con le seguenti funzioni:
- Scansione dei file in un bucket Cloud Storage alla ricerca di malware utilizzando ClamAV e spostamento dei file scansionati in bucket puliti o in quarantena in base al risultato della scansione.
- Mantenere una copia speculare del database delle definizioni di malware ClamAV in Cloud Storage.
Crea un trigger Eventarc per attivare il servizio di scansione malware quando un file viene caricato su Cloud Storage.
Crea un job Cloud Scheduler per attivare il servizio di scansione malware e aggiornare il mirror del database delle definizioni di malware in Cloud Storage.
Costi
Questa architettura utilizza i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.
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 Build, Resource Manager, Cloud Scheduler, Eventarc, Logging, Monitoring, Pub/Sub, Cloud Run, and Service Usage 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 Build, Resource Manager, Cloud Scheduler, Eventarc, Logging, Monitoring, Pub/Sub, Cloud Run, and Service Usage 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 deployment, esegui tutti i comandi da Cloud Shell.
Utilizza Cloud Shell: utilizza questo metodo se vuoi vedere come viene eseguito il deployment e configurato ogni componente della soluzione utilizzando lo strumento a riga di comando
Google Cloud CLI
.Per utilizzare questo metodo di deployment, segui le istruzioni riportate in Eseguire il deployment utilizzando Cloud Shell.
Utilizza l'interfaccia a riga di comando di Terraform: utilizza questo metodo se vuoi eseguire il deployment della soluzione con il minor numero possibile di passaggi manuali. Questo metodo si basa su Terraform per eseguire il deployment e configurare i singoli componenti.
Per utilizzare questo metodo di deployment, segui le istruzioni riportate in Esegui il deployment utilizzando l'interfaccia a riga di comando di Terraform.
In Cloud Shell, imposta le variabili di shell comuni, tra cui regione e posizione:
REGION=us-central1 LOCATION=us PROJECT_ID=PROJECT_ID SERVICE_NAME="malware-scanner" SERVICE_ACCOUNT="${SERVICE_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
Sostituisci
PROJECT_ID
con l'ID progetto.Inizializza l'ambiente
gcloud
con l'ID progetto:gcloud config set project "${PROJECT_ID}"
Crea tre bucket Cloud Storage con nomi univoci:
gcloud storage buckets create "gs://unscanned-${PROJECT_ID}" --location="${LOCATION}" gcloud storage buckets create "gs://quarantined-${PROJECT_ID}" --location="${LOCATION}" gcloud storage buckets create "gs://clean-${PROJECT_ID}" --location="${LOCATION}"
${PROJECT_ID}
viene utilizzato per assicurarsi che i nomi dei bucket siano univoci.Questi tre bucket contengono i file caricati in varie fasi della pipeline di scansione dei file:
unscanned-PROJECT_ID
: contiene i file prima che vengano analizzati. I tuoi utenti caricano i propri file in questo bucket.quarantined-PROJECT_ID
: contiene i file che il servizio di analisi della presenza di malware ha analizzato e ritenuto contenere malware.clean-PROJECT_ID
: contiene i file che il servizio di analisi antimalware ha analizzato e ha rilevato come non infetti.
Crea un quarto bucket Cloud Storage:
gcloud storage buckets create "gs://cvd-mirror-${PROJECT_ID}" --location="${LOCATION}"
${PROJECT_ID}
viene utilizzato per assicurarsi che il nome del bucket sia univoco.Questo bucket
cvd-mirror-PROJECT_ID
viene utilizzato per mantenere un mirror locale del database delle definizioni di malware, il che impedisce l'attivazione limitazione di frequenza da parte della CDN ClamAV.Crea il account di servizio
malware-scanner
:gcloud iam service-accounts create ${SERVICE_NAME}
Concedi il ruolo Amministratore oggetti ai bucket. Il ruolo consente al servizio di leggere ed eliminare i file dal bucket non scansionato e di scrivere i file nei bucket in quarantena e puliti.
gcloud storage buckets add-iam-policy-binding "gs://unscanned-${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" --role=roles/storage.objectAdmin gcloud storage buckets add-iam-policy-binding "gs://clean-${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" --role=roles/storage.objectAdmin gcloud storage buckets add-iam-policy-binding "gs://quarantined-${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" --role=roles/storage.objectAdmin gcloud storage buckets add-iam-policy-binding "gs://cvd-mirror-${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" --role=roles/storage.objectAdmin
Concedi il ruolo Scrittore metriche, che consente al servizio di scrivere le metriche in Monitoring:
gcloud projects add-iam-policy-binding \ "${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role=roles/monitoring.metricWriter
- Un
Dockerfile
per creare un'immagine container con il servizio, il runtime Node.js, Google Cloud SDK e i binari ClamAV. - I file TypeScript per il servizio Cloud Run malware-scanner.
- Un file di configurazione
config.json
per specificare i nomi dei bucket Cloud Storage. - Uno script shell
updateCvdMirror.sh
per aggiornare il mirror del database delle definizioni di malware ClamAV in Cloud Storage. - Uno script shell
bootstrap.sh
per eseguire i servizi necessari all'avvio dell'istanza. 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 il file di configurazione
config.json
in base al file modelloconfig.json.tmpl
nel repository GitHub:sed "s/-bucket-name/-${PROJECT_ID}/" config.json.tmpl > config.json
Il comando precedente utilizza un'operazione di ricerca e sostituzione per assegnare ai bucket Cloud Storage nomi univoci basati sull'ID progetto.
(Facoltativo) Visualizza il file di configurazione aggiornato:
cat config.json
Esegui un popolamento iniziale del mirror del database di malware ClamAV in Cloud Storage:
python3 -m venv pyenv . pyenv/bin/activate pip3 install crcmod cvdupdate ./updateCvdMirror.sh "cvd-mirror-${PROJECT_ID}" deactivate
Questi comandi eseguono un'installazione locale dello strumento
CVDUpdate
, quindi eseguono lo scriptupdateCvdMirror.sh
che utilizzaCVDUpdate
per copiare il database di malware ClamAV nel bucketcvd-mirror-PROJECT_ID
che hai creato in precedenza.Puoi controllare i contenuti del bucket mirror:
gcloud storage ls "gs://cvd-mirror-${PROJECT_ID}/cvds"
Il bucket deve contenere diversi file CVD che contengono l'intero database di malware, diversi file
.cdiff
che contengono gli aggiornamenti differenziali giornalieri e due file JSON con informazioni di configurazione e stato.Crea ed esegui il deployment del servizio Cloud Run utilizzando l'account di servizio creato in precedenza:
gcloud beta run deploy "${SERVICE_NAME}" \ --source . \ --region "${REGION}" \ --no-allow-unauthenticated \ --memory 4Gi \ --cpu 1 \ --concurrency 20 \ --min-instances 1 \ --max-instances 5 \ --no-cpu-throttling \ --cpu-boost \ --timeout 300s \ --service-account="${SERVICE_ACCOUNT}"
Il comando crea un'istanza Cloud Run con 1 vCPU e utilizza 4 GiB di RAM. Questa dimensione è accettabile per questo deployment. Tuttavia, in un ambiente di produzione, potresti scegliere una dimensione maggiore per CPU e memoria dell'istanza e un parametro
--max-instances
più grande. Le dimensioni delle risorse di cui potresti aver bisogno dipendono dalla quantità di traffico che il servizio deve gestire.Il comando include le seguenti specifiche:
- Il parametro
--concurrency
specifica il numero di richieste simultanee che ogni istanza può elaborare. - Il parametro
--no-cpu-throttling
consente all'istanza di eseguire operazioni in background, ad esempio l'aggiornamento delle definizioni di malware. - Il parametro
--cpu-boost
raddoppia il numero di vCPU all'avvio dell'istanza per ridurre la latenza di avvio. - Il parametro
--min-instances 1
mantiene attiva almeno un'istanza, perché il tempo di avvio di ogni istanza è relativamente elevato. - Il parametro
--max-instances 5
impedisce lo scale up del servizio a un valore troppo elevato.
- Il parametro
Quando richiesto, inserisci
Y
per creare ed eseguire il deployment del servizio. La build e il deployment richiedono circa 10 minuti. Al termine, viene visualizzato il seguente messaggio:Service [malware-scanner] revision [malware-scanner-UNIQUE_ID] has been deployed and is serving 100 percent of traffic. Service URL: https://malware-scanner-UNIQUE_ID.a.run.app
Memorizza il valore
Service URL
dall'output del comando di deployment in una variabile shell. Utilizzerai il valore in un secondo momento quando creerai un job Cloud Scheduler.SERVICE_URL="SERVICE_URL"
(Facoltativo) Per controllare il servizio in esecuzione e la versione di ClamAV, esegui questo comando:
curl -D - -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ ${SERVICE_URL}
L'output è simile al seguente esempio. Mostra la versione del servizio di scansione antimalware, la versione di ClamAV e la versione delle definizioni di malware con la data dell'ultimo aggiornamento.
gcs-malware-scanner version 3.2.0 Using Clam AV version: ClamAV 1.4.1/27479/Fri Dec 6 09:40:14 2024
Se utilizzi un progetto esistente creato prima dell'8 aprile 2021, aggiungi il ruolo
iam.serviceAccountTokenCreator
all'account di servizio Pub/Sub:PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)") PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'
L'aggiunta di questo ruolo è necessaria solo per i progetti meno recenti e consente a Pub/Sub di richiamare il servizio Cloud Run.
In Cloud Shell, concedi il ruolo Publisher Pub/Sub all'account di servizio Cloud Storage:
STORAGE_SERVICE_ACCOUNT=$(gcloud storage service-agent --project="${PROJECT_ID}") gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member "serviceAccount:${STORAGE_SERVICE_ACCOUNT}" \ --role "roles/pubsub.publisher"
Consenti al account di servizio
malware-scanner
di richiamare il servizio Cloud Run e di agire come ricevitore di eventi Eventarc:gcloud run services add-iam-policy-binding "${SERVICE_NAME}" \ --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 dell'oggetto finalizzato nel bucket Cloud Storage non analizzato e inviarlo al tuo servizio Cloud Run. Il trigger utilizza l'account di servizio
malware-scanner
per l'autenticazione:BUCKET_NAME="unscanned-${PROJECT_ID}" gcloud eventarc triggers create "trigger-${BUCKET_NAME}-${SERVICE_NAME}" \ --destination-run-service="${SERVICE_NAME}" \ --destination-run-region="${REGION}" \ --location="${LOCATION}" \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=${BUCKET_NAME}" \ --service-account="${SERVICE_ACCOUNT}"
Se ricevi uno dei seguenti errori, attendi un minuto e poi esegui di nuovo i comandi:
ERROR: (gcloud.eventarc.triggers.create) INVALID_ARGUMENT: The request was invalid: Bucket "unscanned-PROJECT_ID" was not found. Please verify that the bucket exists.
ERROR: (gcloud.eventarc.triggers.create) FAILED_PRECONDITION: Invalid resource state for "": Permission denied while using the Eventarc Service Agent. If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. Otherwise, verify that it has Eventarc Service Agent role.
Modifica la scadenza di riconoscimento del messaggio impostandola su cinque minuti nella sottoscrizione Pub/Sub sottostante utilizzata dall'attivatore Eventarc. Il valore predefinito di 10 secondi è troppo breve per file di grandi dimensioni o carichi elevati.
SUBSCRIPTION_NAME=$(gcloud eventarc triggers describe \ "trigger-${BUCKET_NAME}-${SERVICE_NAME}" \ --location="${LOCATION}" \ --format="get(transport.pubsub.subscription)") gcloud pubsub subscriptions update "${SUBSCRIPTION_NAME}" --ack-deadline=300
Anche se il trigger viene creato immediatamente, potrebbero essere necessari fino a due minuti prima che sia completamente funzionale.
Crea un job Cloud Scheduler che esegue una richiesta HTTP
POST
sul servizio Cloud Run con un comando per aggiornare il mirror del database delle definizioni di malware. Per evitare che troppi client utilizzino lo stesso intervallo di tempo, ClamAV richiede di pianificare il job a un minuto casuale compreso tra 3 e 57, evitando i multipli di 10.while : ; do # set MINUTE to a random number between 3 and 57 MINUTE="$((RANDOM%55 + 3))" # exit loop if MINUTE isn't a multiple of 10 [[ $((MINUTE % 10)) != 0 ]] && break done gcloud scheduler jobs create http \ "${SERVICE_NAME}-mirror-update" \ --location="${REGION}" \ --schedule="${MINUTE} */2 * * *" \ --oidc-service-account-email="${SERVICE_ACCOUNT}" \ --uri="${SERVICE_URL}" \ --http-method=post \ --message-body='{"kind":"schedule#cvd_update"}' \ --headers="Content-Type=application/json"
L'argomento della riga di comando
--schedule
definisce quando viene eseguito il job utilizzando il formato della stringa unix-cron. Il valore indicato specifica che il job deve essere eseguito al minuto specifico generato in modo casuale ogni due ore.In Cloud Shell, clona il repository GitHub che contiene il codice e i file Terraform:
git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
In Cloud Shell, imposta le variabili di shell comuni, tra cui regione e posizione:
REGION=us-central1 LOCATION=us PROJECT_ID=PROJECT_ID
Sostituisci
PROJECT_ID
con l'ID progetto.Inizializza l'ambiente
gcloud CLI
con l'ID progetto:gcloud config set project "${PROJECT_ID}"
Crea il file di configurazione
config.json
in base al file modelloconfig.json.tmpl
nel repository GitHub:sed "s/-bucket-name/-${PROJECT_ID}/" \ docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json.tmpl \ > docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json
Il comando precedente utilizza un'operazione di ricerca e sostituzione per assegnare ai bucket Cloud Storage nomi univoci basati sull'ID progetto.
(Facoltativo) Visualizza il file di configurazione aggiornato:
cat docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json
Configura le variabili Terraform. I contenuti del file di configurazione
config.json
vengono passati a Terraform utilizzando la variabileTF_VAR_config_json
, in modo che Terraform sappia quali bucket Cloud Storage creare. Il valore di questa variabile viene passato anche a Cloud Run per configurare il servizio.TF_VAR_project_id=$PROJECT_ID TF_VAR_region=us-central1 TF_VAR_bucket_location=us TF_VAR_config_json="$(cat docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json)" TF_VAR_create_buckets=true export TF_VAR_project_id TF_VAR_region TF_VAR_bucket_location TF_VAR_config_json TF_VAR_create_buckets
In Cloud Shell, esegui questi comandi per eseguire il deployment dell'infrastruttura di base:
gcloud services enable \ cloudresourcemanager.googleapis.com \ serviceusage.googleapis.com cd docker-clamav-malware-scanner/terraform/infra terraform init terraform apply
Rispondi
yes
quando richiesto.Questo script Terraform esegue le seguenti attività:
- Crea i service account
- Crea Artifact Registry
- Crea i bucket Cloud Storage
- Imposta i ruoli e le autorizzazioni appropriati
- Esegue un popolamento iniziale del bucket Cloud Storage che contiene il mirror del database delle definizioni di malware ClamAV
In Cloud Shell, esegui questi comandi per avviare un job Cloud Build per creare l'immagine container per il servizio:
cd ../../cloudrun-malware-scanner gcloud builds submit \ --region="$TF_VAR_region" \ --config=cloudbuild.yaml \ --service-account="projects/$PROJECT_ID/serviceAccounts/malware-scanner-build@$PROJECT_ID.iam.gserviceaccount.com" \ .
Attendi qualche minuto per il completamento della build.
In Cloud Shell, esegui questi comandi per eseguire il deployment del servizio Cloud Run:
cd ../terraform/service/ terraform init terraform apply
Rispondi
yes
quando richiesto.L'avvio e il deployment del servizio possono richiedere diversi minuti.
Questo script Terraform esegue le seguenti attività:
- Esegue il deployment del servizio Cloud Run utilizzando l'immagine container appena creata.
- Configura i trigger Eventarc sui bucket Cloud Storage.
unscanned
Anche se il trigger viene creato immediatamente, potrebbero essere necessari fino a due minuti prima che sia completamente funzionale. - Crea il job Cloud Scheduler per l'aggiornamento al mirror delle definizioni di malware ClamAV.
Se il deployment non riesce con uno dei seguenti errori, attendi un minuto e poi esegui di nuovo il comando
terraform apply
per riprovare a creare il trigger Eventarc.Error: Error creating Trigger: googleapi: Error 400: Invalid resource state for "": The request was invalid: Bucket "unscanned-PROJECT_ID" was not found. Please verify that the bucket exists.
Error: Error creating Trigger: googleapi: Error 400: Invalid resource state for "": Permission denied while using the Eventarc Service Agent. If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. Otherwise, verify that it has Eventarc Service Agent role..
(Facoltativo) Per controllare il servizio in esecuzione e la versione di ClamAV in uso, esegui questi comandi:
MALWARE_SCANNER_URL="$(terraform output -raw cloud_run_uri)" curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ "${MALWARE_SCANNER_URL}"
L'output è simile al seguente esempio. Mostra la versione del servizio di scansione antimalware, la versione di ClamAV e la versione delle definizioni di malware con la data dell'ultimo aggiornamento.
gcs-malware-scanner version 3.2.0 Using Clam AV version: ClamAV 1.4.1/27479/Fri Dec 6 09:40:14 2024
Crea un file di testo di esempio o utilizzane uno esistente pulito per testare i processi della pipeline.
In Cloud Shell, copia il file di dati di esempio nel bucket non analizzato:
gcloud storage cp FILENAME "gs://unscanned-${PROJECT_ID}"
Sostituisci
FILENAME
con il nome del file di testo pulito. Il servizio di scansione antimalware ispeziona ogni file e lo sposta in un bucket appropriato. Questo file viene spostato nel bucket pulito.Attendi qualche secondo per consentire alla pipeline di elaborare il file, quindi controlla il bucket pulito per verificare se il file elaborato è presente:
gcloud storage ls "gs://clean-${PROJECT_ID}" --recursive
Puoi verificare che il file sia stato rimosso dal bucket non scansionato:
gcloud storage ls "gs://unscanned-${PROJECT_ID}" --recursive
Carica un file denominato
eicar-infected.txt
che contenga la firma di test anti-malware standard EICAR nel tuo bucket non scansionato:echo -e 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' \ | gcloud storage cp - "gs://unscanned-${PROJECT_ID}/eicar-infected.txt"
Questa stringa di testo ha una firma che attiva gli scanner di malware a scopo di test. Questo file di test è un test ampiamente utilizzato, non è un malware reale ed è innocuo per la tua workstation. Se provi a creare un file che contiene questa stringa su un computer su cui è installato uno scanner malware, puoi attivare un avviso.
Attendi qualche secondo, quindi controlla il bucket in quarantena per verificare se il file è stato elaborato correttamente dalla pipeline:
gcloud storage ls "gs://quarantined-${PROJECT_ID}" --recursive
Il servizio registra anche una voce di log di Logging quando viene rilevato un file infetto da malware.
Puoi verificare che il file sia stato rimosso dal bucket non scansionato:
gcloud storage ls "gs://unscanned-${PROJECT_ID}" --recursive
In Cloud Shell, attiva il controllo degli aggiornamenti forzando l'esecuzione del job Cloud Scheduler:
gcloud scheduler jobs run "${SERVICE_NAME}-mirror-update" --location="${REGION}"
I risultati di questo comando vengono visualizzati solo nei log dettagliati.
Nella console Google Cloud , vai alla pagina Esplora log di Cloud Logging.
Se il filtro Campi log non viene visualizzato, fai clic su 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.
- Numero di file puliti elaborati:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/clean-files
- Numero di file infetti elaborati:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/infected-files
- Numero di file ignorati e non scansionati:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/ignored-files
- Tempo trascorso per la scansione dei file:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/scan-duration
- Numero totale di byte scansionati:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/bytes-scanned
- Numero di scansioni antimalware non riuscite:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/scans-failed
- Numero di controlli degli aggiornamenti di CVD Mirror:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/cvd-mirror-updates
Nella console Google Cloud , vai alla pagina Metrics Explorer di Cloud Monitoring.
Fai clic sul campo Seleziona una metrica e inserisci la stringa di filtro
malware
.Espandi la risorsa Generic Task.
Espandi la categoria Googlecloudplatform.
Seleziona la metrica googlecloudplatform/gcs-malware-scanning/clean-files. Il grafico mostra un punto dati che indica quando è stato eseguito lo scan del file pulito.
source_bucket
destination_bucket
clam_version
cloud_run_revision
ZERO_LENGTH_FILE
: se il valore di configurazioneignoreZeroLengthFiles
è impostato e il file è vuoto.FILE_TOO_LARGE
: quando il file supera le dimensioni massime di scansione di 500 MiB.REGEXP_MATCH
: quando il nome file corrisponde a uno dei pattern definiti infileExclusionPatterns
.FILE_SIZE_MISMATCH
: se le dimensioni del file cambiano durante l'esame.Crea bucket Cloud Storage non scansionati, puliti e in quarantena con nomi univoci.
Concedi i ruoli appropriati all'account di servizio
malware-scanner
in ogni bucket.Modifica il file di configurazione
config.json
per specificare i nomi dei bucket per ogni configurazione:{ "buckets": [ { "unscanned": "unscanned-bucket-1-name", "clean": "clean-bucket-1-name", "quarantined": "quarantined-bucket-1-name" }, { "unscanned": "unscanned-bucket-2-name", "clean": "clean-bucket-2-name", "quarantined": "quarantined-bucket-2-name" } ], "ClamCvdMirrorBucket": "cvd-mirror-bucket-name" }
Per ciascuno dei bucket non analizzati, crea un trigger Eventarc. Assicurati di creare un nome di trigger univoco per ogni bucket.
Il bucket Cloud Storage deve trovarsi nello stesso progetto e nella stessa regione del trigger Eventarc.
- Il timeout della richiesta del servizio Cloud Run è di 5 minuti
- La scadenza per la conferma di ricezione del messaggio di sottoscrizione di Pub/Sub è di 5 minuti
- Il codice dello scanner ha una
MAX_FILE_SIZE
costante di 500 MiB. - La configurazione del servizio ClamAV ha impostazioni
StreamMaxLength
,MaxScanSize
eMaxFileSize
di 512 MB. Queste impostazioni vengono configurate dallo scriptbootstrap.sh
. - 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.
- Esplora la documentazione di Cloud Storage.
- Per ulteriori architetture di riferimento, diagrammi e best practice, esplora il Cloud Architecture Center.
Esegui il deployment dell'architettura
Puoi implementare l'architettura descritta in questo documento utilizzando uno dei seguenti metodi:
Esegui il deployment utilizzando Cloud Shell
Per eseguire manualmente il deployment dell'architettura descritta in questo documento, completa i passaggi nelle sezioni secondarie seguenti.
prepara l'ambiente
In questa sezione, assegni le impostazioni per i valori utilizzati
durante il deployment, ad esempio
regione e zona.
In questo deployment, utilizzi us-central1
come regione per il servizio Cloud Run e us
come località per il trigger Eventarc e i bucket Cloud Storage.
Configurare un account di servizio per il servizio di scansione antimalware
In questa sezione, creerai un account di servizio da utilizzare per il servizio di scansione malware. Successivamente, concedi i ruoli appropriati al account di servizio in modo che disponga delle autorizzazioni per leggere e scrivere nei bucket Cloud Storage. I ruoli garantiscono che l'account disponga delle autorizzazioni minime e che abbia accesso solo alle risorse di cui ha bisogno.
Crea il servizio malware-scanner in Cloud Run
In questa sezione, esegui il deployment del servizio malware-scanner su Cloud Run. Il servizio viene eseguito in un container Docker che contiene quanto segue:
Per eseguire il deployment del servizio:
Il servizio Cloud Run richiede che tutte le chiamate siano autenticate e che le identità di autenticazione dispongano dell'autorizzazione run.routes.invoke
sul servizio. Aggiungerai l'autorizzazione nella
sezione successiva.
Crea un trigger Eventarc Cloud Storage
In questa sezione, aggiungi le autorizzazioni per consentire a Eventarc di
acquisire gli eventi Cloud Storage e creare un trigger per inviarli
al servizio Cloud Run malware-scanner
.
Crea un job Cloud Scheduler per attivare gli aggiornamenti del mirror del database ClamAV
Questo job aggiorna solo il mirror di ClamAV in Cloud Storage. Il daemon freshclam di ClamAV in ogni istanza di Cloud Run controlla il mirror ogni 30 minuti per nuove definizioni e aggiorna il daemon ClamAV.
Esegui il deployment utilizzando l'interfaccia a riga di comando di Terraform
Questa sezione descrive il deployment dell'architettura descritta in questo documento utilizzando l'interfaccia a riga di comando di Terraform.
Clona il repository GitHub
Prepara l'ambiente
In questa sezione, assegni le impostazioni per i valori utilizzati
durante il deployment, ad esempio
regione e zona.
In questo deployment, utilizzi us-central1
come regione per il servizio Cloud Run e us
come località per il trigger Eventarc e i bucket Cloud Storage.
Esegui il deployment dell'infrastruttura di base
Crea il container per il servizio
Esegui il deployment del servizio e del trigger
Testare la pipeline caricando i file
Per testare la pipeline, carica un file pulito (privo di malware) e un file di test che simula un file infetto:
Testare il meccanismo di aggiornamento del database delle definizioni di malware
Monitorare il servizio
Puoi monitorare il servizio utilizzando Cloud Logging e Cloud Monitoring.
Visualizzare i log dettagliati
I risultati della query dei log mostrano i log del servizio, incluse diverse righe che mostrano le richieste di scansione e lo stato dei due file che hai caricato:
Scan request for gs://unscanned-PROJECT_ID/FILENAME, (##### bytes) scanning with clam ClamAV CLAMAV_VERSION_STRING
Scan status for gs://unscanned-PROJECT_ID/FILENAME: CLEAN (##### bytes in #### ms)
...
Scan request for gs://unscanned-PROJECT_ID/eicar-infected.txt, (69 bytes) scanning with clam ClamAV CLAMAV_VERSION_STRING
Scan status for gs://unscanned-PROJECT_ID/eicar-infected.txt: INFECTED stream: Eicar-Signature FOUND (69 bytes in ### ms)
L'output mostra la versione di ClamAV e la revisione della firma del database di malware, oltre al nome del malware per il file di test infetto. Puoi utilizzare questi messaggi di log per configurare avvisi per quando viene rilevato malware o per quando si verificano errori durante la scansione.
L'output mostra anche i log di aggiornamento del mirror delle definizioni di malware:
Starting CVD Mirror update
CVD Mirror update check complete. output: ...
Se lo specchio è stato aggiornato, l'output mostra righe aggiuntive:
CVD Mirror updated: DATE_TIME - INFO: Downloaded daily.cvd. Version: VERSION_INFO
I log di aggiornamento di Freshclam vengono visualizzati ogni 30 minuti:
DATE_TIME -> Received signal: wake up
DATE_TIME -> ClamAV update process started at DATE_TIME
DATE_TIME -> daily.cvd database is up-to-date (version: VERSION_INFO)
DATE_TIME -> main.cvd database is up-to-date (version: VERSION_INFO)
DATE_TIME -> bytecode.cvd database is up-to-date (version: VERSION_INFO)
Se il database è stato aggiornato, le righe di log di freshclam sono invece simili a quelle seguenti:
DATE_TIME -> daily.cld updated (version: VERSION_INFO)
Visualizza metriche
Il servizio genera le seguenti metriche a scopo di monitoraggio e avviso:
Puoi visualizzare queste metriche in Esplora metriche di Cloud Monitoring:
Puoi utilizzare le metriche per monitorare la pipeline e creare avvisi per quando viene rilevato malware o quando l'elaborazione dei file non va a buon fine.
Le metriche generate hanno le seguenti etichette, che puoi utilizzare per il filtraggio e l'aggregazione per visualizzare dettagli più granulari con Metrics Explorer:
Nella metrica ignored_files
, le seguenti etichette reason
definiscono il motivo per cui i file vengono ignorati:
Configurazione avanzata
Le sezioni seguenti descrivono come configurare lo scanner con parametri più avanzati.
Gestire più bucket
Il servizio di scansione malware può analizzare i file di più bucket di origine e inviarli a bucket puliti e in quarantena separati. Sebbene questa configurazione avanzata non rientri nell'ambito di questo deployment, di seguito è riportato un riepilogo dei passaggi richiesti:
Se utilizzi il deployment Terraform, i passaggi
di questa sezione vengono applicati automaticamente quando passi il file di configurazione
config.json
aggiornato nella variabile di configurazione Terraform
TF_VAR_config_json
.
Ignorare i file temporanei
Alcuni servizi di caricamento, come i gateway SFTP a Cloud Storage, creano uno o più file temporanei durante il processo di caricamento. Questi servizi rinominano i file con il nome finale al termine del caricamento.
Il comportamento normale dello scanner è quello di scansionare e spostare tutti i file, inclusi questi file temporanei non appena vengono scritti, il che potrebbe causare l'errore del servizio di caricamento quando non riesce a trovare i file temporanei.
La sezione fileExclusionPatterns
del file di configurazione config.json
ti consente di utilizzare le espressioni regolari per specificare un elenco di pattern di nomi di file da ignorare.
I file che corrispondono a queste espressioni regolari vengono lasciati nel bucket unscanned
.
Quando questa regola viene attivata, il contatore ignored-files
viene incrementato e viene registrato un messaggio per indicare che il file corrispondente al pattern è stato ignorato.
Il seguente esempio di codice mostra un file di configurazione config.json
con l'elenco
fileExclusionPatterns
impostato per ignorare i file che terminano con .tmp
o che contengono
la stringa .partial_upload.
.
{
"buckets": [
{
"unscanned": "unscanned-bucket-name",
"clean": "clean-bucket-name",
"quarantined": "quarantined-bucket-name"
},
],
"ClamCvdMirrorBucket": "cvd-mirror-bucket-name",
"fileExclusionPatterns": [
"\\.tmp$",
"\\.partial_upload\\."
]
}
Fai attenzione quando utilizzi i caratteri \
nell'espressione regolare, in quanto
dovranno essere sottoposti a escape nel file JSON con un altro \
. Ad esempio, per
specificare un .
letterale in un'espressione regolare, il simbolo deve essere sottoposto a escape due volte: una volta
per l'espressione regolare e una volta per il testo nel file JSON, diventando
\\.
, come nell'ultima riga dell'esempio di codice precedente.
Ignora i file di lunghezza zero
Analogamente ai file temporanei, alcuni servizi di caricamento creano un file di lunghezza zero su Cloud Storage, poi lo aggiornano in un secondo momento con altri contenuti.
Questi file possono anche essere ignorati impostando il parametro config.json
ignoreZeroLengthFiles
su true
, ad esempio:
{
"buckets": [
{
"unscanned": "unscanned-bucket-name",
"clean": "clean-bucket-name",
"quarantined": "quarantined-bucket-name"
},
],
"ClamCvdMirrorBucket": "cvd-mirror-bucket-name",
"ignoreZeroLengthFiles": true
}
Quando viene attivata questa regola, la metrica ignored-files
viene incrementata e viene registrato un messaggio per indicare che un file di lunghezza zero è stato ignorato.
Dimensione massima del file di scansione
La dimensione massima predefinita del file di scansione è 500 MiB. Questa opzione è stata scelta perché la scansione di un file di queste dimensioni richiede circa 5 minuti.
I file di dimensioni superiori a 500 MiB vengono ignorati e lasciati nel bucket unscanned
. La metrica files-ignored
viene incrementata e viene registrato un messaggio.
Se devi aumentare questo limite, aggiorna i seguenti limiti in modo che siano compatibili con i nuovi valori massimi per le dimensioni del file e la durata della scansione:
Esegui la pulizia
La sezione seguente spiega come evitare addebiti futuri per il progettoGoogle Cloud che hai utilizzato in questo deployment.
Elimina il progetto Google Cloud
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo deployment, puoi eliminare il progetto Google Cloud .