Questo documento descrive come eseguire il deployment dell'architettura in Automatizza la scansione antimalware per i file caricati su 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 creata in questo documento:
Il diagramma mostra le due pipeline seguenti gestite da questa architettura:
- Pipeline di scansione dei file, che controlla se un file caricato contiene malware.
- Pipeline di aggiornamento del mirror del database di malware di 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 su Cloud Storage.
Obiettivi
Crea un mirroring del database delle definizioni di malware ClamAV in un bucket Cloud Storage.
Crea un servizio Cloud Run con le seguenti funzioni:
- Scansiona i file in un bucket Cloud Storage alla ricerca di malware utilizzando ClamAV e sposta i file sottoposti a scansione in bucket sicuri o in quarantena in base al risultato della scansione.
- Gestire un mirror del database delle definizioni di malware di 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 in modo da 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, 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.
Esegui il deployment dell'architettura
Puoi implementare l'architettura descritta in questo documento utilizzando uno dei seguenti metodi:
Utilizza Cloud Shell: utilizza questo metodo se vuoi vedere come viene eseguito il deployment e la configurazione di 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 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 la configurazione dei singoli componenti.
Per utilizzare questo metodo di deployment, segui le istruzioni riportate in Eseguire il deployment utilizzando l'interfaccia a riga di comando di Terraform.
Esegui il deployment utilizzando Cloud Shell
Per eseguire manualmente il deployment dell'architettura descritta in questo documento, completa i passaggi nelle sezioni 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 posizione per l'attivatore Eventarc e i bucket Cloud Storage.
In Cloud Shell, imposta le variabili shell comuni, tra cui regione e località:
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 il tuo 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-
: blocca i file prima che vengano sottoposti a scansione. Gli utenti caricano i propri file in questo bucket.PROJECT_ID quarantined-
: contiene i file analizzati dal servizio di scansione del malware e ritenuti contenere malware.PROJECT_ID clean-
: contiene i file che il servizio di scansione malware ha analizzato e che sono risultati non infetti.PROJECT_ID
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-
viene utilizzato per mantenere un mirror locale del database delle definizioni di malware, che impedisce l'attivazione del limite di velocità dalla CDN di ClamAV.PROJECT_ID
Configura un account di servizio per il servizio di scansione malware
In questa sezione crei un account di servizio da utilizzare per il servizio di scansione malware. Poi concedi all'account di servizio i ruoli appropriati in modo che abbia le 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 l'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 sottoposto a scansione 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 di 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
Crea il servizio di scansione malware in Cloud Run
In questa sezione esegui il deployment del servizio di scansione malware in Cloud Run. Il servizio viene eseguito in un container Docker che contiene quanto segue:
- Un
Dockerfile
per creare un'immagine container con il servizio, il runtime Node.js, l'SDK Google Cloud e i binari di ClamAV. - I file TypeScript per il servizio Cloud Run di scansione malware.
- 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.
Per eseguire il deployment del servizio:
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 alconfig.json.tmpl
file modello 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'inizializzazione 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 dei malware ClamAV nel bucketcvd-mirror-
creato in precedenza.PROJECT_ID Puoi controllare i contenuti del bucket di mirroring:
gcloud storage ls "gs://cvd-mirror-${PROJECT_ID}/cvds"
Il bucket deve contenere diversi file CVD che contengono il database completo dei 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 servizio che hai 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 GB di RAM. Queste dimensioni sono accettabili per questo deployment. Tuttavia, in un ambiente di produzione, ti consigliamo di scegliere una dimensione della CPU e della memoria più grande per l'istanza e un parametro
--max-instances
più grande. Le dimensioni delle risorse di cui potresti avere 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, poiché il tempo di avvio di ogni istanza è relativamente elevato. - Il parametro
--max-instances 5
impedisce di eseguire il scaling del servizio in modo troppo elevato.
- Il parametro
Quando richiesto, inserisci
Y
per creare ed eseguire il deployment del servizio. La compilazione 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.appMemorizza il valore
Service URL
dall'output del comando di deployment in una variabile shell. Utilizzerai il valore in un secondo momento quando crei 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 all'esempio seguente. Mostra la versione del servizio di scansione malware, 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
Il servizio Cloud Run richiede che tutte le invocazioni siano
autenticati e che le identità di autenticazione debbano disporre dell'autorizzazione
run.routes.invoke
per il servizio. Aggiungi l'autorizzazione nella
sezione successiva.
Crea un trigger Eventarc per Cloud Storage
In questa sezione aggiungi le autorizzazioni per consentire a Eventarc di acquisire gli eventi di Cloud Storage e creare un trigger per inviarli al servizio Cloud Run malware-scanner
.
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 è obbligatoria solo per i progetti precedenti 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 all'account di servizio
malware-scanner
di invocare il servizio Cloud Run e di agire come ricevente 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 oggetto finalizzato nel bucket Cloud Storage non sottoposto a scansione e inviarlo al tuo servizio Cloud Run. L'attivatore 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 per la conferma del messaggio su cinque minuti nell'abbonamento Pub/Sub sottostante utilizzato 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
Sebbene il trigger venga creato immediatamente, possono essere necessari fino a due minuti per il suo funzionamento completo.
Crea un job Cloud Scheduler per attivare gli aggiornamenti del mirror del database ClamAV
Crea un job Cloud Scheduler che esegua una richiesta
POST
HTTP sul servizio Cloud Run con un comando per aggiornare il mirror del database delle definizioni di malware. Per evitare che troppi client utilizzino la stessa fascia oraria, ClamAV richiede di pianificare il job in 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 a riga di comando
--schedule
definisce quando viene eseguito il job utilizzando il formato di stringa unix-cron. Il valore specificato indica che il job deve essere eseguito nel minuto specifico generato in modo casuale ogni due ore.
Questo job aggiorna solo il mirror di ClamAV in Cloud Storage. Il demone freshclam di ClamAV in ogni istanza di Cloud Run controlla ogni 30 minuti l'archivio per verificare la presenza di nuove definizioni e aggiorna il demone ClamAV.
Esegui il deployment utilizzando l'interfaccia a riga di comando Terraform
Questa sezione descrive il deployment dell'architettura descritta in questo documento utilizzando l'interfaccia a riga di comando Terraform.
Clona il repository GitHub
In Cloud Shell, clona il repository GitHub contenente il codice e i file Terraform:
git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
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 posizione per l'attivatore Eventarc e i bucket Cloud Storage.
In Cloud Shell, imposta le variabili shell comuni, tra cui regione e località:
REGION=us-central1 LOCATION=us PROJECT_ID=
PROJECT_ID Sostituisci
PROJECT_ID
con l'ID progetto.Inizializza l'ambiente
gcloud CLI
con il tuo ID progetto:gcloud config set project "${PROJECT_ID}"
Crea il file di configurazione
config.json
in base alconfig.json.tmpl
file modello 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 devono essere creati. 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
Esegui il deployment dell'infrastruttura di base
In Cloud Shell, esegui i seguenti 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 gli account di servizio
- Crea Artifact Registry
- Crea i bucket Cloud Storage
- Imposta i ruoli e le autorizzazioni appropriati
- Esegue un'inizializzazione del bucket Cloud Storage che contiene il mirror del database delle definizioni di malware di ClamAV
Crea il container per il servizio
In Cloud Shell, esegui i seguenti comandi per avviare un job Cloud Build per creare l'immagine del contenitore 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.
Esegui il deployment del servizio e dell'attivatore
In Cloud Shell, esegui i seguenti comandi per eseguire il deployment del servizio Cloud Run:
cd ../terraform/service/ terraform init terraform apply
Rispondi
yes
quando richiesto.Il deployment e l'avvio 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 gli trigger Eventarc nei
unscanned
bucket Cloud Storage. Anche se il trigger viene creato immediatamente, possono 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 va a buon fine con uno dei seguenti errori, attendi un minuto e poi esegui di nuovo il comando
terraform apply
per riprovare a creare l'attivatore 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 i seguenti 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 all'esempio seguente. Mostra la versione del servizio di scansione malware, 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
Testa la pipeline caricando file
Per testare la pipeline, carica un file pulito (senza malware) e un file di test che simuli un file infetto:
Crea un file di testo di esempio o utilizza un file pulito esistente per testare i processi della pipeline.
In Cloud Shell, copia il file di dati di esempio nel bucket non sottoposto a scansione:
gcloud storage cp
FILENAME "gs://unscanned-${PROJECT_ID}"Sostituisci
FILENAME
con il nome del file di testo pulito. Il servizio di scansione malware controlla ogni file e lo sposta in un bucket appropriato. Il 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 sottoposto a scansione:
gcloud storage ls "gs://unscanned-${PROJECT_ID}" --recursive
Carica un file denominato
eicar-infected.txt
contenente la firma di test antimalware EICAR standard nel bucket non sottoposto a scansione: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 è ampiamente utilizzato. Non si tratta di malware e non è dannoso per la tua workstation. Se provi a creare un file che contiene questa stringa su un computer su cui è installato uno scanner di malware, puoi attivare un avviso.
Attendi qualche secondo, quindi controlla il bucket in quarantena per verificare se il file è passato correttamente attraverso la pipeline:
gcloud storage ls "gs://quarantined-${PROJECT_ID}" --recursive
Il servizio registra anche una voce di log di Logging quando viene rilevato un file infettato da malware.
Puoi verificare che il file sia stato rimosso dal bucket non sottoposto a scansione:
gcloud storage ls "gs://unscanned-${PROJECT_ID}" --recursive
Testare il meccanismo di aggiornamento del database delle definizioni di malware
In Cloud Shell, attiva la ricerca di aggiornamenti forzando l'esecuzione del job Cloud Scheduler:
gcloud scheduler jobs run "${SERVICE_NAME}-mirror-update" --location="${REGION}"
I risultati di questo comando vengono mostrati solo nei log dettagliati.
Monitorare il servizio
Puoi monitorare il servizio utilizzando Cloud Logging e Cloud Monitoring.
Visualizzare i 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.
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, insieme al nome del malware per il file di test infetto. Puoi utilizzare questi messaggi log per configurare avvisi quando viene rilevato un malware o 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 il mirror è 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 del log di freshclam sono simili alle seguenti:
DATE_TIME -> daily.cld updated (version: VERSION_INFO )
Visualizza metriche
Il servizio genera le seguenti metriche per il monitoraggio e l'invio di avvisi:
- 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 sottoposti a scansione:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/ignored-files
- Tempo impiegato 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 di malware non riuscite:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/scans-failed
- Numero di controlli degli aggiornamenti del mirror CVD:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/cvd-mirror-updates
Puoi visualizzare queste metriche in Metrics Explorer in Cloud Monitoring:
Nella console Google Cloud, vai alla pagina Metrics Explorer di Cloud Monitoring.
Fai clic sul campo Seleziona una metrica e inserisci la stringa 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 è stata eseguita la scansione del file pulito.
Puoi utilizzare le metriche per monitorare la pipeline e creare avvisi 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 filtrare e aggregare i dati in modo da visualizzare dettagli più granulari con Metrics Explorer:
source_bucket
destination_bucket
clam_version
cloud_run_revision
Nella metrica ignored_files
, le seguenti etichette reason
definiscono il motivo per cui i file vengono ignorati:
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 del file corrisponde a uno dei pattern definiti infileExclusionPatterns
.FILE_SIZE_MISMATCH
: se le dimensioni del file cambiano durante l'esame.
Configurazione avanzata
Le sezioni seguenti descrivono come configurare lo scanner con parametri più avanzati.
Gestire più bucket
Il servizio di scansione malware può scansionare i file di più bucket di origine e inviarli a bucket di file sicuri e in quarantena separati. Sebbene questa configurazione avanzata non rientri nell'ambito di questo deployment, di seguito è riportato un riepilogo dei passaggi richiesti:
Crea bucket Cloud Storage non sottoposti a scansione, puliti e messi in quarantena con nomi univoci.
Concedi i ruoli appropriati all'account di servizio
malware-scanner
su 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 ogni bucket non sottoposto a scansione, crea un trigger Eventarc. Assicurati di creare un nome attivatore univoco per ogni bucket.
Il bucket Cloud Storage deve trovarsi nello stesso progetto e nella stessa regione dell'attivatore Eventarc.
Se utilizzi il deployment Terraform, i passaggi
in questa sezione vengono applicati automaticamente quando passi il file di configurazione aggiornatoconfig.json
nella variabile di configurazione TerraformTF_VAR_config_json
.
Ignorare i file temporanei
Alcuni servizi di caricamento, come i gateway SFTP per Cloud Storage, creano uno o più file temporanei durante il processo di caricamento. Al termine del caricamento, questi servizi rinominano i file con il nome finale.
Il normale comportamento dello scanner è eseguire la scansione 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
consente di utilizzare espressioni regolari per specificare un elenco di pattern di nomi file da ignorare.
Tutti i file corrispondenti 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 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, poiché dovranno essere preceduti da un altro \
nel file JSON. Ad esempio, per
specificare un valore letterale .
in un'espressione regolare, il simbolo deve essere sottoposto a evocazione due volte, una volta per
l'espressione regolare e di nuovo per il testo nel file JSON, diventando quindi
\\.
, come nell'ultima riga del precedente esempio di codice.
Ignora i file di lunghezza pari a zero
Analogamente ai file temporanei, alcuni servizi di caricamento creano un file di lunghezza pari a zero su Cloud Storage, per poi aggiornarlo in un secondo momento con altri contenuti.
Questi file possono essere ignorati anche 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 questa regola viene attivata, la metrica ignored-files
viene incrementata e viene registrato un messaggio per indicare che è stato ignorato un file di lunghezza pari a zero.
Dimensioni massime del file di scansione
La dimensione massima predefinita del file di scansione è 500 MiB. Questo valore è stato scelto 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 supportino i nuovi valori di dimensione massima del file e della durata della scansione:
- Il timeout della richiesta del servizio Cloud Run è di 5 minuti
- La scadenza per la conferma del messaggio di sottoscrizione di Pub/Sub è di 5 minuti
- Il codice dello Scanner ha un valore costante di 500 MiB.
MAX_FILE_SIZE
- La configurazione del servizio ClamAV ha impostazioni
StreamMaxLength
,MaxScanSize
eMaxFileSize
di 512 MB. Queste impostazioni vengono impostate dallo scriptbootstrap.sh
.
Esegui la pulizia
La sezione seguente spiega come evitare addebiti futuri per il progetto Google Cloud utilizzato in questo dispiegamento.
Elimina il progetto Google Cloud
Per evitare che al tuo Google Cloud account vengano addebitati costi relativi alle risorse utilizzate in questo deployment, puoi eliminare il progetto Google Cloud.
- 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
- Consulta la documentazione di Cloud Storage.
- Per altre architetture di riferimento, diagrammi e best practice, visita il Centro architetture di Google Cloud.