Collecter les journaux BloxOne Threat Defense
Ce document explique comment ingérer les journaux BloxOne Threat Defense dans Google Security Operations à l'aide de Bindplane. L'analyseur Logstash extrait les champs des journaux BLOXONE DNS
reçus au format SYSLOG ou JSON. Il normalise d'abord le message de journal dans un objet JSON, puis mappe les champs extraits au modèle de données unifié (UDM), en enrichissant les données avec des informations de géolocalisation et de DNS pour l'analyse de sécurité.
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, les ports du pare-feu sont ouverts.
- Accès privilégié à Infoblox BloxOne
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
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 :
- Recherchez le fichier
config.yaml
. En règle générale, il se trouve 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).
- Recherchez 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: '/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 ingestion_labels: log_type: 'BLOXONE' raw_log_field: body 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 Syslog dans Infoblox BloxOne
- Connectez-vous au portail Infoblox.
- Accédez à Configurer > Administration > Connecteur de données.
- Sélectionnez l'onglet Configuration de la destination.
- Cliquez sur Créer > Syslog.
- Fournissez les informations de configuration suivantes :
- Nom : donnez un nom descriptif (par exemple, "Collecteur Google SecOps").
- Description : saisissez une brève description.
- État : sélectionnez Activer.
- Tags : cliquez sur Ajouter et spécifiez les éléments suivants pour associer une clé à la destination :
- KEY : saisissez un nom descriptif pour la clé.
- VALUE : saisissez la valeur de la clé.
- Format : sélectionnez CEF.
- Protocole : sélectionnez UDP ou TCP (selon la configuration de votre agent Bindplane).
- Nom de domaine complet/Adresse IP : saisissez l'adresse IP de l'agent Bindplane.
- Port : saisissez le port de l'agent Bindplane (la valeur par défaut est définie sur
514
pour UDP).
- Cliquez sur Enregistrer et fermer.
Table de mappage UDM
Champ du journal | Mappage UDM | Logique |
---|---|---|
additional_list.key |
Ce champ est utilisé dans une boucle pour parcourir le tableau additional_list et extraire les données en fonction de la valeur du champ key . Il n'est pas directement mappé à l'UDM. |
|
additional_list.value |
principal.location.region_latitude , principal.location.region_longitude , target.location.region_latitude , target.location.region_longitude |
Ce champ est utilisé conjointement avec additional_list.key pour extraire des valeurs spécifiques du tableau additional_list . La logique d'extraction et de mappage de la valeur dépend de la key correspondante. Par exemple : – Si additional_list.key est intel:source:ip:geoIP:location , extrayez les valeurs de latitude et de longitude à l'aide de grok, puis mappez-les respectivement sur principal.location.region_latitude et principal.location.region_longitude . : si additional_list.key est intel:destination:ip:geoIP:location , extrayez les valeurs de latitude et de longitude à l'aide de grok et mappez-les respectivement sur target.location.region_latitude et target.location.region_longitude . |
additional_string.key |
Semblable à additional_list.key , ce champ est utilisé dans une boucle pour itérer sur le tableau additional_string et extraire les données en fonction de la valeur key . Il n'est pas directement mappé à l'UDM. |
|
additional_string.value |
additional.fields.value.string_value , principal.location.country_or_region , target.location.country_or_region , src.ip , src.port , src.hostname , network.ip_protocol |
Utilisé avec additional_string.key pour extraire des valeurs du tableau additional_string . La logique de mappage de la valeur dépend de la key correspondante. Par exemple : – Si additional_string.key est intel:source:ip:ip2asn:start_ip , intel:source:ip:ip2asn:finish_ip , intel:destination:ip:ip2asn:start_ip ou intel:destination:ip:ip2asn:finish_ip , mappez la valeur sur additional.fields.value.string_value avec la clé correspondante. : si additional_string.key est intel:source:ip:geoIP:country , mappez la valeur sur principal.location.country_or_region . : si additional_string.key est intel:destination:ip:geoIP:country , mappez la valeur sur target.location.country_or_region . : si additional_string.key est log:source:ip , mappez la valeur sur src.ip . : si additional_string.key est log:source:port , mappez la valeur sur src.port après l'avoir convertie en entier. : si additional_string.key est log:source:hostname , mappez la valeur sur src.hostname . : si additional_string.key est log:cdh:input:protocol , mappez la valeur sur network.ip_protocol après l'avoir convertie en majuscules. |
app_category |
security_result.category_details |
Mappé directement. |
confidence |
security_result.confidence |
Mappé selon la logique suivante : – Si confidence est LOW , mappez-le sur LOW_CONFIDENCE .: si confidence est MEDIUM , mappez sur MEDIUM_CONFIDENCE .: si confidence est HIGH , mappez sur HIGH_CONFIDENCE . |
country |
principal.location.name |
Mappé directement, mais uniquement si raw.infobloxb1region est vide. |
device |
principal.ip , principal.asset.ip |
Mappé directement, mais uniquement si raw.dvc est vide. |
dhcp_fingerprint |
security_result.detection_fields.value |
Mappé directement avec la clé dhcp_fingerprint . |
dns_view |
security_result.detection_fields.value |
Mappé directement avec la clé dns_view . |
endpoint_groups |
security_result.detection_fields.value |
Mappé directement avec la clé endpoint_groups . |
event_time |
metadata.event_timestamp.seconds |
Analysé en tant que code temporel ISO8601, la valeur en secondes est extraite. Utilisé uniquement si le champ timestamp est vide. |
feed_name |
principal.resource.name |
feed_name est mappé sur principal.resource.name . |
feed_type |
principal.resource.attribute.labels.value |
Mappé directement avec la clé feed_type . |
mac_address |
principal.mac |
Directement mappé après conversion en minuscules. |
network |
principal.hostname , principal.asset.hostname |
Mappé directement, mais uniquement si raw.dvchost et raw.dvc sont vides. |
os_version |
principal.platform_version |
Mappé directement. |
policy_action |
security_result.action_details , security_result.action |
policy_action est directement mappé sur security_result.action_details .security_result.action est dérivé selon la logique suivante :– Si policy_action est Redirect ou Log , mappez-le sur ALLOW .: si policy_action est BLOCK , mappez sur BLOCK . |
policy_name |
security_result.detection_fields.value |
Mappé directement avec la clé policy_name . |
qname |
network.dns.questions.name |
Mappé directement. |
qtype |
network.dns.questions.type |
Mappé selon la logique suivante : - Si qtype est A , mappez sur 1 (converti en entier non signé).: si qtype est défini sur PTR , mappez-le sur 12 (converti en entier non signé). |
raw.act |
security_result.action_details |
Mappé directement. |
raw.app |
network.application_protocol |
Mappé directement après la conversion en majuscules. |
raw.deviceeventclassid |
metadata.product_event_type |
Concaténé avec raw.name (séparé par - ) et mappé sur metadata.product_event_type . |
raw.devicevendor |
metadata.vendor_name |
Mappé directement. |
raw.deviceproduct |
metadata.product_name |
Mappé directement. |
raw.deviceversion |
metadata.product_version |
Mappé directement. |
raw.deviceseverity |
security_result.severity_details , security_result.severity |
raw.deviceseverity est directement mappé sur security_result.severity_details .security_result.severity est dérivé selon la logique suivante :– Si raw.deviceseverity est dans [0 , 1 , 2 , 3 ], mappez-le sur LOW .: si raw.deviceseverity est dans [4 , 5 , 6 ], mappez-le sur MEDIUM .: si raw.deviceseverity est dans [7 , 8 ], mappez sur HIGH .: si raw.deviceseverity est dans [9 , 10 ], mappez sur CRITICAL . |
raw.dvc |
principal.ip , principal.asset.ip |
Mappé directement. |
raw.dvchost |
principal.hostname , principal.asset.hostname |
Mappé directement, mais uniquement s'il n'est pas égal à raw.dvc . |
raw.infobloxb1connectiontype |
additional.fields.value.string_value |
Mappé directement avec la clé infobloxb1connectiontype . |
raw.infobloxb1ophname |
observer.hostname , observer.asset.hostname |
Mappé directement. |
raw.infobloxb1ophipaddress |
observer.ip |
Mappé directement. |
raw.infobloxb1policyname |
security_result.detection_fields.value |
Mappé directement avec la clé infobloxb1policyname . |
raw.infobloxdnsqclass |
dns_question.class , dns_answer.class |
Utilisé pour dériver dns_question.class et dns_answer.class en fonction d'une table de référence définie dans le fichier dns_query_class_mapping.include . |
raw.infobloxdnsqtype |
dns_question.type , dns_answer.type |
Utilisé pour dériver dns_question.type et dns_answer.type en fonction d'une table de référence définie dans le fichier dns_record_type.include . |
raw.infobloxdnsrcode |
network.dns.response_code |
Permet de dériver network.dns.response_code en fonction d'une table de référence définie dans le fichier dns_response_code.include . |
raw.infobloxpolicyid |
security_result.detection_fields.value |
Mappé directement avec la clé infobloxpolicyid . |
raw.msg |
metadata.description |
raw.msg est directement mappé sur metadata.description après suppression des guillemets de début et de fin. |
raw.name |
metadata.product_event_type |
Concaténé avec raw.deviceeventclassid (séparé par - ) et mappé sur metadata.product_event_type . |
rcode |
security_result.detection_fields.value , network.dns.response_code |
rcode est directement mappé sur security_result.detection_fields.value avec la clé rcode .Si rcode est NXDOMAIN , network.dns.response_code est défini sur 3 (converti en entier non signé). |
rdata |
network.dns.answers.data |
Mappé directement. |
rip |
target.ip , target.asset.ip |
Mappé directement. |
severity |
security_result.severity |
Mappé selon la logique suivante : - Si severity est INFO (sans tenir compte de la casse), mappez-le sur INFORMATIONAL .: si severity est HIGH , mappez sur HIGH . |
tclass |
security_result.detection_fields.value |
Mappé directement avec la clé tclass . |
threat_indicator |
security_result.detection_fields.value |
Mappé directement avec la clé threat_indicator . |
timestamp |
metadata.event_timestamp.seconds |
Analysé en tant que code temporel ISO8601, la valeur en secondes est extraite. |
user |
principal.user.user_display_name |
Mappé directement. |
user_groups |
security_result.detection_fields.value |
Mappé directement avec la clé user_groups . |
N/A | principal.resource.resource_subtype |
Définissez sur Feed si feed_name n'est pas vide. |
N/A | metadata.log_type |
Variable définie sur BLOXONE . |
N/A | additional.fields.key |
Définissez ce paramètre sur infobloxancount , infobloxarcount , infobloxb1connectiontype , infobloxnscount , intel:destination:ip:ip2asn:finish_ip , intel:destination:ip:ip2asn:start_ip , intel:source:ip:ip2asn:finish_ip ou intel:source:ip:ip2asn:start_ip en fonction des champs raw correspondants. |
N/A | metadata.event_type |
Définie sur STATUS_UPDATE si has_principal est true , sinon définie sur GENERIC_EVENT . |
N/A | network.dns.questions.type |
Définissez la valeur sur 1 pour les enregistrements A et sur 12 pour les enregistrements PTR , convertis en entier non signé. |
N/A | network.dns.answers.name , network.dns.answers.type , network.dns.answers.class |
Extrait de raw.msg en analysant la chaîne de réponse DNS. |
N/A | intermediary.hostname , intermediary.ip , intermediary.asset.ip |
Extrait de raw.msg en analysant la chaîne de réponse DNS. |
Remarque : Ce tableau n'inclut que les champs mappés au modèle de données unifié. Certains champs du journal brut peuvent être utilisés en interne par l'analyseur, mais ne sont pas directement reflétés dans la sortie UDM finale.
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.