Règles de détection composites

Compatible avec :

La détection composite dans Google SecOps consiste à associer plusieurs règles YARA-L. Ce document explique comment créer une règle composite. Pour en savoir plus, consultez Présentation des détections composites.

Comprendre la structure des règles

Les règles de détection composites sont toujours des règles multi-événements et suivent la même structure et la même syntaxe qu'une règle à événement unique.

Une règle composite comporte les composants essentiels suivants :

  • Section events : définit vos entrées, c'est-à-dire les détections ou événements spécifiques que la règle analyse.

  • Section match : spécifie comment les entrées doivent être connectées sur une période définie.

  • Section condition : contient la logique finale qui détermine si les événements associés répondent aux critères de déclenchement d'une alerte.

Définir les entrées dans la section events

La première étape de la création d'une règle de détection composite consiste à définir les entrées de la règle dans la section events. Les entrées des règles composites proviennent de collections, qui stockent les détections générées par d'autres requêtes. Google SecOps propose les deux méthodes suivantes pour accéder aux données des collections.

Faire référence au contenu de détection avec des variables ou des libellés de métadonnées

Pour accéder aux données d'une détection sans faire référence aux événements UDM d'origine, vous pouvez utiliser des variables outcome, match ou des libellés meta. Nous vous recommandons cette approche, car elle offre une plus grande flexibilité et une meilleure compatibilité avec différents types de règles.

Par exemple, plusieurs règles peuvent stocker une chaîne (telle qu'une URL, un nom de fichier ou une clé de registre) dans une variable outcome commune si vous recherchez cette chaîne dans différents contextes. Pour accéder à cette chaîne à partir d'une règle composite, commencez par detection et recherchez les informations pertinentes à l'aide des éléments de la ressource Collection.

Exemple : Supposons qu'une règle de détection génère les informations suivantes :

  • Variable de résultat : dest_domain = "cymbal.com"

  • Champ UDM : target.hostname = "cymbal.com"

Dans la règle composite, vous pouvez accéder à ces données à l'aide des chemins suivants :

  • detection.detection.outcomes["dest_domain"] pour accéder à la variable de résultat dest_domain.

  • detection.collection_elements.references.event.target.hostname pour accéder au champ UDM target.hostname.

  • detection.time_window.start_time.seconds pour accéder au code temporel de début de la détection.

L'API Collection et l'API SecurityResult permettent d'accéder aux deux :

  • Valeurs des métadonnées et des résultats de la détection (detection.detection)
  • Événements UDM sous-jacents des règles référencées (collection_elements)

Faire référence à du contenu de détection avec un ID ou un nom de règle

Vous pouvez faire référence à une règle par son nom ou son ID. Nous vous recommandons cette approche lorsque votre logique de détection dépend de règles spécifiques et que vous souhaitez réduire les données analysées aux résultats de ces règles uniquement. Faire référence aux règles pertinentes par leur nom ou leur ID améliore les performances et évite les délais d'expiration en réduisant les données analysées. Par exemple, vous pouvez interroger directement des champs tels que target.url ou principal.ip à partir d'une détection précédente connue.

  • Faire référence à une règle par son ID (recommandé) : utilisez le champ detection.detection.rule_id pour faire référence à une règle par son ID. Vous trouverez l'ID de la règle dans l'URL de la règle dans Google SecOps. Les règles générées par les utilisateurs ont des ID au format ru_UUID, tandis que les détections sélectionnées ont des ID au format ur_UUID. Exemple :

    detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"

  • Faire référence à une règle par son nom : utilisez le champ detection.detection.rule_name pour faire référence à une règle par son nom. Vous pouvez spécifier le nom exact de la règle ou utiliser une expression régulière pour la faire correspondre. Exemple :

    • detection.detection.rule_name = "My Rule Name"
    • detection.detection.rule_name = "/PartOfName/"

Joindre des entrées dans la section match

Pour associer des détections, des événements ou des entités dans une règle composite, définissez la section match à l'aide de variables définies dans la section events. Ces variables peuvent inclure des libellés de règles, des variables de résultat, des variables de correspondance, des champs de détection ou des éléments de collecte.

Pour en savoir plus sur la syntaxe, consultez Syntaxe de la section "Correspondance".

Définir la section condition

Définissez la section condition pour évaluer les résultats de la section match. Si la condition est true, une alerte est générée. Pour en savoir plus sur la syntaxe, consultez Syntaxe de la section "Condition".

Appliquer des techniques avancées aux règles composites

Cette section explique comment appliquer des techniques avancées lors de la création de règles composites.

Combiner des événements et des détections

Les règles composites peuvent combiner plusieurs sources de données, y compris les événements UDM, les données du graphique d'entités et les champs de détection. Les consignes suivantes s'appliquent :

  • Utiliser des variables distinctes par source : attribuez des variables d'événement uniques à chaque source de données (par exemple, $e pour les événements et $d pour les détections), où la source de données inclut les événements, les entités et les détections.

  • Associer des sources sur un contexte partagé : associez des sources de données à l'aide de valeurs communes, telles que des ID utilisateur, des adresses IP ou des noms de domaine dans les conditions de votre règle.

  • Définissez une fenêtre de correspondance : incluez toujours une clause match avec une fenêtre temporelle ne dépassant pas 48 heures.

Exemple : combiner des événements et des détections

rule CheckCuratedDetection_with_EDR_and_EG {
  meta:
    author = "noone@cymbal.com"
  events:
    $d.detection.detection.rule_name = /SCC: Custom Modules: Configurable Bad Domain/
    $d.detection.collection_elements.references.event.network.dns.questions.name = $domain
    $d.detection.collection_elements.references.event.principal.asset.hostname = $hostname

    $e.metadata.log_type = "LIMACHARLIE_EDR"
    $e.metadata.product_event_type = "NETWORK_CONNECTIONS"
    $domain = re.capture($e.principal.process.command_line, "\\s([a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+)$")
    $hostname = re.capture($e.principal.hostname, "([^.]*)")

    $prevalence.graph.metadata.entity_type = "DOMAIN_NAME"
    $prevalence.graph.metadata.source_type = "DERIVED_CONTEXT"
    $prevalence.graph.entity.hostname = $domain
    $prevalence.graph.entity.domain.prevalence.day_count = 10
    $prevalence.graph.entity.domain.prevalence.rolling_max <= 5
    $prevalence.graph.entity.domain.prevalence.rolling_max > 0

  match:
    $hostname over 1h

  outcome:
    $risk_score = 80
    $CL_target = array($domain)

  condition:
    $e and $d and $prevalence
}

Créer des détections composites séquentielles

Les détections composites séquentielles identifient des schémas d'événements associés où la séquence de détections est importante, comme une tentative de connexion par force brute suivie d'une connexion réussie. Ces modèles peuvent combiner plusieurs détections de base, événements UDM bruts ou les deux.

Pour créer une détection composite séquentielle, vous devez appliquer cet ordre dans votre règle. Pour appliquer la séquence attendue, utilisez l'une des méthodes suivantes :

  • Fenêtres glissantes : définissez la séquence de détections à l'aide de fenêtres glissantes dans vos conditions match.

  • Comparaisons des codes temporels : comparez les codes temporels des détections dans la logique de votre règle pour vérifier qu'elles se produisent dans l'ordre sélectionné.

Exemple : détections composites séquentielles

events:
    $d1.detection.detection.rule_name = "fileEvent_rule"
    $userid = $d1.detection.detection.outcomes["user"]
    $hostname = $d1.detection.detection.outcomes["hostname"]

    $d2.detection.detection.rule_name = "processExecution_rule"
    $userid = $d2.detection.detection.outcomes["user"]
    $hostname = $d2.detection.detection.outcomes["hostname"]

    $d3.detection.detection.rule_name = "networkEvent_rule"
    $userid = $d3.detection.detection.outcomes["user"]
    $hostname = $d3.detection.detection.outcomes["hostname"]

$d3.detection.collection_elements.references.event.metadata.event_timestamp.seconds > $d2.detection.collection_elements.references.event.metadata.event_timestamp.seconds

  match:
    $userid over 24h after $d1

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