Collecter les journaux ExtraHop RevealX
Ce document explique comment ingérer des journaux ExtraHop RevealX dans Google Security Operations à l'aide de Bindplane. L'analyseur extrait les champs des journaux au format JSON et Syslog. Il utilise des modèles grok et une logique conditionnelle pour gérer différents formats de journaux, en mappant les champs extraits à l'UDM et en enrichissant les données avec des informations liées à la sécurité telles que la gravité et les catégories. L'analyseur gère également des types d'événements ExtraHop spécifiques, tels que le DNS Rebinding, les erreurs d'authentification Kerberos et les connexions RDP, en appliquant une logique d'analyse spécialisée pour chacun d'eux.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Instance Google SecOps
- Windows 2016 ou version ultérieure, ou un hôte Linux avec
systemd
- Si vous exécutez le programme derrière un proxy, assurez-vous que les ports du pare-feu sont ouverts.
- Accès privilégié à ExtraHop Reveal X
Obtenir le fichier d'authentification d'ingestion Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Agents de collecte.
- Téléchargez le fichier d'authentification d'ingestion. Enregistrez le fichier de manière sécurisée sur le système sur lequel Bindplane sera installé.
Obtenir l'ID client Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres SIEM> Profil.
- Copiez et enregistrez le numéro client de la section Informations sur l'organisation.
Installer l'agent Bindplane
Installez l'agent Bindplane sur votre système d'exploitation Windows ou Linux en suivant les instructions ci-dessous.
Installation de fenêtres
- Ouvrez l'invite de commandes ou PowerShell en tant qu'administrateur.
Exécutez la commande suivante :
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Installation de Linux
- Ouvrez un terminal avec les droits root ou sudo.
Exécutez la commande suivante :
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Ressources d'installation supplémentaires
Pour plus d'options d'installation, consultez le guide d'installation.
Configurer l'agent Bindplane pour ingérer Syslog et l'envoyer à Google SecOps
- Accédez au fichier de configuration :
- Trouvez le fichier
config.yaml
. Il se trouve généralement dans le répertoire/etc/bindplane-agent/
sous Linux ou dans le répertoire d'installation sous Windows. - Ouvrez le fichier à l'aide d'un éditeur de texte (par exemple,
nano
,vi
ou le Bloc-notes).
- Trouvez le fichier
Modifiez le fichier
config.yaml
comme suit :receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization log_type: 'EXTRAHOP' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
- Remplacez le port et l'adresse IP selon les besoins de votre infrastructure.
- Remplacez
<customer_id>
par le numéro client réel. - Mettez à jour
/path/to/ingestion-authentication-file.json
en indiquant le chemin d'accès où le fichier d'authentification a été enregistré dans la section Obtenir le fichier d'authentification pour l'ingestion Google SecOps.
Redémarrez l'agent Bindplane pour appliquer les modifications.
Pour redémarrer l'agent Bindplane sous Linux, exécutez la commande suivante :
sudo systemctl restart bindplane-agent
Pour redémarrer l'agent Bindplane sous Windows, vous pouvez utiliser la console Services ou saisir la commande suivante :
net stop BindPlaneAgent && net start BindPlaneAgent
Configurer ExtraHop Syslog
- Connectez-vous à l'administration ExtraHop à l'aide de
https://<extrahop-hostname-or-IP-address>/admin
. - Accédez à État et diagnostics > Journal d'audit.
- Cliquez sur Configurer les paramètres Syslog.
- Fournissez les informations de configuration suivantes :
- Destination : saisissez l'adresse IP de l'agent Bindplane.
- Protocole : sélectionnez UDP ou TCP, selon votre configuration Bindplane.
- Port : saisissez le numéro de port de l'agent Bindplane.
- Cliquez sur Tester les paramètres.
- Cliquez sur Enregistrer.
Table de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
alert_name |
security_result.summary |
La valeur de alert_name du journal brut est mappée sur security_result.summary . |
answers[].data |
network.dns.answers[].data |
La valeur de data pour chaque élément du tableau answers du journal brut est mappée au champ data de l'élément correspondant dans le tableau network.dns.answers . |
answers[].name |
network.dns.answers[].name |
La valeur de name pour chaque élément du tableau answers du journal brut est mappée au champ name de l'élément correspondant dans le tableau network.dns.answers . |
answers[].ttl |
network.dns.answers[].ttl |
La valeur de ttl pour chaque élément du tableau answers du journal brut est mappée au champ ttl de l'élément correspondant dans le tableau network.dns.answers . |
answers[].typeNum |
network.dns.answers[].type |
La valeur de typeNum pour chaque élément du tableau answers du journal brut est mappée au champ type de l'élément correspondant dans le tableau network.dns.answers . |
client_ip |
principal.ip |
La valeur de client_ip du journal brut est mappée sur principal.ip . |
cn1 |
security_result.rule_labels[].value |
La valeur de cn1 du journal brut est utilisée comme valeur pour un élément security_result.rule_labels avec la clé "Detection ID" (ID de détection). |
cn2 |
security_result.detection_fields[].value |
La valeur de cn2 du journal brut est utilisée comme valeur pour un élément security_result.detection_fields avec la clé "riskscore". |
cs1 |
security_result.rule_name |
La valeur de cs1 du journal brut est mappée sur security_result.rule_name . |
cs2 |
security_result.category_details[] |
La valeur de cs2 du journal brut est ajoutée en tant qu'élément au tableau security_result.category_details . |
description |
metadata.description |
La valeur de description du journal brut, après traitement (suppression des caractères de nouvelle ligne et des barres obliques inverses), est mappée sur metadata.description . Dans certains cas, d'autres champs du journal brut peuvent contribuer à ce champ ou le remplacer. |
details |
principal.resource.resource_subtype , security_result.summary , principal.ip |
Le champ details est analysé. La valeur associée à la clé "facility" est mappée sur principal.resource.resource_subtype . La valeur associée à la clé "details" est mappée sur security_result.summary . La valeur associée à la clé "src_ip" est mappée sur principal.ip . |
dst |
target.ip ou target.mac |
La valeur de dst du journal brut est mappée sur target.ip s'il s'agit d'une adresse IP ou sur target.mac s'il s'agit d'une adresse MAC. |
dst_ip |
target.ip |
La valeur de dst_ip du journal brut est mappée sur target.ip . |
eh_event |
metadata.event_type , network.application_protocol |
Si eh_event est défini sur "dns", metadata.event_type est défini sur NETWORK_DNS et network.application_protocol est défini sur DNS . Si eh_event est défini sur "RDP", metadata.event_type est défini sur NETWORK_CONNECTION et network.application_protocol est défini sur RDP . |
event_id |
metadata.product_event_type |
La valeur de event_id du journal brut est mappée sur metadata.product_event_type . |
facility |
principal.resource.resource_subtype |
La valeur de facility du journal brut est mappée sur principal.resource.resource_subtype . |
ipaddr |
principal.ip |
La valeur de ipaddr du journal brut est mappée sur principal.ip . |
jsonPayload.description |
metadata.product_event_type , principal.hostname , principal.asset.hostname , security_result.summary |
Le champ jsonPayload.description est analysé au format JSON. Le champ "operation" est mappé sur metadata.product_event_type . Le champ "event" (après suppression de " Audit Log") est mappé sur principal.hostname et principal.asset.hostname . Le champ "details" est mappé sur security_result.summary . |
jsonPayload.event |
metadata.product_event_type , principal.hostname , principal.asset.hostname |
La valeur de jsonPayload.event du journal brut (après suppression de " Audit Log") est mappée sur metadata.product_event_type , principal.hostname et principal.asset.hostname . |
jsonPayload.id |
metadata.product_log_id |
La valeur de jsonPayload.id du journal brut est mappée sur metadata.product_log_id . |
macaddr |
principal.mac |
La valeur de macaddr du journal brut est mappée sur principal.mac . |
name |
metadata.description |
La valeur de name du journal brut est mappée sur metadata.description . |
object_id |
target.resource.product_object_id |
La valeur de object_id du journal brut est mappée sur target.resource.product_object_id . |
object_name |
target.resource.name |
La valeur de object_name du journal brut est mappée sur target.resource.name . |
object_type |
target.resource.resource_type |
La valeur de object_type du journal brut (convertie en majuscules) est mappée sur target.resource.resource_type . |
operation |
metadata.product_event_type |
La valeur de operation du journal brut est mappée sur metadata.product_event_type . |
priority |
security_result.severity , security_result.severity_details |
Si priority est défini sur "notice", security_result.severity est défini sur MEDIUM et security_result.severity_details est défini sur la valeur de priority . |
product_event_type |
metadata.product_event_type |
La valeur de product_event_type du journal brut est mappée sur metadata.product_event_type . Elle est également utilisée pour déterminer le metadata.event_type et d'autres champs en fonction de sa valeur. |
qname |
network.dns.questions[].name |
La valeur de qname du journal brut est mappée au champ name d'un élément network.dns.questions . |
qname_or_host |
intermediary.hostname |
La valeur de qname_or_host du journal brut est mappée sur intermediary.hostname . |
qtype |
network.dns.questions[].type |
La valeur de qtype du journal brut est mappée au champ type d'un élément network.dns.questions , ce qui convertit la représentation de chaîne en son équivalent numérique en fonction des types d'enregistrements DNS. |
resource.labels.project_id |
target.resource.attribute.labels[].value |
La valeur de resource.labels.project_id du journal brut est utilisée comme valeur pour un élément target.resource.attribute.labels avec la clé "ID du projet". |
resource.type |
target.resource.resource_subtype |
La valeur de resource.type du journal brut est mappée sur target.resource.resource_subtype . |
rdp_record.clientBuild |
metadata.product_version |
La valeur de rdp_record.clientBuild du journal brut est mappée sur metadata.product_version . |
rdp_record.clientBytes |
network.sent_bytes |
La valeur de rdp_record.clientBytes du journal brut est mappée sur network.sent_bytes . |
rdp_record.clientName |
principal.hostname |
La valeur de rdp_record.clientName du journal brut est mappée sur principal.hostname . |
rdp_record.clientPort |
principal.port |
La valeur de rdp_record.clientPort du journal brut est mappée sur principal.port . |
rdp_record.cookie |
principal.user.userid |
La valeur de rdp_record.cookie (après suppression de "mstshash=") du journal brut est mappée sur principal.user.userid . |
rdp_record.proto |
network.ip_protocol |
La valeur de rdp_record.proto du journal brut est mappée sur network.ip_protocol , ce qui convertit "TCP" en "TCP" et "UDP" en "UDP". |
rdp_record.selectedProtocol |
security_result.description |
La valeur de rdp_record.selectedProtocol du journal brut est mappée sur security_result.description . |
rdp_record.serverBytes |
network.received_bytes |
La valeur de rdp_record.serverBytes du journal brut est mappée sur network.received_bytes . |
rdp_record.serverPort |
target.port |
La valeur de rdp_record.serverPort du journal brut est mappée sur target.port . |
rt |
metadata.event_timestamp |
La valeur de rt du journal brut est analysée en tant qu'horodatage et mappée sur metadata.event_timestamp . |
severity |
security_result.severity , security_result.severity_details , event.idm.is_alert , event.idm.is_significant |
La valeur de severity est mappée sur security_result.severity_details . Il est également utilisé pour déterminer la valeur de security_result.severity , event.idm.is_alert et event.idm.is_significant . |
src |
principal.ip ou principal.mac |
La valeur de src du journal brut est mappée sur principal.ip s'il s'agit d'une adresse IP ou sur principal.mac s'il s'agit d'une adresse MAC. |
src_ip |
principal.ip ou principal.mac |
La valeur de src_ip du journal brut est mappée sur principal.ip s'il s'agit d'une adresse IP ou sur principal.mac s'il s'agit d'une adresse MAC. |
summary |
security_result.summary |
La valeur de summary du journal brut est mappée sur security_result.summary . |
ts |
metadata.event_timestamp |
La valeur de ts du journal brut est analysée en tant qu'horodatage et mappée sur metadata.event_timestamp . |
user |
principal.user.userid |
La valeur de user du journal brut est mappée sur principal.user.userid . |
(N/A) | metadata.log_type |
Toujours défini sur "EXTRAHOP". |
(N/A) | metadata.vendor_name |
Toujours défini sur "EXTRAHOP". |
(N/A) | metadata.product_name |
Toujours défini sur "EXTRAHOP". |
(N/A) | security_result.severity |
Définissez la valeur sur CRITICAL par défaut, ou en fonction de la valeur de severity ou priority . |
(N/A) | event.idm.is_alert |
Définie sur true si security_result.severity est "HIGH" ou "CRITICAL". |
(N/A) | event.idm.is_significant |
Définie sur true si security_result.severity est "HIGH" ou "CRITICAL". |
(N/A) | metadata.event_type |
Déterminé en fonction des valeurs d'autres champs, tels que eh_event , product_event_type , has_principal et dst . La valeur par défaut est GENERIC_EVENT . |
(N/A) | network.application_protocol |
Définissez sur DNS si eh_event est "dns" ou si message contient "DNS Rebinding". Définie sur RDP si eh_event est "RDP". |
(N/A) | security_result.rule_labels[].key |
Définissez le libellé de la règle sur "ID de détection" pour qu'il soit dérivé de cn1 . |
(N/A) | security_result.detection_fields[].key |
Définissez sur "riskscore" pour le champ de détection dérivé de cn2 . |
(N/A) | principal.user.attribute.roles[].type |
Définie sur SERVICE_ACCOUNT si user_name est présent. |
(N/A) | extensions.auth.type |
Définissez sur SSO si product_event_type est défini sur "Erreurs d'authentification du client Kerberos". |
(N/A) | extensions.auth.mechanism |
Défini sur USERNAME_PASSWORD si product_event_type est "Unsafe LDAP Authentication" (Authentification LDAP non sécurisée) ou "Kerberos Client Auth Errors" (Erreurs d'authentification du client Kerberos). |
(N/A) | security_result.category |
Définissez sur NETWORK_SUSPICIOUS si product_event_type est "DNS Internal Reverse Lookup Scan" ou contient "Inbound Suspicious Connections". Définissez sur NETWORK_MALICIOUS si product_event_type est défini sur "Demande au serveur de base de données externe". |
(N/A) | network.http.response_code |
Défini en fonction de status_code extrait de product_event_type s'il correspond au modèle "HTTP Server %{INT:status_code} %{GREEDYDATA}". |
jsonPayload.cs1 |
security_result.detection_fields[].value |
La valeur de jsonPayload.cs1 du journal brut est utilisée comme valeur pour un élément security_result.detection_fields . |
jsonPayload.cn1 |
security_result.detection_fields[].value |
La valeur de jsonPayload.cn1 du journal brut est utilisée comme valeur pour un élément security_result.detection_fields . |
jsonPayload.cn2 |
security_result.detection_fields[].value |
La valeur de jsonPayload.cn2 du journal brut est utilisée comme valeur pour un élément security_result.detection_fields . |
jsonPayload.cs1Label , jsonPayload.cn1Label , jsonPayload.cn2Label |
security_result.detection_fields[].key |
Ces champs du journal brut sont utilisés comme clés pour les éléments correspondants dans security_result.detection_fields . |
jsonPayload.src |
principal.ip |
La valeur de jsonPayload.src du journal brut est mappée sur principal.ip . |
jsonPayload.dst |
target.ip |
La valeur de jsonPayload.dst du journal brut est mappée sur target.ip . |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.