Automatisierte Malware-Scans für Dateien bereitstellen, die in Cloud Storage hochgeladen wurden

In diesem Dokument wird beschrieben, wie Sie die Architektur unter Malware-Scans für Dateien automatisieren, die in Cloud Storage hochgeladen werden bereitstellen.

In diesem Bereitstellungsleitfaden wird davon ausgegangen, dass Sie mit den grundlegenden Funktionen der folgenden Technologien vertraut sind:

Architektur

Das folgende Diagramm zeigt die Bereitstellungsarchitektur, die Sie in diesem Dokument erstellen.

Architektur der Malwarescan-Pipeline

Das Diagramm zeigt die folgenden zwei Pipelines, die von dieser Architektur verwaltet werden:

  • Pipeline zum Scannen von Dateien, die prüft, ob eine hochgeladene Datei Malware enthält.
  • Aktualisierte Pipeline der gespiegelten Malware-Datenbank von ClamAV, die eine aktuelle Spiegelung der von ClamAV verwendeten Malware-Datenbank bereitstellt.

Weitere Informationen zur Architektur finden Sie unter Malware-Scans für Dateien automatisieren, die in Cloud Storage hochgeladen werden.

Ziele

  • Spiegelung der ClamAV-Malware-Definitionsdatenbank in einem Cloud Storage-Bucket erstellen.

  • Cloud Run-Dienst mit den folgenden Funktionen erstellen:

    • Dateien in einem Cloud Storage-Bucket auf Malware mithilfe von ClamAV scannen und gescannte Dateien in saubere Buckets oder Quarantäne-Buckets auf Basis des Scanergebnisses verschieben.
    • Gespiegelte ClamAV-Malware-Definitionsdatenbank in Cloud Storage verwalten
  • Erstellen eines Eventarc-Triggers um den Malwarescan-Dienst auszulösen, wenn eine Datei in Cloud Storage hochgeladen wird.

  • Erstellen Sie einen Cloud Scheduler-Job, um den Malwarescan-Dienst auszulösen, um die Spiegelung der Malware-Definitionsdatenbank in Cloud Storage zu aktualisieren.

Kosten

In dieser Architektur werden die folgenden kostenpflichtigen Komponenten von Google Cloudverwendet:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.

Hinweise

  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.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. 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 (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.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    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 dieser Bereitstellung führen Sie alle Befehle über Cloud Shell aus.

    Architektur bereitstellen

    Sie können die in diesem Dokument beschriebene Architektur mit einer der folgenden Methoden bereitstellen:

    • Cloud Shell verwenden: Verwenden Sie diese Methode, wenn Sie sehen möchten, wie die einzelnen Komponenten der Lösung mit dem Google Cloud CLI-Befehlszeilentool bereitgestellt und konfiguriert werden.

      Folgen Sie der Anleitung unter Mit Cloud Shell bereitstellen, um diese Bereitstellungsmethode zu verwenden.

    • Terraform-Befehlszeile verwenden: Verwenden Sie diese Methode, wenn Sie die Lösung mit möglichst wenigen manuellen Schritten bereitstellen möchten. Bei dieser Methode werden die einzelnen Komponenten mit Terraform bereitgestellt und konfiguriert.

      Folgen Sie der Anleitung unter Mit der Terraform-Befehlszeile bereitstellen, um diese Bereitstellungsmethode zu verwenden.

    Mit Cloud Shell bereitstellen

    Führen Sie die Schritte in den folgenden Unterabschnitten aus, um die in diesem Dokument beschriebene Architektur manuell bereitzustellen.

    Umgebung vorbereiten

    In diesem Abschnitt weisen Sie Einstellungen für Werte zu, die in der gesamten Bereitstellung verwendet werden, z. B. Regionen und Zonen. In dieser Bereitstellung verwenden Sie us-central1 als Region für den Cloud Run-Dienst und us als Speicherort für den Eventarc-Trigger und Cloud Storage-Buckets.

    1. Legen Sie in Cloud Shell gängige Shell-Variablen fest, einschließlich Region und Standort:

      REGION=us-central1
      LOCATION=us
      PROJECT_ID=PROJECT_ID
      SERVICE_NAME="malware-scanner"
      SERVICE_ACCOUNT="${SERVICE_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
      

      Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.

    2. Initialisieren Sie die gcloud-Umgebung mit Ihrer Projekt-ID:

      gcloud config set project "${PROJECT_ID}"
      
    3. Erstellen Sie drei Cloud Storage-Buckets mit eindeutigen Namen:

      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} wird verwendet, um sicherzustellen, dass die Bucket-Namen eindeutig sind.

      Diese drei Buckets enthalten die hochgeladenen Dateien in verschiedenen Phasen der Pipeline zum Scannen von Dateien:

      • unscanned-PROJECT_ID: Enthält Dateien, bevor sie gescannt werden. Die Nutzer laden ihre Dateien in diesen Bucket hoch.

      • quarantined-PROJECT_ID: Enthält Dateien, die vom Malwarescanner gescannt wurden und Malware enthalten.

      • clean-PROJECT_ID: Enthält Dateien, die vom Malwarescanner gescannt wurden und nicht infiziert sind.

    4. Erstellen Sie einen vierten Cloud Storage-Bucket:

      gcloud storage buckets create "gs://cvd-mirror-${PROJECT_ID}" --location="${LOCATION}"
      

      ${PROJECT_ID} wird verwendet, damit der Bucket-Name eindeutig ist.

      Dieser Bucket cvd-mirror-PROJECT_ID wird verwendet, um eine lokale Spiegelung der Malware-Definitionsdatenbank zu verwalten. Dadurch wird verhindert, dass die Ratenbegrenzung vom ClamAV-CDN ausgelöst wird.

    Dienstkonto für den Malwarescanner-Dienst einrichten

    In diesem Abschnitt erstellen Sie ein Dienstkonto, das für den Malwarescanner-Dienst verwendet werden soll. Anschließend weisen Sie dem Dienstkonto die entsprechenden Rollen zu, damit es Berechtigungen zum Lesen und Schreiben in den Cloud Storage-Buckets hat. Die Rollen sorgen dafür, dass das Konto nur minimale Berechtigungen und nur Zugriff auf die benötigten Ressourcen hat.

    1. Erstellen Sie das Dienstkonto malware-scanner:

      gcloud iam service-accounts create ${SERVICE_NAME}
      
    2. Weisen Sie den Buckets die Rolle „Objektadministrator“ zu. Die Rolle erlaubt dem Dienst Dateien aus dem ungescannten Bucket zu lesen und zu löschen sowie Dateien in die unter Quarantäne gestellten und sauberen Buckets zu schreiben.

      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. Weisen Sie die Rolle „Messwert-Autor“ zu, mit der der Dienst Messwerte in Monitoring schreiben kann:

      gcloud projects add-iam-policy-binding \
            "${PROJECT_ID}" \
            --member="serviceAccount:${SERVICE_ACCOUNT}" \
            --role=roles/monitoring.metricWriter
      

    Malwarescanner-Dienst in Cloud Run erstellen

    In diesem Abschnitt stellen Sie den Malwarescanner-Dienst in Cloud Run bereit. Der Dienst wird in einem Docker-Container ausgeführt, der Folgendes enthält:

    • Eine Dockerfile zum Erstellen eines Container-Images mit dem Dienst, der Node.js-Laufzeit, dem Google Cloud SDK und ClamAV-Binärdateien.
    • Die TypeScript-Dateien für den Cloud Run-Dienst für Malwarescanner.
    • Eine config.json-Konfigurationsdatei zur Angabe Ihrer Cloud Storage-Bucket-Namen.
    • Ein updateCvdMirror.sh-Shell-Skript zum Aktualisieren der ClamAV-Malware-Definitionsdatenbank in Cloud Storage.
    • Ein bootstrap.sh-Shell-Skript zum Ausführen der erforderlichen Dienste beim Starten der Instanz.

    So stellen Sie den Dienst bereit:

    1. Klonen Sie in Cloud Shell das GitHub-Repository, das die Codedateien enthält:

      git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
      
    2. Wechseln Sie in das Verzeichnis cloudrun-malware-scanner:

      cd docker-clamav-malware-scanner/cloudrun-malware-scanner
      
    3. Erstellen Sie die Konfigurationsdatei config.json basierend auf der Vorlagendatei config.json.tmpl im GitHub-Repository:

      sed "s/-bucket-name/-${PROJECT_ID}/" config.json.tmpl > config.json
      

      Im vorherigen Befehl wird ein Such- und Ersetzungsvorgang verwendet, um den Cloud Storage-Buckets eindeutige Namen zu geben, die auf der Projekt-ID basieren.

    4. Optional: Aktualisierte Konfigurationsdatei ansehen:

      cat config.json
      
    5. Führen Sie eine erste Population der gespiegelten ClamAV-Malware-Datenbank in Cloud Storage durch:

      python3 -m venv pyenv
      . pyenv/bin/activate
      pip3 install crcmod cvdupdate
      ./updateCvdMirror.sh "cvd-mirror-${PROJECT_ID}"
      deactivate
      

      Mit diesen Befehlen wird das CVDUpdate-Tool lokal installiert und dann das updateCvdMirror.sh-Skript ausgeführt, mit dem die ClamAV-Malware-Datenbank mit CVDUpdate in den zuvor erstellten Bucket cvd-mirror-PROJECT_ID kopiert wird.

      Sie können den Inhalt des gespiegelten Buckets prüfen:

      gcloud storage ls "gs://cvd-mirror-${PROJECT_ID}/cvds"
      

      Der Bucket sollte mehrere CVD-Dateien mit der vollständigen Malware-Datenbank, mehrere .cdiff-Dateien mit den differenziellen Aktualisierungen des Tages und zwei JSON-Dateien mit Konfigurations- und Statusinformationen enthalten.

    6. Erstellen und stellen Sie den Cloud Run-Dienst mit dem Dienstkonto bereit, das Sie zuvor erstellt haben:

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

      Der Befehl erstellt eine Cloud Run-Instanz mit 1 vCPU und 4 GiB RAM. Diese Größe ist für diese Bereitstellung akzeptabel. In einer Produktionsumgebung sollten Sie jedoch eine größere CPU- und Speichergröße für die Instanz und einen größeren --max-instances-Parameter auswählen. Welche Ressourcen Sie möglicherweise benötigen, hängt davon ab, wie viel Traffic der Dienst verarbeiten muss.

      Der Befehl enthält die folgenden Spezifikationen:

      • Der Parameter --concurrency gibt die Anzahl der gleichzeitigen Anfragen an, die jede Instanz verarbeiten kann.
      • Mit dem Parameter --no-cpu-throttling kann die Instanz Vorgänge im Hintergrund ausführen, z. B. Malware-Definitionen aktualisieren.
      • Der Parameter --cpu-boost verdoppelt die Anzahl der vCPUs beim Start der Instanz, um die Startlatenz zu reduzieren.
      • Der Parameter --min-instances 1 behält mindestens eine aktive Instanz bei, da die Startzeit für jede Instanz relativ hoch ist.
      • Der Parameter --max-instances 5 verhindert, dass der Dienst zu hoch skaliert wird.
    7. Geben Sie bei Aufforderung Y ein, um den Dienst zu erstellen und bereitzustellen. Build und Bereitstellung dauern etwa zehn Minuten. Nach Abschluss wird die folgende Meldung angezeigt:

      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. Speichern Sie den Wert Service URL aus der Ausgabe des Bereitstellungsbefehls in einer Shell-Variablen. Sie verwenden den Wert später, wenn Sie einen Cloud Scheduler-Job erstellen.

      SERVICE_URL="SERVICE_URL"
      
    9. Optional: Führen Sie den folgenden Befehl aus, um den ausgeführten Dienst und die ClamAV-Version zu prüfen:

      curl -D - -H "Authorization: Bearer $(gcloud auth print-identity-token)"  \
          ${SERVICE_URL}
      

      Die Ausgabe sieht so aus: Dort werden die Version des Malware-Scanner-Dienstes, die Version von ClamAV und die Version der Malware-Definitionen mit dem Datum der letzten Aktualisierung angezeigt.

      gcs-malware-scanner version 3.2.0
      Using Clam AV version: ClamAV 1.4.1/27479/Fri Dec  6 09:40:14 2024
      

    Der Cloud Run-Dienst erfordert, dass alle Aufrufe authentifiziert werden und die authentifizierenden Identitäten die Berechtigung run.routes.invoke für den Dienst haben. Die Berechtigung fügen Sie im nächsten Abschnitt hinzu.

    Cloud Storage-Trigger für Eventarc erstellen

    In diesem Abschnitt fügen Sie Berechtigungen hinzu, damit Eventarc Cloud Storage-Ereignisse erfassen kann und erstellen einen Trigger, um diese Ereignisse an den Cloud Run-Dienst malware-scanner zu senden.

    1. Wenn Sie ein vorhandenes Projekt verwenden, das vor dem 8. April 2021 erstellt wurde, weisen Sie dem Pub/Sub-Dienstkonto die Rolle iam.serviceAccountTokenCreator zu:

      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'
      

      Diese Rolle ist nur für ältere Projekte erforderlich und ermöglicht Pub/Sub, den Cloud Run-Dienst aufzurufen.

    2. Weisen Sie in Cloud Shell dem Cloud Storage-Dienstkonto die Rolle „Pub/Sub-Publisher“ zu:

      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. Erlauben Sie dem Dienstkonto malware-scanner den Cloud Run-Dienst aufzurufen und als Eventarc-Ereignisempfänger zu fungieren:

      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. Erstellen Sie einen Eventarc-Trigger, um das endgültige Objektereignis im nicht gescannten Cloud Storage-Bucket zu erfassen und an Ihren Cloud Run-Dienst zu senden. Der Trigger verwendet das Dienstkonto malware-scanner zur Authentifizierung:

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

      Wenn Sie einen der folgenden Fehler erhalten, warten Sie eine Minute und führen Sie die Befehle dann noch einmal aus:

      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. Ändern Sie die Frist für die Nachrichtenbestätigung in dem zugrunde liegenden Pub/Sub-Abo, das vom Eventarc-Trigger verwendet wird, auf fünf Minuten. Der Standardwert von zehn Sekunden ist zu kurz für große Dateien oder hohe Lasten.

      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
      

      Der Trigger wird zwar sofort erstellt, es kann jedoch bis zu zwei Minuten dauern, bis er vollständig funktioniert.

    Cloud Scheduler-Job erstellen, um Updates der gespiegelten ClamAV-Datenbank auszulösen

    • Erstellen Sie einen Cloud Scheduler-Job, der eine HTTP-POST-Anfrage im Cloud Run-Dienst mit einem Befehl ausführt, um die gespiegelte Malware-Definitionsdatenbank zu aktualisieren. Damit nicht zu viele Clients denselben Zeitraum verwenden, muss ClamAV den Job in einer zufälligen Minute zwischen 3 und 57 planen, wobei Vielfache von 10 vermieden werden sollten.

      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"
      

      Das --schedule-Befehlszeilenargument definiert, wann der Job im Unix-Cron-Stringformat ausgeführt wird. Der angegebene Wert gibt an, dass der Job alle zwei Stunden zur genau zufällig generierten Minute ausgeführt werden soll.

    Dieser Job aktualisiert nur das gespiegelte ClamAV in Cloud Storage. Der ClamAV-Refresh-Daemon in jeder Instanz von Cloud Run prüft den Spiegel alle 30 Minuten auf neue Definitionen und aktualisiert den ClamAV-Daemon.

    Mit der Terraform-Befehlszeile bereitstellen

    In diesem Abschnitt wird beschrieben, wie Sie die in diesem Dokument beschriebene Architektur mit der Terraform-Befehlszeile bereitstellen.

    GitHub-Repository klonen

    1. Klonen Sie in Cloud Shell das GitHub-Repository, das den Code und die Terraform-Dateien enthält:

      git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
      

    Umgebung vorbereiten

    In diesem Abschnitt weisen Sie Einstellungen für Werte zu, die in der gesamten Bereitstellung verwendet werden, z. B. Regionen und Zonen. In dieser Bereitstellung verwenden Sie us-central1 als Region für den Cloud Run-Dienst und us als Speicherort für den Eventarc-Trigger und Cloud Storage-Buckets.

    1. Legen Sie in Cloud Shell gängige Shell-Variablen fest, einschließlich Region und Standort:

      REGION=us-central1
      LOCATION=us
      PROJECT_ID=PROJECT_ID
      

      Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.

    2. Initialisieren Sie die gcloud CLI-Umgebung mit Ihrer Projekt-ID:

      gcloud config set project "${PROJECT_ID}"
      
    3. Erstellen Sie die Konfigurationsdatei config.json basierend auf der Vorlagendatei config.json.tmpl im GitHub-Repository:

      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
      

      Im vorherigen Befehl wird ein Such- und Ersetzungsvorgang verwendet, um den Cloud Storage-Buckets eindeutige Namen zu geben, die auf der Projekt-ID basieren.

    4. Optional: Aktualisierte Konfigurationsdatei ansehen:

      cat docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json
      
    5. Konfigurieren Sie die Terraform-Variablen. Der Inhalt der Konfigurationsdatei config.json wird über die Variable TF_VAR_config_json an Terraform übergeben, damit Terraform weiß, welche Cloud Storage-Buckets erstellt werden sollen. Der Wert dieser Variablen wird auch an Cloud Run übergeben, um den Dienst zu konfigurieren.

      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
      

    Basisinfrastruktur bereitstellen

    1. Führen Sie in Cloud Shell die folgenden Befehle aus, um die Basisinfrastruktur bereitzustellen:

      gcloud services enable \
        cloudresourcemanager.googleapis.com \
        serviceusage.googleapis.com
      cd docker-clamav-malware-scanner/terraform/infra
      terraform init
      terraform apply
      

      Antworten Sie mit yes, wenn Sie dazu aufgefordert werden.

      Dieses Terraform-Skript führt die folgenden Aufgaben aus:

      • Dienstkonten erstellen
      • Artifact Registry erstellen
      • Cloud Storage-Buckets erstellen
      • Legt die entsprechenden Rollen und Berechtigungen fest.
      • Führt eine erste Population des Cloud Storage-Bucket durch, der die Spiegelung der ClamAV-Malware-Definitionsdatenbank enthält.

    Container für den Dienst erstellen

    1. Führen Sie in Cloud Shell die folgenden Befehle aus, um einen Cloud Build-Job zu starten, mit dem das Container-Image für den Dienst erstellt wird:

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

      Warten Sie einige Minuten, bis der Build abgeschlossen ist.

    Dienst bereitstellen und auslösen

    1. Führen Sie in Cloud Shell die folgenden Befehle aus, um den Cloud Run-Dienst bereitzustellen:

      cd ../terraform/service/
      terraform init
      terraform apply
      

      Antworten Sie mit yes, wenn Sie dazu aufgefordert werden.

      Es kann einige Minuten dauern, bis der Dienst bereitgestellt und gestartet wird.

      Dieses Terraform-Skript führt die folgenden Aufgaben aus:

      • Stellt den Cloud Run-Dienst mit dem Container-Image bereit, das Sie gerade erstellt haben.
      • Richtet die Eventarc-Trigger für die unscanned Cloud Storage-Buckets ein. Der Trigger wird zwar sofort erstellt, es kann jedoch bis zu zwei Minuten dauern, bis er vollständig funktioniert.
      • Erstellt den Cloud Scheduler-Job zum Aktualisieren der gespiegelten ClamAV-Malware-Definitionen.

      Wenn die Bereitstellung mit einem der folgenden Fehler fehlschlägt, warten Sie eine Minute und führen Sie den Befehl terraform apply noch einmal aus, um den Eventarc-Trigger noch einmal zu erstellen.

      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. Optional: Führen Sie die folgenden Befehle aus, um den ausgeführten Dienst und die verwendete ClamAV-Version zu prüfen:

      MALWARE_SCANNER_URL="$(terraform output -raw cloud_run_uri)"
      curl -H "Authorization: Bearer $(gcloud auth print-identity-token)"  \
        "${MALWARE_SCANNER_URL}"
      

      Die Ausgabe sieht so aus: Dort werden die Version des Malware-Scanner-Dienstes, die Version von ClamAV und die Version der Malware-Definitionen mit dem Datum der letzten Aktualisierung angezeigt.

      gcs-malware-scanner version 3.2.0
      Using Clam AV version: ClamAV 1.4.1/27479/Fri Dec  6 09:40:14 2024
      

    Pipeline durch Hochladen von Dateien testen

    Zum Testen der Pipeline laden Sie eine saubere Datei (ohne Malware) und eine Testdatei hoch, die eine infizierte Datei nachahmt:

    1. Erstellen Sie eine Beispieltextdatei oder verwenden Sie eine vorhandene saubere Datei, um die Pipeline-Prozesse zu testen.

    2. Kopieren Sie in Cloud Shell die Beispieldatendatei in den ungescannten Bucket:

      gcloud storage cp FILENAME "gs://unscanned-${PROJECT_ID}"
      

      Ersetzen Sie FILENAME durch den Namen der sauberen Textdatei. Der Malwarescanner-Dienst prüft jedes Dokument und verschiebt es in einen entsprechenden Bucket. Diese Datei wird in den sauberen Bucket verschoben.

    3. Warten Sie ein paar Sekunden, bis die Pipeline die Datei verarbeitet hat. Prüfen Sie dann, ob sich die verarbeitete Datei im sauberen Bucket befindet:

      gcloud storage ls "gs://clean-${PROJECT_ID}" --recursive
      

      Sie können prüfen, ob die Datei aus dem ungescannten Bucket entfernt wurde:

      gcloud storage ls "gs://unscanned-${PROJECT_ID}" --recursive
      
    4. Laden Sie eine Datei mit dem Namen eicar-infected.txt, die die EICAR-Standard-Anti-Malware-Testsignatur enthält, in den nicht gescannten Bucket:

      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"
      

      Dieser Textstring hat eine Signatur, die Malwarescanner für Testzwecke auslöst. Diese Testdatei ist ein weit verbreiteter Test, bei dem es sich nicht um Malware handelt und die für Ihre Workstation harmlos ist. Wenn Sie versuchen, eine Datei mit diesem String auf einem Computer mit einem installierten Malwarescanner zu erstellen, können Sie eine Warnung auslösen.

    5. Warten Sie einige Sekunden und prüfen Sie dann im Quarantäne-Bucket, ob die Datei die Pipeline erfolgreich durchlaufen hat.

      gcloud storage ls "gs://quarantined-${PROJECT_ID}" --recursive
      

      Der Dienst protokolliert auch einen Logging-Logeintrag, wenn eine mit Malware infizierte Datei erkannt wird.

      Sie können prüfen, ob die Datei aus dem ungescannten Bucket entfernt wurde:

      gcloud storage ls "gs://unscanned-${PROJECT_ID}" --recursive
      

    Aktualisierungsmechanismus für Datenbankdefinitionen für Malware-Definitionen testen

    • Lösen Sie in Cloud Shell die Prüfung auf Aktualisierungen aus. Erzwingen Sie dazu die Ausführung des Cloud Scheduler-Jobs:

      gcloud scheduler jobs run "${SERVICE_NAME}-mirror-update" --location="${REGION}"
      

      Die Ergebnisse dieses Befehls werden nur in den detaillierten Logs angezeigt.

    Dienst überwachen

    Sie können den Dienst mit Cloud Logging und Cloud Monitoring überwachen.

    Detaillierte Logs ansehen

    1. Rufen Sie in der Google Cloud Console die Cloud Logging-Seite „Logs Explorer“ auf.

      Zum Log-Explorer

    2. Wenn der Filter Logfelder nicht angezeigt wird, klicken Sie auf Logfelder.

    3. Klicken Sie im Filter Logfelder auf Cloud Run Revision.

    4. Klicken Sie im Abschnitt Servicename des Filters Logfelder auf Malware-Scanner.

    Die Ergebnisse der Logabfrage enthalten die Logs des Dienstes, darunter mehrere Zeilen mit den Scananfragen und dem Status der zwei hochgeladenen Dateien:

    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)
    

    Die Ausgabe zeigt die ClamAV-Version und die Überarbeitung der Malware-Datenbanksignatur sowie den Malware-Namen für die infizierte Testdatei. Sie können diese Logmeldungen verwenden, um Warnungen für den Fall von Malware oder für Fehler beim Scannen einzurichten.

    Die Ausgabe zeigt auch die Aktualisierungslogs für Malware-Definitionen:

    Starting CVD Mirror update
    CVD Mirror update check complete. output: ...
    

    Wenn der Spiegel aktualisiert wurde, enthält die Ausgabe zusätzliche Zeilen:

    CVD Mirror updated: DATE_TIME - INFO: Downloaded daily.cvd. Version: VERSION_INFO
    

    Freshclam-Update-Logs werden alle 30 Minuten angezeigt:

    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)
    

    Wenn die Datenbank aktualisiert wurde, sehen die Logzeilen für Aktualität in etwa so aus:

    DATE_TIME -> daily.cld updated (version: VERSION_INFO)
    

    Messwerte ansehen

    Der Dienst generiert die folgenden Messwerte zu Monitoring- und Benachrichtigungszwecken:

    • Anzahl der verarbeiteten Bereinigungsdateien:
      workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/clean-files
    • Anzahl der verarbeiteten infizierten Dateien:
      workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/infected-files
    • Anzahl der ignorierten und nicht gescannten Dateien:
      workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/ignored-files
    • Zeit, die für das Scannen von Dateien aufgewendet wurde:
      workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/scan-duration
    • Gesamtzahl gescannter Byte:
      workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/bytes-scanned
    • Anzahl der fehlgeschlagenen Malware-Scans:
      workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/scans-failed
    • Anzahl der Überprüfungen der CVD-Mirror-Aktualisierung:
      workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/cvd-mirror-updates

    Sie können diese Messwerte im Metrics Explorer von Cloud Monitoring ansehen:

    1. Rufen Sie in der Google Cloud Console die Seite „Cloud Monitoring > Metrics Explorer“ auf.

      Zum Metrics Explorer

    2. Klicken Sie auf das Feld Messwert auswählen und geben Sie den Filterstring malware ein.

    3. Maximieren Sie die Ressource Generic Task (Allgemeine Aufgabe).

    4. Maximieren Sie die Kategorie Googlecloudplatform.

    5. Wählen Sie den Messwert googlecloudplatform/gcs-malware-scanning/clean-files aus. Das Diagramm zeigt einen Datenpunkt, der angibt, wann die saubere Datei gescannt wurde.

    Sie können Messwerte verwenden, um die Pipeline zu überwachen und Warnungen zu erstellen, wenn Malware erkannt wird oder Dateien nicht verarbeitet werden können.

    Die generierten Messwerte haben die folgenden Labels, die Sie für die Filterung und Aggregation verwenden können, um detaillierte Informationen mit Metrics Explorer anzuzeigen:

    • source_bucket
    • destination_bucket
    • clam_version
    • cloud_run_revision

    Im Messwert ignored_files geben die folgenden reason-Labels an, warum Dateien ignoriert werden:

    • ZERO_LENGTH_FILE: Wenn der Konfigurationswert ignoreZeroLengthFiles festgelegt ist und die Datei leer ist.
    • FILE_TOO_LARGE: Wenn die Datei die maximale Scangröße von 500 MiB überschreitet.
    • REGEXP_MATCH: Wenn der Dateiname mit einem der in fileExclusionPatterns definierten Muster übereinstimmt.
    • FILE_SIZE_MISMATCH: Wenn sich die Dateigröße während der Untersuchung ändert.

    Erweiterte Konfiguration

    In den folgenden Abschnitten wird beschrieben, wie Sie den Scanner mit erweiterten Parametern konfigurieren können.

    Mehrere Buckets verarbeiten

    Der Malwarescanner-Dienst kann Dateien aus mehreren Quell-Buckets scannen und die Dateien an separate, unter Quarantäne gestellte Buckets senden. Obwohl diese erweiterte Konfiguration nicht im Rahmen dieser Bereitstellung ist, finden Sie hier eine Zusammenfassung der erforderlichen Schritte:

    1. Erstellen Sie nicht gescannte, bereinigte und unter Quarantäne gestellte Cloud Storage-Buckets mit eindeutigen Namen.

    2. Weisen Sie dem Dienstkonto malware-scanner in jedem Bucket die entsprechenden Rollen zu.

    3. Bearbeiten Sie die Konfigurationsdatei config.json, um die Bucket-Namen für jede Konfiguration anzugeben:

      {
        "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. Für jeden nicht gescannten Bucket erstellen Sie einen Eventarc-Trigger. Erstellen Sie für jeden Bucket einen eindeutigen Triggernamen.

      Der Cloud Storage-Bucket muss sich im selben Projekt und in derselben Region wie der Eventarc-Trigger befinden.

    Wenn Sie die Terraform-Bereitstellung verwenden, werden die Schritte in diesem Abschnitt automatisch angewendet, wenn Sie Ihre aktualisierte config.json-Konfigurationsdatei in der Terraform-Konfigurationsvariablen TF_VAR_config_json übergeben.

    Temporäre Dateien ignorieren

    Bei einigen Upload-Diensten, z. B. SFTP-zu-Cloud Storage-Gateways, werden während des Uploads eine oder mehrere temporäre Dateien erstellt. Diese Dienste benennen die Dateien dann nach Abschluss des Uploads in den endgültigen Dateinamen um.

    Normalerweise scannt und verschiebt der Scanner alle Dateien, einschließlich dieser temporären Dateien, sobald sie geschrieben werden. Dies kann dazu führen, dass der Upload-Dienst fehlschlägt, wenn er seine temporären Dateien nicht findet.

    Im Abschnitt fileExclusionPatterns der Konfigurationsdatei config.json können Sie mit regulären Ausdrücken eine Liste von Dateinamenmustern angeben, die ignoriert werden sollen. Alle Dateien, die mit diesen regulären Ausdrücken übereinstimmen, verbleiben im unscanned-Bucket.

    Wenn diese Regel ausgelöst wird, wird der Zähler ignored-files erhöht und eine Meldung protokolliert, die angibt, dass die Datei, die dem Muster entspricht, ignoriert wurde.

    Das folgende Codebeispiel zeigt eine config.json-Konfigurationsdatei, in der die Liste fileExclusionPatterns so festgelegt ist, dass Dateien ignoriert werden, die mit .tmp enden oder die Zeichenfolge .partial_upload. enthalten.

    {
      "buckets": [
        {
          "unscanned": "unscanned-bucket-name",
          "clean": "clean-bucket-name",
          "quarantined": "quarantined-bucket-name"
        },
      ],
      "ClamCvdMirrorBucket": "cvd-mirror-bucket-name",
      "fileExclusionPatterns": [
        "\\.tmp$",
        "\\.partial_upload\\."
      ]
    }
    

    Achten Sie darauf, dass Sie \-Zeichen im regulären Ausdruck verwenden, da sie in der JSON-Datei mit einem weiteren \ maskiert werden müssen. Wenn Sie beispielsweise ein Literal . in einem regulären Ausdruck angeben möchten, muss das Symbol zweimal mit Escapezeichen versehen werden: einmal für den regulären Ausdruck und einmal für den Text in der JSON-Datei. Es wird also zu \\., wie in der letzten Zeile des vorherigen Codebeispiels.

    Dateien mit der Länge null ignorieren

    Ähnlich wie bei temporären Dateien erstellen einige Upload-Dienste eine Datei mit der Länge null in Cloud Storage und aktualisieren diese Datei später mit weiteren Inhalten.

    Diese Dateien können auch ignoriert werden, indem Sie den Parameter config.json ignoreZeroLengthFiles auf true festlegen, z. B.:

    {
      "buckets": [
        {
          "unscanned": "unscanned-bucket-name",
          "clean": "clean-bucket-name",
          "quarantined": "quarantined-bucket-name"
        },
      ],
      "ClamCvdMirrorBucket": "cvd-mirror-bucket-name",
      "ignoreZeroLengthFiles": true
    }
    

    Wenn diese Regel ausgelöst wird, wird der Messwert ignored-files erhöht und eine Meldung protokolliert, die angibt, dass eine Datei mit der Länge null ignoriert wurde.

    Maximale Dateigröße für den Scan

    Die standardmäßige maximale Dateigröße für Scans beträgt 500 MiB. Diese Größe wurde gewählt, weil das Scannen einer Datei dieser Größe etwa 5 Minuten dauert.

    Dateien, die größer als 500 MiB sind, werden ignoriert und im unscanned-Bucket belassen. Der Messwert files-ignored wird erhöht und eine Nachricht wird protokolliert.

    Wenn Sie dieses Limit erhöhen müssen, aktualisieren Sie die folgenden Limits entsprechend der neuen maximalen Dateigröße und Scandauer:

    Bereinigen

    Im folgenden Abschnitt wird erläutert, wie Sie zukünftige Gebühren für dasGoogle Cloud -Projekt vermeiden können, das Sie in dieser Bereitstellung verwendet haben.

    Google Cloud -Projekt löschen

    Damit Ihrem Google Cloud -Konto die in dieser Bereitstellung verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie das Google Cloud -Projekt löschen.

    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.

    Nächste Schritte