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 télémétriques publiés dans les sujets Pub/Sub pour les ingérer dans Google SecOps en tant que demandes.

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

Avant de commencer

Avant de configurer l'intégration 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ée) : cette méthode utilise des jetons éphémères avec l'emprunt d'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 durable.

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 Ajouter > Cré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 les 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 (modifier).

  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 avec l'emprunt d'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 à Plate-forme de contenu > 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, puis recherchez l'adresse e-mail de l'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 (modifier).

  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 et 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 elle est configurée, vous devez également fournir un Quota Project ID. Service Account JSON File Content est alors ignoré.

Service Account JSON File Content

Facultatif.

Contenu complet du fichier JSON de clé de 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 obtenir des instructions sur la configuration d'une intégration dans Google SecOps, consultez Configurer des intégrations.

Vous pourrez apporter des modifications ultérieurement, si nécessaire. Une fois que vous avez configuré une instance d'intégration, vous pouvez l'utiliser dans des playbooks. Pour savoir comment configurer et prendre en charge plusieurs instances, consultez Prise en charge de plusieurs instances.

Actions

Pour en savoir plus sur les actions, consultez Répondre aux actions en attente dans Votre bureau et Effectuer une action manuelle.

Ping

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

Cette action ne s'applique pas aux entités Google SecOps.

Entrées d'action

Aucune.

Sorties d'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 résultat 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 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).

Connecteur Pub/Sub – Messages

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

Utilisez le connecteur Messages Pub/Sub pour récupérer les messages de Pub/Sub.

Mappage de la 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 de messages Pub/Sub lit les valeurs integer et float et les mappe en fonction des paramètres Google SecOps. Le tableau suivant indique 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.

Au départ, 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
}

La valeur "Default" est obligatoire.

Dans le cas où 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 de la 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, l'environnement par défaut est sélectionné.

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 clé de compte de service.

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

Pour configurer ce paramètre, indiquez le contenu complet 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 par rapport à 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, accordez 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

Nom personnalisé de la demande.

Lorsque vous configurez ce paramètre, le connecteur ajoute une clé nommé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éfixes.

Alert Name Template Obligatoire

Nom de l'alerte personnalisée.

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

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

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 de l'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 de l'horodatage du message.

Le connecteur a besoin de l'horodatage pour traiter correctement le message. Si le code temporel n'utilise pas le format de code temporel 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 façon 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 la gravité, consultez Mappage de la 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 du 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 capacité de Google SecOps lors de la création d'alertes.

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 pour la connexion à Pub/Sub est valide.

Cette option est 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 Messages Pub/Sub :

{
   "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 auprès des membres de la communauté et des professionnels Google SecOps.