Collecter les journaux des alertes Dataminr
Ce document explique comment ingérer des journaux d'alertes Dataminr dans Google Security Operations à l'aide de Google Cloud Storage V2, d'une fonction Cloud Run et de Cloud Scheduler.
Dataminr Pulse fournit des renseignements en temps réel basés sur l'IA à partir de plus de 500 000 sources de données publiques mondiales, y compris le Web profond et le dark Web. La plate-forme fournit des alertes précoces sur les cybermenaces émergentes, les failles, les attaques par rançongiciel, les fuites de données et les risques numériques qui affectent votre organisation et les tiers. L'API Dataminr Pulse utilise l'authentification par identifiants client OAuth 2.0 et la pagination basée sur les curseurs pour récupérer les alertes.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Une instance Google SecOps
- Un projet Google Cloud avec les API suivantes activées :
- API Cloud Storage
- API Cloud Run functions
- API Cloud Scheduler
- API Cloud Pub/Sub
- Autorisations pour créer et gérer des buckets GCS, des fonctions Cloud Run, des sujets Pub/Sub et des jobs Cloud Scheduler
- Autorisations permettant de gérer les stratégies IAM sur les buckets GCS
- Un compte Dataminr Pulse actif avec l'accès à l'API activé
- Identifiants de l'API Dataminr Pulse (ID client et code secret du client)
- Au moins une liste d'alertes Dataminr Pulse configurée dans votre compte Dataminr
créer un bucket Google Cloud Storage ;
- Accédez à Google Cloud Console.
- Sélectionnez votre projet ou créez-en un.
- Dans le menu de navigation, accédez à Cloud Storage> Buckets.
- Cliquez sur Créer un bucket.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Nommer votre bucket Saisissez un nom unique (par exemple, dataminr-alert-logs).Type d'emplacement Choisissez en fonction de vos besoins (région, birégion ou multirégion). Emplacement Sélectionnez l'emplacement (par exemple, us-central1).Classe de stockage Standard (recommandé pour les journaux auxquels vous accédez fréquemment) Access control (Contrôle des accès) Uniforme (recommandé) Outils de protection Facultatif : Activer la gestion des versions des objets ou la règle de conservation Cliquez sur Créer.
Collecter les identifiants Dataminr
Pour permettre à la fonction Cloud Run de récupérer les données d'alerte, vous avez besoin d'identifiants API avec authentification par identifiants client OAuth 2.0 fournis par votre représentant Dataminr.
Obtenir des identifiants d'API
- Contactez votre responsable de compte Dataminr ou l'équipe d'assistance pour demander l'accès à l'API.
- Fournissez les informations suivantes :
- Nom de votre organisation
- Cas d'utilisation : intégration à Google Chronicle SIEM
- Accès requis : API Dataminr Pulse pour les cyberrisques
Dataminr fournit des identifiants d'API et vous donne accès aux éléments suivants :
- ID client : identifiant client OAuth 2.0 unique
- Code secret du client : clé secrète de votre client OAuth 2.0
Vérifier les identifiants de l'API
Pour vérifier que vos identifiants fonctionnent, exécutez la commande suivante :
curl -X POST https://gateway.dataminr.com/auth/2/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=api_key"Une réponse réussie renvoie un objet JSON contenant un champ
access_token:{ "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI...", "token_type": "Bearer", "expire": 3600 }
Collecter les ID de la liste des alertes
- Connectez-vous à l'application Web Dataminr Pulse sur
https://app.dataminr.com. - Accédez à vos listes d'alertes (listes de surveillance) configurées.
Notez les ID des listes d'alertes que vous souhaitez ingérer dans Google SecOps.
Créer un compte de service pour la fonction Cloud Run
- Dans la console Google Cloud, accédez à IAM et administration > Comptes de service.
- Cliquez sur Créer un compte de service.
- Fournissez les informations de configuration suivantes :
- Nom du compte de service : saisissez
dataminr-alert-collector. - Description du compte de service : saisissez
Service account for Dataminr Alerts Cloud Run function to write alert data to GCS.
- Nom du compte de service : saisissez
- Cliquez sur Créer et continuer.
- Dans la section Autoriser ce compte de service à accéder au projet, ajoutez les rôles suivants :
- Cliquez sur Sélectionner un rôle, puis recherchez et sélectionnez Administrateur des objets Storage.
- Cliquez sur Ajouter un autre rôle, puis recherchez et sélectionnez Demandeur Cloud Run.
- Cliquez sur Continuer.
- Cliquez sur OK.
Accorder des autorisations IAM sur un bucket GCS
- Accédez à Cloud Storage > Buckets.
- Cliquez sur le nom de votre bucket (par exemple,
dataminr-alert-logs). - Accédez à l'onglet Autorisations.
- Cliquez sur Accorder l'accès.
- Fournissez les informations de configuration suivantes :
- Ajouter des comptes principaux : saisissez l'adresse e-mail du compte de service (par exemple,
dataminr-alert-collector@PROJECT_ID.iam.gserviceaccount.com). - Attribuer des rôles : sélectionnez Administrateur des objets Storage.
- Ajouter des comptes principaux : saisissez l'adresse e-mail du compte de service (par exemple,
- Cliquez sur Enregistrer.
Créer un sujet Pub/Sub
Le sujet Pub/Sub déclenche la fonction Cloud Run lorsqu'un message est publié par Cloud Scheduler.
- Dans la console Google Cloud, accédez à Pub/Sub > Sujets.
- Cliquez sur Créer un sujet.
- Fournissez les informations de configuration suivantes :
- ID du sujet : saisissez
dataminr-alert-trigger. - Ajouter un abonnement par défaut : laissez cette option cochée.
- ID du sujet : saisissez
- Cliquez sur Créer.
Créer la fonction Cloud Run
- Dans la console Google Cloud, accédez à Cloud Run Functions.
- Cliquez sur Créer une fonction.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Environnement 2e génération Nom de la fonction dataminr-alert-collectorRégion Sélectionnez la même région que votre bucket GCS. Type de déclencheur Cloud Pub/Sub Sujet Pub/Sub dataminr-alert-triggerMémoire allouée 512 MiB Délai avant expiration 540 secondes Compte de service d'exécution dataminr-alert-collectorCliquez sur Suivant.
Définissez Environnement d'exécution sur Python 3.12.
Définissez Point d'entrée sur
main.Dans le fichier
requirements.txt, ajoutez les dépendances suivantes :functions-framework==3.* google-cloud-storage==2.* requests==2.*Dans le fichier
main.py, collez le code suivant :import functions_framework import json import os import logging import time from datetime import datetime, timedelta, timezone from google.cloud import storage import requests logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) storage_client = storage.Client() TOKEN_URL = "https://gateway.dataminr.com/auth/2/token" ALERTS_URL = "https://gateway.dataminr.com/api/3/alerts" def _get_access_token(client_id: str, client_secret: str) -> str: """Obtain an OAuth 2.0 access token from Dataminr.""" payload = { "client_id": client_id, "client_secret": client_secret, "grant_type": "api_key", } headers = {"Content-Type": "application/x-www-form-urlencoded"} resp = requests.post(TOKEN_URL, data=payload, headers=headers, timeout=30) resp.raise_for_status() token_data = resp.json() access_token = token_data.get("access_token") if not access_token: raise ValueError("No access_token in token response") logger.info("Successfully obtained Dataminr access token.") return access_token def _load_state(bucket_name: str, state_key: str) -> dict: """Load the last cursor (alertId) from GCS.""" try: bucket = storage_client.bucket(bucket_name) blob = bucket.blob(state_key) if blob.exists(): data = json.loads(blob.download_as_text()) logger.info(f"Loaded state: {data}") return data except Exception as e: logger.warning(f"State read error: {e}") logger.info("No previous state found.") return {} def _save_state(bucket_name: str, state_key: str, state: dict) -> None: """Save the cursor state to GCS.""" bucket = storage_client.bucket(bucket_name) blob = bucket.blob(state_key) blob.upload_from_string( json.dumps(state), content_type="application/json" ) logger.info(f"Saved state: {state}") def _fetch_alerts( access_token: str, alert_lists: str, page_size: int, cursor: str = None, ) -> tuple: """Fetch a page of alerts from the Dataminr Pulse API.""" headers = { "Authorization": f"Bearer {access_token}", "Accept": "application/json", } params = { "lists": alert_lists, "num": page_size, } if cursor: params["from"] = cursor resp = requests.get( ALERTS_URL, headers=headers, params=params, timeout=60 ) # Handle rate limiting via response headers rate_remaining = resp.headers.get("x-ratelimit-remaining") rate_reset = resp.headers.get("x-ratelimit-reset") if resp.status_code == 429: reset_time = int(rate_reset) if rate_reset else 60 wait_seconds = max(reset_time - int(time.time()), 1) logger.warning( f"Rate limited. Waiting {wait_seconds}s before retry." ) time.sleep(wait_seconds) resp = requests.get( ALERTS_URL, headers=headers, params=params, timeout=60 ) resp.raise_for_status() if rate_remaining is not None: logger.info( f"Rate limit remaining: {rate_remaining}, reset: {rate_reset}" ) data = resp.json() alerts = data if isinstance(data, list) else data.get("data", []) return alerts @functions_framework.cloud_event def main(cloud_event): """Cloud Run function entry point triggered by Pub/Sub.""" bucket_name = os.environ["GCS_BUCKET"] prefix = os.environ.get("GCS_PREFIX", "dataminr_alerts") state_key = os.environ.get("STATE_KEY", "dataminr_state/cursor.json") client_id = os.environ["CLIENT_ID"] client_secret = os.environ["CLIENT_SECRET"] alert_lists = os.environ["ALERT_LISTS"] max_records = int(os.environ.get("MAX_RECORDS", "1000")) page_size = min(int(os.environ.get("PAGE_SIZE", "40")), 40) lookback_hours = int(os.environ.get("LOOKBACK_HOURS", "24")) try: access_token = _get_access_token(client_id, client_secret) state = _load_state(bucket_name, state_key) cursor = state.get("last_cursor") is_first_run = cursor is None all_alerts = [] total_fetched = 0 pages_fetched = 0 while total_fetched < max_records: logger.info( f"Fetching page {pages_fetched + 1} (cursor: {cursor})..." ) alerts = _fetch_alerts( access_token, alert_lists, page_size, cursor=cursor ) if not alerts: logger.info("No more alerts returned. Stopping pagination.") break # Filter by lookback window on first run (no prior cursor) if is_first_run: cutoff_ms = int( ( datetime.now(timezone.utc) - timedelta(hours=lookback_hours) ).timestamp() * 1000 ) alerts = [ a for a in alerts if a.get("eventTime", 0) >= cutoff_ms ] all_alerts.extend(alerts) total_fetched += len(alerts) pages_fetched += 1 # Update cursor to the last alertId in this page last_alert = alerts[-1] if alerts else None if last_alert and "alertId" in last_alert: cursor = last_alert["alertId"] else: break # Stop if we received fewer alerts than requested if len(alerts) < page_size: logger.info("Received partial page. Stopping pagination.") break logger.info( f"Collected {len(all_alerts)} alerts across {pages_fetched} pages." ) if not all_alerts: logger.info("No new alerts to write.") return "No new alerts", 200 # Write alerts as NDJSON to GCS now_str = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ") blob_path = f"{prefix}/{now_str}.ndjson" ndjson_body = "\n".join( json.dumps(alert, separators=(",", ":")) for alert in all_alerts ) bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_path) blob.upload_from_string( ndjson_body, content_type="application/x-ndjson" ) _save_state( bucket_name, state_key, { "last_cursor": cursor, "last_run": datetime.now(timezone.utc).isoformat(), }, ) msg = ( f"Wrote {len(all_alerts)} alerts to " f"gs://{bucket_name}/{blob_path}" ) logger.info(msg) return msg, 200 except Exception as e: logger.error(f"Error collecting Dataminr alerts: {e}") raiseCliquez sur Déployer.
Attendez que la fonction soit déployée. Une fois le déploiement terminé, l'état passe à une coche verte.
Configurer les variables d'environnement
- Une fois la fonction déployée, accédez à Cloud Run Functions> dataminr-alert-collector.
- Cliquez sur Modifier et déployer la nouvelle révision.
- Cliquez sur l'onglet Variables et secrets (ou développez Paramètres d'exécution, de compilation, de connexion et de sécurité pour la première génération).
Ajoutez les variables d'environnement suivantes :
Clé Exemple de valeur GCS_BUCKETdataminr-alert-logsGCS_PREFIXdataminr_alertsSTATE_KEYdataminr_state/cursor.jsonCLIENT_IDVotre ID client OAuth 2.0 Dataminr CLIENT_SECRETCode secret du client OAuth 2.0 Dataminr ALERT_LISTSID de liste d'alertes Dataminr séparés par une virgule MAX_RECORDS1000PAGE_SIZE40LOOKBACK_HOURS24Cliquez sur Déployer.
Créer une tâche Cloud Scheduler
Cloud Scheduler publie un message sur le sujet Pub/Sub selon une programmation, ce qui déclenche la fonction Cloud Run pour interroger Dataminr Pulse et rechercher de nouvelles alertes.
- Dans la console Google Cloud, accédez à Cloud Scheduler.
- Cliquez sur Créer une tâche.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Nom dataminr-alert-pollRégion Sélectionnez la même région que votre fonction. Fréquence */5 * * * *(toutes les cinq minutes)Fuseau horaire Sélectionnez votre fuseau horaire (par exemple, UTC).Cliquez sur Continuer.
Dans la section Configurer l'exécution :
- Type de cible : sélectionnez Pub/Sub.
- Thème : sélectionnez
dataminr-alert-trigger. - Corps du message : saisissez
{"poll": true}.
Cliquez sur Créer.
Vérifier la fonction Cloud Run
- Dans Cloud Scheduler, recherchez le job
dataminr-alert-poll. - Cliquez sur Forcer l'exécution pour déclencher une exécution immédiate.
- Accédez à Cloud Run Functions > dataminr-alert-collector > Journaux.
Vérifiez que la fonction s'est exécutée correctement en recherchant des entrées de journal telles que :
Successfully obtained Dataminr access token. Fetching page 1 (cursor: None)... Collected 35 alerts across 1 pages. Wrote 35 alerts to gs://dataminr-alert-logs/dataminr_alerts/20250115T103000Z.ndjsonAccédez à Cloud Storage > Buckets > dataminr-alert-logs.
Accédez au préfixe
dataminr_alerts/.Vérifiez que des fichiers NDJSON sont créés avec les données d'alerte Dataminr.
Récupérer le compte de service Google SecOps et configurer le flux
Google SecOps utilise un compte de service unique pour lire les données de votre bucket GCS. Vous devez accorder à ce compte de service l'accès à votre bucket.
Obtenir l'adresse e-mail du compte de service
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Cliquez sur Configurer un flux unique.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
Dataminr Alerts). - Sélectionnez Google Cloud Storage V2 comme Type de source.
- Sélectionnez Alertes Dataminr comme Type de journal.
- Cliquez sur Obtenir un compte de service.
Une adresse e-mail unique pour le compte de service s'affiche, par exemple :
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopiez cette adresse e-mail pour l'utiliser dans la section suivante.
Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants :
URL du bucket de stockage : saisissez l'URI du bucket GCS avec le chemin d'accès au préfixe :
gs://dataminr-alert-logs/dataminr_alerts/Option de suppression de la source : sélectionnez l'option de suppression de votre choix :
- Jamais : ne supprime jamais aucun fichier après les transferts (recommandé pour les tests).
- Supprimer les fichiers transférés : supprime les fichiers après un transfert réussi.
Supprimer les fichiers transférés et les répertoires vides : supprime les fichiers et les répertoires vides après un transfert réussi.
Âge maximal des fichiers : incluez les fichiers modifiés au cours des derniers jours (180 jours par défaut).
Espace de noms de l'élément : espace de noms de l'élément.
Libellés d'ingestion : libellé à appliquer aux événements de ce flux (par exemple,
DATAMINR_ALERT).
Cliquez sur Suivant.
Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.
Accorder des autorisations IAM au compte de service Google SecOps
Le compte de service Google SecOps a besoin du rôle Lecteur des objets Storage sur votre bucket GCS.
- Accédez à Cloud Storage > Buckets.
- Cliquez sur le nom de votre bucket (par exemple,
dataminr-alert-logs). - Accédez à l'onglet Autorisations.
- Cliquez sur Accorder l'accès.
- Fournissez les informations de configuration suivantes :
- Ajouter des comptes principaux : collez l'adresse e-mail du compte de service Google SecOps.
- Attribuer des rôles : sélectionnez Lecteur des objets de l'espace de stockage.
Cliquez sur Enregistrer.
Table de mappage UDM
| Champ de journal | Mappage UDM | Logique |
|---|---|---|
| alertId | metadata.product_log_id | Valeur copiée directement |
| alertType.color | about.labels.alertType_color | Valeur copiée directement |
| alertType.id | about.labels.alertType_id | Valeur copiée directement |
| alertType.name | about.labels.alertType_name | Valeur copiée directement |
| availableRelatedAlerts | about.labels.availableRelatedAlerts | Converti en chaîne |
| sous-titres | metadata.description | Valeur copiée directement |
| cat.name | security_result.category_details | Valeur copiée directement |
| cat.id | security_result.detection_fields.categories_id | Valeur copiée directement |
| cat.idStr | security_result.detection_fields.categories_idStr | Valeur copiée directement |
| cat.path | security_result.detection_fields.categories_path | Valeur copiée directement |
| cat.requested | security_result.detection_fields.categories_requested | Valeur copiée directement |
| cat.retired | security_result.detection_fields.categories_retired | Converti en chaîne |
| cat.topicType | about.labels.categories_topicType | Valeur copiée directement |
| cat.name | security_result.category | Défini sur POLICY_VIOLATION si cat.name == "Cybersecurity - Policy"; NETWORK_MALICIOUS si dans ["Cybersecurity - Threats & Vulnerabilities", "Cybersecurity - Crime & Malicious Activity", "Threats & Precautions", "Threats"]; NETWORK_SUSPICIOUS si =~ "Cybersecurity"; MAIL_PHISHING si =~ "Email and Web Servers"; DATA_EXFILTRATION si =~ "Data Exposure and Breaches"; POLICY_VIOLATION si =~ "Government, Policy, & Political Affairs"; PHISHING si =~ "(Malware |
| comp.dm_bucket.name | security_result.about.resource.attribute.labels.dmbucket%{bucket.id} | Valeur copiée directement |
| comp.dm_sector.name | security_result.about.resource.attribute.labels.dmsector%{sector.id} | Valeur copiée directement |
| comp.id | security_result.about.resource.attribute.labels.companies_id | Valeur copiée directement |
| comp.idStr | security_result.about.resource.attribute.labels.companies_idStr | Valeur copiée directement |
| comp.locations.city | security_result.about.location.city | Valeur de loc.city si loc_index == 0 |
| comp.locations.country, comp.locations.state.symbol | security_result.about.location.country_or_region | Concaténé sous la forme "%{loc.country} - %{loc.state.symbol}" si loc_index == 0 et si les deux ne sont pas vides |
| comp.locations.postalCode | security_result.about.resource.attribute.labels.locations_postalCode | Valeur copiée directement si loc_index == 0 et non vide |
| comp.locations.state.name | security_result.about.location.state | Valeur copiée directement si loc_index == 0 |
| comp.locations.city | about.labels.loc_%{loc_index}_city | Valeur copiée directement si loc_index != 0 et n'est pas vide |
| comp.locations.country, comp.locations.state.symbol | about.labels.loc_%{loc_index}_country_or_region | Concaténé sous la forme "%{loc.country} - %{loc.state.symbol}" si loc_index != 0 et si les deux ne sont pas vides |
| comp.locations.postalCode | securityresult.about.resource.attribute.labels.locations%{loc_index}_postalCode | Valeur copiée directement si loc_index != 0 et n'est pas vide |
| comp.locations.state.name | about.labels.loc_%{loc_index}_state_name | Valeur copiée directement si loc_index != 0 et n'est pas vide |
| comp.name | security_result.about.resource.name | Valeur copiée directement |
| comp.requested | security_result.about.resource.attribute.labels.companies_requested | Valeur copiée directement |
| comp.retired | security_result.about.resource.attribute.labels.companies_retired | Converti en chaîne |
| comp.ticker | security_result.about.resource.attribute.labels.companies_ticker | Valeur copiée directement |
| comp.topicType | security_result.about.resource.attribute.labels.companies_topicType | Valeur copiée directement |
| eventLocation.coordinates.0 | principal.location.region_coordinates.latitude | Valeur copiée directement |
| eventLocation.coordinates.1 | principal.location.region_coordinates.longitude | Valeur copiée directement |
| eventLocation.name | principal.location.name | Valeur copiée directement |
| eventLocation.places | principal.labels.location_places | Chaîne issue d'un tableau avec un séparateur de virgule |
| eventLocation.probability | principal.labels.eventLocation_probability | Converti en chaîne |
| eventLocation.radius | principal.labels.eventLocation_radius | Converti en chaîne |
| eventMapLargeURL | principal.labels.eventMapLargeURL | Valeur copiée directement |
| eventMapSmallURL | principal.labels.eventMapSmallURL | Valeur copiée directement |
| eventTime | @timestamp | Converti de millisecondes epoch en code temporel |
| eventVolume | about.labels.eventVolume | Converti en chaîne |
| expandAlertURL | metadata.url_back_to_product | Valeur copiée directement |
| expandMapURL | principal.labels.expandMapURL | Valeur copiée directement |
| headerColor | about.labels.headerColor | Valeur copiée directement |
| headerLabel | about.labels.headerLabel | Valeur copiée directement |
| metadata.cyber.addresses.ip | principal.ip | Extrait à l'aide du modèle grok si l'index est égal à 0 |
| metadata.cyber.addresses.port | principal.port | Valeur copiée directement si l'index est égal à 0, convertie en entier |
| metadata.cyber.addresses.port | principal.labels.addresses_%{index}_port | Valeur copiée directement si l'index est différent de 0 |
| metadata.cyber.addresses.version | principal.labels.metadata_cyberaddresses%{index}_version | Valeur copiée directement |
| metadata.cyber.asns | network.asn | Valeur copiée directement si l'index est égal à 0 |
| metadata.cyber.asns | about.labels.metadatacyber%{index}_asn | Valeur copiée directement si l'index est différent de 0 |
| metadata.cyber.hashValues.value | security_result.about.file.sha1 | Valeur copiée directement si le type est SHA1, en minuscules |
| metadata.cyber.hashValues.value | security_result.about.file.sha256 | Valeur copiée directement si le type est SHA256, en minuscules |
| metadata.cyber.malwares | security_result.associations.name | Valeur copiée directement |
| metadata.cyber.malwares | security_result.associations.type | Définie sur MALWARE |
| metadata.cyber.orgs | network.organization_name | Valeur copiée directement si l'index est égal à 0 |
| metadata.cyber.orgs | about.labels.metadatacyber%{index}_orgs | Valeur copiée directement si l'index est différent de 0 |
| metadata.cyber.products | principal.application | Valeur copiée directement si l'index est égal à 0 |
| metadata.cyber.products | principal.labels.metadata_cyberproducts%{index} | Valeur copiée directement si l'index est différent de 0 |
| metadata.cyber.threats | security_result.threat_name | Valeur copiée directement si l'index est égal à 0 |
| metadata.cyber.threats | security_result.about.labels.metadata_cyberthreats%{index} | Valeur copiée directement si l'index est différent de 0 |
| metadata.cyber.URLs | security_result.about.url | Valeur copiée directement si l'index est égal à 0 |
| metadata.cyber.URLs | securityresult.about.labels.url%{index} | Valeur copiée directement si l'index est différent de 0 |
| metadata.cyber.malwares.0 | security_result.category | Définissez sur SOFTWARE_MALICIOUS si elle existe. |
| metadata.cyber.vulnerabilities.cvss | extensions.vulns.vulnerabilities.cvss_base_score | Valeur copiée directement |
| metadata.cyber.vulnerabilities.exploitPocLinks | extensions.vulns.vulnerabilities.cve_description | Joint à partir du tableau avec le séparateur " n" |
| metadata.cyber.vulnerabilities.id | extensions.vulns.vulnerabilities.cve_id | Valeur copiée directement |
| metadata.cyber.vulnerabilities.products.productName | extensions.vulns.vulnerabilities.about.application | Valeur copiée directement si l'index est égal à 0 |
| metadata.cyber.vulnerabilities.products.productVendor | extensions.vulns.vulnerabilities.vendor | Valeur copiée directement si l'index est égal à 0 |
| metadata.cyber.vulnerabilities.products.productVersion | extensions.vulns.vulnerabilities.about.platform_version | Valeur copiée directement si l'index est égal à 0, espaces supprimés |
| metadata.cyber.vulnerabilities.products.productName | extensions.vulns.vulnerabilities.about.labels.productName_%{index} | Valeur copiée directement si l'index est différent de 0 |
| metadata.cyber.vulnerabilities.products.productVendor | extensions.vulns.vulnerabilities.about.labels.productVendor_%{index} | Valeur copiée directement si l'index est différent de 0 |
| metadata.cyber.vulnerabilities.products.productVersion | extensions.vulns.vulnerabilities.about.labels.productVersion_%{index} | Valeur copiée directement si l'index est différent de 0, espaces supprimés |
| parentAlertId | about.labels.parentAlertId | Valeur copiée directement |
| post.languages.lang | target.labels.post_languageslang%{index} | Valeur copiée directement |
| post.languages.position | target.labels.post_languagesposition%{index} | Converti en chaîne |
| post.link | target.labels.post_link | Valeur copiée directement |
| post.media.link | principal.resource.name | Valeur copiée directement si l'index est égal à 0 |
| post.media.description | target.resource.attribute.labels.post_media_description | Valeur copiée directement si l'index est égal à 0 |
| post.media.display_url | target.resource.attribute.labels.post_media_display_url | Valeur copiée directement si l'index est égal à 0 |
| post.media.isSafe | target.resource.attribute.labels.post_media_isSafe | Converti en chaîne si l'index est égal à 0 |
| post.media.media_url | target.resource.attribute.labels.post_media_media_url | Valeur copiée directement si l'index est égal à 0 |
| post.media.sizes.large.h | target.resource.attribute.labels.post_media_sizes_large_h | Converti en chaîne si l'index est égal à 0 |
| post.media.sizes.large.resize | target.resource.attribute.labels.post_media_sizes_large_resize | Valeur copiée directement si l'index est égal à 0 |
| post.media.sizes.large.w | target.resource.attribute.labels.post_media_sizes_large_w | Converti en chaîne si l'index est égal à 0 |
| post.media.sizes.medium.h | target.resource.attribute.labels.post_media_sizes_medium_h | Converti en chaîne si l'index est égal à 0 |
| post.media.sizes.medium.resize | target.resource.attribute.labels.post_media_sizes_medium_resize | Valeur copiée directement si l'index est égal à 0 |
| post.media.sizes.medium.w | target.resource.attribute.labels.post_media_sizes_medium_w | Converti en chaîne si l'index est égal à 0 |
| post.media.sizes.small.h | target.resource.attribute.labels.post_media_sizes_small_h | Converti en chaîne si l'index est égal à 0 |
| post.media.sizes.small.resize | target.resource.attribute.labels.post_media_sizes_small_resize | Valeur copiée directement si l'index est égal à 0 |
| post.media.sizes.small.w | target.resource.attribute.labels.post_media_sizes_small_w | Converti en chaîne si l'index est égal à 0 |
| post.media.sizes.thumb.h | target.resource.attribute.labels.post_media_sizes_thumb_h | Converti en chaîne si l'index est égal à 0 |
| post.media.sizes.thumb.resize | target.resource.attribute.labels.post_media_sizes_thumb_resize | Valeur copiée directement si l'index est égal à 0 |
| post.media.sizes.thumb.w | target.resource.attribute.labels.post_media_sizes_thumb_w | Converti en chaîne si l'index est égal à 0 |
| post.media.source | target.resource.attribute.labels.post_media_source | Valeur copiée directement si l'index est égal à 0 |
| post.media.thumbnail | target.resource.attribute.labels.post_media_thumbnail | Valeur copiée directement si l'index est égal à 0 |
| post.media.title | target.resource.attribute.labels.post_media_title | Valeur copiée directement si l'index est égal à 0 |
| post.media.url | target.resource.attribute.labels.post_media_url | Valeur copiée directement si l'index est égal à 0 |
| post.media.video_info.duration_millis | target.resource.attribute.labels.post_media_video_info_duration_millis | Converti en chaîne si l'index est égal à 0 |
| post.media.video_info.aspect_ratio | target.resource.attribute.labels.post_media_video_info_aspect_ratio | Concaténé sous la forme %{med.video_info.aspect_ratio.0}, %{med.video_info.aspect_ratio.1} si l'index est égal à 0 |
| post.media.video_info.variants.bitrate | target.resource.attribute.labels.post_media_video_info_variantsbitrate%{var_index} | Converti en chaîne |
| post.media.video_info.variants.content_type | target.resource.attribute.labels.post_media_video_info_variants_contenttype%{var_index} | Valeur copiée directement |
| post.media.video_info.variants.url | target.resource.attribute.labels.post_media_video_info_variantsurl%{var_index} | Valeur copiée directement |
| post.media.type | principal.resource.resource_subtype | Valeur copiée directement si l'index est égal à 0 |
| post.media.link | about.resource.name | Valeur copiée directement si l'index est différent de 0 |
| post.media.description | about.resource.attribute.labels.post_media_description | Valeur copiée directement si l'index est différent de 0 |
| post.media.display_url | about.resource.attribute.labels.post_media_display_url | Valeur copiée directement si l'index est différent de 0 |
| post.media.isSafe | about.resource.attribute.labels.post_media_isSafe | Converti en chaîne si l'index est différent de 0 |
| post.media.media_url | about.resource.attribute.labels.post_media_media_url | Valeur copiée directement si l'index est différent de 0 |
| post.media.sizes.large.h | about.resource.attribute.labels.post_media_sizes_large_h | Converti en chaîne si l'index est différent de 0 |
| post.media.sizes.large.resize | about.resource.attribute.labels.post_media_sizes_large_resize | Valeur copiée directement si l'index est différent de 0 |
| post.media.sizes.large.w | about.resource.attribute.labels.post_media_sizes_large_w | Converti en chaîne si l'index est différent de 0 |
| post.media.sizes.medium.h | about.resource.attribute.labels.post_media_sizes_medium_h | Converti en chaîne si l'index est différent de 0 |
| post.media.sizes.medium.resize | about.resource.attribute.labels.post_media_sizes_medium_resize | Valeur copiée directement si l'index est différent de 0 |
| post.media.sizes.medium.w | about.resource.attribute.labels.post_media_sizes_medium_w | Converti en chaîne si l'index est différent de 0 |
| post.media.sizes.small.h | about.resource.attribute.labels.post_media_sizes_small_h | Converti en chaîne si l'index est différent de 0 |
| post.media.sizes.small.resize | about.resource.attribute.labels.post_media_sizes_small_resize | Valeur copiée directement si l'index est différent de 0 |
| post.media.sizes.small.w | about.resource.attribute.labels.post_media_sizes_small_w | Converti en chaîne si l'index est différent de 0 |
| post.media.sizes.thumb.h | about.resource.attribute.labels.post_media_sizes_thumb_h | Converti en chaîne si l'index est différent de 0 |
| post.media.sizes.thumb.resize | about.resource.attribute.labels.post_media_sizes_thumb_resize | Valeur copiée directement si l'index est différent de 0 |
| post.media.sizes.thumb.w | about.resource.attribute.labels.post_media_sizes_thumb_w | Converti en chaîne si l'index est différent de 0 |
| post.media.source | about.resource.attribute.labels.post_media_source | Valeur copiée directement si l'index est différent de 0 |
| post.media.thumbnail | about.resource.attribute.labels.post_media_thumbnail | Valeur copiée directement si l'index est différent de 0 |
| post.media.title | about.resource.attribute.labels.post_media_title | Valeur copiée directement si l'index est différent de 0 |
| post.media.url | about.resource.attribute.labels.post_media_url | Valeur copiée directement si l'index est différent de 0 |
| post.media.video_info.duration_millis | about.resource.attribute.labels.post_media_video_info_duration_millis | Converti en chaîne si l'index est différent de 0 |
| post.media.video_info.aspect_ratio | about.resource.attribute.labels.post_media_video_info_aspect_ratio | Concaténé sous la forme %{med.video_info.aspect_ratio.0}, %{med.video_info.aspect_ratio.1} si l'index est différent de 0 |
| post.media.video_info.variants.bitrate | about.resource.attribute.labels.post_media_video_info_variantsbitrate%{var_index} | Converti en chaîne |
| post.media.video_info.variants.content_type | about.resource.attribute.labels.post_media_video_info_variants_contenttype%{var_index} | Valeur copiée directement |
| post.media.video_info.variants.url | about.resource.attribute.labels.post_media_video_info_variantsurl%{var_index} | Valeur copiée directement |
| post.media.type | about.resource.resource_subtype | Valeur copiée directement si l'index est différent de 0 |
| post.translatedText | target.labels.post_translatedText | Valeur copiée directement |
| post.text | target.labels.post_text | Valeur copiée directement |
| post.timestamp | target.resource.attribute.creation_time | Converti de millisecondes epoch en code temporel |
| publisherCategory.color | target.labels.publisherCategory_color | Valeur copiée directement |
| publisherCategory.name | target.labels.publisherCategory_name | Valeur copiée directement |
| publisherCategory.shortName | target.labels.publisherCategory_shortName | Valeur copiée directement |
| relatedTerms.url | principal.labels.relatedTerms_%{terms.text} | Valeur copiée directement |
| relatedTermsQueryURL | principal.labels.relatedTermsQueryURL | Valeur copiée directement |
| sect.id | about.labels.sectors_id | Valeur copiée directement |
| sect.idStr | about.labels.sectors_idStr | Valeur copiée directement |
| sect.name | about.labels.sectors_name | Valeur copiée directement |
| sect.retired | about.labels.sectors_retired | Converti en chaîne |
| sect.topicType | about.labels.sectors_topicType | Valeur copiée directement |
| source.channels.0 | principal.application | Valeur copiée directement |
| source.displayName | principal.user.user_display_name | Valeur copiée directement |
| source.link | principal.url | Valeur copiée directement |
| source.verified | principal.labels.source_verified | Converti en chaîne |
| subCaption.bullets.content | about.labels.subCaption_bullets_content | Valeur copiée directement |
| subCaption.bullets.media | about.labels.subCaption_bullets_media | Valeur copiée directement |
| subCaption.bullets.source | about.labels.subCaption_bullets_source | Valeur copiée directement |
| watchlist.id | about.labels.watchlistsMatchedByType_id | Valeur copiée directement |
| watchlist.externalTopicIds | about.labels.watchlistsMatchedByType_externalTopicIds | Chaîne issue d'un tableau avec un séparateur de virgule |
| watchlist.name | about.labels.watchlistsMatchedByType_name | Valeur copiée directement |
| watchlist.type | about.labels.watchlistsMatchedByType_type | Valeur copiée directement |
| watchlist.userProperties.omnilist | about.labels.watchlistsMatchedByType_userProperties_omnilist | Valeur copiée directement |
| watchlist.userProperties.uiListType | about.labels.watchlistsMatchedByType_userProperties_uiListType | Valeur copiée directement |
| watchlist.userProperties.watchlistColor | about.labels.watchlistsMatchedByType_userProperties_watchlistColor | Valeur copiée directement |
| watchlist.locationGroups.locations.id | about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationsid%{loc_i} | Valeur copiée directement |
| watchlist.locationGroups.locations.lng | about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationslng%{loc_i} | Converti en chaîne si lg_i != 0 ou loc_i != 0 |
| watchlist.locationGroups.locations.lat | about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationslat%{loc_i} | Converti en chaîne si lg_i != 0 ou loc_i != 0 |
| watchlist.locationGroups.locations.name | about.labels.watchlistsMatchedByTypelocationGroups%{lg_i}_locationsname%{loc_i} | Valeur copiée directement si lg_i != 0 ou loc_i != 0 |
| watchlist.locationGroups.id | about.labels.watchlistsMatchedByType_locationGroupsid%{lg_i} | Valeur copiée directement |
| watchlist.locationGroups.name | about.labels.watchlistsMatchedByType_locationGroupsname%{lg_i} | Valeur copiée directement |
| watchlist.locationGroups.locations.lng | about.location.region_coordinates.longitude | Valeur copiée directement si lg_i == 0 et loc_i == 0 |
| watchlist.locationGroups.locations.lat | about.location.region_coordinates.latitude | Valeur copiée directement si lg_i == 0 et loc_i == 0 |
| watchlist.locationGroups.locations.name | about.location.name | Valeur copiée directement si lg_i == 0 et loc_i == 0 |
| source.entityName | principal.hostname | Valeur copiée directement |
| metadata.event_type | Défini sur "GENERIC_EVENT", puis remplacé par "SCAN_HOST" si principal_ip ou principal.hostname ne sont pas vides |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.