Collecter les journaux de flux CrowdStrike Falcon
Ce document explique comment collecter les journaux CrowdStrike Falcon Stream à l'aide de Bindplane. L'analyseur extrait les paires clé-valeur et les met en correspondance avec le modèle de données unifié (UDM), gère différents séparateurs et enrichit les données avec un contexte supplémentaire, comme la gravité et les types d'événements. Il effectue également des transformations spécifiques pour certains types et champs d'événements, tels que les connexions utilisateur et les résultats de sécurité.
Avant de commencer
- Assurez-vous de disposer d'une instance Google Security Operations.
- Assurez-vous d'utiliser Windows 2016 ou une version ultérieure, ou un hôte Linux avec
systemd
. - Si vous exécutez l'application derrière un proxy, assurez-vous que les ports du pare-feu sont ouverts.
- Assurez-vous d'avoir un accès privilégié à la console CrowdStrike Falcon.
- Obtenez les identifiants de l'API pour Falcon Stream (ID client et code secret client).
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 le numéro client Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Profil.
- Copiez et sauvegardez le numéro client dans la section Détails de l'organisation.
Installer l'agent Bindplane
Installation de Windows
- Ouvrez l'invite de commande 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 des 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
Autres ressources d'installation
- Pour plus d'options d'installation, consultez ce guide d'installation.
Configurer l'agent Bindplane pour qu'il ingère les journaux Syslog et les envoie à 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 (
nano
,vi
ou Bloc-notes, par exemple).
- Recherchez le fichier
Modifiez le fichier
config.yaml
comme suit :receivers: tcplog: # Replace the port and IP address as required listen_address: "0.0.0.0:54525" 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: SYSLOG namespace: cs_stream raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - tcplog exporters: - chronicle/chronicle_w_labels
- Remplacez le port et l'adresse IP dans votre infrastructure si nécessaire.
- Remplacez
<customer_id>
par le numéro client réel. - Remplacez
/path/to/ingestion-authentication-file.json
par le chemin d'accès où le fichier d'authentification a été enregistré dans la section Obtenir le fichier d'authentification d'ingestion Google SecOps.
Redémarrer 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 et obtenir une clé API CrowdStrike
- Connectez-vous à CrowdStrike Falcon avec un compte privilégié.
- Accédez à Menu > Assistance.
- Cliquez sur Clients d'API > KeysSelect.
- Cliquez sur Ajouter un client API.
- Dans la section Champs d'application de l'API, sélectionnez Flux d'événements, puis activez l'option Lecture.
- Cliquez sur Ajouter.
- Copiez et enregistrez l'ID client, le code secret du client et l'URL de base.
Installer le connecteur Falcon SIEM
- Téléchargez le package d'installation RPM pour votre système d'exploitation.
Installation du package:
Système d'exploitation CentOS:
sudo rpm -Uvh <installer package>
Système d'exploitation Ubuntu:
sudo dpkg -i <installer package>
Répertoires d'installation par défaut:
- Connecteur SIEM Falcon :
/opt/crowdstrike/
. - Service :
/etc/init.d/cs.falconhoseclientd/
.
- Connecteur SIEM Falcon :
Configurer le connecteur SIEM pour transférer les événements vers Bindplane
- Connectez-vous à la machine avec le connecteur SIEM installé en tant qu'utilisateur
sudo
. - Accédez au répertoire
/opt/crowdstrike/etc/
. - Remplacement du nom
cs.falconhoseclient.leef.cfg
parcs.falconhoseclient.cfg
.- Le connecteur SIEM utilise la configuration
cs.falconhoseclient.cfg
par défaut.
- Le connecteur SIEM utilise la configuration
- Modifiez le fichier
cs.falconhoseclient.cfg
et modifiez ou définissez les paramètres suivants :api_url:
: votre URL de base CrowdStrike Falcon copiée à l'étape précédente.app_id:
: toute chaîne utilisée comme identifiant pour la connexion à l'API Falcon Streaming (par exemple, définie surapp_id: SECOPS-LEEF
).client_id:
: valeurclient_id
copiée à l'étape précédente.client_secret:
: valeurclient_secret
copiée à l'étape précédente.send_to_syslog_server: true
: activez le transfert vers le serveur Syslog.host:
: adresse IP ou nom d'hôte de l'agent Bindplane.port:
: port de l'agent Bindplane.
- Enregistrez le fichier
cs.falconhoseclient.cfg
. Démarrez le service du connecteur SIEM:
Système d'exploitation CentOS:
sudo service cs.falconhoseclientd start
Système d'exploitation Ubuntu 16.04 ou version ultérieure:
sudo systemctl start cs.falconhoseclientd.service
Facultatif: Arrêtez le service Connecteur SIEM:
Système d'exploitation CentOS:
sudo service cs.falconhoseclientd stop
Système d'exploitation Ubuntu 16.04 ou version ultérieure:
sudo systemctl stop cs.falconhoseclientd.service
Facultatif: redémarrez le service du connecteur SIEM:
Système d'exploitation CentOS:
sudo service cs.falconhoseclientd restart
Système d'exploitation Ubuntu 16.04 ou version ultérieure:
sudo systemctl restart cs.falconhoseclientd.service
Tableau de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
cat |
security_result.category_details |
La valeur du champ cat est mappée directement sur le champ security_result.category_details . |
commandLine |
target.process.command_line |
La valeur du champ commandLine est mappée directement sur le champ target.process.command_line . |
cs1 |
security_result.summary |
Si cs1Label est "incidentType", la valeur de cs1 est mappée sur security_result.summary . Sinon, il est mappé en tant que paire clé-valeur dans security_result.detection_fields avec la clé de cs1Label et la valeur de cs1 . |
cs1Label |
security_result.detection_fields.key |
Utilisé comme clé dans security_result.detection_fields lorsque cs1 n'est pas un type d'incident. |
cs2 |
security_result.detection_fields.value |
Mappé en tant que paire clé-valeur dans security_result.detection_fields avec la clé de cs2Label et la valeur de cs2 . |
cs2Label |
security_result.detection_fields.key |
Utilisé comme clé dans security_result.detection_fields avec cs2 . |
cs3 |
security_result.detection_fields.value |
Mappé en tant que paire clé-valeur dans security_result.detection_fields avec la clé de cs3Label et la valeur de cs3 . |
cs3Label |
security_result.detection_fields.key |
Utilisé comme clé dans security_result.detection_fields avec cs3 . |
cs4 |
security_result.about.url |
Si cs4Label est "falconHostLink", la valeur de cs4 est mappée sur security_result.about.url . Sinon, il est mappé en tant que paire clé-valeur dans security_result.detection_fields avec la clé de cs4Label et la valeur de cs4 . |
cs4Label |
security_result.detection_fields.key |
Utilisé comme clé dans security_result.detection_fields lorsque cs4 n'est pas un falconHostLink. |
description |
metadata.description |
La valeur du champ description est mappée directement sur le champ metadata.description . Si elle est vide, incidentDescription , msg ou serviceName sont utilisés à la place. |
devTime |
metadata.event_timestamp |
La valeur du champ devTime est analysée et mappée sur le champ metadata.event_timestamp . |
deviceCustomDate1 |
metadata.event_timestamp |
Si devTime n'est pas présent, la valeur du champ deviceCustomDate1 est analysée et mappée sur le champ metadata.event_timestamp . |
domain |
principal.administrative_domain |
Extrait du champ userName à l'aide d'une expression régulière et mappé sur principal.administrative_domain . |
duser |
principal.user.userid |
Si elle est présente, la valeur de duser écrase le champ usrName , puis est utilisée pour renseigner les champs utilisateur. |
endpointName |
security_result.detection_fields.value |
Mappé en tant que paire clé-valeur dans security_result.detection_fields avec la clé "endpointName". |
eventType |
metadata.product_event_type |
La valeur du champ eventType est mappée directement sur le champ metadata.product_event_type . |
falconHostLink |
security_result.about.url |
La valeur du champ falconHostLink est mappée directement sur le champ security_result.about.url . |
filePath |
target.process.file.full_path |
La valeur du champ filePath est mappée directement sur le champ target.process.file.full_path . |
identityProtectionIncidentId |
security_result.detection_fields.value |
Mappé en tant que paire clé-valeur dans security_result.detection_fields avec la clé "identityProtectionIncidentId". |
incidentDescription |
metadata.description |
Si description est vide, la valeur du champ incidentDescription est mappée sur le champ metadata.description . |
incidentType |
security_result.summary |
La valeur du champ incidentType est mappée directement sur le champ security_result.summary . |
log_type |
metadata.log_type |
La valeur du champ log_type est mappée directement sur le champ metadata.log_type . |
msg |
metadata.description |
Si description et incidentDescription sont vides, la valeur du champ msg est mappée sur le champ metadata.description . |
numbersOfAlerts |
security_result.detection_fields.value |
Mappé en tant que paire clé-valeur dans security_result.detection_fields avec la clé "numbersOfAlerts". |
numberOfCompromisedEntities |
security_result.detection_fields.value |
Mappé en tant que paire clé-valeur dans security_result.detection_fields avec la clé "numberOfCompromisedEntities". |
product |
metadata.product_name |
La valeur du champ product est mappée directement sur le champ metadata.product_name . |
resource |
target.resource.name |
La valeur du champ resource est mappée directement sur le champ target.resource.name . |
serviceName |
target.application |
La valeur du champ serviceName est mappée directement sur le champ target.application . Également utilisé comme solution de remplacement pour metadata.description . |
severityName |
security_result.severity |
La valeur du champ severityName est mappée sur le champ security_result.severity après avoir été mise en majuscules. La logique de mappage inclut des conversions spécifiques pour différents noms de gravité. |
sha256 |
target.file.sha256 |
La valeur du champ sha256 est mappée directement sur le champ target.file.sha256 . |
src |
principal.ip |
La valeur du champ src est mappée directement sur le champ principal.ip . |
srcMAC |
principal.mac |
La valeur du champ srcMAC est mappée directement sur le champ principal.mac après avoir remplacé les traits d'union par des deux-points. |
state |
security_result.detection_fields.value |
Mappé en tant que paire clé-valeur dans security_result.detection_fields avec la clé "state". |
success |
security_result.action |
Si success est défini sur "true", security_result.action est défini sur "ALLOW". Si success est défini sur "false", security_result.action est défini sur "BLOCK". |
userName |
principal.user.userid |
Si usrName n'est pas présent, la valeur du champ userName est utilisée pour renseigner les champs utilisateur. Le domaine est extrait, le cas échéant. |
usrName |
principal.user.userid /target.user.userid |
Si ce paramètre est présent, la valeur du champ usrName est mappée sur principal.user.userid ou target.user.userid , en fonction de eventType . S'il s'agit d'une adresse e-mail, elle est également ajoutée au champ email_addresses correspondant. |
vendor |
metadata.vendor_name |
La valeur du champ vendor est mappée directement sur le champ metadata.vendor_name . |
version |
metadata.product_version |
La valeur du champ version est mappée directement sur le champ metadata.product_version . |
(Logique de l'analyseur) | extensions.auth.mechanism |
Défini sur "USERNAME_PASSWORD" si eventType est "saml2Assert" ou "twoFactorAuthenticate". |
(Logique de l'analyseur) | extensions.auth.type |
Définissez-le sur "AUTHTYPE_UNSPECIFIED" si eventType est "assert" ou "userAuthenticate". |
(Logique de l'analyseur) | metadata.event_timestamp |
L'horodatage du champ collection_time ou timestamp du journal brut est utilisé comme code temporel de l'événement. |
(Logique de l'analyseur) | metadata.event_type |
Déterminé en fonction de eventType et d'autres champs. La valeur par défaut est "GENERIC_EVENT". Vous pouvez la remplacer par "USER_LOGIN", "GROUP_MODIFICATION", "GROUP_DELETION", "SERVICE_STOP", "SERVICE_START" ou "USER_UNCATEGORIZED". |
(Logique de l'analyseur) | target.resource.type |
Défini sur "GROUP" si eventType est "remove_group", "update_group" ou "delete_group". |
Modifications
2025-01-10
Amélioration :
- Lorsque "OperationBlocked" est défini sur "true", "security_result.action" est mappé sur "BLOCK".
- Lorsque "OperationBlocked" est défini sur "false", "security_result.action" est mappé sur "ALLOW".
- Lorsque "event_type" est "IdentityProtectionEvent", "event_data.IncidentDescription" est mappé sur "security_result.summary".
- Lorsque "event_type" est "IdentityProtectionEvent", mappez "event_data.SeverityName" sur "security_result.severity".
2025-01-09
Amélioration :
- "event_data.Technique" a été mappé sur "security_result.rule_name".
- "event_data.CommandLine" a été mappé sur "target.process.command_line".
- Si "event_data.IOCType" est "ipv4", mappez "event_data.IOCValue" sur "target.ip" et "target.asset.ip".
- Si "event_data.IOCType" est "hash_sha256", mappez "event_data.IOCValue" sur "target.file.sha256".
2024-12-12
Amélioration :
- Mappage de "event.SeverityName" sur "security_result.severity".
- "event.Description" a été mappé sur "security_result.summary".
- "security_result.action" mappé en fonction de "event.PatternDispositionFlags.OperationBlocked".
2024-10-29
Amélioration :
- Prise en charge du format JSON pour les journaux.
- Mappage de "request" sur "network.http.referral_url".
- Mappage de "networkDetectionType" sur "security_result.detection_fields".
2022-07-18
Amélioration :
- Ajout du mappage suivant pour les journaux au format LEEF:
- Le champ "version" a été mappé à "metadata.product_version".
- Les champs "usrName" et "userName" à "principal.user.email_addresses" s'il s'agit d'une adresse e-mail, sinon mappés sur "principal.user.userid".
- Le champ "severityName" a été mappé à "security_result.severity".
- Le champ "cat" a été mappé sur "security_result.category_details".
- Le champ "incidentType" a été mappé sur "security_result.summary".
- Le champ "falconHostLink" a été mappé sur "security_result.about.url".
- Le champ "numberOfCompromisedEntities" a été mappé sur "security_result.detection_fields[n]".
- Le champ "identityProtectionIncidentId" a été mappé sur "security_result.detection_fields[n]".
- Le champ "numbersOfAlerts" a été mappé sur "security_result.detection_fields[n]".
- Le champ "state" a été mappé sur "security_result.detection_fields[n]".
- Ajout du mappage suivant pour les journaux au format CEF:
- Le champ "version" a été mappé à "metadata.product_version".
- Le champ "deviceCustomDate1" a été mappé sur "metadata.event_type".
- Le champ "msg" a été mappé sur "metadata.description".
- Le champ "cs1" est mappé sur "security_result.summary" si la valeur de "cs1Label" est "incidentType", sinon il est mappé sur "security_result.detection_fields[n]".
- Le champ "cs2" a été mappé sur "security_result.detection_fields[n]".
- Le champ "cs3" a été mappé sur "security_result.detection_fields[n]".
- Le champ "cs1" est mappé sur "security_result.about.url" si la valeur de "cs4Label" est "falconHostLink", sinon il est mappé sur "security_result.detection_fields[n]".
- Le champ "cn1" a été mappé sur "security_result.detection_fields[n]".
- Le champ "cn2" a été mappé sur "security_result.detection_fields[n]".
- Le champ "cn3" a été mappé sur "security_result.detection_fields[n]".
- Le champ "duser" est mappé sur "principal.user.email_addresses" s'il s'agit d'une adresse e-mail, sinon sur "principal.user.userid".
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.