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.
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
- 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.
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
In the Google Cloud console, 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.
In dieser Bereitstellung führen Sie alle Befehle über Cloud Shell aus.
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.
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.Initialisieren Sie die
gcloud
-Umgebung mit Ihrer Projekt-ID:gcloud config set project "${PROJECT_ID}"
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.
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.Erstellen Sie das Dienstkonto
malware-scanner
:gcloud iam service-accounts create ${SERVICE_NAME}
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
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
- 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. Klonen Sie in Cloud Shell das GitHub-Repository, das die Codedateien enthält:
git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
Wechseln Sie in das Verzeichnis
cloudrun-malware-scanner
:cd docker-clamav-malware-scanner/cloudrun-malware-scanner
Erstellen Sie die Konfigurationsdatei
config.json
basierend auf der Vorlagendateiconfig.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.
Optional: Aktualisierte Konfigurationsdatei ansehen:
cat config.json
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 dasupdateCvdMirror.sh
-Skript ausgeführt, mit dem die ClamAV-Malware-Datenbank mitCVDUpdate
in den zuvor erstellten Bucketcvd-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.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.
- Der Parameter
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
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"
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
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.
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"
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"
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.
Ä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.
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.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
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.Initialisieren Sie die
gcloud CLI
-Umgebung mit Ihrer Projekt-ID:gcloud config set project "${PROJECT_ID}"
Erstellen Sie die Konfigurationsdatei
config.json
basierend auf der Vorlagendateiconfig.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.
Optional: Aktualisierte Konfigurationsdatei ansehen:
cat docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json
Konfigurieren Sie die Terraform-Variablen. Der Inhalt der Konfigurationsdatei
config.json
wird über die VariableTF_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
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.
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.
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..
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
Erstellen Sie eine Beispieltextdatei oder verwenden Sie eine vorhandene saubere Datei, um die Pipeline-Prozesse zu testen.
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.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
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.
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
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.
Rufen Sie in der Google Cloud Console die Cloud Logging-Seite „Logs Explorer“ auf.
Wenn der Filter Logfelder nicht angezeigt wird, klicken Sie auf Logfelder.
Klicken Sie im Filter Logfelder auf Cloud Run Revision.
Klicken Sie im Abschnitt Servicename des Filters Logfelder auf Malware-Scanner.
- 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
Rufen Sie in der Google Cloud Console die Seite „Cloud Monitoring > Metrics Explorer“ auf.
Klicken Sie auf das Feld Messwert auswählen und geben Sie den Filterstring
malware
ein.Maximieren Sie die Ressource Generic Task (Allgemeine Aufgabe).
Maximieren Sie die Kategorie Googlecloudplatform.
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.
source_bucket
destination_bucket
clam_version
cloud_run_revision
ZERO_LENGTH_FILE
: Wenn der KonfigurationswertignoreZeroLengthFiles
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 infileExclusionPatterns
definierten Muster übereinstimmt.FILE_SIZE_MISMATCH
: Wenn sich die Dateigröße während der Untersuchung ändert.Erstellen Sie nicht gescannte, bereinigte und unter Quarantäne gestellte Cloud Storage-Buckets mit eindeutigen Namen.
Weisen Sie dem Dienstkonto
malware-scanner
in jedem Bucket die entsprechenden Rollen zu.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" }
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.
- Das Zeitlimit für Anfragen für den Cloud Run-Dienst beträgt 5 Minuten.
- Die Bestätigungsfrist für Pub/Sub-Abonachrichten beträgt 5 Minuten.
- Der Scanner-Code hat eine
MAX_FILE_SIZE
-Konstante von 500 MiB. - Die ClamAV-Dienstkonfiguration hat die Einstellungen
StreamMaxLength
,MaxScanSize
undMaxFileSize
von 512 MB. Diese Einstellungen werden durch dasbootstrap.sh
-Script festgelegt. - In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- Dokumentation zu Cloud Storage ansehen
- Weitere Referenzarchitekturen, Diagramme und Best Practices finden Sie im Cloud-Architekturcenter.
Architektur bereitstellen
Sie können die in diesem Dokument beschriebene Architektur mit einer der folgenden Methoden bereitstellen:
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.
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.
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:
So stellen Sie den Dienst bereit:
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.
Cloud Scheduler-Job erstellen, um Updates der gespiegelten ClamAV-Datenbank auszulösen
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
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.
Basisinfrastruktur bereitstellen
Container für den Dienst erstellen
Dienst bereitstellen und auslösen
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:
Aktualisierungsmechanismus für Datenbankdefinitionen für Malware-Definitionen testen
Dienst überwachen
Sie können den Dienst mit Cloud Logging und Cloud Monitoring überwachen.
Detaillierte Logs ansehen
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:
Sie können diese Messwerte im Metrics Explorer von Cloud Monitoring ansehen:
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:
Im Messwert ignored_files
geben die folgenden reason
-Labels an, warum Dateien ignoriert werden:
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:
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.