Collecter les journaux Forcepoint Proxy
Ce document explique comment ingérer des journaux de proxy Forcepoint dans Google Security Operations à l'aide de Bindplane. Le parseur nettoie d'abord le message de journal d'entrée et extrait les paires clé-valeur à l'aide de modèles Grok et d'expressions régulières. Il mappe ensuite les champs extraits au modèle de données unifié (UDM) en fonction de conditions et de valeurs de champ spécifiques, en gérant différents formats de journaux et cas extrêmes pour assurer une représentation cohérente des données.
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 le programme derrière un proxy, assurez-vous que les ports du pare-feu sont ouverts.
- Assurez-vous de disposer d'un accès privilégié à Forcepoint Proxy.
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 ce 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: FORCEPOINT_WEBPROXY 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 Forcepoint Web Security Suite
- Connectez-vous à la console Forcepoint.
- Accédez à Web> Paramètres> Général.
- Cliquez sur Intégration SIEM.
- Cochez la case Activer l'intégration SIEM pour ce serveur de règles.
- Fournissez les informations de configuration suivantes :
- Adresse IP ou nom d'hôte : saisissez l'adresse IP de l'agent Bindplane.
- Numéro de port : saisissez le numéro de port configuré sur l'agent Bindplane (par exemple,
514
). - Protocole de transport : sélectionnez le protocole UDP.
- Format SIEM : sélectionnez Syslog/CEF (Arcsight).
- Cliquez sur OK.
- Cliquez sur Save and deploy (Enregistrer et déployer).
Table de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
action | security_result.summary | Si action_msg n'est pas vide, il est mappé à security_result.summary. Sinon, si l'action n'est pas vide, elle est mappée à security_result.summary. Sinon, si "act" n'est pas vide, il est mappé à security_result.summary. |
action_msg | security_result.summary | Si action_msg n'est pas vide, il est mappé à security_result.summary. Sinon, si l'action n'est pas vide, elle est mappée à security_result.summary. Sinon, si "act" n'est pas vide, il est mappé à security_result.summary. |
application | target.application | Si destinationServiceName n'est pas vide, il est mappé à app_name. Sinon, si l'application n'est pas vide et ne contient pas http ni HTTP , elle est mappée à app_name. Enfin, app_name est mappé à target.application. |
bytes_in | network.received_bytes | Si "in" n'est pas vide, il est mappé sur "bytes_in". Enfin, bytes_in est mappé sur network.received_bytes. |
bytes_out | network.sent_bytes | Si "out" n'est pas vide, il est mappé à "bytes_out". Enfin, bytes_out est mappé sur network.sent_bytes. |
cat | security_result.category_details | Si cat n'est pas vide, il est mappé à la catégorie. Enfin, la catégorie est mappée à security_result.category_details. |
cn1 | security_result.detection_fields.value | Si cn1 n'est pas vide, il est mappé à security_result.detection_fields.value avec la clé Disposition Number . |
ContentType | target.file.mime_type | Si contentType n'est pas vide, il est mappé à ContentType. Enfin, ContentType est mappé sur target.file.mime_type. |
cs1 | target_role.description | cs1 est mappé à target_role.description. |
cs2 | security_result.category_details | Si cs2 n'est pas vide et n'est pas 0 , il est mappé à security_result.category_details avec le préfixe Dynamic Category: . |
cs3 | target.file.mime_type | cs3 est mappé sur target.file.mime_type. |
description | metadata.description | Si la description n'est pas vide, elle est mappée sur metadata.description. |
destinationServiceName | target.application | Si destinationServiceName n'est pas vide, il est mappé à app_name. Enfin, app_name est mappé à target.application. |
deviceFacility | metadata.product_event_type | Si product_event et deviceFacility ne sont pas vides, ils sont concaténés avec - et mappés à metadata.product_event_type. Sinon, product_event est mappé à metadata.product_event_type. |
disposition | security_result.detection_fields.value | Si la disposition n'est pas vide, elle est mappée à security_result.detection_fields.value avec la clé Disposition Number . |
dst | target.ip | Si "dst" n'est pas vide et que "dvchost" l'est, il est mappé sur "dst_ip". Enfin, dst_ip est mappé sur target.ip. |
dst_host | target.hostname | Si "dst" n'est pas vide et que "dvchost" est vide, il est mappé sur "dst_host". Enfin, dst_host est mappé à target.hostname. |
dst_ip | target.ip | Si "dst" n'est pas vide et que "dvchost" l'est, il est mappé sur "dst_ip". Enfin, dst_ip est mappé sur target.ip. |
dst_port | target.port | Si "dst" n'est pas vide et que "dvchost" est vide, il est mappé à "dst_port". Enfin, dst_port est mappé sur target.port. |
duration | network.session_duration.seconds | Si la durée n'est pas vide et n'est pas 0 , elle est mappée sur network.session_duration.seconds. |
dvchost | intermediary.ip | Si dvchost n'est pas vide, il est mappé sur int_ip. Enfin, int_ip est mappé à intermediary.ip s'il s'agit d'une adresse IP valide, sinon il est mappé à intermediary.hostname. |
file_path | target.file.full_path | Si file_path n'est pas vide, il est mappé sur target.file.full_path. |
hôte | principal.ip | Si l'hôte n'est pas vide, il est mappé à src. Enfin, "src" est mappé sur "principal.ip". |
http_method | network.http.method | Si requestMethod n'est pas vide, il est mappé sur http_method. Sinon, si la méthode n'est pas vide, elle est mappée sur http_method. Enfin, http_method est mappé sur network.http.method. |
http_proxy_status_code | network.http.response_code | Si http_response est vide, ou si sa valeur est 0 ou - , et que http_proxy_status_code n'est pas vide, il est mappé sur network.http.response_code. |
http_response | network.http.response_code | Si http_response n'est pas vide, n'est pas 0 et n'est pas - , il est mappé à network.http.response_code. |
http_user_agent | network.http.user_agent | Si http_user_agent n'est pas vide et n'est pas - , il est mappé à network.http.user_agent. |
dans | network.received_bytes | Si "in" n'est pas vide, il est mappé sur "bytes_in". Enfin, bytes_in est mappé sur network.received_bytes. |
int_host | intermediary.hostname | Si int_ip n'est pas vide et que int_host n'est pas vide et est différent de int_ip, il est mappé à intermediary.hostname. |
int_ip | intermediary.ip | Si dvchost n'est pas vide, il est mappé sur int_ip. Enfin, int_ip est mappé à intermediary.ip s'il s'agit d'une adresse IP valide, sinon il est mappé à intermediary.hostname. |
level | target_role.name | Si le niveau n'est pas vide et que le rôle est vide, il est mappé au rôle. Enfin, le rôle est mappé à target_role.name. |
log_level | security_result.severity | Si la gravité est définie sur 1 , si log_level contient info ou si message contient notice , security_result.severity est défini sur INFORMATIONAL . Si la gravité est 7 , security_result.severity est défini sur HIGH . |
loginID | principal.user.userid | Si loginID n'est pas vide, il est mappé à l'utilisateur. Enfin, si l'utilisateur n'est pas vide, n'est pas - et ne contient pas LDAP , il est mappé à principal.user.userid. |
méthode | network.http.method | Si requestMethod n'est pas vide, il est mappé sur http_method. Sinon, si la méthode n'est pas vide, elle est mappée sur http_method. Enfin, http_method est mappé sur network.http.method. |
NatRuleId | security_result.detection_fields.value | Si NatRuleId n'est pas vide, il est mappé à security_result.detection_fields.value avec la clé NatRuleId . |
interprétés. | network.sent_bytes | Si "out" n'est pas vide, il est mappé à "bytes_out". Enfin, bytes_out est mappé sur network.sent_bytes. |
pid | target.process.pid | Si pid n'est pas vide, il est mappé à target.process.pid. |
stratégie | target_role.description | Si la règle n'est pas vide, elle est mappée à la règle. Si la règle n'est pas vide et n'est pas - , elle est mappée sur target_role.description. |
Règle | target_role.description | Si la règle n'est pas vide, elle est mappée à la règle. Si la règle n'est pas vide et n'est pas - , elle est mappée sur target_role.description. |
product_event | metadata.product_event_type | Si le produit n'est pas vide, il est mappé à product_event. Si product_event et deviceFacility ne sont pas vides, ils sont concaténés avec - et mappés à metadata.product_event_type. Sinon, product_event est mappé à metadata.product_event_type. |
proxyStatus-code | network.http.response_code | Si http_response est vide ou 0 ou - , et que http_proxy_status_code est vide et que proxyStatus-code n'est pas vide, il est mappé à network.http.response_code. |
refererUrl | network.http.referral_url | Si refererUrl n'est pas vide et n'est pas - , il est mappé sur network.http.referral_url. |
requestClientApplication | network.http.user_agent | Si requestMethod n'est pas vide, il est mappé à http_user_agent. Enfin, http_user_agent est mappé sur network.http.user_agent. |
requestMethod | network.http.method | Si requestMethod n'est pas vide, il est mappé sur http_method. Enfin, http_method est mappé sur network.http.method. |
rôle | target_role.name | Si le niveau n'est pas vide et que le rôle est vide, il est mappé au rôle. Enfin, le rôle est mappé à target_role.name. |
RuleID | security_result.rule_id | Si RuleID n'est pas vide, il est mappé à security_result.rule_id. |
serverStatus-code | network.http.response_code | Si http_response est vide ou 0 ou - , et que http_proxy_status_code est vide et que proxyStatus-code n'est pas vide, il est mappé à network.http.response_code. |
de gravité, | security_result.severity | Si la gravité est définie sur 1 , si log_level contient info ou si message contient notice , security_result.severity est défini sur INFORMATIONAL . Si la gravité est 7 , security_result.severity est défini sur HIGH . |
spt | principal.port | Si spt n'est pas vide, il est mappé à src_port. Enfin, src_port est mappé sur principal.port. |
src | principal.ip | Si src_host n'est pas vide, il est mappé sur source_ip_temp. Si source_ip_temp est une adresse IP valide et que src est vide, elle est mappée à src. Si l'hôte n'est pas vide, il est mappé à src. Enfin, "src" est mappé sur "principal.ip". |
src_host | principal.hostname | Si src_host n'est pas vide, il est mappé sur source_ip_temp. Si source_ip_temp n'est pas une adresse IP valide, elle est mappée sur principal.hostname. Si source_ip_temp est une adresse IP valide et que src est vide, elle est mappée à src. Enfin, "src" est mappé sur "principal.ip". |
src_port | principal.port | Si src_port n'est pas vide, il est mappé à principal.port. |
suser | principal.user.userid | Si loginID n'est pas vide, il est mappé à l'utilisateur. Si suser n'est pas vide, il est mappé à user. Enfin, si l'utilisateur n'est pas vide, n'est pas - et ne contient pas LDAP , il est mappé à principal.user.userid. |
url | target.url | Si l'URL n'est pas vide, elle est mappée sur target.url. |
utilisateur | principal.user.userid | Si loginID n'est pas vide, il est mappé à l'utilisateur. Si suser n'est pas vide, il est mappé à user. Sinon, si usrName n'est pas vide, il est mappé à l'utilisateur. Enfin, si l'utilisateur n'est pas vide, n'est pas - et ne contient pas LDAP , il est mappé à principal.user.userid. |
usrName | principal.user.userid | Si loginID n'est pas vide, il est mappé à l'utilisateur. Si suser n'est pas vide, il est mappé à user. Sinon, si usrName n'est pas vide, il est mappé à l'utilisateur. Enfin, si l'utilisateur n'est pas vide, n'est pas - et ne contient pas LDAP , il est mappé à principal.user.userid. |
date | metadata.event_timestamp | Si "when" n'est pas vide, il est analysé et mis en correspondance avec metadata.event_timestamp. |
metadata.log_type | La valeur FORCEPOINT_WEBPROXY est codée en dur dans metadata.log_type. |
|
metadata.product_name | La valeur Forcepoint Webproxy est codée en dur dans metadata.product_name. |
|
metadata.vendor_name | La valeur Forcepoint est codée en dur dans metadata.vendor_name. |
|
network.application_protocol | Si dst_port est défini sur 80 , network.application_protocol est défini sur HTTP . Si dst_port est défini sur 443 , network.application_protocol est défini sur HTTPS . |
|
principal.user.group_identifiers | Si l'utilisateur n'est pas vide, n'est pas - et contient LDAP , la partie UO de la chaîne utilisateur est extraite et mappée à principal.user.group_identifiers. |
|
principal.user.user_display_name | Si l'utilisateur n'est pas vide, n'est pas - et contient LDAP , la partie nom d'utilisateur de la chaîne utilisateur est extraite et mappée à principal.user.user_display_name. |
|
security_result.action | Si action_msg, action ou act ne sont pas vides, sec_action est défini sur ALLOW ou BLOCK en fonction de leurs valeurs. Enfin, sec_action est mappé à security_result.action. |
|
security_result.category_details | Si cat n'est pas vide, il est mappé à la catégorie. Enfin, la catégorie est mappée à security_result.category_details. Si cs2 n'est pas vide et n'est pas 0 , il est mappé à security_result.category_details avec le préfixe Dynamic Category: . |
|
security_result.detection_fields.key | La valeur Disposition Number est codée en dur dans security_result.detection_fields.key lors du mappage de l'état ou de cn1. La valeur NatRuleId est codée en dur dans security_result.detection_fields.key lors du mappage de NatRuleId. La valeur Category Number est codée en dur dans security_result.detection_fields.key lors du mappage de category_no. |
|
security_result.severity | Si la gravité est définie sur 1 , si log_level contient info ou si message contient notice , security_result.severity est défini sur INFORMATIONAL . Si la gravité est 7 , security_result.severity est défini sur HIGH . |
|
target_role.description | Si la règle n'est pas vide, elle est mappée à la règle. Si la règle n'est pas vide et n'est pas - , elle est mappée sur target_role.description. |
|
target_role.name | Si le niveau n'est pas vide et que le rôle est vide, il est mappé au rôle. Enfin, le rôle est mappé à target_role.name. | |
category_no | security_result.detection_fields.value | Si category_no n'est pas vide, il est mappé à security_result.detection_fields.value avec la clé Category Number . |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.