Collecter les journaux Symantec VIP Authentication Hub

Compatible avec :

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

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Agents de collecte.
  3. 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

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres SIEM> Profil.
  3. Copiez et enregistrez le numéro client de la section Informations sur l'organisation.

Installer l'agent Bindplane

Installation de fenêtres

  1. Ouvrez l'invite de commandes ou PowerShell en tant qu'administrateur.
  2. Exécutez la commande suivante :

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Installation de Linux

  1. Ouvrez un terminal avec les droits root ou sudo.
  2. 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

  1. 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).
  2. 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
    
  3. Remplacez le port et l'adresse IP selon les besoins de votre infrastructure.

  4. Remplacez <customer_id> par le numéro client réel.

  5. 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

  1. Connectez-vous à l'interface utilisateur Web de votre Symantec VIP Gateway.
  2. Accédez à Journaux > Configuration Syslog.
  3. Si vous configurez Syslog pour la première fois, vous êtes invité à configurer les paramètres Syslog. Sélectionnez Oui.
  4. Si vous avez déjà configuré Syslog, cliquez sur Modifier en bas de la page.
  5. 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).
  6. Cliquez sur Enregistrer.
  7. Accédez à Fournisseurs d'identité> Configuration du portail en libre-service.
  8. Modifiez les informations de configuration suivantes :
    • Niveau de journalisation : sélectionnez Info.
    • Enable Syslog (Activer Syslog) : sélectionnez Yes (Oui).
  9. Cliquez sur Envoyer.
  10. Accédez à Fournisseurs d'identité > Configuration de l'authentification VIP Manager.
  11. Modifiez les informations de configuration suivantes :
    • Niveau de journalisation : sélectionnez Info.
    • Enable Syslog (Activer Syslog) : sélectionnez Yes (Oui).
  12. Cliquez sur Envoyer.
  13. Accédez à User Store > LDAP Directory Synchronization (Magasin d'utilisateurs > Synchronisation de l'annuaire LDAP).
  14. Modifiez les informations de configuration suivantes :
    • Niveau de journalisation : sélectionnez Info.
    • Enable Syslog (Activer Syslog) : sélectionnez Yes (Oui).
  15. 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.