Malwarescan für in Cloud Storage hochgeladene Dateien automatisieren

Last reviewed 2023-04-19 UTC

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

Ein manuelles Prüfen der großen Anzahl von Dateien, 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 Dateien 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, Cloud Scheduler, Eventarc, Docker und Node.js vertraut sind.

Architektur

Das folgende Diagramm bietet einen Überblick über die Architektur.

Architektur der Malwarescan-Pipeline

Von dieser Architektur werden zwei Pipelines verwaltet:

  • Dateiscan-Pipeline, die prüft, ob eine hochgeladene Datei Malware enthält
  • ClamAV Malware Database-Spiegelungs-Pipeline, die einen aktuellen Spiegel der von ClamAV verwendeten Malware-Datenbank verwaltet.

Pipeline zum Scannen von Dateien

Die Dateiscan-Pipeline funktioniert so:

  1. Endnutzer laden ihre Dateien in den nicht gescannten Cloud Storage-Bucket hoch.
  2. Der Eventarc-Dienst erfasst dieses Uploadereignis und informiert den Cloud Run-Dienst über diese neue Datei.
  3. Der Cloud Run-Dienst lädt die neue Datei aus dem nicht gescannten Cloud Storage-Bucket herunter und übergibt sie an den ClamAV Malwarescanner.
  4. Je nach Ergebnis des Malware-Scans führt der Dienst eine der folgenden Aktionen aus:
    • Wenn ClamAV deklariert, dass die Datei sauber ist, wird sie vom nicht gescannten Cloud Storage-Bucket in den sauberen Cloud Storage-Bucket verschoben.
    • Wenn ClamAV deklariert, dass die Datei Malware enthält, wird sie aus dem ungescannten Cloud Storage-Bucket in den Quarantäne Cloud Storage-Bucket verschoben.
  5. Der Dienst meldet das Ergebnis dieser Aktionen an Logging und Monitoring, damit Administratoren Aktionen ausführen können.

Pipeline zur Aktualisierung des ClamAV Malware-Datenbankspiegels

Damit der ClamAV Malwarescanner effektiv gescannt werden kann, muss eine aktuelle Datenbank mit Malwaresignaturen vorhanden sein.

Der ClamAV-Dienst wird mit Cloud Run ausgeführt, einem zustandslosen Dienst. Beim Start einer Instanz des Dienstes muss ClamAV immer die neueste vollständige Malware-Datenbank herunterladen, die mehrere Hundert Megabyte groß ist.

Die öffentliche Malware-Datenbank für ClamAV wird in einem Content Distribution Network (CDN) gehostet, was diese Downloads begrenzt. Wenn mehrere Instanzen gestartet werden und versuchen, die vollständige Datenbank herunterzuladen, kann die Ratenbegrenzung ausgelöst werden. Dadurch wird die von Cloud Run verwendete externe IP-Adresse 24 Stunden lang blockiert. Dadurch wird verhindert, dass der ClamAV-Dienst gestartet wird, und verhindert den Download von Malware-Datenbankupdates.

Außerdem verwendet Cloud Run einen gemeinsamen Pool externer IP-Adressen. Daher werden Downloads von Malwareinstanzen der verschiedenen Projekte vom CDN als von einer einzigen Adresse stammend angesehen und lösen den Block aus.

Diese Pipeline speichert einen aktuellen privaten lokalen Spiegel der Datenbank in Cloud Storage. Dadurch wird sichergestellt, dass auf die öffentliche ClamAV-Datenbank nur einmal pro Update zugegriffen wird, um die kleineren Dateien für differenzielle Updates und nicht die vollständige Datenbank herunterzuladen, wodurch eine Ratenbegrenzung verhindert wird.

Diese Pipeline funktioniert so:

  1. Ein Cloud Scheduler-Job ist so konfiguriert, dass er alle zwei Stunden ausgelöst wird. Dies entspricht dem Standardintervall für die Aktualisierungsprüfung, das vom ClamAV Freshclam-Dienst verwendet wird. Dieser Job stellt eine HTTP-POST-Anfrage an den Cloud Run-Dienst, der ihn anweist, die Malware-Datenbankspiegelung zu aktualisieren.
  2. Die Cloud Run-Instanz kopiert die Malware-Datenbankspiegelung aus dem Cloud Storage-Bucket in das lokale Dateisystem.
  3. Die Instanz führt dann das Tool ClamAV CVDUpdate aus, das alle verfügbaren differenziellen Aktualisierungen herunterlädt und sie auf die Datenbankspiegelung anwendet.
  4. Anschließend wird der aktualisierte Malware-Datenbankspiegel in den Cloud Storage-Bucket kopiert.

Der in der Cloud Run-Instanz ausgeführte ClamAV freshclam lädt die Malware-Datenbank beim Start von Cloud Storage herunter und überprüft regelmäßig die verfügbaren Datenbankaktualisierungen und lädt sie herunter. Cloud Storage-Bucket während der Laufzeit

Lernziele

  • Erstellen Sie eine Spiegelung der ClamAV-Malware-Definitionsdatenbank in einem Cloud Storage-Bucket.

  • Erstellen Sie einen Cloud Run-Dienst mit den folgenden Funktionen:

    • Scannen Sie Dateien in einem Cloud Storage-Bucket nach Malware. Verschieben Sie gescannte Dateien je nach Ergebnis des Scans in bereinigte oder unter Quarantäne gestellte Buckets.
    • Spiegel der 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 den Spiegel der Malwaredefinitionsdatenbank in Cloud Storage zu aktualisieren.

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. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. Artifact Registry, Cloud Run, Eventarc, Logging, Cloud Scheduler, Pub/Sub, and Cloud Build APIs aktivieren.

    Aktivieren Sie die APIs

  5. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  6. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  7. Artifact Registry, Cloud Run, Eventarc, Logging, Cloud Scheduler, Pub/Sub, and Cloud Build APIs aktivieren.

    Aktivieren Sie die APIs

  8. Aktivieren Sie Cloud Shell in der Google Cloud Console.

    Cloud Shell aktivieren

    Unten in der Google Cloud Console wird eine Cloud Shell-Sitzung gestartet und eine Eingabeaufforderung angezeigt. Cloud Shell ist eine Shell-Umgebung, in der das Google Cloud CLI bereits installiert ist und Werte für Ihr aktuelles Projekt bereits festgelegt sind. Das Initialisieren der Sitzung kann einige Sekunden dauern.

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

    Legen Sie PROJECT_ID auf Ihre Projekt-ID fest.

  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:

    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.

    Diese drei Buckets enthalten die hochgeladenen Dateien in verschiedenen Phasen der Dateiscan-Pipeline:

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

    gsutil mb -l "${LOCATION}" "gs://cvd-mirror-${PROJECT_ID}"
    

    ${PROJECT_ID} wird verwendet, um sicherzustellen, dass der Bucket-Name eindeutig ist.

    Mit diesem Bucket cvd-mirror-PROJECT_ID wird eine lokale Spiegelung der Malware-Definitionsdatenbank verwaltet, die verhindert, dass die Ratenbegrenzung vom ClamAV-CDN ausgelöst wird.

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 ${SERVICE_NAME}
    
  2. Weisen Sie den Buckets die Rolle „Objektadministrator“ zu, damit der Dienst Dateien aus dem ungescannten Bucket lesen und löschen sowie Dateien 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}"
    gsutil iam ch \
        "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \
        "gs://cvd-mirror-${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:

  • Ein Dockerfile zum Erstellen eines Container-Images mit dem Dienst, der Node.js-Laufzeit, dem GCloud SDK und ClamAV-Binärdateien.
  • Die Node.js-Dateien für den Malwarescanner Cloud Run-Dienst.
  • config.json-Konfigurationsdatei, um Ihre Cloud Storage-Bucket-Namen anzugeben.
  • updateCvdMirror.sh-Shell-Skript zum Aktualisieren des ClamAV-Malware-Definition-Datenbankspiegels in Cloud Storage.
  • cloud-run-proxy-Dienst zum Weiterleiten von freshclam-HTTP-Anfragen, die authentifizierten Zugriff auf Cloud Storage APIs bieten.
  • bootstrap.sh-Shell-Skript zum Ausführen der erforderlichen Dienste beim Instanzstart.
  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. Bearbeiten Sie die Konfigurationsdatei config.json, um die soeben erstellten Cloud Storage-Buckets anzugeben. Da sie auf der Projekt-ID basieren, kann ein einfacher Suchen und Ersetzen verwendet werden:

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

    Sie können die aktualisierte Konfigurationsdatei ansehen:

    cat config.json
    
  4. Führen Sie eine anfängliche Population des ClamAV Malware-Datenbankspiegels in Cloud Storage durch:

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

    Dadurch wird das CVDUpdate-Tool lokal installiert, damit die Malware-Datenbank heruntergeladen und anschließend in den zuvor erstellten Cloud Storage-cvd-Mirror-Bucket hochgeladen.

    Sie können den Inhalt des Spiegels prüfen:

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

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

  5. Erstellen und stellen Sie den Cloud Run-Dienst mit dem zuvor erstellten Dienstkonto bereit:

    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 \
      --service-account="${SERVICE_ACCOUNT}"
    

    Dadurch wird eine Cloud Run-Instanz mit einer vCPU erstellt und 4 GiB RAM verwendet. Dies ist eine akzeptable Größe für diese Anleitung. 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, je nachdem, wie viel Traffic der Dienst verarbeiten muss.

    Der Parameter --concurrency gibt die Anzahl der gleichzeitigen Anfragen an, die jede Instanz verarbeiten kann.

    Der Parameter --no-cpu-throttling ermöglicht der Instanz, Vorgänge im Hintergrund auszuführen, z. B. das Aktualisieren von Malware-Definitionen.

    Der Parameter --cpu-boost verdoppelt die Anzahl der vCPUs beim Start der Instanz, um die Startlatenz zu reduzieren.

    Der Parameter --min-instances 1 sorgt dafür, dass mindestens eine Instanz aktiv ist, da die Startzeit jeder Instanz relativ hoch ist.

    Der Parameter --max-instances 5 verhindert, dass der Dienst zu hoch skaliert wird.

  6. Geben Sie bei Aufforderung Y ein.

Der Build und die Bereitstellung dauern etwa zehn Minuten. Nach Abschluss des Vorgangs wird eine 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

Speichern Sie den Wert Service URL aus der Ausgabe des Bereitstellungsbefehls in einer Shell-Variable. Sie wird später beim Erstellen eines Cloud Scheduler-Jobs verwendet:

SERVICE_URL="SERVICE_URL"

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}

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 "${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 einer der folgenden beiden Fehler angezeigt wird, 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.

    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 Nachrichtenbestätigungsfrist im zugrunde liegenden Pub/Sub-Abo, das vom Eventarc-Trigger verwendet wird, auf zwei Minuten:

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

    Der Standardwert von zehn Sekunden ist zu groß für große Dateien oder hohe Lasten.

Cloud Scheduler-Job erstellen, um Aktualisierungen der ClamAV-Datenbankspiegelung auszulösen

Erstellen Sie einen Cloud Scheduler-Job, der eine HTTP POST-Anfrage an den Cloud Run-Dienst ausführt, mit einem Befehl, um die Spiegelung der Malware-Definitionsdatenbank zu aktualisieren. Damit nicht zu viele Clients denselben Slot verwenden, müssen Sie für ClamAV den Job nach einem Zufallsprinzip zwischen 3 und 57 planen und ein Vielfaches von 10 vermeiden.

while : ; do
  # set MINUTE to a random number between 3 and 57
  MINUTE="$((RANDOM%55 + 3))"
  # exit loop if MINUTE is not 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 Befehlszeilenargument --schedule definiert, wann der Job mit dem Stringformat unix-cron ausgeführt wird. Der angegebene Wert gibt an, dass er alle zwei Stunden zur jeweiligen zufällig generierten Minute ausgeführt werden soll.

Mit diesem Job wird nur der ClamAV-Spiegel in Cloud Storage aktualisiert. 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.

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

    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. 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 den bereinigten Bucket, um festzustellen, ob sich dort die verarbeitete Datei befindet:

    gsutil ls -r "gs://clean-${PROJECT_ID}"
    
  4. Die Datei 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 -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 Quarantäne-Bucket, ob die Datei die Pipeline erfolgreich durchlaufen hat. Der Dienst protokolliert auch einen Logging-Logeintrag, wenn eine mit Malware infizierte Datei erkannt wird.

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

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

Mechanismus zur Datenbankaktualisierung mit Malware-Definitionen testen

  • In Cloud Shell können Sie die Prüfung auf Aktualisierungen auslösen, indem Sie die Ausführung des Cloud Scheduler-Jobs erzwingen:

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

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

Dienst überwachen

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

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

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)

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

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

Die Malware-Definitionen für Spiegel-Updates werden ebenfalls angezeigt und sehen so aus:

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

Wenn der Spiegel aktualisiert wurde, wird eine zusätzliche Zeile angezeigt:

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

Freshclam-Aktualisierungslogs werden alle 30 Minuten angezeigt und so 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, werden stattdessen die Bereinigen-Logzeilen so angezeigt:

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

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/malware-scanning/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/malware-scanning/scans_failed
  • Anzahl der CVD-Mirror-Update-Prüfungen:
    custom.googleapis.com/opencensus/malware-scanning/cvd-mirror-updates

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 auswählen 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 Malware 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 mit eindeutigen Namen.

  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-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, der für jeden Bucket einen eindeutigen Triggernamen bietet.

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. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Nächste Schritte