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

Architettura della pipeline di scansione del malware.

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

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

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

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

  2. Inizializza l'ambiente gcloud con il tuo 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: blocca i file prima che vengano sottoposti a scansione. Gli utenti caricano i propri file in questo bucket.

    • quarantined-PROJECT_ID: contiene i file analizzati dal servizio di scansione del malware e ritenuti contenere malware.

    • clean-PROJECT_ID: contiene i file che il servizio di scansione malware ha analizzato e che sono risultati 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, che impedisce l'attivazione del limite di velocità dalla CDN di ClamAV.

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.

  1. Crea l'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 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
    
  3. 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:

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

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

    cat config.json
    
  5. 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 script updateCvdMirror.sh che utilizza CVDUpdate per copiare il database dei malware ClamAV nel bucket cvd-mirror-PROJECT_ID creato in precedenza.

    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.

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

  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 è obbligatoria solo per i progetti precedenti 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 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"
    
  4. 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.
    
  5. 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

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

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

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

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

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

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

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

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

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

  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 sottoposto a scansione:

    gcloud storage ls "gs://unscanned-${PROJECT_ID}" --recursive
    
  4. 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.

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

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

  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 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 è 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 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 del 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ò 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:

  1. Crea bucket Cloud Storage non sottoposti a scansione, puliti e messi in quarantena con nomi univoci.

  2. Concedi i ruoli appropriati all'account di servizio malware-scanner su 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 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:

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.

  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