Collecter les journaux du proxy Forcepoint
Ce document explique comment ingérer les journaux du proxy Forcepoint dans Google Security Operations à l'aide de Bindplane. L'analyseur 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 sur le 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 particuliers 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 l'application derrière un proxy, assurez-vous que les ports du pare-feu sont ouverts.
- Assurez-vous de disposer d'un accès privilégié au proxy Forcepoint.
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: 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 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é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 du 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 Enregistrer et déployer.
Tableau de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
action | security_result.summary | Si action_msg n'est pas vide, il est mappé sur security_result.summary. Sinon, si "action" n'est pas vide, il est mappé sur "security_result.summary". Sinon, si act n'est pas vide, il est mappé sur security_result.summary. |
action_msg | security_result.summary | Si action_msg n'est pas vide, il est mappé sur security_result.summary. Sinon, si "action" n'est pas vide, il est mappé sur "security_result.summary". Sinon, si act n'est pas vide, il est mappé sur security_result.summary. |
application | target.application | Si destinationServiceName n'est pas vide, il est mappé sur app_name. Sinon, si l'app n'est pas vide et ne contient pas http ou HTTP , elle est mappée sur app_name. Enfin, app_name est mappé sur 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é sur "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 sur security_result.category_details. |
cn1 | security_result.detection_fields.value | Si cn1 n'est pas vide, il est mappé sur security_result.detection_fields.value avec la clé Disposition Number . |
ContentType | target.file.mime_type | Si contentType n'est pas vide, il est mappé sur ContentType. Enfin, ContentType est mappé sur target.file.mime_type. |
cs1 | target_role.description | cs1 est mappé sur target_role.description. |
cs2 | security_result.category_details | Si cs2 n'est pas vide et n'est pas 0 , il est mappé sur 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 valeur de description n'est pas vide, elle est mappée sur metadata.description. |
destinationServiceName | target.application | Si destinationServiceName n'est pas vide, il est mappé sur app_name. Enfin, app_name est mappé sur target.application. |
deviceFacility | metadata.product_event_type | Si product_event et deviceFacility ne sont pas vides, ils sont concatenatés avec - et mappés sur metadata.product_event_type. Sinon, product_event est mappé sur metadata.product_event_type. |
disposition | security_result.detection_fields.value | Si "disposition" n'est pas vide, il est mappé sur security_result.detection_fields.value avec la clé Disposition Number . |
dst | target.ip | Si "dst" n'est pas vide et que "dvchost" est vide, 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é sur target.hostname. |
dst_ip | target.ip | Si "dst" n'est pas vide et que "dvchost" est vide, 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é sur "dst_port". Enfin, le port de destination est mappé sur le port cible. |
duration | network.session_duration.seconds | Si la valeur de "duration" 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é sur intermediary.ip s'il s'agit d'une adresse IP valide, sinon il est mappé sur 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é sur "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 valeur de "method" 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 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, ni 0 , ni - , il est mappé sur 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é sur 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 différent de int_ip, il est mappé sur intermediary.hostname. |
int_ip | intermediary.ip | Si dvchost n'est pas vide, il est mappé sur int_ip. Enfin, int_ip est mappé sur intermediary.ip s'il s'agit d'une adresse IP valide, sinon il est mappé sur intermediary.hostname. |
level | target_role.name | Si le niveau n'est pas vide et que le rôle est vide, il est mappé sur le rôle. Enfin, le rôle est mappé sur target_role.name. |
log_level | security_result.severity | Si la gravité est 1 , si le niveau de journalisation contient info ou si le message contient notice , la valeur security_result.severity est définie 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'attribut "user" n'est pas vide, n'est pas - et ne contient pas LDAP , il est mappé sur principal.user.userid. |
méthode | network.http.method | Si requestMethod n'est pas vide, il est mappé sur http_method. Sinon, si la valeur de "method" 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é sur security_result.detection_fields.value avec la clé NatRuleId . |
interprétés. | network.sent_bytes | Si "out" n'est pas vide, il est mappé sur "bytes_out". Enfin, bytes_out est mappé sur network.sent_bytes. |
pid | target.process.pid | Si le PID n'est pas vide, il est mappé sur target.process.pid. |
stratégie | target_role.description | Si "Policy" n'est pas vide, il est mappé à la règle. Si la valeur de 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 "Policy" n'est pas vide, il est mappé à la règle. Si la valeur de 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 "product" n'est pas vide, il est mis en correspondance avec "product_event". Si product_event et deviceFacility ne sont pas vides, ils sont concatenatés avec - et mappés sur metadata.product_event_type. Sinon, product_event est mappé sur 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é sur 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é sur 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é sur le rôle. Enfin, le rôle est mappé sur target_role.name. |
RuleID | security_result.rule_id | Si RuleID n'est pas vide, il est mappé sur 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é sur network.http.response_code. |
de gravité, | security_result.severity | Si la gravité est 1 , si le niveau de journalisation contient info ou si le message contient notice , la valeur security_result.severity est définie 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é sur 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 sur src. Si l'hôte n'est pas vide, il est mappé sur "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 sur src. Enfin, "src" est mappé sur "principal.ip". |
src_port | principal.port | Si src_port n'est pas vide, il est mappé sur 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'attribut "user" n'est pas vide, n'est pas - et ne contient pas LDAP , il est mappé sur 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é sur "user". Enfin, si l'attribut "user" n'est pas vide, n'est pas - et ne contient pas LDAP , il est mappé sur 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é sur "user". Enfin, si l'attribut "user" n'est pas vide, n'est pas - et ne contient pas LDAP , il est mappé sur principal.user.userid. |
date | metadata.event_timestamp | Si "when" n'est pas vide, il est analysé et mappé sur 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 80 , network.application_protocol est défini sur HTTP . Si dst_port est 443 , network.application_protocol est défini sur HTTPS . |
|
principal.user.group_identifiers | Si l'attribut "user" n'est pas vide, n'est pas - et contient LDAP , la partie "UO" de la chaîne utilisateur est extraite et mappée sur principal.user.group_identifiers. |
|
principal.user.user_display_name | Si l'attribut "user" n'est pas vide, n'est pas - et contient LDAP , la partie du nom d'utilisateur de la chaîne utilisateur est extraite et mappée sur 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é sur 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 sur security_result.category_details. Si cs2 n'est pas vide et n'est pas 0 , il est mappé sur 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 la disposition 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 de la mise en correspondance de category_no. |
|
security_result.severity | Si la gravité est 1 , si le niveau de journalisation contient info ou si le message contient notice , la valeur security_result.severity est définie sur INFORMATIONAL . Si la gravité est 7 , security_result.severity est défini sur HIGH . |
|
target_role.description | Si "Policy" n'est pas vide, il est mappé à la règle. Si la valeur de 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é sur le rôle. Enfin, le rôle est mappé sur target_role.name. | |
category_no | security_result.detection_fields.value | Si category_no n'est pas vide, il est mappé sur security_result.detection_fields.value avec la clé Category Number . |
Modifications
2025-01-16
Amélioration :
- Mappage de
security_result.action
surBLOCK
lorsques-action
estTCP_DENIED
.
2024-10-18
Amélioration :
- Ajout de la possibilité d'analyser les journaux CSV non analysés.
- Ajout de la possibilité de supprimer les journaux CSV non valides.
- Mappage de
host-url
surprincipal.url
.
2024-07-10
Amélioration :
- Ajout des modèles Grok pour les nouveaux journaux au format KV.
- Mappage de
username
surprincipal.user.userid
. - Mappage de
cs-uri
surtarget.url
. cs-uri-query
,time-taken
,filter-category
,cs-uri-path
,cs-uri-extension
etrs_content_type
ont été mappés suradditional.fields
.- Si
sc-filter-result
estOBSERVED
, définissezsecurity_result.action
surALLOW
. Sinon, sisc-filter-result
estDENIED
, définissezsecurity_result.action
surBLOCK
. Sinon, définissezsecurity_result.action
surALLOW
. - Mappage de
cs-auth-group
surprincipal.user_group_identifiers
. - Mappage de
cs-method
surnetwork.http.method
. - Mappage de
sc-status
surresponse_code
. - Mappage de
s-action
sursecurity_result.detection_fields
. - Mappage de
srcport
surprincipal.port
. - Mappage de
dstport
surtarget.port
. - Mappage de
sc-bytes
surnetwork.received_bytes
. - Mappage de
cs-bytes
surnetwork.sent_bytes
. - Mappage de
cs
sursecurity_result.summary
. - Mappage de
cs_referer
surnetwork.http.referral_url
. - Mappage de
cs-host
surtarget.hostname
.
2024-06-10
Amélioration :
- Prise en charge des journaux au format CSV.
2023-06-12
Amélioration :
- Modèle Grok modifié pour analyser les journaux d'erreur dans lesquels certaines valeurs sont présentes sous la forme "-".
- Ajout d'une vérification de condition pour le champ "http_response" avant le mappage.
2022-08-11
Amélioration :
- Modification de grok pour analyser les journaux de type CEF sans en-tête syslog.
2022-05-16
Amélioration :
- Numéro de catégorie mappé sur security_result.detection_fields.
2022-05-05
Amélioration :
- Ajout de mappage pour les champs:
requestClientApplication
à http.user_agent,proxyStatus-code
à http.response_code,disposition
etcn1
à security_result.detection_fields. - Champ "cs2" mappé sur "security_result.category_details" si la valeur de "cs2Label" est "DynCat".
- Champ "cs2" mappé sur "security_result.detection_fields" si la valeur de "cs2Label" est "NatRuleId".
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.