Esegui il deployment della scansione automatica dei malware per i file caricati su Cloud Storage

Last reviewed 2024-12-02 UTC

Questo documento descrive come eseguire il deployment dell'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:

Architettura della pipeline di scansione antimalware.

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 ClamAV, che mantiene un mirror aggiornato del database di malware utilizzato da ClamAV.

Per saperne di più 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.
    • Manutenzione di una copia mirror 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 per 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

  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 senza costi per l'esecuzione, il test e il deployment dei workload.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Build, Resource Manager, Cloud Scheduler, Eventarc, Logging, Monitoring, Pub/Sub, Cloud Run, and Service Usage APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Artifact Registry, Cloud Build, Resource Manager, Cloud Scheduler, Eventarc, Logging, Monitoring, Pub/Sub, Cloud Run, and Service Usage APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  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 e viene visualizzato un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installata e con valori già impostati per il progetto corrente. L'inizializzazione della sessione può richiedere alcuni secondi.

  9. In questo deployment, esegui tutti i comandi da Cloud Shell.

Esegui il deployment dell'architettura

Puoi eseguire il deployment dell'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 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 Esegui il deployment utilizzando Cloud Shell.

  • Utilizza Terraform CLI: 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 il deployment e la configurazione dei 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.

Esegui il deployment utilizzando Cloud Shell

Per eseguire manualmente il deployment dell'architettura descritta in questo documento, completa i passaggi nelle seguenti sezioni.

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.

  1. In Cloud Shell, imposta le variabili della 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.

  2. Inizializza l'ambiente gcloud con l'ID progetto:

    gcloud config set project "${PROJECT_ID}"
    
  3. 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 dei malware ha analizzato e ha rilevato che non sono infetti.

  4. 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.

Configura un account di servizio per il servizio di scansione antimalware

In questa sezione crei un account di servizio da utilizzare per il servizio di scansione malware. Quindi, 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 necessarie.

  1. Crea il account di servizio malware-scanner:

    gcloud iam service-accounts create ${SERVICE_NAME}
    
  2. 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
    
  3. 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
    

Crea il servizio di scansione malware 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:

  • 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.

Per eseguire il deployment del servizio:

  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 il file di configurazione config.json in base al file modello config.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.

  4. (Facoltativo) Visualizza il file di configurazione aggiornato:

    cat config.json
    
  5. 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 script updateCvdMirror.sh che utilizza CVDUpdate per copiare il database di malware ClamAV nel bucket cvd-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 su configurazione e stato.

  6. Crea ed esegui il deployment del servizio Cloud Run utilizzando il service account 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 GiB di RAM. Questa dimensione è accettabile per questo deployment. Tuttavia, in un ambiente di produzione, potresti voler scegliere una CPU e una memoria più grandi per l'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.
  7. 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
    
  8. 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"
    
  9. (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
    

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.

  1. 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.

  2. In Cloud Shell, concedi il ruolo Publisher Pub/Sub al 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"
    
  3. 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"
    
  4. 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.
    
  5. Modifica la scadenza di riconoscimento del messaggio a 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 per attivare gli aggiornamenti del mirror del database ClamAV

  • 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 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 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.

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 Terraform.

Clona il repository GitHub

  1. 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
    

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.

  1. In Cloud Shell, imposta le variabili della shell comuni, tra cui regione e posizione:

    REGION=us-central1
    LOCATION=us
    PROJECT_ID=PROJECT_ID
    

    Sostituisci PROJECT_ID con l'ID progetto.

  2. Inizializza l'ambiente gcloud CLI con l'ID progetto:

    gcloud config set project "${PROJECT_ID}"
    
  3. Crea il file di configurazione config.json in base al file modello config.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.

  4. (Facoltativo) Visualizza il file di configurazione aggiornato:

    cat docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json
    
  5. Configura le variabili Terraform. I contenuti del file di configurazione config.json vengono passati a Terraform utilizzando la variabile TF_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
    

Esegui il deployment dell'infrastruttura di base

  1. 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

Crea il container per il servizio

  1. 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.

Esegui il deployment del servizio e del trigger

  1. 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.

    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 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 va a buon fine e viene visualizzato 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..
    
  2. (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 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
    

Testare la pipeline caricando i file

Per testare la pipeline, carica un file pulito (senza malware) e un file di test che simula un file infetto:

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

  2. 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.

  3. Attendi qualche secondo affinché la pipeline elabori 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
    
  4. Carica un file denominato eicar-infected.txt che contenga la firma di test anti-malware standard EICAR nel 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.

  5. 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
    

Testare il meccanismo di aggiornamento del database delle definizioni di malware

  • 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.

Monitorare il servizio

Puoi monitorare il servizio utilizzando Cloud Logging e Cloud Monitoring.

Visualizzare i log dettagliati

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

    Vai a Esplora log

  2. Se il filtro Campi log non viene visualizzato, fai clic su 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 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, nonché il nome del malware per il file di test infetto. Puoi utilizzare questi messaggi di log per configurare avvisi per quando viene rilevato 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 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 per il monitoraggio e gli 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 scansionati:
    workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/ignored-files
  • Tempo trascorso a scansionare i 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

Puoi visualizzare queste metriche in Esplora metriche di Cloud Monitoring:

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

    Vai a Esplora metriche

  2. Fai clic sul campo Seleziona una metrica e inserisci la stringa di filtro malware.

  3. Espandi la risorsa Generic Task.

  4. Espandi la categoria Googlecloudplatform.

  5. 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.

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:

  • 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 configurazione ignoreZeroLengthFiles è impostato e il file è vuoto.
  • FILE_TOO_LARGE: quando il file supera la dimensione massima di scansione di 500 MiB.
  • REGEXP_MATCH: quando il nome file corrisponde a uno dei pattern definiti in fileExclusionPatterns.
  • 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ò eseguire la scansione dei file da 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:

  1. Crea bucket Cloud Storage non scansionati, puliti e in quarantena con nomi univoci.

  2. Concedi i ruoli appropriati all'account di servizio malware-scanner in ogni bucket.

  3. 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"
    }
    
  4. 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.

Se utilizzi il deployment Terraform, i passaggi di questa sezione vengono applicati automaticamente quando trasmetti 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 file 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'interruzione 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 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 quindi \\., 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, quindi 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 .

  1. Nella console Google Cloud , vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona quello 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