Collecter les journaux Symantec CloudSOC CASB
Ce document explique comment ingérer des journaux Symantec CloudSOC CASB dans Google Security Operations à l'aide de l'agent Bindplane.
Symantec CloudSOC est un agent de sécurité des accès au cloud (CASB) qui génère des messages syslog pour l'activité des applications cloud, les cas de non-respect des règles DLP, les détections de menaces, les résultats d'inspection du contenu et les événements d'accès des utilisateurs. L'analyseur extrait les champs des journaux au format JSON et syslog, puis les mappe au modèle de données unifié (UDM).
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Une instance Google SecOps
- Windows Server 2016 ou version ultérieure, ou hôte Linux avec
systemd - Connectivité réseau entre l'agent BindPlane et l'hôte Symantec CloudSOC
- Si vous exécutez l'agent derrière un proxy, assurez-vous que les ports de pare-feu sont ouverts conformément aux exigences de l'agent BindPlane.
- Accès administrateur à l'hôte Symantec CloudSOC
Obtenir des identifiants Google SecOps pour l'agent BindPlane
Pour authentifier l'agent Bindplane auprès de Google SecOps, choisissez l'une des méthodes suivantes :
- Nouveaux déploiements : utilisez l'API Chronicle (option 1).
- Anciens déploiements : continuez à utiliser le fichier d'authentification d'ingestion (option 2) jusqu'à l'arrêt de l'API Ingestion le 20 juillet 2027.
Option 1 : Créer un compte de service pour l'API Chronicle (recommandé)
- Connectez-vous à la consoleGoogle Cloud et sélectionnez le projet Google Cloud associé à votre instance Google SecOps.
- Accédez à IAM et administration > Comptes de service.
- Cliquez sur Créer un compte de service.
- Fournissez les informations de configuration suivantes :
- Nom du compte de service : saisissez un nom pour le compte (par exemple,
bindplane-ingest). - Description du compte de service : saisissez une description (par exemple,
Bindplane agent log ingestion).
- Nom du compte de service : saisissez un nom pour le compte (par exemple,
- Cliquez sur Créer et continuer.
- Dans la section Autoriser ce compte de service à accéder au projet, cliquez sur Sélectionner un rôle, puis sélectionnez Éditeur Chronicle.
- Cliquez sur Continue (Continuer), puis sur Done (OK).
- Cliquez sur le compte de service que vous avez créé, puis accédez à l'onglet Clés.
- Cliquez sur Ajouter une clé > Créer une clé.
- Sélectionnez JSON, puis cliquez sur Créer. Le fichier de clé est téléchargé sur votre ordinateur.
- Enregistrez le fichier de clé sous le nom
ingestion-auth.jsondans le répertoire du collecteur Bindplane (/opt/observiq-otel-collector/ingestion-auth.jsonsous Linux ouC:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.jsonsous Windows), ou mettez à jourcreds_file_pathdansconfig.yamlpour qu'il corresponde au chemin d'accès où vous l'enregistrez. - Accédez à IAM et administration > Paramètres, puis copiez le numéro du projet. Vous en aurez besoin pour configurer l'exportateur.
Option 2 : Télécharger le fichier d'authentification d'ingestion (ancien)
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres > Gestion des données > Agents de collecte. Si vous utilisez une plate-forme SIEM uniquement, accédez à Paramètres > 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 où l'agent BindPlane sera installé.
Obtenir le numéro client Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres > Administration > Profil. Si vous utilisez une plate-forme SIEM uniquement, accédez à Paramètres > Profil.
Copiez et enregistrez le numéro client de la section Détails de l'organisation.
Installer l'agent BindPlane
Installez l'agent BindPlane sur votre système d'exploitation Windows ou Linux en suivant les instructions ci-dessous.
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" /quietAttendez que l'installation se termine.
Vérifiez l'installation en exécutant la commande suivante :
sc query observiq-otel-collectorLe service doit s'afficher comme étant EN COURS D'EXÉCUTION.
Installation sous Linux
- Ouvrez un terminal avec des droits d'accès racine 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.shAttendez que l'installation se termine.
Vérifiez l'installation en exécutant la commande suivante :
sudo systemctl status observiq-otel-collectorLe service doit s'afficher comme actif (en cours d'exécution).
Ressources d'installation supplémentaires
Pour en savoir plus sur les options d'installation et le dépannage, consultez le guide d'installation de l'agent Bindplane.
Configurer l'agent Bindplane pour ingérer les journaux Syslog et les envoyer à Google SecOps
Localiser le fichier de configuration
Linux :
sudo nano /opt/observiq-otel-collector/config.yamlWindows :
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Modifiez le fichier de configuration
Remplacez l'intégralité du contenu de
config.yamlpar la configuration suivante :receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/symantec_casb: protocol: https # Region of your instance, for example us, europe, asia-southeast1 location: <LOCATION> # Project number of the Google Cloud project linked to the instance project: '<PROJECT_NUMBER>' compression: gzip creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json' customer_id: '<customer_id>' endpoint: chronicle.googleapis.com log_type: SYMANTEC_CASB raw_log_field: body service: pipelines: logs/symantec_casb_to_chronicle: receivers: - udplog exporters: - chronicle/symantec_casb
Paramètres de configuration
Remplacez les espaces réservés suivants :
Configuration du récepteur :
listen_address: adresse IP et port d'écoute :0.0.0.0pour écouter sur toutes les interfaces (recommandé)- Le port
514est le port syslog standard (nécessite un accès racine sous Linux ; utilisez1514pour un accès non racine).
Configuration de l'exportateur :
creds_file_path: chemin d'accès complet au fichier de clé JSON du compte de service (option 1) :- Linux :
/opt/observiq-otel-collector/ingestion-auth.json - Windows :
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux :
customer_id: ID client copié depuis la console Google SecOpslocation: remplacez<LOCATION>par la région de votre instance Google SecOps (par exemple,us,europeouasia-southeast1). L'exportateur ajoute cette valeur en préfixe àchronicle.googleapis.com. Pour obtenir la liste complète, consultez Points de terminaison régionaux.project: remplacez<PROJECT_NUMBER>par le numéro de projet indiqué dans IAM et administration > Paramètres.endpoint: laissez la valeur définie surchronicle.googleapis.com.
Ancien exportateur d'API d'ingestion
Si vous utilisez le fichier d'authentification d'ingestion de l'option 2, remplacez le bloc
exporterspar le code suivant. Définissezcreds_file_pathsur le chemin d'accès au fichier d'authentification d'ingestion. Si votre instance se trouve en dehors des États-Unis, remplacezmalachiteingestion-pa.googleapis.compar votre point de terminaison régional (par exemple,europe-malachiteingestion-pa.googleapis.com).exporters: chronicle/symantec_casb: compression: gzip creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.googleapis.com log_type: SYMANTEC_CASB raw_log_field: body
Enregistrez le fichier de configuration.
- Après avoir modifié le fichier, enregistrez-le :
- Linux : appuyez sur
Ctrl+O, puis surEnter, puis surCtrl+X. - Windows : cliquez sur Fichier > Enregistrer.
- Linux : appuyez sur
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 observiq-otel-collectorVérifiez que le service est en cours d'exécution :
sudo systemctl status observiq-otel-collectorVérifiez les journaux pour détecter d'éventuelles erreurs :
sudo journalctl -u observiq-otel-collector -f
Pour redémarrer l'agent BindPlane sous Windows, choisissez l'une des options suivantes :
Invite de commande ou PowerShell en tant qu'administrateur :
net stop observiq-otel-collector && net start observiq-otel-collectorConsole Services :
- Appuyez sur
Win+R, saisissezservices.msc, puis appuyez sur Entrée. - Recherchez observIQ OpenTelemetry Collector.
- Effectuez un clic droit et sélectionnez Redémarrer.
Vérifiez que le service est en cours d'exécution :
sc query observiq-otel-collectorVérifiez les journaux pour détecter d'éventuelles erreurs :
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Appuyez sur
Configurer syslog dans Symantec CloudSOC CASB
- Connectez-vous à votre hôte Symantec CloudSOC.
Exécutez la commande suivante pour identifier l'enregistreur utilisé par le système :
ls -d /etc/*syslog*Accédez à la section correspondante, en fonction de la réponse :
- syslog.conf : ancien Syslog.
- syslog-ng.conf : Syslog-ng.
Ancienne configuration de Syslog
Ouvrez le fichier
syslogd, généralement situé dans le répertoire/etc/default:vi /etc/default/syslogdAssurez-vous que la valeur
SYSLOGDcontient l'option-r:SYSLOGD="-r"Enregistrez le fichier et quittez l'éditeur.
Ouvrez le fichier
services, généralement situé dans le répertoire/etc:vi /etc/servicesModifiez la valeur du port pour le service syslog :
syslog 514/udpEnregistrez le fichier et quittez l'éditeur.
Ouvrez le fichier
syslog.conf, généralement situé dans le répertoire/etc:vi /etc/syslog.confMettez à jour la configuration pour transférer tous les journaux vers l'agent Bindplane :
*.* @<BINDPLANE_IP>- Remplacez
<BINDPLANE_IP>par l'adresse IP de l'agent BindPlane.
- Remplacez
Ouvrez le fichier
hosts, généralement situé dans le répertoire/etc:vi /etc/hostsCréez une entrée DNS locale pour l'agent Bindplane :
<BINDPLANE_IP> bindplane_agent_hostEnregistrez le fichier et quittez l'éditeur.
Redémarrez le service du daemon syslog.
Configuration de Syslog-ng
Ouvrez le fichier
syslog-ng.conf, généralement situé dans le répertoire/etc:vi /etc/syslog-ng.confAjoutez le code suivant à la fin du fichier :
destination d_bindplane { udp("<BINDPLANE_IP>" port(514)); }; log { source(s_src); destination(d_bindplane); };- Remplacez
<BINDPLANE_IP>par l'adresse IP de l'agent BindPlane.
- Remplacez
Ouvrez le fichier
hosts, généralement situé dans le répertoire/etc:vi /etc/hostsCréez une entrée DNS locale pour l'agent Bindplane :
<BINDPLANE_IP> bindplane_agent_hostEnregistrez le fichier et quittez l'éditeur.
Redémarrez le service du daemon syslog-ng.
Table de mappage UDM
| Champ du journal | Mappage UDM | Logique |
|---|---|---|
_domain |
target.hostname |
Valeur du champ _domain |
_domain |
target.asset.hostname |
Valeur du champ _domain |
_id |
metadata.product_log_id |
Valeur du champ _id |
actions_taken |
security_result.detection_fields[].value |
Valeur du champ actions_taken. La clé est générée dynamiquement sous la forme Action_ + index. |
activity_type |
metadata.product_event_type |
La valeur du champ activity_type si product_data.activity_type est vide, ou la valeur de product_data.activity_type si ce champ n'est pas vide. |
collector_device_ip |
principal.ip |
La valeur du champ collector_device_ip, si elle n'est pas Unknown IP. |
collector_device_ip |
principal.asset.ip |
La valeur du champ collector_device_ip, si elle n'est pas Unknown IP. |
collector_device_name |
principal.hostname |
Valeur du champ collector_device_name. |
collector_device_name |
principal.asset.hostname |
Valeur du champ collector_device_name. |
content_checks.dlp.raw_response.contentdetails[].contentBlockId |
security_result.detection_fields[].value |
La valeur de content_checks.dlp.raw_response.contentdetails[].contentBlockId. La clé est générée dynamiquement sous la forme contentBlockId_ + index. |
content_checks.dlp.raw_response.contentdetails[].topLevelFileType |
security_result.detection_fields[].value |
La valeur de content_checks.dlp.raw_response.contentdetails[].topLevelFileType. La clé est générée dynamiquement sous la forme topLevelFileType_ + index. |
content_checks.dlp.raw_response.requestid |
security_result.detection_fields[].value |
La valeur de content_checks.dlp.raw_response.requestid. La clé est Request ID. |
content_checks.dlp.raw_response.responseaction |
security_result.detection_fields[].value |
La valeur de content_checks.dlp.raw_response.responseaction. La clé est Response Action. |
content_checks.dlp.raw_response.violation[].name |
security_result.detection_fields[].value |
La valeur de content_checks.dlp.raw_response.violation[].name. La clé est générée dynamiquement sous la forme Violation_Policy_Name_ + index. |
content_checks.dlp.raw_response.violation[].policyId |
security_result.detection_fields[].value |
La valeur de content_checks.dlp.raw_response.violation[].policyId. La clé est générée dynamiquement sous la forme Violation_Policy_ID_ + index. |
content_checks.dlp.updated_timestamp |
additional.fields[].value.string_value |
La valeur de content_checks.dlp.updated_timestamp. La clé est Updated TimeStamp. |
content_checks.filename |
target.file.full_path |
La valeur de content_checks.filename. |
content_checks.mimetype |
target.file.mime_type |
La valeur de content_checks.mimetype. |
content_checks.risktype_list[] |
security_result.detection_fields[].value |
La valeur de content_checks.risktype_list[]. La clé est générée dynamiquement sous la forme RiskType_ + index. |
content_checks.vba_macros.expressions[].values[].key |
security_result.detection_fields[].key |
La valeur de content_checks.vba_macros.expressions[].values[].key concaténée avec les index. |
content_checks.vba_macros.expressions[].values[].value |
security_result.detection_fields[].value |
La valeur de content_checks.vba_macros.expressions[].values[].value. |
content_checks.vk_content_iq_violations[] |
security_result.detection_fields[].value |
La valeur de content_checks.vk_content_iq_violations[]. La clé est générée dynamiquement sous la forme content_violation_ + index. |
content_checks.vk_dlp_policy_violations[] |
security_result.detection_fields[].value |
La valeur de content_checks.vk_dlp_policy_violations[]. La clé est générée dynamiquement sous la forme dlp_policy_violation_ + index. |
content_checks.vk_encryption |
security_result.detection_fields[].value |
La valeur de content_checks.vk_encryption. La clé est vk_encryption. |
content_checks.vk_glba |
security_result.detection_fields[].value |
La valeur de content_checks.vk_glba. La clé est vk_glba. |
content_checks.vk_hipaa |
security_result.detection_fields[].value |
La valeur de content_checks.vk_hipaa. La clé est vk_hipaa. |
content_checks.vk_pci |
security_result.detection_fields[].value |
La valeur de content_checks.vk_pci. La clé est vk_pci. |
content_checks.vk_pii |
security_result.detection_fields[].value |
La valeur de content_checks.vk_pii. La clé est vk_pii. |
content_checks.vk_source_code |
security_result.detection_fields[].value |
La valeur de content_checks.vk_source_code. La clé est vk_source_code. |
content_checks.vk_vba_macros |
security_result.detection_fields[].value |
La valeur de content_checks.vk_vba_macros. La clé est vk_vba_macros. |
content_checks.vk_virus |
security_result.detection_fields[].value |
La valeur de content_checks.vk_virus. La clé est vk_virus. |
content_checks.violations |
security_result.detection_fields[].value |
La valeur de content_checks.violations. La clé est violations. |
created_timestamp |
additional.fields[].value.string_value |
La valeur de created_timestamp. La clé est Created TimeStamp. |
date |
metadata.event_timestamp.seconds |
Secondes d'epoch extraites du champ date. |
device_ip |
target.ip |
La valeur du champ device_ip, si elle n'est pas Unknown IP. |
device_ip |
target.asset.ip |
La valeur du champ device_ip, si elle n'est pas Unknown IP. |
file_size |
target.file.size |
Valeur de file_size ou de product_data.file_size si la première est vide. Converti en entier non signé. |
file_url |
target.file.full_path |
La valeur de product_data.file_url. |
group_name |
target.group.group_display_name |
Nom à afficher extrait du champ group_name. |
hosts[] |
principal.ip |
Valeurs du champ hosts, séparées par une virgule. |
inserted_timestamp |
additional.fields[].value.string_value |
La valeur de inserted_timestamp. La clé est Inserted TimeStamp. |
instance |
principal.hostname |
La première valeur du champ instance s'il s'agit d'un tableau, ou la valeur du champ instance s'il s'agit d'une chaîne. |
instance |
principal.asset.hostname |
La première valeur du champ instance s'il s'agit d'un tableau, ou la valeur du champ instance s'il s'agit d'une chaîne. |
ioi_code |
security_result.summary |
Valeur du champ ioi_code. |
_latency |
security_result.detection_fields[].value |
Valeur du champ _latency. La clé est Latency. |
locations |
security_result.detection_fields[].value |
Valeur du champ locations. La clé est Locations. |
log_name |
intermediary.asset.asset_id |
ID de journal extrait du champ log_name, précédé du préfixe logid:. |
mailbox_owner |
target.user.userid |
La valeur de product_data.mailbox owner. |
metadata.log_type |
metadata.log_type |
Codé en dur sur SYMANTEC_CASB. |
metadata.product_name |
metadata.product_name |
Codé en dur sur SYMANTEC_CASB. |
metadata.vendor_name |
metadata.vendor_name |
Codé en dur sur SYMANTEC. |
msg |
metadata.description |
La valeur du champ msg ou du champ message si msg n'est pas présent. |
name |
security_result.detection_fields[].value |
Valeur du champ name. La clé est Name. |
object_name |
security_result.detection_fields[].value |
Valeur du champ object_name. La clé est Object Name. |
object_type |
target.resource.name |
Valeur du champ object_type. |
org_unit |
security_result.detection_fields[].value |
Valeur du champ org_unit. La clé est org_unit ID. |
policy_action |
security_result.action_details |
Valeur du champ policy_action. |
policy_type |
security_result.detection_fields[].value |
Valeur du champ policy_type. La clé est policy_type. |
policy_violated |
security_result.detection_fields[].value |
Valeur du champ policy_violated. La clé est policy_violated. |
product_data._domain |
target.hostname |
La valeur de product_data._domain. |
product_data._domain |
target.asset.hostname |
La valeur de product_data._domain. |
product_data.activity_type |
metadata.product_event_type |
La valeur de product_data.activity_type. |
product_data.file url |
target.file.full_path |
La valeur de product_data.file url. |
product_data.file_size |
target.file.size |
La valeur de product_data.file_size. |
product_data.group |
target.group.group_display_name |
La valeur de product_data.group. |
product_data.location |
principal.location.country_or_region |
La valeur de product_data.location. |
product_data.logon error |
security_result.summary |
La valeur de product_data.logon error. |
product_data.mailbox owner |
target.user.userid |
La valeur de product_data.mailbox owner. |
product_data.name |
target.file.full_path |
La valeur de product_data.name. |
product_data.object_name |
target.file.full_path |
La valeur de product_data.object_name. |
product_data.originatingserver product_data.service |
target.application |
La valeur de product_data.service. |
product_data.site url |
target.url |
La valeur de product_data.site url. |
product_data.target |
target.user.userid |
La valeur de product_data.target. |
product_data.useragent |
network.http.user_agent |
La valeur de product_data.useragent. |
product_name |
intermediary.application |
Valeur du champ product_name. |
product_uid |
metadata.product_name |
Valeur du champ product_uid. |
responsible_logs |
additional.fields[].value.string_value |
Valeur du champ responsible_logs. La clé est responsible_logs. |
resource_id |
target.resource.product_object_id |
Valeur du champ resource_id. |
risks |
security_result.detection_fields[].value |
Valeur du champ risks. La clé est Risks. |
security_result.action |
security_result.action |
Dérivé de product_data.logon error. Définie sur BLOCK, si product_data.logon error est BlockedByConditionalAccess. |
security_result.severity |
security_result.severity |
La valeur en majuscules du champ severity, s'il s'agit de l'un des niveaux de gravité acceptés. |
security_result.severity_details |
security_result.severity_details |
La valeur du champ severity, s'il ne s'agit pas de l'un des niveaux de gravité acceptés. |
security_result.summary |
security_result.summary |
Valeur du champ ioi_code ou product_data.logon error si ioi_code n'est pas présent. |
service |
target.application |
Valeur du champ service si product_data.service est vide. |
site_url |
target.url |
La valeur de product_data.site url. |
source |
principal.resource.attribute.labels[].value |
Valeur du champ source. La clé est Source. |
sub_feature |
additional.fields[].value.string_value |
Valeur du champ sub_feature. La clé est Sub Feature. |
target.application |
target.application |
Dérivé en fonction de product_data.activity_type et de la présence du compte principal et de la cible. |
target.resource.name |
target.resource.name |
Dérivé en fonction de product_data.activity_type et de la présence du compte principal et de la cible. |
threat_score |
security_result.detection_fields[].value |
Valeur du champ threat_score. La clé est Threat Score. |
transaction_id |
security_result.detection_fields[].value |
Valeur du champ transaction_id. La clé est Transaction ID. |
updated_timestamp |
additional.fields[].value.string_value |
Valeur de updated_timestamp ou de content_checks.dlp.updated_timestamp si la première est vide. La clé est Updated TimeStamp. |
user |
principal.user.userid |
Valeur du champ user. |
user_email |
target.user.userid |
Valeur du champ user_email. |
user_mail |
target.user.userid |
Valeur du champ user_mail extraite du champ msg. |
user_name |
principal.user.user_display_name |
Valeur du champ user_name. |
user_uid |
principal.user.userid ou target.user.userid |
Valeur du champ user_uid. Mappé sur principal.user.userid si product_data.activity_type n'est pas InvalidLogin ou Login, sinon mappé sur target.user.userid. |
uuid |
intermediary.asset.product_object_id |
Valeur du champ uuid. |
version |
metadata.product_version |
Valeur du champ version. |
user", "user_mail", and "user_uid |
principal.user.email_addresses |
Mappé à partir du journal des modifications |
user_email", "mailbox_owner", "product_data.target", and "user_uid |
target.user.email_addresses |
Mappé à partir du journal des modifications |
__event_timestamp |
metadata.event_timestamp |
Mappé à partir du journal des modifications |
_elastic_timestamp", "created_timestamp", "inserted_timestamp", "updated_timestamp", "responsible_logs" and "sub_feature |
additional.fields |
Mappé à partir du journal des modifications |
threat_score", "locations", "transaction_id", "content_checks.dlp.raw_response.requestid", "content_checks.dlp.raw_response.responseaction", "org_unit", "policy_type", "content_checks.vk_pci", "content_checks.vk_vba_macros", "content_checks.vk_glba", "content_checks.vk_source_code", "content_checks.vk_pii", "content_checks.vk_virus", "content_checks.vk_hipaa", "content_checks.violations", "object_name", "multi_user", "risks", "name", "_latency", "content_checks.dlp.raw_response.warning", "content_checks.dlp.raw_response.violation", "content_checks.dlp.raw_response.contentdetails", "content_checks.vk_dlp_policy_violations", "content_checks.risktype_list", "content_checks.vk_content_iq_violations", "actions_taken", "__detect_source", "multi_facility", "content_checks.vba_macros.expressions" and "policy_violated |
security_result.detection_fields |
Mappé à partir du journal des modifications |
resource_id |
target.resource.id |
Mappé à partir du journal des modifications |
Journal des modifications
Afficher le journal des modifications de cet analyseur
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.