Collecter les journaux des alertes Dataminr

Compatible avec :

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 ;

  1. Accédez à Google Cloud Console.
  2. Sélectionnez votre projet ou créez-en un.
  3. Dans le menu de navigation, accédez à Cloud Storage> Buckets.
  4. Cliquez sur Créer un bucket.
  5. 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
  6. 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

  1. Contactez votre responsable de compte Dataminr ou l'équipe d'assistance pour demander l'accès à l'API.
  2. 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
  3. 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

  1. Connectez-vous à l'application Web Dataminr Pulse sur https://app.dataminr.com.
  2. Accédez à vos listes d'alertes (listes de surveillance) configurées.
  3. 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

  1. Dans la console Google Cloud, accédez à IAM et administration > Comptes de service.
  2. Cliquez sur Créer un compte de service.
  3. 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.
  4. Cliquez sur Créer et continuer.
  5. Dans la section Autoriser ce compte de service à accéder au projet, ajoutez les rôles suivants :
    1. Cliquez sur Sélectionner un rôle, puis recherchez et sélectionnez Administrateur des objets Storage.
    2. Cliquez sur Ajouter un autre rôle, puis recherchez et sélectionnez Demandeur Cloud Run.
  6. Cliquez sur Continuer.
  7. Cliquez sur OK.

Accorder des autorisations IAM sur un bucket GCS

  1. Accédez à Cloud Storage > Buckets.
  2. Cliquez sur le nom de votre bucket (par exemple, dataminr-alert-logs).
  3. Accédez à l'onglet Autorisations.
  4. Cliquez sur Accorder l'accès.
  5. 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.
  6. 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.

  1. Dans la console Google Cloud, accédez à Pub/Sub > Sujets.
  2. Cliquez sur Créer un sujet.
  3. Fournissez les informations de configuration suivantes :
    • ID du sujet : saisissez dataminr-alert-trigger.
    • Ajouter un abonnement par défaut : laissez cette option cochée.
  4. Cliquez sur Créer.

Créer la fonction Cloud Run

  1. Dans la console Google Cloud, accédez à Cloud Run Functions.
  2. Cliquez sur Créer une fonction.
  3. Fournissez les informations de configuration suivantes :

    Paramètre Valeur
    Environnement 2e génération
    Nom de la fonction dataminr-alert-collector
    Région Sélectionnez la même région que votre bucket GCS.
    Type de déclencheur Cloud Pub/Sub
    Sujet Pub/Sub dataminr-alert-trigger
    Mémoire allouée 512 MiB
    Délai avant expiration 540 secondes
    Compte de service d'exécution dataminr-alert-collector
  4. Cliquez sur Suivant.

  5. Définissez Environnement d'exécution sur Python 3.12.

  6. Définissez Point d'entrée sur main.

  7. Dans le fichier requirements.txt, ajoutez les dépendances suivantes :

    functions-framework==3.*
    google-cloud-storage==2.*
    requests==2.*
    
  8. 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}")
            raise
    
  9. Cliquez sur Déployer.

  10. 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

  1. Une fois la fonction déployée, accédez à Cloud Run Functions> dataminr-alert-collector.
  2. Cliquez sur Modifier et déployer la nouvelle révision.
  3. 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).
  4. Ajoutez les variables d'environnement suivantes :

    Clé Exemple de valeur
    GCS_BUCKET dataminr-alert-logs
    GCS_PREFIX dataminr_alerts
    STATE_KEY dataminr_state/cursor.json
    CLIENT_ID Votre ID client OAuth 2.0 Dataminr
    CLIENT_SECRET Code secret du client OAuth 2.0 Dataminr
    ALERT_LISTS ID de liste d'alertes Dataminr séparés par une virgule
    MAX_RECORDS 1000
    PAGE_SIZE 40
    LOOKBACK_HOURS 24
  5. Cliquez 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.

  1. Dans la console Google Cloud, accédez à Cloud Scheduler.
  2. Cliquez sur Créer une tâche.
  3. Fournissez les informations de configuration suivantes :

    Paramètre Valeur
    Nom dataminr-alert-poll
    Ré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).
  4. Cliquez sur Continuer.

  5. 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}.
  6. Cliquez sur Créer.

Vérifier la fonction Cloud Run

  1. Dans Cloud Scheduler, recherchez le job dataminr-alert-poll.
  2. Cliquez sur Forcer l'exécution pour déclencher une exécution immédiate.
  3. Accédez à Cloud Run Functions > dataminr-alert-collector > Journaux.
  4. 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.ndjson
    
  5. Accédez à Cloud Storage > Buckets > dataminr-alert-logs.

  6. Accédez au préfixe dataminr_alerts/.

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

  1. Accédez à Paramètres SIEM> Flux.
  2. Cliquez sur Add New Feed (Ajouter un flux).
  3. Cliquez sur Configurer un flux unique.
  4. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Dataminr Alerts).
  5. Sélectionnez Google Cloud Storage V2 comme Type de source.
  6. Sélectionnez Alertes Dataminr comme Type de journal.
  7. Cliquez sur Obtenir un compte de service.
  8. Une adresse e-mail unique pour le compte de service s'affiche, par exemple :

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  9. Copiez cette adresse e-mail pour l'utiliser dans la section suivante.

  10. Cliquez sur Suivant.

  11. 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).

  12. Cliquez sur Suivant.

  13. 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.

  1. Accédez à Cloud Storage > Buckets.
  2. Cliquez sur le nom de votre bucket (par exemple, dataminr-alert-logs).
  3. Accédez à l'onglet Autorisations.
  4. Cliquez sur Accorder l'accès.
  5. 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.
  6. 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.