Utiliser des données enrichies en contexte dans les règles
Pour permettre aux analystes de sécurité lors d'une enquête, Chronicle ingère des données contextuelles provenant de différentes sources, analyse les données ingérées et fournit plus de contexte sur les artefacts dans l'environnement client. Ce document fournit des exemples illustrant comment les analystes peuvent utiliser des données enrichies en contexte dans les règles de détection de moteur.
Pour en savoir plus sur l'enrichissement des données, consultez Comment Chronicle enrichit les données d'événements et d'entités.
Utiliser des champs enrichis avec prévalence dans les règles
Les exemples suivants montrent comment utiliser les champs enrichis liés à la prévalence dans le moteur de détection. Pour en savoir plus, consultez la liste des champs enrichis liés à la prévalence.
Identifier les accès aux domaines présentant une faible prévalence
Cette règle génère un événement de détection, et non une alerte de détection, lorsqu'une correspondance est trouvée. Il s'agit principalement d'un indicateur secondaire lorsque vous examinez un asset. Par exemple, d'autres alertes de gravité plus élevée ont déclenché un incident.
rule network_prevalence_low_prevalence_domain_access {
meta:
author = "Chronicle Security"
description = "Detects access to a low prevalence domain. Requires baseline of prevalence be in place for effective deployment."
severity = "LOW"
events:
$e.metadata.event_type = "NETWORK_HTTP"
$e.principal.ip = $ip
// filter out URLs with RFC 1918 IP addresses, i.e., internal assets
not re.regex($e.target.hostname, `(127(?:\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$)|(10(?:\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$)|(192\.168(?:\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){2}$)|(172\.(?:1[6-9]|2\d|3[0-1])(?:\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){2})`)
// only match valid FQDN, filter out background non-routable noise
re.regex($e.target.hostname, `(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]`)
$domainName = $e.target.hostname
//join event ($e) to entity graph ($d)
$e.target.hostname = $d.graph.entity.domain.name
$d.graph.metadata.entity_type = "DOMAIN_NAME"
// tune prevalence as fits your results
$d.graph.entity.domain.prevalence.rolling_max <= 10
match:
$ip over 1h
outcome:
$risk_score = max(
// increment risk score based upon rolling_max prevalence
if ( $d.graph.entity.domain.prevalence.rolling_max >= 10, 10) +
if ( $d.graph.entity.domain.prevalence.rolling_max >= 2 and $d.graph.entity.domain.prevalence.rolling_max <= 9 , 20) +
if ( $d.graph.entity.domain.prevalence.rolling_max = 1, 30)
)
$domain_list = array_distinct($domainName)
$domain_count = count_distinct($domainName)
condition:
$e and $d
}
Voici un exemple illustrant les détections générées par cette règle.
Afficher l'image dans une nouvelle fenêtre
Identifier l'accès aux domaines présentant un faible taux de prévalence
Cette règle peut être utilisée pour détecter l'accès aux domaines présentant un score de prévalence faible. Pour être efficaces, une référence aux scores de prévalence des artefacts doit exister. L'exemple suivant utilise des listes de référence pour ajuster le résultat et applique une valeur de prévalence de seuil.
rule network_prevalence_low_prevalence_domain_access {
meta:
author = "Chronicle Security"
description = "Detects access to a low prevalence domain. Requires baseline of prevalence be in place for effective deployment."
severity = "LOW"
events:
$e.metadata.event_type = "NETWORK_HTTP"
$e.principal.ip = $ip
// filter out URLs with RFC 1918 IP addresses, i.e., internal assets
not re.regex($e.target.hostname, `(127(?:\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$)|(10(?:\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$)|(192\.168(?:\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){2}$)|(172\.(?:1[6-9]|2\d|3[0-1])(?:\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){2})`)
// used an explicit exclusion reference list
not $e.target.hostname in %exclusion_network_prevalence_low_prevalence_domain_access
// only match valid FQDN, filter out background non-routable noise
re.regex($e.target.hostname, `(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]`)
$domainName = $e.target.hostname
//join event ($e) to entity graph ($d)
$e.target.hostname = $d.graph.entity.domain.name
$d.graph.metadata.entity_type = "DOMAIN_NAME"
// tune prevalence as fits your results
$d.graph.entity.domain.prevalence.rolling_max <= 10
match:
$ip over 1h
outcome:
$risk_score = max(
// increment risk score based upon rolling_max prevalence
if ( $d.graph.entity.domain.prevalence.rolling_max >= 10, 10) +
if ( $d.graph.entity.domain.prevalence.rolling_max >= 2 and $d.graph.entity.domain.prevalence.rolling_max <= 9 , 20) +
if ( $d.graph.entity.domain.prevalence.rolling_max = 1, 30)
)
$domain_list = array_distinct($domainName)
$domain_count = count_distinct($domainName)
condition:
$e and #d > 10
}
Voici une capture d'écran montrant les exemples de détections générés par cette règle.
Afficher l'image dans une nouvelle fenêtre
Identifier les domaines à faible prévalence avec une correspondance IOC
Cette règle de détection génère une alerte de détection et fournit une correspondance haute fidélité comparant un domaine à faible prévalence qui est également un CIO connu.
rule network_prevalence_uncommon_domain_ioc_match {
meta:
author = "Chronicle Security"
description = "Lookup Network DNS queries against Entity Graph for low prevalence domains with a matching IOC entry."
severity = "MEDIUM"
events:
$e.metadata.event_type = "NETWORK_DNS"
$e.network.dns.questions.name = $hostname
//only match FQDNs, e.g., exclude chrome dns access tests and other internal hosts
$e.network.dns.questions.name = /(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]/
//prevalence entity graph lookup
$p.graph.metadata.entity_type = "DOMAIN_NAME"
$p.graph.entity.domain.prevalence.rolling_max <= 3
$p.graph.entity.domain.name = $hostname
//ioc entity graph lookup
$i.graph.metadata.vendor_name = "ET_PRO_IOC"
$i.graph.metadata.entity_type = "DOMAIN_NAME"
$i.graph.entity.hostname = $hostname
match:
$hostname over 10m
outcome:
$risk_score = max(
//increment risk score based upon rolling_max prevalence
if ( $p.graph.entity.domain.prevalence.rolling_max = 3, 50) +
if ( $p.graph.entity.domain.prevalence.rolling_max = 2, 70) +
if ( $p.graph.entity.domain.prevalence.rolling_max = 1, 90)
)
condition:
$e and $p and $i
}
Voici un exemple illustrant les détections générées par cette règle.
Utiliser les champs enrichis de la navigation sécurisée dans les règles
Chronicle ingère les données de listes de menaces liées aux hachages de fichiers. Ces informations enrichies sont stockées en tant qu'entités dans Chronicle.
Vous pouvez créer des règles de détection afin d'identifier les correspondances avec des entités ingérées à partir de la navigation sécurisée. Voici un exemple de règle de détection Engine qui interroge ces informations enrichies pour créer des analyses contextuelles.
rule safe_browsing_file_execution {
meta:
author = "Chronicle Security"
description = "Example usage of Safe Browsing data, to detect execution of a file that's been deemed malicious"
severity = "LOW"
events:
// find a process launch event, match on hostname
$execution.metadata.event_type = "PROCESS_LAUNCH"
$execution.principal.hostname = $hostname
// join execution event with Safe Browsing graph
$sb.graph.entity.file.sha256 = $execution.target.process.file.sha256
// look for files deemed malicious
$sb.graph.metadata.entity_type = "FILE"
$sb.graph.metadata.threat.severity = "CRITICAL"
$sb.graph.metadata.product_name = "Google Safe Browsing"
$sb.graph.metadata.source_type = "GLOBAL_CONTEXT"
match:
$hostname over 1h
condition:
$execution and $sb
}
Utiliser des champs enrichis de géolocalisation dans les règles
Les champs UDM qui stockent des données enrichies par la géolocalisation peuvent être utilisés dans les règles de détection de moteur. L'exemple suivant montre comment détecter si une entité utilisateur s'authentifie à partir de plusieurs états distincts.
rule geoip_user_login_multiple_states_within_1d {
meta:
author = "demo"
description = "Detect multiple authentication attempts from multiple distinct locations using geolocation-enriched UDM fields."
severity = "INFORMATIONAL"
events:
$geoip.metadata.event_type = "USER_LOGIN"
(
$geoip.metadata.vendor_name = "Google Workspace" or
$geoip.metadata.vendor_name = "Google Cloud Platform"
)
/* optionally, detect distinct locations at a country */
(
$geoip.principal.ip_geo_artifact.location.country_or_region != "" and
$geoip.principal.ip_geo_artifact.location.country_or_region = $country
)
(
$geoip.principal.ip_geo_artifact.location.state != "" and
$geoip.principal.ip_geo_artifact.location.state = $state
)
$geoip.target.user.email_addresses = $user
match:
$user over 1d
condition:
$geoip and #state > 1
}
Étapes suivantes
Pour savoir comment utiliser des données enrichies avec d'autres fonctionnalités de Chronicle, consultez les pages suivantes:
- Utilisez des données enrichies en contexte dans la recherche UDM.
- Utiliser des données contextuelles dans les rapports