Recoger registros de Symantec CloudSOC CASB
En este documento se explica cómo ingerir registros de Symantec CloudSOC en Google Security Operations mediante Bindplane. El analizador extrae registros de syslog o mensajes con formato JSON. Realiza varias operaciones clave: analiza el campo del mensaje, convierte el mensaje a JSON si es necesario, extrae campos, los asigna al modelo de datos unificado (UDM) y enriquece el evento con contexto adicional, como marcas de tiempo y detalles de los resultados de seguridad. El analizador también gestiona varios formatos de registro y realiza acciones específicas en función del campo activity_type
para clasificar el evento correctamente.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Instancia de Google SecOps
- Windows 2016 o versiones posteriores, o un host Linux con
systemd
- Si se ejecuta a través de un proxy, los puertos del cortafuegos están abiertos
- Acceso privilegiado a Symantec CloudSOC
Obtener el archivo de autenticación de ingestión de Google SecOps
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recogida.
- Descarga el archivo de autenticación de ingestión. Guarda el archivo de forma segura en el sistema en el que se instalará Bindplane.
Obtener el ID de cliente de Google SecOps
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Perfil.
- Copia y guarda el ID de cliente de la sección Detalles de la organización.
Instalar el agente de Bindplane
Instalación de ventanas
- Abre el símbolo del sistema o PowerShell como administrador.
Ejecuta el siguiente comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Instalación de Linux
- Abre un terminal con privilegios de superusuario o sudo.
Ejecuta el siguiente comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Recursos de instalación adicionales
Para ver más opciones de instalación, consulta la guía de instalación.
Configurar el agente de BindPlane para ingerir Syslog y enviarlo a Google SecOps
- Accede al archivo de configuración:
- Busca el archivo
config.yaml
. Normalmente, se encuentra en el directorio/etc/bindplane-agent/
en Linux o en el directorio de instalación en Windows. - Abre el archivo con un editor de texto (por ejemplo,
nano
,vi
o Bloc de notas).
- Busca el archivo
Edita el archivo
config.yaml
de la siguiente manera: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_CASB' raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Sustituye el puerto y la dirección IP según sea necesario en tu infraestructura.
Sustituye
<customer_id>
por el ID de cliente real.Actualiza
/path/to/ingestion-authentication-file.json
a la ruta donde se guardó el archivo de autenticación en la sección Obtener el archivo de autenticación de ingestión de Google SecOps.
Reinicia el agente de Bindplane para aplicar los cambios
Para reiniciar el agente de Bindplane en Linux, ejecuta el siguiente comando:
sudo systemctl restart bindplane-agent
Para reiniciar el agente de Bindplane en Windows, puedes usar la consola Servicios o introducir el siguiente comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Configurar Syslog en Symantec CASB
- Inicia sesión en el host de Symantec CloudSOC.
Ejecuta el siguiente comando para identificar el registrador que usa el sistema:
ls –d /etc/*syslog*
Ve a la sección correspondiente según la respuesta del comando anterior:
- syslog.conf Syslog antiguo.
- syslog-ng.conf: syslog-ng.
Configuración de Syslog antigua
Abre el archivo
syslogd
, que suele estar en el directorio/etc/default
, con el editorvi
.vi /etc/default/syslogd
Asegúrate de que el valor de
SYSLOGD
contenga la marca-r
.SYSLOGD="-r"
Guarda el archivo y cierra el editor:
- Cambia al modo de comandos pulsando la tecla Esc.
- Pulsa
:
(dos puntos) para abrir la barra de peticiones. - Escribe
wq
después de los dos puntos y pulsa Intro.
Abre el archivo
services
, que suele estar en el directorio/etc
, con el editorvi
.vi /etc/services
Edita el valor del puerto del servicio syslog:
syslog 514/udp
Guarda el archivo y cierra el editor:
- Cambia al modo de comandos pulsando la tecla Esc.
- Pulsa
:
(dos puntos) para abrir la barra de peticiones. - Escribe
wq
después de los dos puntos y pulsa Intro.
Abre el archivo
syslog.conf
, que suele estar en el directorio/etc
, con el editorvi
.vi /etc/syslog.conf
Actualiza la configuración para reenviar todos los registros a Google SecOps.
*.* @bindplane_agent_host
Guarda el archivo y cierra el editor:
- Cambia al modo de comandos pulsando la tecla Esc.
- Pulsa
:
(dos puntos) para abrir la barra de peticiones. - Escribe
wq
después de los dos puntos y pulsa Intro.
Abre el archivo
hosts
, que suele estar en el directorio/etc
, con el editorvi
.vi /etc/hosts
Crea una entrada de DNS local para
bindplane_agent_host
.0.0.0.0 bindplane_agent_host
Guarda el archivo y cierra el editor:
- Cambia al modo de comandos pulsando la tecla Esc.
- Pulsa
:
(dos puntos) para abrir la barra de peticiones. - Escribe
wq
después de los dos puntos y pulsa Intro.
Reinicia el servicio del daemon syslog.
Configuración de syslog-ng
Abre el archivo
syslog-ng.conf
, que suele estar en el directorio/etc
, con el editorvi
.vi /etc/syslog-ng.conf
Añade el siguiente código al final del archivo:
destination d____ { udp("bindplane_agent_host" port(514));}; log {source(s_src); destination(d____);};
Abre el archivo
hosts
, que suele estar en el directorio/etc
, con el editorvi
.vi /etc/hosts
Crea una entrada de DNS local para
bindplane_agent_host
.0.0.0.0 bindplane_agent_host
Guarda el archivo y cierra el editor:
- Cambia al modo de comandos pulsando la tecla Esc.
- Pulsa
:
(dos puntos) para abrir la barra de peticiones. - Escribe
wq
después de los dos puntos y pulsa Intro.
Reinicia el servicio del daemon syslog-ng.
Tabla de asignación de UDM
Campo de registro | Asignación de UDM | Lógica |
---|---|---|
_domain |
target.hostname |
El valor del campo _domain |
_domain |
target.asset.hostname |
El valor del campo _domain |
_id |
metadata.product_log_id |
El valor del campo _id |
actions_taken |
security_result.detection_fields[].value |
Valor del campo actions_taken . La clave se genera dinámicamente como Action_ + índice. |
activity_type |
metadata.product_event_type |
El valor del campo activity_type si product_data.activity_type está vacío o el valor de product_data.activity_type si no está vacío. |
collector_device_ip |
principal.ip |
El valor del campo collector_device_ip , si no es Unknown IP . |
collector_device_ip |
principal.asset.ip |
El valor del campo collector_device_ip , si no es Unknown IP . |
collector_device_name |
principal.hostname |
Valor del campo collector_device_name . |
collector_device_name |
principal.asset.hostname |
Valor del campo collector_device_name . |
content_checks.dlp.raw_response.contentdetails[].contentBlockId |
security_result.detection_fields[].value |
Valor de content_checks.dlp.raw_response.contentdetails[].contentBlockId . La clave se genera dinámicamente como contentBlockId_ + índice. |
content_checks.dlp.raw_response.contentdetails[].topLevelFileType |
security_result.detection_fields[].value |
Valor de content_checks.dlp.raw_response.contentdetails[].topLevelFileType . La clave se genera dinámicamente como topLevelFileType_ + índice. |
content_checks.dlp.raw_response.requestid |
security_result.detection_fields[].value |
Valor de content_checks.dlp.raw_response.requestid . La clave es Request ID . |
content_checks.dlp.raw_response.responseaction |
security_result.detection_fields[].value |
Valor de content_checks.dlp.raw_response.responseaction . La clave es Response Action . |
content_checks.dlp.raw_response.violation[].name |
security_result.detection_fields[].value |
Valor de content_checks.dlp.raw_response.violation[].name . La clave se genera dinámicamente como Violation_Policy_Name_ + índice. |
content_checks.dlp.raw_response.violation[].policyId |
security_result.detection_fields[].value |
Valor de content_checks.dlp.raw_response.violation[].policyId . La clave se genera dinámicamente como Violation_Policy_ID_ + índice. |
content_checks.dlp.updated_timestamp |
additional.fields[].value.string_value |
Valor de content_checks.dlp.updated_timestamp . La clave es Updated TimeStamp . |
content_checks.filename |
target.file.full_path |
Valor de content_checks.filename . |
content_checks.mimetype |
target.file.mime_type |
Valor de content_checks.mimetype . |
content_checks.risktype_list[] |
security_result.detection_fields[].value |
Valor de content_checks.risktype_list[] . La clave se genera dinámicamente como RiskType_ + índice. |
content_checks.vba_macros.expressions[].values[].key |
security_result.detection_fields[].key |
El valor de content_checks.vba_macros.expressions[].values[].key concatenado con los índices. |
content_checks.vba_macros.expressions[].values[].value |
security_result.detection_fields[].value |
Valor de content_checks.vba_macros.expressions[].values[].value . |
content_checks.vk_content_iq_violations[] |
security_result.detection_fields[].value |
Valor de content_checks.vk_content_iq_violations[] . La clave se genera dinámicamente como content_violation_ + índice. |
content_checks.vk_dlp_policy_violations[] |
security_result.detection_fields[].value |
Valor de content_checks.vk_dlp_policy_violations[] . La clave se genera dinámicamente como dlp_policy_violation_ + índice. |
content_checks.vk_encryption |
security_result.detection_fields[].value |
Valor de content_checks.vk_encryption . La clave es vk_encryption . |
content_checks.vk_glba |
security_result.detection_fields[].value |
Valor de content_checks.vk_glba . La clave es vk_glba . |
content_checks.vk_hipaa |
security_result.detection_fields[].value |
Valor de content_checks.vk_hipaa . La clave es vk_hipaa . |
content_checks.vk_pci |
security_result.detection_fields[].value |
Valor de content_checks.vk_pci . La clave es vk_pci . |
content_checks.vk_pii |
security_result.detection_fields[].value |
Valor de content_checks.vk_pii . La clave es vk_pii . |
content_checks.vk_source_code |
security_result.detection_fields[].value |
Valor de content_checks.vk_source_code . La clave es vk_source_code . |
content_checks.vk_vba_macros |
security_result.detection_fields[].value |
Valor de content_checks.vk_vba_macros . La clave es vk_vba_macros . |
content_checks.vk_virus |
security_result.detection_fields[].value |
Valor de content_checks.vk_virus . La clave es vk_virus . |
content_checks.violations |
security_result.detection_fields[].value |
Valor de content_checks.violations . La clave es violations . |
created_timestamp |
additional.fields[].value.string_value |
Valor de created_timestamp . La clave es Created TimeStamp . |
date |
metadata.event_timestamp.seconds |
Segundos transcurridos desde el inicio del registro de tiempo extraídos del campo date . |
device_ip |
target.ip |
El valor del campo device_ip , si no es Unknown IP . |
device_ip |
target.asset.ip |
El valor del campo device_ip , si no es Unknown IP . |
file_size |
target.file.size |
El valor de file_size o product_data.file_size si el primero está vacío. Se ha convertido en un número entero sin signo. |
file_url |
target.file.full_path |
Valor de product_data.file_url . |
group_name |
target.group.group_display_name |
Nombre visible extraído del campo group_name . |
hosts[] |
principal.ip |
Los valores del campo hosts , separados por comas. |
inserted_timestamp |
additional.fields[].value.string_value |
Valor de inserted_timestamp . La clave es Inserted TimeStamp . |
instance |
principal.hostname |
El primer valor del campo instance si es una matriz o el valor del campo instance si es una cadena. |
instance |
principal.asset.hostname |
El primer valor del campo instance si es una matriz o el valor del campo instance si es una cadena. |
ioi_code |
security_result.summary |
Valor del campo ioi_code . |
_latency |
security_result.detection_fields[].value |
Valor del campo _latency . La clave es Latency . |
locations |
security_result.detection_fields[].value |
Valor del campo locations . La clave es Locations . |
log_name |
intermediary.asset.asset_id |
El ID de registro extraído del campo log_name , con el prefijo logid: . |
mailbox_owner |
target.user.userid |
Valor de product_data.mailbox owner . |
metadata.log_type |
metadata.log_type |
Valor fijo establecido en el código fuente SYMANTEC_CASB . |
metadata.product_name |
metadata.product_name |
Valor fijo establecido en el código fuente SYMANTEC_CASB . |
metadata.vendor_name |
metadata.vendor_name |
Valor fijo establecido en el código fuente SYMANTEC . |
msg |
metadata.description |
El valor del campo msg o del campo message si no está presente msg . |
name |
security_result.detection_fields[].value |
Valor del campo name . La clave es Name . |
object_name |
security_result.detection_fields[].value |
Valor del campo object_name . La clave es Object Name . |
object_type |
target.resource.name |
Valor del campo object_type . |
org_unit |
security_result.detection_fields[].value |
Valor del campo org_unit . La clave es org_unit ID . |
policy_action |
security_result.action_details |
Valor del campo policy_action . |
policy_type |
security_result.detection_fields[].value |
Valor del campo policy_type . La clave es policy_type . |
policy_violated |
security_result.detection_fields[].value |
Valor del campo policy_violated . La clave es policy_violated . |
product_data._domain |
target.hostname |
Valor de product_data._domain . |
product_data._domain |
target.asset.hostname |
Valor de product_data._domain . |
product_data.activity_type |
metadata.product_event_type |
Valor de product_data.activity_type . |
product_data.file url |
target.file.full_path |
Valor de product_data.file url . |
product_data.file_size |
target.file.size |
Valor de product_data.file_size . |
product_data.group |
target.group.group_display_name |
Valor de product_data.group . |
product_data.location |
principal.location.country_or_region |
Valor de product_data.location . |
product_data.logon error |
security_result.summary |
Valor de product_data.logon error . |
product_data.mailbox owner |
target.user.userid |
Valor de product_data.mailbox owner . |
product_data.name |
target.file.full_path |
Valor de product_data.name . |
product_data.object_name |
target.file.full_path |
Valor de product_data.object_name . |
product_data.originatingserver product_data.service |
target.application |
Valor de product_data.service . |
product_data.site url |
target.url |
Valor de product_data.site url . |
product_data.target |
target.user.userid |
Valor de product_data.target . |
product_data.useragent |
network.http.user_agent |
Valor de product_data.useragent . |
product_name |
intermediary.application |
Valor del campo product_name . |
product_uid |
metadata.product_name |
Valor del campo product_uid . |
responsible_logs |
additional.fields[].value.string_value |
Valor del campo responsible_logs . La clave es responsible_logs . |
resource_id |
target.resource.product_object_id |
Valor del campo resource_id . |
risks |
security_result.detection_fields[].value |
Valor del campo risks . La clave es Risks . |
security_result.action |
security_result.action |
Derivado de product_data.logon error . Su valor debe ser BLOCK si product_data.logon error es BlockedByConditionalAccess . |
security_result.severity |
security_result.severity |
El valor en mayúsculas del campo severity , si es uno de los niveles de gravedad admitidos. |
security_result.severity_details |
security_result.severity_details |
El valor del campo severity , si no es uno de los niveles de gravedad admitidos. |
security_result.summary |
security_result.summary |
El valor del campo ioi_code o product_data.logon error si ioi_code no está presente. |
service |
target.application |
Valor del campo service si product_data.service está vacío. |
site_url |
target.url |
Valor de product_data.site url . |
source |
principal.resource.attribute.labels[].value |
Valor del campo source . La clave es Source . |
sub_feature |
additional.fields[].value.string_value |
Valor del campo sub_feature . La clave es Sub Feature . |
target.application |
target.application |
Se deriva de product_data.activity_type y de la presencia de la entidad principal y la de destino. |
target.resource.name |
target.resource.name |
Se deriva de product_data.activity_type y de la presencia de la entidad principal y la de destino. |
threat_score |
security_result.detection_fields[].value |
Valor del campo threat_score . La clave es Threat Score . |
transaction_id |
security_result.detection_fields[].value |
Valor del campo transaction_id . La clave es Transaction ID . |
updated_timestamp |
additional.fields[].value.string_value |
El valor de updated_timestamp o content_checks.dlp.updated_timestamp si el primero está vacío. La clave es Updated TimeStamp . |
user |
principal.user.userid |
Valor del campo user . |
user_email |
target.user.userid |
Valor del campo user_email . |
user_mail |
target.user.userid |
El valor del campo user_mail extraído del campo msg . |
user_name |
principal.user.user_display_name |
Valor del campo user_name . |
user_uid |
principal.user.userid o target.user.userid |
Valor del campo user_uid . Se asigna a principal.user.userid si product_data.activity_type no es InvalidLogin ni Login . De lo contrario, se asigna a target.user.userid . |
uuid |
intermediary.asset.product_object_id |
Valor del campo uuid . |
version |
metadata.product_version |
Valor del campo version . |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.