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 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:

Architettura della pipeline di scansione antimalware.

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

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure 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.

    Enable the APIs

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

    Go to project selector

  6. Make sure 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.

    Enable the APIs

  8. In the Google Cloud console, activate Cloud Shell.

    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.

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

    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.

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

    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 antimalware ha analizzato e ha rilevato come non 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.

    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.

    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 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:

    • 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 di configurazione e stato.

    6. 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.
    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 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"
      
    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 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 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 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.

    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

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

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

    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:

    1. Crea un file di testo di esempio o utilizzane uno esistente pulito 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 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
      
    4. 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.

    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, 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:

    • 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

    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 le dimensioni massime 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ò 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:

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

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Passaggi successivi