Ce tutoriel explique comment créer un pipeline basé sur des événements permettant d'automatiser la détection de code malveillant dans des documents.
L'analyse manuelle de nombreux documents importés sur Cloud Storage est trop chronophage pour la plupart des applications.
Ce pipeline est créé à l'aide de produits Google Cloud et d'un moteur antivirus Open Source appelé ClamAV. Dans ce tutoriel, ClamAV s'exécute dans un conteneur Docker hébergé dans Cloud Run. Le pipeline écrit également des entrées de journal dans Cloud Logging et enregistre les métriques dans Cloud Monitoring.
Vous pouvez déclencher des alertes basées sur les journaux pour les documents infectés à l'aide de ces entrées de journal Logging, mais leur configuration n'entre pas dans le cadre de ce tutoriel.
Dans ce tutoriel, le terme logiciel malveillant est un terme générique désignant les chevaux de Troie, les virus et autres codes malveillants.
Dans ce tutoriel, nous partons du principe que vous maîtrisez les fonctionnalités de base de Cloud Storage, de Cloud Run, d'Eventarc, de Docker et de Node.js.
Architecture
Le schéma suivant présente les étapes du pipeline.
Voici la procédure permettant de mettre en œuvre un pipeline d'architecture :
- Vous importez des fichiers dans Cloud Storage.
- L'événement d'importation déclenche automatiquement le service de détection de logiciels malveillants.
- Le service de détection recherche des logiciels malveillants dans le document importé.
- Si le document est infecté, le service le déplace dans un bucket de mise en quarantaine. Sinon, il le déplace dans un dossier contenant les documents analysés non infectés.
Objectifs
Créer un service de détection de logiciels malveillants Cloud Run pour rechercher les logiciels malveillants dans les documents à l'aide de ClamAV et déplacer les documents analysés vers des buckets propres ou mis en quarantaine en fonction du résultat de l'analyse.
Créer un déclencheur Eventarc pour déclencher le service de détection de logiciels malveillants lors de l'importation d'un document dans Cloud Storage.
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
- 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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Run, Eventarc, Logging, and Cloud Build APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Run, Eventarc, Logging, and Cloud Build APIs.
-
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.
Dans ce tutoriel, vous allez exécuter toutes les commandes dans Cloud Shell.
Configurer votre environnement
Dans cette section, vous attribuez des paramètres pour les valeurs utilisées tout au long du tutoriel, telles que la région et la zone.
Dans ce tutoriel, vous utilisez us-central1
comme région pour le service Cloud Run et us
comme emplacement pour le déclencheur Eventarc et les buckets Cloud Storage.
Dans Cloud Shell, définissez la région et la zone :
export REGION=us-central1 export LOCATION=us
Initialisez l'environnement
gcloud
avec votre ID de projet et définissez une variable d'environnement:export PROJECT_ID=PROJECT_ID gcloud config set project "${PROJECT_ID}"
Définissez PROJECT_ID sur l'ID de votre projet.
Créez trois buckets Cloud Storage avec des noms uniques :
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}
permet de garantir que les noms de bucket sont uniques.
Les trois buckets que vous créez contiennent le document à différentes étapes du pipeline :
unscanned-PROJECT_ID
: contient les documents avant traitement. Il s'agit du bucket dans lequel vous importez vos documents.quarantined-PROJECT_ID
: contient les documents que le service de détection de logiciels malveillants analyse et dont il estime qu'ils contiennent des logiciels malveillants.clean-PROJECT_ID
: contient les documents que le service de détection de logiciels malveillants analyse et qui ne sont pas infectés.
Créer un compte de service pour le service de détection de logiciels malveillants et accorder des autorisations
Dans cette section, vous allez créer un compte de service à utiliser pour le service de détection de logiciels malveillants et attribuer les rôles appropriés au compte de service afin qu'il soit autorisé à lire et écrire dans les buckets Cloud Storage. Cela permet de garantir que le compte dispose d'autorisations minimales et n'a accès qu'aux ressources dont il a besoin.
Créez le compte de service
malware-scanner
:gcloud iam service-accounts create malware-scanner export SERVICE_ACCOUNT="malware-scanner@${PROJECT_ID}.iam.gserviceaccount.com"
Attribuez le rôle d'administrateur des objets aux buckets, ce qui permet au service de lire et de supprimer des documents du bucket non analysé, ainsi que d'écrire des documents dans les buckets mis en quarantaine et propres.
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}"
Attribuez le rôle "Rédacteur de métriques" permettant au service d'écrire des métriques dans Monitoring:
gcloud projects add-iam-policy-binding \ "${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role=roles/monitoring.metricWriter
Créer un service de détection de logiciels malveillants dans Cloud Run
Dans cette section, vous déployez le service de détection de logiciels malveillants sur Cloud Run. Le service s'exécute dans un conteneur Docker et contient les éléments suivants :
- Fichiers Node.js pour le service de détection de logiciels malveillants
- Un fichier Dockerfile pour créer une image avec le service et des binaires ClamAV.
- Un script shell
bootstrap.sh
permettant d'exécuter les daemons clamAV etfreshclam
lorsque le conteneur démarre
Dans Cloud Shell, clonez le dépôt GitHub contenant les fichiers de code :
git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
Accédez au répertoire
cloudrun-malware-scanner
:cd docker-clamav-malware-scanner/cloudrun-malware-scanner
Créez et déployez le service Cloud Run à l'aide du compte de service créé précédemment:
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}"
Lorsque vous y êtes invité, saisissez
Y
.
Une fois le déploiement terminé, un message s'affiche:
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
Le service Cloud Run exige que tous les appels soient authentifiés, et les identités d'authentification doivent disposer de l'autorisation run.routes.invoke
sur le service.
Vous pouvez vérifier le service en cours d'exécution et la version de ClamAV en exécutant la commande suivante:
curl -D - -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ SERVICE_URL
SERVICE_URL est l'URL signalée dans le résultat du déploiement présenté précédemment.
Créer un déclencheur Cloud Storage pour Eventarc
Dans cette section, vous allez ajouter des autorisations pour permettre à Eventarc de capturer les événements Cloud Storage et un déclencheur pour envoyer ces événements au service malware-scanner
Cloud Run.
Si vous utilisez un projet existant créé avant le 8 avril 2021, configurez Pub/Sub pour les notifications push.
Dans Cloud Shell, attribuez le rôle
roles/pubsub.publisher
au compte de service Cloud Storage :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"
Autorisez le compte de service
malware-scanner
à appeler le service Cloud Run et agissez en tant que récepteur d'événements Eventarc :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"
Créez un déclencheur Eventarc pour capturer l'événement d'objet finalisé dans le bucket Cloud Storage non analysé et l'envoyer à votre service Cloud Run. Le déclencheur utilisera le compte de service
malware-scanner
pour l'authentification: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}"
Si vous recevez l'erreur suivante, attendez une minute, puis exécutez à nouveau la commande :
ERROR: (gcloud.eventarc.triggers.create) INVALID_ARGUMENT: The request was invalid: Bucket "unscanned-PROJECT_ID" was not found. Please verify that the bucket exists.
Tester le pipeline en important des fichiers
Vous importez un fichier sain (sans logiciel malveillant) et un fichier infecté pour tester le pipeline.
Créez un exemple de fichier texte ou utilisez un fichier sain existant pour tester les processus du pipeline.
Copiez l'exemple de fichier de données dans le bucket des fichiers non analysés :
gsutil cp filename "gs://unscanned-${PROJECT_ID}"
Remplacez
filename
par le nom du fichier texte sain. Le service de détection de logiciels malveillants inspecte chaque document et le déplace vers un bucket approprié. Ce document est déplacé vers le bucketclean-PROJECT_ID
.Laissez quelques secondes au pipeline pour traiter le document, puis vérifiez dans le bucket
clean-PROJECT_ID
que le document traité est présent :gsutil ls -r "gs://clean-${PROJECT_ID}"
Le document a été supprimé du bucket non analysé:
gsutil ls -r "gs://unscanned-${PROJECT_ID}"
Dans Cloud Shell, importez un fichier
eicar-infected.txt
contenant la signature de test anti-logiciels malveillants standard EICAR dans votre bucketunscanned-PROJECT_ID
: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"
Attendez quelques secondes, puis vérifiez dans le bucket
quarantined-PROJECT_ID
que votre document est bien passé à travers le pipeline. Le service consigne également une entrée de journal Logging lorsqu'un document infecté par un logiciel malveillant est détecté.gsutil ls -r "gs://quarantined-${PROJECT_ID}"
Le document a été supprimé du bucket non analysé:
gsutil ls -r "gs://unscanned-${PROJECT_ID}"
Surveiller le service
Le service peut être surveillé à l'aide de Cloud Logging et de Cloud Monitoring.
Afficher les journaux
Dans la console Google Cloud, accédez à la page "Explorateur de journaux" de Cloud Logging.
Si le filtre Champs de journal ne s'affiche pas, cliquez sur le bouton Champs de journal.
Dans le filtre Log Fields (Champs de journal), cliquez sur Révision dans Cloud Run.
Dans la section Nom du service du filtre Champs de journal, cliquez sur service de détection de logiciels malveillants.
Les résultats de la requête de journaux affichent les journaux du service, y compris plusieurs lignes indiquant les requêtes analysées et l'état des deux fichiers que vous avez importés. Exemple:
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)"
Vous pouvez voir que la version de ClamAV et la révision de signature de virus sont signalées, ainsi que le nom de virus pour le fichier de test infecté.
Vous pouvez utiliser ces messages de journaux pour configurer des alertes à chaque fois qu'un virus a été détecté ou pour quand des échecs se sont produits lors de l'analyse.
Afficher les métriques
Le service génère les métriques suivantes à des fins de surveillance et d'alerte:
- Nombre de fichiers sains traités:
custom.googleapis.com/opencensus/malware-scanning/clean_files
- Nombre de fichiers infectés traités:
custom.googleapis.com/opencensus/malwares-canning/infected_files
- Temps passé à analyser les fichiers:
custom.googleapis.com/opencensus/malware-scanning/scan_duration
- Nombre total d'octets analysés:
custom.googleapis.com/opencensus/malware-scanning/bytes_scanned
- Nombre d'échecs d'analyse de logiciels malveillants:
custom.googleapis.com/opencensus/malwares-canning/scans_failed
Vous pouvez consulter ces métriques dans l'explorateur de métriques Cloud Monitoring.
Dans la console Google Cloud, accédez à la page "Explorateur de métriques" de Cloud Monitoring.
Cliquez sur le champ Métrique et saisissez la chaîne de filtre
malware
.Sélectionnez la métrique OpenCensus/malware-scanning/clean_files. Le graphique affiche un point de données indiquant à quel moment le fichier sain a été analysé.
Les métriques peuvent être utilisées pour surveiller le pipeline et créer des alertes en cas de détection d'un virus ou d'échec du traitement des fichiers.
Pour plus de détails, les métriques peuvent être réparties en fonction de divers libellés de métrique:
- source_bucket
- destination_bucket
- clam_version
- cloud_run_revision
Gérer plusieurs buckets
Le service de détection de logiciels malveillants peut analyser des fichiers provenant de plusieurs buckets sources, en les envoyant à des buckets séparés propres et mis en quarantaine.
Bien que cette configuration avancée n'entre pas dans le cadre de ce tutoriel, les étapes à suivre sont résumées comme suit:
Créer les différents buckets Cloud Storage non analysés, propres et mis en quarantaine
Attribuez les rôles appropriés au compte de service
malware-scanner
sur les différents buckets.Modifiez le fichier de configuration
config.json
pour spécifier les noms des buckets pour chaque configuration:{ "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" } ] }
Déployez le service
malware-scanner
, en spécifiant la variable d'environnementCONFIG_FILE=./config.json
à la place des trois variablesXXX_BUCKET=...
, afin que la configuration dans le fichier est utilisé.Pour chacun des buckets non analysés, créez un déclencheur Eventarc, en modifiant le nom du déclencheur et le nom du bucket à chaque fois.
Effectuer un nettoyage
Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.
Supprimer le projet
- 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.
Étape suivante
- Découvrez-en plus sur l'automatisation de la classification des données importées sur Cloud Storage.
- Passez en revue la documentation Cloud Storage.
- Explorez des architectures de référence, des schémas, des tutoriels et des bonnes pratiques concernant Google Cloud. Consultez notre Centre d'architecture cloud.