Malwarescan für in Cloud Storage hochgeladene Dokumente automatisieren

Last reviewed 2021-10-10 UTC

In dieser Anleitung erfahren Sie, wie Sie eine ereignisgesteuerte Pipeline erstellen, mit der Sie das Prüfen von Dokumenten auf schädlichen Code automatisieren können.

Ein manuelles Prüfen der großen Anzahl von Dokumenten, die auf Cloud Storage hochgeladen werden, ist für die meisten Anwendungen zu zeitaufwendig.

Diese Pipeline wird mithilfe von Google Cloud-Produkten und einer Open-Source-Antivirus-Engine namens ClamAV erstellt. In dieser Anleitung wird ClamAV in einem Docker-Container ausgeführt, der in Cloud Run gehostet wird. Die Pipeline schreibt auch Logeinträge in Cloud Logging und zeichnet Messwerte in Cloud Monitoring auf.

Sie können mit diesen Logging-Logeinträgen logbasierte Warnungen für infizierte Dokumente auslösen. Das Einrichten solcher Warnungen wird in dieser Anleitung jedoch nicht behandelt.

Der Begriff Malware wird in dieser Anleitung als Oberbegriff für Trojaner, Viren und anderen schädlichen Code verwendet.

In dieser Anleitung wird davon ausgegangen, dass Sie mit den Grundfunktionen von Cloud Storage, Cloud Run, Eventarc, Docker und Node.js vertraut sind.

Architektur

Das folgende Diagramm stellt die Schritte in der Pipeline dar.

Architektur der Malwarescan-Pipeline

Die folgenden Schritte stellen die Architekturpipeline dar:

  • Hochladen der Dateien in Cloud Storage
  • Das Upload-Ereignis löst automatisch den Malwarescanner-Dienst aus.
  • Der Malwarescanner-Dienst scannt die hochgeladenen Dokumente auf Malware.
  • Wenn das Dokument infiziert ist, wird es vom Dienst in einen Quarantäne-Bucket verschoben. Andernfalls wird das Dokument in einen anderen Bucket verschoben, in dem sich uninfizierte gescannte Dokumente befinden.

Ziele

  • Erstellen eines Cloud Run-Malwarescanner-Dienstes, um Dokumente mit ClamAV auf Malware zu scannen und die gescannten Dokumente entsprechend dem Scanergebnis in bereinigte Buckets oder Quarantäne-Buckets zu verschieben.

  • Erstellen eines Eventarc-Triggers um den Malwarescan-Dienst auszulösen, wenn ein Dokument in Cloud Storage hochgeladen wird.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweis

  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 Run, Eventarc, Logging, and Cloud Build 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 Run, Eventarc, Logging, and Cloud Build 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 dieser Anleitung führen Sie alle Befehle über Cloud Shell aus.

Umgebung einrichten

In diesem Abschnitt weisen Sie Einstellungen für Werte zu, die in der gesamten Anleitung verwendet werden, z. B. Regionen und Zonen. In dieser Anleitung 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 die Region und den Standort fest:

    export REGION=us-central1
    export LOCATION=us
    
  2. Initialisieren Sie die gcloud-Umgebung mit Ihrer Projekt-ID und legen Sie eine Umgebungsvariable fest:

    export PROJECT_ID=PROJECT_ID
    gcloud config set project "${PROJECT_ID}"
    

    Legen Sie PROJECT_ID auf Ihre Projekt-ID fest.

  3. Erstellen Sie drei Cloud Storage-Buckets mit eindeutigen Namen:

    gsutil mb -l "${LOCATION}" "gs://unscanned-${PROJECT_ID}"
    gsutil mb -l "${LOCATION}" "gs://quarantined-${PROJECT_ID}"
    gsutil mb -l "${LOCATION}" "gs://clean-${PROJECT_ID}"
    

    ${PROJECT_ID} wird verwendet, um sicherzustellen, dass die Bucket-Namen eindeutig sind.

Die drei erstellten Buckets enthalten die Dokumente in verschiedenen Phasen des Pipeline-Verlaufs:

  • unscanned-PROJECT_ID: Enthält Dokumente vor ihrer Verarbeitung. In diesen Bucket laden Sie Ihre Dokumente hoch.

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

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

Dienstkonto für den Malwarescanner-Dienst erstellen und Berechtigungen gewähren

In diesem Abschnitt erstellen Sie ein Dienstkonto, das für den Malwarescanner-Dienst verwendet werden soll, und weisen dem Dienstkonto die entsprechenden Rollen zu, damit es Berechtigungen zum Lesen und Schreiben in den Cloud Storage-Buckets hat. Dadurch wird sichergestellt, 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 malware-scanner
    export SERVICE_ACCOUNT="malware-scanner@${PROJECT_ID}.iam.gserviceaccount.com"
    
  2. Weisen Sie den Buckets die Rolle "Objektadministrator" zu, damit der Dienst Dokumente aus dem ungescannten Bucket lesen und löschen sowie Dokumente in die unter Quarantäne gestellten und sauberen Buckets schreiben kann.

    gsutil iam ch \
        "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \
        "gs://unscanned-${PROJECT_ID}"
    gsutil iam ch \
        "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \
        "gs://clean-${PROJECT_ID}"
    gsutil iam ch \
        "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \
        "gs://quarantined-${PROJECT_ID}"
    
  3. Weisen Sie die Rolle des Messwertautors 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 und enthält Folgendes:

  • Node.js-Dateien für den Malwarescanner-Dienst.
  • Ein Dockerfile zum Erstellen eines Images mit dem Dienst und ClamAV-Binärdateien
  • Ein bootstrap.sh-Shell-Skript zum Ausführen von clamAV- und freshclam-Daemons beim Start des Containers.
  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 und stellen Sie den Cloud Run-Dienst mit dem zuvor erstellten Dienstkonto bereit:

    export SERVICE_NAME=malware-scanner
    gcloud beta run deploy "${SERVICE_NAME}" \
      --source . \
      --region "${REGION}" \
      --no-allow-unauthenticated \
      --memory 4Gi \
      --min-instances 1 \
      --no-cpu-throttling \
      --service-account="${SERVICE_ACCOUNT}" \
      --set-env-vars \
        "UNSCANNED_BUCKET=unscanned-${PROJECT_ID},
        CLEAN_BUCKET=clean-${PROJECT_ID},
        QUARANTINED_BUCKET=quarantined-${PROJECT_ID}"
    
  4. Geben Sie bei Aufforderung Y ein.

Wenn die Bereitstellung abgeschlossen ist, wird folgende Meldung angezeigt:

Service [malware-scanner] revision [malware-scanner-NNNNN-XXX] has been deployed and is serving 100 percent of traffic.
Service URL: https://malware-scanner-XXXXXXXX-XX.a.run.app

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.

Mit dem folgenden Befehl können Sie den ausgeführten Dienst und die ClamAV-Version prüfen:

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

SERVICE_URL ist die URL, die in der zuvor gezeigten Bereitstellungsausgabe gemeldet wird.

Cloud Storage-Trigger für Eventarc erstellen

In diesem Abschnitt fügen Sie Berechtigungen hinzu, damit Eventarc Cloud Storage-Ereignisse erfassen und einen Trigger zum Senden dieser Ereignisse an den Cloud Run-Dienst malware-scanner ausführen kann.

  1. Wenn Sie ein vorhandenes Projekt verwenden, das vor dem 8. April 2021 erstellt wurde, konfigurieren Sie Pub/Sub für Push-Benachrichtigungen.

  2. Weisen Sie in Cloud Shell dem Cloud Storage-Dienstkonto die Rolle roles/pubsub.publisher zu:

    STORAGE_SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p "${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 fungieren Sie als Eventarc-Ereignisempfänger:

    gcloud run services add-iam-policy-binding malware-scanner \
      --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:

    gcloud eventarc triggers create trigger-gcs-malware-scanner \
      --destination-run-service="${SERVICE_NAME}" \
      --destination-run-region="${REGION}" \
      --location="${LOCATION}" \
      --event-filters="type=google.cloud.storage.object.v1.finalized" \
      --event-filters="bucket=unscanned-${PROJECT_ID}" \
      --service-account="${SERVICE_ACCOUNT}"
    

    Wenn Sie die folgende Fehlermeldung erhalten, warten Sie eine Minute und führen Sie den Befehl 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.

Pipeline durch Hochladen von Dateien testen

Sie laden eine saubere Datei (ohne Malware) und eine infizierte Datei hoch, um die Pipeline zu testen.

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

  2. Kopieren Sie die Datei mit den Beispieldaten in den Bucket mit ungescannten Dateien:

    gsutil 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. Dieses Dokument wird in den clean-PROJECT_ID-Bucket verschoben.

  3. Warten Sie ein paar Sekunden, bis die Pipeline das Dokument verarbeitet hat. Prüfen Sie dann, ob sich das verarbeitete Dokument im clean-PROJECT_ID-Bucket befindet:

    gsutil ls -r "gs://clean-${PROJECT_ID}"
    
  4. Das Dokument wurde aus dem ungescannten Bucket entfernt:

    gsutil ls -r "gs://unscanned-${PROJECT_ID}"
    
  5. Laden Sie in Cloud Shell eine Datei mit dem Namen eicar-infected.txt, die die EICAR-Standard-Anti-Malware-Testsignatur enthält, in den unscanned-PROJECT_ID-Bucket hoch:

    echo -e 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' \
        | gsutil cp - "gs://unscanned-${PROJECT_ID}/eicar-infected.txt"
    
  6. Warten Sie einige Sekunden und prüfen Sie dann im quarantined-PROJECT_ID-Bucket, ob das Dokument die Pipeline erfolgreich durchlaufen hat. Der Dienst protokolliert auch einen Logging-Logeintrag, wenn ein mit Malware infiziertes Dokument erkannt wird.

    gsutil ls -r "gs://quarantined-${PROJECT_ID}"
    
  7. Das Dokument wurde aus dem ungescannten Bucket entfernt:

    gsutil ls -r "gs://unscanned-${PROJECT_ID}"
    

Dienst überwachen

Der Dienst kann mit Cloud Logging und Cloud Monitoring überwacht werden.

Logs ansehen

  1. Rufen Sie in der Google Cloud Console die Seite "Log-Explorer" von Cloud Logging auf.

    Zum Log-Explorer

  2. Wenn der Filter Logfelder nicht angezeigt wird, klicken Sie auf die Schaltfläche 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. Beispiel:

Info: "Scan request for gs://unscanned-PROJECT_ID/filename, (##### bytes) scanning with clam ClamAV 0.103.3/26347/Mon Nov 8 09:19:39 2021"
Info: "Scan status for gs://unscanned-PROJECT_ID/filename: CLEAN (##### bytes in #### ms)"
...
Info: "Scan request for gs://unscanned-PROJECT_ID/eicar-infected.txt, (69 bytes) scanning with clam ClamAV 0.103.3/26347/Mon Nov 8 09:19:39 2021"
Warning: "Scan status for gs://unscanned-PROJECT_ID/eicar-infected.txt: INFECTED stream: Eicar-Signature FOUND (69 bytes in ### ms)"

Wie Sie sehen, werden die ClamAV-Version und die Überarbeitung der Virensignatur zusammen mit dem Virennamen für die infizierte Testdatei gemeldet.

Sie können diese Logmeldungen verwenden, um Warnungen für den Fall eines Virus oder für Fehler beim Scannen einzurichten.

Messwerte ansehen

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

  • Anzahl der verarbeiteten Bereinigungsdateien:
    custom.googleapis.com/opencensus/malware-scanning/clean_files
  • Anzahl der verarbeiteten infizierten Dateien:
    custom.googleapis.com/opencensus/malwares-canning/infected_files
  • Zeit, die für das Scannen von Dateien aufgewendet wurde:
    custom.googleapis.com/opencensus/malware-scanning/scan_duration
  • Gesamtzahl gescannter Byte:
    custom.googleapis.com/opencensus/malware-scanning/bytes_scanned
  • Anzahl der fehlgeschlagenen Malware-Scans:
    custom.googleapis.com/opencensus/malwares-canning/scans_failed

Sie können diese Messwerte im Metrics Explorer von Cloud Monitoring aufrufen.

  1. Rufen Sie in der Google Cloud Console die Cloud Monitoring-Seite "Metrics Explorer" auf.

    Zum Metrics Explorer

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

  3. Wählen Sie den Messwert OpenCensus/Malware-Scanning/clean_files aus. Das Diagramm zeigt einen Datenpunkt, der angibt, wann die saubere Datei gescannt wurde.

Messwerte können verwendet werden, um die Pipeline zu überwachen und Warnungen zu erstellen, wenn ein Virus erkannt wird oder wenn Dateien nicht verarbeitet werden können.

Weitere Informationen können nach verschiedenen Messwertlabels aufgeschlüsselt werden:

  • source_bucket
  • destination_bucket
  • clam_version
  • cloud_run_revision

Mehrere Buckets verarbeiten

Der Malwarescanner-Dienst kann Dateien aus mehreren Quell-Buckets scannen und sie an separate, unter Quarantäne gestellte Buckets senden.

Diese erweiterte Konfiguration wird in dieser Anleitung zwar nicht behandelt, aber in den folgenden Schritte zusammengefasst:

  1. Erstellen Sie die verschiedenen nicht gescannten, bereinigten und unter Quarantäne gestellten Cloud Storage-Buckets.

  2. Weisen Sie dem Dienstkonto malware-scanner in den verschiedenen Buckets 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",
          "clean": "clean-bucket-1",
          "quarantined": "quarantined-bucket-1"
        },
        {
          "unscanned": "unscanned-bucket-2",
          "clean": "clean-bucket-2",
          "quarantined": "quarantined-bucket-2"
        }
      ]
    }
    
  4. Stellen Sie den malware-scanner-Dienst bereit und geben Sie die Umgebungsvariable CONFIG_FILE=./config.json anstelle der drei XXX_BUCKET=...-Variablen an, damit die Konfiguration in der Datei verwendet wird.

  5. Für jeden nicht gescannten Bucket erstellen Sie einen Eventarc-Trigger, der jedes Mal den Triggernamen und den Bucket-Namen ändert.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

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