Intégrer Pub/Sub à Google SecOps

Ce document explique comment intégrer Pub/Sub à Google Security Operations.

Cas d'utilisation

L'intégration Pub/Sub est compatible avec les cas d'utilisation suivants :

  • Ingestion automatisée des alertes : récupérez en continu les journaux de sécurité, les alertes et les données de télémétrie publiés dans des sujets Pub/Sub pour les ingérer dans Google SecOps en tant que demandes.

  • Orchestration centralisée de la sécurité : consolidez le routage des événements liés à la sécurité via Pub/Sub à partir des systèmes cloud et tiers pour déclencher des playbooks de réponse automatisés.

Avant de commencer

Avant de configurer l'intégration de Pub/Sub dans Google SecOps, effectuez les étapes préalables suivantes :

  1. Créez un compte de service.

  2. Attribuez les rôles IAM (Identity and Access Management) nécessaires à votre compte de service.

  3. Choisissez et configurez l'une des méthodes d'authentification suivantes :

    • Option 1 : Workload Identity (recommandé) : cette méthode utilise des jetons de courte durée en empruntant l'identité d'un compte de service.

    • Option 2 : Clé JSON du compte de service : cette méthode repose sur un fichier de clé secrète statique et de longue durée.

Créer un compte de service

  1. Dans la console Google Cloud , accédez à IAM et administration > Comptes de service.

    Accéder à la page "Comptes de service"

  2. Cliquez sur addCréer un compte de service.

  3. Indiquez un nom et une description, puis cliquez sur OK. Notez l'adresse e-mail du compte de service.

Attribuer des rôles IAM

L'octroi d'autorisations permet à l'intégration d'afficher et d'extraire des messages de vos abonnements. Pour attribuer le rôle standard, procédez comme suit :

  1. Dans la console Google Cloud , accédez à IAM.

    Accéder à IAM

  2. Recherchez votre compte de service, puis cliquez sur Modifier le compte principal (edit).

  3. Cliquez sur Ajouter un autre rôle, puis sélectionnez Lecteur Pub/Sub (roles/pubsub.viewer).

  4. Cliquez sur Enregistrer.

Configurer les identifiants Workload Identity

Workload Identity est l'approche recommandée, car elle utilise des jetons d'accès éphémères en empruntant l'identité d'un compte de service.

Identifier l'identité unique de l'instance

Pour établir une connexion, vous devez autoriser votre instance Google SecOps à emprunter l'identité de votre compte de service.

  1. Dans Google SecOps, accédez à Content Hub > Intégrations de réponse.

  2. Sélectionnez l'intégration Pub/Sub, puis saisissez l'adresse e-mail de votre compte de service dans Adresse e-mail Workload Identity.

  3. Cliquez sur Enregistrer > Tester. Le test devrait échouer.

  4. Cliquez sur close_small à côté du bouton Tester et recherchez l'adresse e-mail d'identité commençant par gke-init-python@... ou soar-python@....

  5. Copiez cette adresse e-mail unique.

Autoriser l'identité de l'instance dans Google Cloud

  1. Dans la console Google Cloud , accédez à IAM et administration > Comptes de service.

    Accéder à la page "Comptes de service"

  2. Sélectionnez le compte de service cible, puis accédez à Autorisations > Accorder l'accès.

  3. Collez l'adresse e-mail unique dans Nouveaux comptes principaux, puis attribuez le rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator).

Accorder l'accès au projet de quota

L'authentification avec une Workload Identity nécessite un Quota Project ID pour suivre l'utilisation de l'API et la facturation.

  1. Dans la console Google Cloud , accédez à IAM pour le projet utilisé comme projet de quota.

    Accéder à IAM

  2. Recherchez votre compte de service, puis cliquez sur Modifier le compte principal (edit).

  3. Cliquez sur Ajouter un autre rôle, puis sélectionnez Consommateur Service Usage (roles/serviceusage.serviceUsageConsumer).

  4. Cliquez sur Enregistrer.

Configurer une clé JSON

Les fichiers de clés secrètes statiques de longue durée nécessitent une rotation manuelle. N'utilisez cette méthode que si l'authentification Workload Identity n'est pas disponible.

  1. Dans la console Google Cloud , accédez à IAM et administration > Comptes de service, puis sélectionnez votre compte de service.

    Accéder à la page "Comptes de service"

  2. Accédez à l'onglet Clés, puis cliquez sur Ajouter une clé > Créer une clé.

  3. Sélectionnez JSON, puis cliquez sur Créer. Le navigateur télécharge le fichier JSON sur votre ordinateur.

Paramètres d'intégration

L'intégration Pub/Sub nécessite les paramètres suivants :

Paramètre Description
Workload Identity Email

Facultatif.

Adresse e-mail du client de votre compte de service.

Ne configurez ce paramètre que si vous vous authentifiez à l'aide d'une identité de charge de travail. Si cette option est configurée, vous devez également fournir un Quota Project ID et Service Account JSON File Content est ignoré.

Service Account JSON File Content

Facultatif.

Contenu complet du fichier JSON de la clé du compte de service.

Configurez ce paramètre pour l'authentification par clé de compte de service.

Quota Project ID

Facultatif.

ID du projet utilisé pour l'utilisation de l'API et la facturation.

Ce paramètre est obligatoire lorsque vous utilisez l'authentification Workload Identity.

Si aucune valeur n'est fournie, l'intégration récupère l'ID à partir des identifiants du compte de service.

Project ID

Facultatif.

ID du projet à cibler dans Pub/Sub.

Si aucune valeur n'est fournie, l'intégration récupère l'ID à partir des identifiants du compte de service.

Verify SSL

Obligatoire.

Valide le certificat SSL pour la connexion au serveur. Cette option est activée par défaut.

Pour savoir comment configurer une intégration dans Google SecOps, consultez Configurer des intégrations.

Vous pourrez apporter des modifications ultérieurement si nécessaire. Après avoir configuré une instance d'intégration, vous pouvez l'utiliser dans des playbooks. Pour en savoir plus sur la configuration et la prise en charge de plusieurs instances, consultez Prendre en charge plusieurs instances.

Actions

Pour en savoir plus sur les actions, consultez Répondre aux actions en attente depuis votre bureau et Exécuter une action manuelle dans votre demande.

Ping

Utilisez l'action Ping pour tester la connectivité à Pub/Sub.

Cette action ne s'exécute pas sur les entités Google SecOps.

Entrées de l'action

Aucune.

Sorties de l'action

L'action Ping fournit les résultats suivants :

Type de sortie de l'action Disponibilité
Pièce jointe du mur des cas Non disponible
Lien vers le mur des cas Non disponible
Tableau du mur des cas Non disponible
Table d'enrichissement Non disponible
Résultat JSON Non disponible
Messages de sortie Disponible
Résultat du script Disponible
Messages de sortie

L'action Ping peut renvoyer les messages de sortie suivants :

Message de sortie Description du message
Successfully connected to the Pub/Sub server with the provided connection parameters! L'action a réussi.
Failed to connect to the Pub/Sub server! Error is ERROR_REASON

Échec de l'action.

Vérifiez la connexion au serveur, les paramètres d'entrée ou les identifiants.

Résultat du script

Le tableau suivant répertorie la valeur de la sortie du résultat du script lorsque vous utilisez l'action Ping :

Nom du résultat du script Valeur
is_success True ou False

Connecteurs

Pour obtenir des instructions détaillées sur la configuration d'un connecteur dans Google SecOps, consultez Ingérer vos données (connecteurs).

Pub/Sub – Connecteur de messages

Dans la plate-forme Google SecOps, le connecteur Pub/Sub – Messages est appelé PubSub – Messages Connector.

Utilisez le connecteur Pub/Sub – Messages pour récupérer des messages depuis Pub/Sub.

Mappage de gravité JSON

Pour mapper la gravité de l'alerte, vous devez spécifier le champ utilisé par le connecteur Pub/Sub – Messages pour obtenir la valeur de gravité dans le paramètre Severity Mapping JSON. La réponse du connecteur peut contenir des types de valeurs, tels que integer, float et string.

Le connecteur Pub/Sub – Messages lit les valeurs integer et float et les mappe conformément aux paramètres Google SecOps. Le tableau suivant montre le mappage des valeurs integer à la gravité dans Google SecOps :

Valeur entière Gravité mappée
100 Critical
Du 80 au 100 High
Du 60 au 80 Medium
Du 40 au 60 Low
Moins de 40 Informational

Si la réponse contient la valeur string, le connecteur Pub/Sub – Messages nécessite une configuration supplémentaire.

Initialement, la valeur par défaut s'affiche comme suit :

{
    "Default": 60
}

Si les valeurs requises pour le mappage se trouvent dans la clé JSON event_severity, elles peuvent être les suivantes :

  • "Malicious"
  • "Benign"
  • "Unknown"

Pour analyser les valeurs de clé JSON event_severity et vous assurer que l'objet JSON est au bon format, configurez le paramètre Severity Mapping JSON comme suit :

{
    "event_severity": {
        "Malicious": 100,
        "Unknown": 60,
        "Benign": -1
    },
    "Default": 50
}

Veuillez indiquer une valeur pour "Default".

Si plusieurs correspondances sont trouvées pour le même objet JSON, le connecteur Pub/Sub – Messages donne la priorité à la première clé d'objet JSON.

Pour utiliser des champs contenant des valeurs integer ou float, configurez la clé et une chaîne vide dans le paramètre Severity Mapping JSON :

{
  "Default":"60",
  "integer_field": "",
  "float_field": ""
}

Entrées du connecteur

Le connecteur Pub/Sub – Messages nécessite les paramètres suivants :

Paramètre Description
Product Field Name Obligatoire

Nom du champ dans lequel le nom du produit est stocké.

La valeur par défaut est Product Name.

Event Field Name Obligatoire

Nom du champ utilisé pour déterminer le nom de l'événement (sous-type).

La valeur par défaut est event_type.

Environment Field Name Optional

Nom du champ dans lequel le nom de l'environnement est stocké.

Si le champ d'environnement n'est pas trouvé, l'environnement est défini sur l'environnement par défaut.

La valeur par défaut est "".

Environment Regex Pattern Optional

Modèle d'expression régulière à exécuter sur la valeur trouvée dans le champ Environment Field Name. Ce paramètre vous permet de manipuler le champ "environment" à l'aide d'une logique d'expression régulière.

Utilisez la valeur par défaut .* pour récupérer la valeur Environment Field Name brute requise.

Si le modèle d'expression régulière est nul ou vide, ou si la valeur de l'environnement est nulle, le résultat de l'environnement final est l'environnement par défaut.

PythonProcessTimeout Obligatoire

Délai avant expiration (en secondes) du processus Python exécutant le script actuel.

La valeur par défaut est 60.

Service Account JSON File Content Optional

Contenu du fichier JSON de la clé du compte de service.

Vous pouvez configurer ce paramètre ou le paramètre Workload Identity Email.

Pour configurer ce paramètre, fournissez l'intégralité du contenu du fichier JSON de la clé de compte de service que vous avez téléchargé lors de la création d'un compte de service.

Pour le connecteur Pub/Sub – Messages, l'authentification avec le fichier JSON de clé de compte de service est prioritaire sur la fédération d'identité de charge de travail.

Workload Identity Email Optional

Adresse e-mail du client de votre compte de service.

Vous pouvez configurer ce paramètre ou le paramètre Service Account JSON File Content.

Pour emprunter l'identité de comptes de service avec la fédération d'identité de charge de travail, attribuez le rôle Service Account Token Creator à votre compte de service.

Project ID Optional

ID du projet à utiliser dans le connecteur.

Quota Project ID Optional

ID du projet Google Cloud que vous utilisez pour les API Google Cloud et la facturation. Ce paramètre nécessite que vous accordiez le rôle Service Usage Consumer à votre compte de service. Pour en savoir plus sur les rôles IAM, consultez Contrôle des accès avec IAM.

L'intégration associe cette valeur de paramètre à toutes les requêtes API.

Subscription ID Obligatoire

ID de l'abonnement Pub/Sub.

Case Name Template Optional

Un nom de cas personnalisé.

Lorsque vous configurez ce paramètre, le connecteur ajoute une clé appelée custom_case_name à l'événement Google SecOps.

Vous pouvez fournir des espaces réservés au format suivant : [name of the field].

Exemple : Phishing - [event_mailbox]

Pour les espaces réservés, le connecteur utilise le premier événement Google SecOps. Le connecteur ne gère que les clés contenant la valeur de chaîne. Pour configurer ce paramètre, spécifiez les champs d'événement sans préfixe.

Alert Name Template Obligatoire

Nom d'alerte personnalisé.

Vous pouvez fournir des espaces réservés au format suivant : [name of the field].

Exemple : Phishing - [event_mailbox].

Pour les espaces réservés, le connecteur utilise le premier événement Google SecOps. Le connecteur ne gère que les clés contenant la valeur de chaîne. Si vous ne fournissez aucune valeur ou si vous utilisez un modèle non valide, le connecteur utilise une valeur de remplacement au format suivant : CONNECTOR_NAME - Alert. Pour configurer ce paramètre, spécifiez les champs d'événement sans préfixe.

Rule Generator Template Obligatoire

Un générateur de règles personnalisées.

Vous pouvez fournir des espaces réservés au format suivant : [name of the field].

Exemple : Phishing - [event_mailbox].

Pour les espaces réservés, le connecteur utilise le premier événement Google SecOps. Le connecteur ne gère que les clés contenant la valeur de chaîne. Si vous ne fournissez aucune valeur ou si vous utilisez un modèle non valide, le connecteur utilise une valeur de remplacement au format suivant : CONNECTOR_NAME - Rule Generator. Pour configurer ce paramètre, spécifiez les champs d'événement sans préfixe.

Timestamp Field Obligatoire

Nom du champ permettant de définir le code temporel de l'alerte Google SecOps.

Si le code temporel n'utilise pas le format d'heure epoch Unix, définissez le format du code temporel dans le paramètre Timestamp Format.

La valeur par défaut est message_publishTime.

Timestamp Format Optional

Format du code temporel du message.

Le connecteur nécessite l'horodatage pour traiter correctement le message. Si le code temporel n'utilise pas le format d'heure de l'epoch Unix et que vous ne configurez pas de format de code temporel, le connecteur échoue.

La valeur par défaut est %Y-%m-%dT%H:%M:%S.%fZ.

Severity Mapping JSON Obligatoire

Objet JSON qui définit la manière dont le connecteur extrait le niveau de gravité du message.

La valeur par défaut est la suivante :

    {
      "Default": "60"
    }
    

Pour en savoir plus sur le mappage de gravité, consultez Mappage de gravité JSON.

Unique ID Field Optional

Nom du champ permettant de confirmer que le message est unique. Vous pouvez utiliser le mot clé réservé pubsub_message_id pour extraire l'ID de message Pub/Sub natif. Si vous ne définissez pas de valeur ou si le champ est introuvable, le connecteur génère un hachage SHA-256 et l'utilise comme identifiant pour le message.

Max Messages To Fetch Obligatoire

Nombre maximal de messages à traiter pour chaque itération de connecteur.

La valeur par défaut est 100.

Disable Overflow Optional

Si cette option est sélectionnée, le connecteur ignore le mécanisme de dépassement de Google SecOps lors de la création de l'alerte.

Cette option est sélectionnée par défaut.

Verify SSL Obligatoire

Si cette option est sélectionnée, l'intégration vérifie que le certificat SSL de connexion à Pub/Sub est valide.

Cette option sera sélectionnée par défaut.

Proxy Server Address Optional

Adresse du serveur proxy à utiliser.

Proxy Username Optional

Nom d'utilisateur du proxy pour l'authentification.

Proxy Password Optional

Mot de passe du proxy pour l'authentification.

Règles du connecteur

Le connecteur Pub/Sub – Messages est compatible avec les proxys.

Événements de connecteur

L'exemple suivant montre la sortie JSON d'un événement Google SecOps généré par le connecteur Pub/Sub – Messages :

{
   "notificationConfigName": "organizations/ORGANIZATION_ID/notificationConfigs/soar_connector_toxic_notifications_config",
   "finding": {
       "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
       "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
       "resourceName": "//compute.googleapis.com/projects/PROJECT_ID/global/firewalls/FIREWALL_ID",
       "state": "ACTIVE",
       "category": "OPEN_NETBIOS_PORT",
       "externalUri": "https://console.cloud.google.com/networking/firewalls/details/default-allow-rdp?project\u003dPROJECT_ID",
       "sourceProperties": {
           "Recommendation": "Restrict the firewall rules at: https://console.cloud.google.com/networking/firewalls/details/default-allow-rdp?project\u003dPROJECT_ID",
           "ExceptionInstructions": "Add the security mark \"allow_open_netbios_port\" to the asset with a value of \"true\" to prevent this finding from being activated again.",
           "Explanation": "Firewall rules that allow connections from all IP addresses on TCP ports 137-139 or UDP ports 137-139 may expose NetBIOS services to attackers.",
           "ScannerName": "FIREWALL_SCANNER",
           "ResourcePath": [
               "projects/PROJECT_ID/",
               "folders/FOLDER_ID/",
               "folders/FOLDER_ID/",
               "organizations/ORGANIZATION_ID/"
           ],
           "ExposedService": "NetBIOS",
           "OpenPorts": {
               "TCP": [
                   137.0,
                   138.0,
                   139.0
               ],
               "UDP": [
                   137.0,
                   138.0,
                   139.0
               ]
           },
           "compliance_standards": {
               "iso": [
                   {
                       "ids": [
                           "A.13.1.1"
                       ]
                   }
               ],
               "pci": [
                   {
                       "ids": [
                           "1.2.1"
                       ]
                   }
               ],
               "nist": [
                   {
                       "ids": [
                           "SC-7"
                       ]
                   }
               ]
           },
           "ReactivationCount": 4.0
       },
       "securityMarks": {
           "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks",
           "marks": {
               "peter": "e2e1"
           }
       },
       "eventTime": "2024-08-30T14:44:37.973090Z",
       "createTime": "2024-06-24T07:08:54.777Z",
       "propertyDataTypes": {
           "ResourcePath": {
               "listValues": {
                   "propertyDataTypes": [
                       {
                           "primitiveDataType": "STRING"
                       }
                   ]
               }
           },
           "ReactivationCount": {
               "primitiveDataType": "NUMBER"
           },
           "Explanation": {
               "primitiveDataType": "STRING"
           },
           "ExposedService": {
               "primitiveDataType": "STRING"
           },
           "ScannerName": {
               "primitiveDataType": "STRING"
           }
       }
   }
}

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.