Collecter les journaux Symantec VIP Authentication Hub
Ce document explique comment ingérer les journaux Symantec VIP Authentication Hub dans Google Security Operations à l'aide de Bindplane. Le code du parseur nettoie et prétraite d'abord le message de journal d'entrée, en convertissant des champs spécifiques et en restructurant les données à partir de paires clé-valeur. Il extrait ensuite les informations pertinentes de différents champs à l'aide de modèles Grok et d'une logique conditionnelle, puis les mappe aux attributs correspondants dans le modèle de données unifié (UDM) pour une représentation standardisée des événements de sécurité.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
- Instance Google SecOps
- Hôte Windows 2016 ou version ultérieure, ou 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é au hub d'authentification Symantec VIP
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: 'SYMANTEC_VIP_AUTHHUB' 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
avec le chemin d'accès à l'emplacement 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 Symantec VIP Authentication Hub
- Connectez-vous à l'interface utilisateur Web de votre Symantec VIP Gateway.
- Accédez à Journaux > Configuration Syslog.
- Si vous configurez Syslog pour la première fois, vous êtes invité à configurer les paramètres Syslog. Sélectionnez Oui.
- Si vous avez déjà configuré Syslog, cliquez sur Modifier en bas de la page.
- Fournissez les informations de configuration suivantes :
- Syslog Facility (Fonctionnalité Syslog) : sélectionnez LOG_LOCAL0.
- Hôte Syslog : saisissez l'adresse IP de l'agent Bindplane.
- Port Syslog : saisissez le numéro de port de l'agent Bindplane (par exemple,
514
pour UDP).
- Cliquez sur Enregistrer.
- Accédez à Fournisseurs d'identité> Configuration du portail en libre-service.
- Modifiez les informations de configuration suivantes :
- Niveau de journalisation : sélectionnez Info.
- Enable Syslog (Activer Syslog) : sélectionnez Yes (Oui).
- Cliquez sur Envoyer.
- Accédez à Fournisseurs d'identité > Configuration de l'authentification VIP Manager.
- Modifiez les informations de configuration suivantes :
- Niveau de journalisation : sélectionnez Info.
- Enable Syslog (Activer Syslog) : sélectionnez Yes (Oui).
- Cliquez sur Envoyer.
- Accédez à User Store > LDAP Directory Synchronization (Magasin d'utilisateurs > Synchronisation de l'annuaire LDAP).
- Modifiez les informations de configuration suivantes :
- Niveau de journalisation : sélectionnez Info.
- Enable Syslog (Activer Syslog) : sélectionnez Yes (Oui).
- Cliquez sur Envoyer.
Table de mappage UDM
Champ du journal | Mappage UDM | Logique |
---|---|---|
/auth/v1/authenticate |
security_result.detection_fields[].value |
La valeur est extraite du champ /auth/v1/authenticate du journal brut et attribuée à un objet security_result.detection_fields avec la clé api . |
__isAuditIdLcmIdStore |
additional.fields[].value.string_value |
La valeur est extraite du champ __isAuditIdLcmIdStore du journal brut et attribuée à un objet additional.fields avec la clé __isAuditIdLcmIdStore . |
accessTokenScopes |
security_result.detection_fields[].value |
La valeur est extraite du champ accessTokenScopes du journal brut et attribuée à un objet security_result.detection_fields avec la clé accessTokenScopes . |
accessTokenTid |
security_result.detection_fields[].value |
La valeur est extraite du champ accessTokenTid du journal brut et attribuée à un objet security_result.detection_fields avec la clé accessTokenTid . |
api |
security_result.detection_fields[].value |
La valeur est extraite du champ api du journal brut et attribuée à un objet security_result.detection_fields avec la clé api . |
appId |
additional.fields[].value.string_value |
La valeur est extraite du champ appId du journal brut et attribuée à un objet additional.fields avec la clé appId . |
appName |
principal.application |
La valeur est extraite du champ appName du journal brut. |
azpName |
additional.fields[].value.string_value |
La valeur est extraite du champ azpName du journal brut et attribuée à un objet additional.fields avec la clé azpName . |
bytes_sent |
network.sent_bytes |
La valeur est extraite du champ bytes_sent du journal brut. |
client |
principal.asset.ip , principal.ip |
L'adresse IP est extraite du champ client du journal brut à l'aide d'un modèle Grok, puis ajoutée aux champs principal.ip et principal.asset.ip . |
clientId |
additional.fields[].value.string_value , principal.user.userid |
La valeur est extraite du champ clientId du journal brut et attribuée à un objet additional.fields avec la clé clientId . Si le champ clientId n'est pas vide, il est également utilisé pour remplir le champ principal.user.userid . |
clientIp |
principal.asset.ip , principal.ip |
La valeur est extraite du champ clientIp du journal brut et ajoutée aux champs principal.ip et principal.asset.ip . |
clientTid |
additional.fields[].value.string_value |
La valeur est extraite du champ clientTid du journal brut et attribuée à un objet additional.fields avec la clé clientTid . |
clientTxnId |
additional.fields[].value.string_value |
La valeur est extraite du champ clientTxnId du journal brut et attribuée à un objet additional.fields avec la clé clientTxnId . |
contentType |
additional.fields[].value.string_value |
La valeur est extraite du champ contentType du journal brut et attribuée à un objet additional.fields avec la clé contentType . |
countryISO |
principal.location.country_or_region |
La valeur est extraite du champ countryISO du journal brut. |
eventId |
metadata.product_event_type |
La valeur est extraite du champ eventId du journal brut. |
flowStateId |
additional.fields[].value.string_value |
La valeur est extraite du champ flowStateId du journal brut et attribuée à un objet additional.fields avec la clé flowStateId . |
geo.city_name |
principal.location.city |
La valeur est extraite du champ geo.city_name du journal brut. |
geo.country_name |
principal.location.country_or_region |
La valeur est extraite du champ geo.country_name du journal brut. |
geo.location.lat |
principal.location.region_coordinates.latitude |
La valeur est extraite du champ geo.location.lat du journal brut, convertie en float et renommée principal.location.region_coordinates.latitude . |
geo.location.lon |
principal.location.region_coordinates.longitude |
La valeur est extraite du champ geo.location.lon du journal brut, convertie en float et renommée principal.location.region_coordinates.longitude . |
guid |
metadata.product_log_id |
La valeur est extraite du champ guid du journal brut. |
host |
principal.asset.hostname , principal.hostname |
La valeur est extraite du champ host du journal brut, sans guillemets, et ajoutée aux champs principal.hostname et principal.asset.hostname . |
httpMethod |
network.http.method |
La valeur est extraite du champ httpMethod du journal brut. |
httpReferrer |
network.http.referral_url |
La valeur est extraite du champ httpReferrer du journal brut. |
identitySourceId |
additional.fields[].value.string_value |
La valeur est extraite du champ identitySourceId du journal brut et attribuée à un objet additional.fields avec la clé identitySourceId . |
internal-user-sync-ext-resourceGuid |
target.user.userid |
La valeur est extraite du champ internal-user-sync-ext-resourceGuid du journal brut. |
internal-user-sync-ext-resourceName |
target.user.email_addresses |
La valeur est extraite du champ internal-user-sync-ext-resourceName du journal brut et ajoutée au champ target.user.email_addresses . |
issuerUrl |
target.url |
La valeur est extraite du champ issuerUrl du journal brut. |
kubernetes.annotations.cni.projectcalico.org_containerID |
target.resource.product_object_id |
La valeur est extraite du champ kubernetes.annotations.cni.projectcalico.org_containerID du journal brut. |
kubernetes.annotations.cni.projectcalico.org_podIP |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.annotations.cni.projectcalico.org_podIP du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé podIP . |
kubernetes.annotations.cni.projectcalico.org_podIPs |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.annotations.cni.projectcalico.org_podIPs du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé podIPs . |
kubernetes.container_hash |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.container_hash du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé container_hash . |
kubernetes.container_image |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.container_image du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé container_image . |
kubernetes.container_name |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.container_name du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé container_name . |
kubernetes.docker_id |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.docker_id du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé docker_id . |
kubernetes.host |
principal.asset.hostname , principal.hostname |
La valeur est extraite du champ kubernetes.host du journal brut et ajoutée aux champs principal.hostname et principal.asset.hostname . |
kubernetes.labels.app |
Ce champ n'est pas mappé à l'objet IDM dans l'UDM. | |
kubernetes.labels.app.kubernetes.io/component |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.labels.app.kubernetes.io/component du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé io_component . |
kubernetes.labels.app.kubernetes.io/instance |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.labels.app.kubernetes.io/instance du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé io_instance . |
kubernetes.labels.app.kubernetes.io/managed-by |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.labels.app.kubernetes.io/managed-by du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé io_managed-by . |
kubernetes.labels.app.kubernetes.io/name |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.labels.app.kubernetes.io/name du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé io_name . |
kubernetes.labels.app.kubernetes.io/part-of |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.labels.app.kubernetes.io/part-of du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé io_part-of . |
kubernetes.labels.app.kubernetes.io/version |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.labels.app.kubernetes.io/version du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé io_version . |
kubernetes.labels.helm.sh/chart |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.labels.helm.sh/chart du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé helm_sh_chart . |
kubernetes.labels.helmChartName |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.labels.helmChartName du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé helmChartName . |
kubernetes.labels.imageTag |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.labels.imageTag du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé imageTag . |
kubernetes.labels.pod-template-hash |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.labels.pod-template-hash du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé pod-template-hash . |
kubernetes.namespace_name |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.namespace_name du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé namespace_name . |
kubernetes.pod_id |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.pod_id du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé pod_id . |
kubernetes.pod_name |
target.resource.attribute.labels[].value |
La valeur est extraite du champ kubernetes.pod_name du journal brut et attribuée à un objet target.resource.attribute.labels avec la clé pod_name . |
level |
security_result.severity |
Si le champ level du journal brut correspond à notice ou info (sans tenir compte de la casse), le champ security_result.severity est défini sur INFORMATIONAL . |
log |
security_result.description , level , kv_data |
Les champs level et kv_data sont extraits du champ log du journal brut à l'aide d'un modèle Grok. Le champ security_result.description est renseigné avec l'intégralité du champ log . |
logtag |
additional.fields[].value.string_value |
La valeur est extraite du champ logtag du journal brut et attribuée à un objet additional.fields avec la clé logtag . |
method |
network.http.method |
La valeur est extraite du champ method du journal brut. |
msg |
metadata.event_type , security_result.description |
La valeur est extraite du champ msg du journal brut et utilisée pour remplir le champ security_result.description . Le champ metadata.event_type est déterminé en fonction du contenu du champ msg : * USER_CREATION si msg contient Internal user created or updated . * USER_LOGIN si msg contient Authorization Initiated Succesfully , Authentication Initiated Successfully ou Authentication Successful . * USER_RESOURCE_ACCESS si msg contient Token Generated ou token verified . * NETWORK_CONNECTION si has_principal et has_target sont tous les deux vrais. * STATUS_UPDATE si has_principal est "true". * GENERIC_EVENT sinon. |
path |
principal.file.full_path |
La valeur est extraite du champ path du journal brut. |
principalId |
additional.fields[].value.string_value , principal.user.userid |
La valeur est extraite du champ principalId du journal brut et attribuée à un objet additional.fields avec la clé principalId . Si le champ principalId n'est pas clientId et n'est pas vide, il est également utilisé pour renseigner le champ principal.user.userid . |
principalType |
additional.fields[].value.string_value |
La valeur est extraite du champ principalType du journal brut et attribuée à un objet additional.fields avec la clé principalType . |
protocol |
network.application_protocol |
Si le champ protocol du journal brut correspond à HTTP (sans tenir compte de la casse), le champ network.application_protocol est défini sur HTTP . |
referrer |
network.http.referral_url |
La valeur est extraite du champ referrer du journal brut, sans guillemets, et attribuée au champ network.http.referral_url . |
relVersion |
metadata.product_version |
La valeur est extraite du champ relVersion du journal brut. |
remoteAddr |
additional.fields[].value.string_value |
La valeur est extraite du champ remoteAddr du journal brut et attribuée à un objet additional.fields avec la clé remoteAddr . |
requestId |
additional.fields[].value.string_value |
La valeur est extraite du champ requestId du journal brut et attribuée à un objet additional.fields avec la clé requestId . |
requestTime |
additional.fields[].value.string_value |
La valeur est extraite du champ requestTime du journal brut et attribuée à un objet additional.fields avec la clé requestTime . |
responseCode |
network.http.response_code |
La valeur numérique est extraite du champ responseCode du journal brut à l'aide d'un modèle Grok, convertie en entier et attribuée au champ network.http.response_code . |
request |
method , path , protocol |
Les champs method , path et protocol sont extraits du champ request du journal brut à l'aide d'un modèle Grok après suppression des guillemets. |
server |
target.asset.hostname , target.hostname |
La valeur est extraite du champ server du journal brut et ajoutée aux champs target.hostname et target.asset.hostname . |
service |
additional.fields[].value.string_value |
La valeur est extraite du champ service du journal brut et attribuée à un objet additional.fields avec la clé service . |
status |
network.http.response_code |
La valeur est extraite du champ status du journal brut, convertie en nombre entier et attribuée au champ network.http.response_code . |
stream |
additional.fields[].value.string_value |
La valeur est extraite du champ stream du journal brut et attribuée à un objet additional.fields avec la clé stream . |
sub |
additional.fields[].value.string_value |
La valeur est extraite du champ sub du journal brut et attribuée à un objet additional.fields avec la clé sub . |
subType |
additional.fields[].value.string_value |
La valeur est extraite du champ subType du journal brut et attribuée à un objet additional.fields avec la clé subType . |
tid |
additional.fields[].value.string_value |
La valeur est extraite du champ tid du journal brut et attribuée à un objet additional.fields avec la clé tid . |
timestamp |
metadata.event_timestamp |
La valeur est extraite du champ timestamp du journal brut et analysée en tant que code temporel ISO8601. |
tname |
additional.fields[].value.string_value |
La valeur est extraite du champ tname du journal brut et attribuée à un objet additional.fields avec la clé tname . |
txnId |
additional.fields[].value.string_value |
La valeur est extraite du champ txnId du journal brut et attribuée à un objet additional.fields avec la clé txnId . |
type |
additional.fields[].value.string_value |
La valeur est extraite du champ type du journal brut et attribuée à un objet additional.fields avec la clé type . |
userAgent |
network.http.parsed_user_agent , network.http.user_agent |
La valeur est extraite du champ userAgent du journal brut et attribuée aux champs network.http.user_agent et network.http.parsed_user_agent . Le champ network.http.parsed_user_agent est ensuite converti en objet user-agent analysé. |
userDN |
additional.fields[].value.string_value |
La valeur est extraite du champ userDN du journal brut et attribuée à un objet additional.fields avec la clé userDN . |
userGuid |
additional.fields[].value.string_value |
La valeur est extraite du champ userGuid du journal brut et attribuée à un objet additional.fields avec la clé userGuid . |
userIdpGuid |
additional.fields[].value.string_value |
La valeur est extraite du champ userIdpGuid du journal brut et attribuée à un objet additional.fields avec la clé userIdpGuid . |
userIP |
principal.asset.ip , principal.ip , target.asset.ip , target.ip et intermediary.ip |
Les adresses IP sont extraites du champ userIP du journal brut à l'aide d'un modèle Grok. La première adresse IP est ajoutée aux champs principal.ip et principal.asset.ip . La deuxième adresse IP est ajoutée aux champs target.ip et target.asset.ip . La troisième adresse IP est ajoutée au champ intermediary.ip . |
userLoginId |
target.user.email_addresses |
Si le champ userLoginId du journal brut n'est pas vide et correspond à un modèle d'adresse e-mail, il est ajouté au champ target.user.email_addresses . |
userLoginIdAttributeMappingName |
target.user.user_display_name |
La valeur est extraite du champ userLoginIdAttributeMappingName du journal brut. |
userRiskLevel |
additional.fields[].value.string_value |
La valeur est extraite du champ userRiskLevel du journal brut et attribuée à un objet additional.fields avec la clé userRiskLevel . |
userRiskScore |
additional.fields[].value.string_value |
La valeur est extraite du champ userRiskScore du journal brut et attribuée à un objet additional.fields avec la clé userRiskScore . |
userIp |
principal.asset.ip , principal.ip |
La valeur est extraite du champ userIp du journal brut et ajoutée aux champs principal.ip et principal.asset.ip . |
userUniversalId |
additional.fields[].value.string_value |
La valeur est extraite du champ userUniversalId du journal brut et attribuée à un objet additional.fields avec la clé userUniversalId . |
vhost |
additional.fields[].value.string_value |
La valeur est extraite du champ vhost du journal brut et attribuée à un objet additional.fields avec la clé vhost . |
N/A | extensions.auth.type |
La valeur est définie sur SSO si le champ metadata.event_type est USER_LOGIN . |
N/A | metadata.log_type |
La valeur est définie sur SYMANTEC_VIP_AUTHHUB . |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.