Recopila registros de Proofpoint On-Demand
En este documento, se explica cómo transferir registros de Proofpoint On-Demand a Google Security Operations con la integración de la API integrada. El analizador extrae campos de los registros JSON y los transforma al formato del UDM de Chronicle. Maneja dos formatos de registro principales: uno que contiene metadatos de correo electrónico y el otro que contiene detalles de transacciones SMTP, y usa lógica condicional para analizar los campos de forma adecuada y completar los campos del Modelo de datos unificado (UDM) según los datos disponibles. El analizador también realiza la limpieza de datos, como quitar caracteres extraños y convertir marcas de tiempo.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Instancia de Google SecOps
- Licencia de Proofpoint On-Demand Remote Syslog
- Acceso con privilegios a Proofpoint
Configura el acceso a la API de Proofpoint On-Demand
- Accede al portal de administrador de Proofpoint.
- Copia tu ID de clúster (se muestra en la esquina superior derecha de tu interfaz de administración, junto al número de versión).
- Ve a Configuración > Administración de claves de API.
- Haz clic en Crear nuevo para abrir el diálogo Crear clave de API nueva.
- Ingresa un Nombre único (por ejemplo,
Google SecOps Key
). - Genera la clave de API.
- Selecciona Ver detalles en el menú de puntos suspensivos de la nueva clave de API.
- Copia la clave de API.
Configura feeds
Existen dos puntos de entrada diferentes para configurar feeds en la plataforma de Google SecOps:
- Configuración de SIEM > Feeds
- Centro de contenido > Paquetes de contenido
Configura feeds en Configuración del SIEM > Feeds
Para configurar un feed, sigue estos pasos:
- Ve a Configuración del SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- En la siguiente página, haz clic en Configurar un solo feed.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
PoD Logs
). - Selecciona API de terceros como el Tipo de origen.
- Selecciona el tipo de registro Proofpoint On-Demand.
- Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
- Encabezados HTTP de autenticación: Ingresa la clave de API de Proofpoint en formato
Authorization: Bearer {API_KEY}
y agrega una línea nueva con los siguientes datos de WebSocket-Key:Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==
. - ID de clúster: Ingresa el ID de clúster de Proofpoint que copiaste antes.
- Encabezados HTTP de autenticación: Ingresa la clave de API de Proofpoint en formato
Haz clic en Siguiente.
Revisa la configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Configura feeds desde el Centro de contenido
Especifica valores para los siguientes campos:
- Encabezados HTTP de autenticación: Ingresa la clave de API de Proofpoint en formato
Authorization: Bearer {API_KEY}
y agrega una línea nueva con los siguientes datos de WebSocket-Key:Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==
. - ID de clúster: Ingresa el ID de clúster de Proofpoint que copiaste antes.
Opciones avanzadas
- Nombre del feed: Es un valor predeterminado que identifica el feed.
- Tipo de fuente: Es el método que se usa para recopilar registros en Google SecOps.
- Espacio de nombres del activo: Es el espacio de nombres asociado con el feed.
- Etiquetas de transferencia: Son las etiquetas que se aplican a todos los eventos de este feed.
Tabla de asignación de UDM
Campo de registro | Asignación de UDM | Lógica |
---|---|---|
classification |
security_result.detection_fields.classification |
El valor proviene directamente del campo classification en el registro sin procesar. |
cluster |
security_result.detection_fields.cluster |
El valor proviene directamente del campo cluster en el registro sin procesar. |
completelyRewritten |
security_result.detection_fields.completelyRewritten |
El valor proviene directamente del campo completelyRewritten en el registro sin procesar. |
connection.country |
principal.location.country_or_region |
El valor proviene directamente del campo connection.country en el registro sin procesar, a menos que sea "**". |
connection.host |
principal.hostname |
El valor proviene directamente del campo connection.host en el registro sin procesar. |
connection.ip |
principal.ip |
El valor proviene directamente del campo connection.ip en el registro sin procesar, si es una dirección IPv4 válida. También se combina con senderIP si está presente. |
connection.protocol |
network.application_protocol |
La parte del protocolo anterior a los dos puntos en connection.protocol se extrae con gsub y se asigna. Por ejemplo, "smtp:smtp" se convierte en "SMTP". |
connection.tls.inbound.cipher |
network.tls.cipher |
El valor proviene directamente del campo connection.tls.inbound.cipher en el registro sin procesar, a menos que sea "NONE". |
connection.tls.inbound.version |
network.tls.version |
El valor proviene directamente del campo connection.tls.inbound.version en el registro sin procesar, a menos que la codificación sea "NONE". |
envelope.from |
network.email.from |
El valor proviene directamente del campo envelope.from en el registro sin procesar. También se reemplaza por sm.from o fromAddress si están presentes. |
envelope.rcpts |
network.email.to |
Las direcciones de correo electrónico en envelope.rcpts se combinan en el campo network.email.to si son direcciones de correo electrónico válidas. También se combina con sm.to o toAddresses si están presentes. |
envelope.rcptsHashed |
read_only_udm.additional.fields |
Las direcciones de correo electrónico hasheadas en envelope.rcptsHashed se agregan como campos adicionales con claves como "toHashed_0", "toHashed_1", etcétera. |
eventTime |
@timestamp |
El valor se analiza a partir del campo eventTime con el formato ISO8601 o RFC 3339. |
eventType |
security_result.summary |
El valor proviene directamente del campo eventType en el registro sin procesar. |
filter.disposition |
security_result.action_details |
El valor proviene directamente del campo filter.disposition en el registro sin procesar, a menos que esté presente tls.verify . |
filter.modules.av.virusNames.0 |
security_result.threat_name |
El valor proviene directamente del campo filter.modules.av.virusNames.0 en el registro sin procesar. |
filter.modules.dmarc.authResults |
read_only_udm.additional.fields |
El método y el resultado de cada entrada en filter.modules.dmarc.authResults se agregan como campos adicionales con claves como "authResultsMethod_0", "authResults_result_0", "authResultsMethod_1", etcétera. |
filter.modules.spam.langs |
read_only_udm.additional.fields |
Cada idioma en filter.modules.spam.langs se agrega como un campo adicional con claves como "lang_0", "lang_1", etcétera. |
filter.modules.spam.safeBlockedListMatches.0.listType |
security_result.detection_fields.safeBlockedListMatches_listType |
El valor proviene directamente del campo filter.modules.spam.safeBlockedListMatches.0.listType en el registro sin procesar. |
filter.modules.spam.safeBlockedListMatches.0.rule |
security_result.detection_fields.safeBlockedListMatches_rule |
El valor proviene directamente del campo filter.modules.spam.safeBlockedListMatches.0.rule en el registro sin procesar. |
filter.modules.spam.scores.classifiers.adult |
security_result.detection_fields.adult |
El valor proviene directamente del campo filter.modules.spam.scores.classifiers.adult en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.bulk |
security_result.detection_fields.bulk |
El valor proviene directamente del campo filter.modules.spam.scores.classifiers.bulk en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.impostor |
security_result.detection_fields.impostor |
El valor proviene directamente del campo filter.modules.spam.scores.classifiers.impostor en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.lowpriority |
security_result.detection_fields.lowpriority |
El valor proviene directamente del campo filter.modules.spam.scores.classifiers.lowpriority en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.malware |
security_result.detection_fields.malware |
El valor proviene directamente del campo filter.modules.spam.scores.classifiers.malware en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.mlx |
security_result.detection_fields.mlx |
El valor proviene directamente del campo filter.modules.spam.scores.classifiers.mlx en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.mlxlog |
security_result.detection_fields.mlxlog |
El valor proviene directamente del campo filter.modules.spam.scores.classifiers.mlxlog en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.phish |
security_result.detection_fields.phish |
El valor proviene directamente del campo filter.modules.spam.scores.classifiers.phish en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.spam |
security_result.detection_fields.spam |
El valor proviene directamente del campo filter.modules.spam.scores.classifiers.spam en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.suspect |
security_result.detection_fields.suspect |
El valor proviene directamente del campo filter.modules.spam.scores.classifiers.suspect en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.engine |
security_result.detection_fields.engine |
El valor proviene directamente del campo filter.modules.spam.scores.engine en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.overall |
security_result.detection_fields.overall |
El valor proviene directamente del campo filter.modules.spam.scores.overall en el registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.version.definitions |
security_result.summary |
El valor proviene directamente del campo filter.modules.spam.version.definitions en el registro sin procesar. |
filter.modules.spam.version.engine |
metadata.product_version |
El valor proviene directamente del campo filter.modules.spam.version.engine en el registro sin procesar. |
filter.modules.urldefense.counts.rewritten |
read_only_udm.additional.fields.urldefenseCountsRewritten |
El valor proviene directamente del campo filter.modules.urldefense.counts.rewritten en el registro sin procesar. |
filter.modules.urldefense.counts.total |
security_result.detection_fields.urldefense_total |
El valor proviene directamente del campo filter.modules.urldefense.counts.total en el registro sin procesar. |
filter.modules.zerohour.score |
read_only_udm.additional.fields.zeroHourScore |
El valor proviene directamente del campo filter.modules.zerohour.score en el registro sin procesar. |
filter.origGuid |
read_only_udm.additional.fields.origGuid |
El valor proviene directamente del campo filter.origGuid en el registro sin procesar. |
filter.qid |
read_only_udm.additional.fields.filterQid |
El valor proviene directamente del campo filter.qid en el registro sin procesar. |
filter.quarantine.folder |
security_result.detection_fields.filter_quarantine_folder |
El valor proviene directamente del campo filter.quarantine.folder en el registro sin procesar. |
filter.quarantine.folderId |
security_result.detection_fields.filter_quarantine_folderId |
El valor proviene directamente del campo filter.quarantine.quarantine.folderId en el registro sin procesar. |
filter.quarantine.module |
security_result.detection_fields.filter_quarantine_module |
El valor proviene directamente del campo filter.quarantine.module en el registro sin procesar. |
filter.quarantine.rule |
security_result.detection_fields.filter_quarantine_rule |
El valor proviene directamente del campo filter.quarantine.rule en el registro sin procesar. |
filter.quarantine.type |
security_result.detection_fields.filter_quarantine_type |
El valor proviene directamente del campo filter.quarantine.type en el registro sin procesar. |
filter.routeDirection |
network.direction |
Si filter.routeDirection es "inbound", network.direction se establece en "INBOUND". Si filter.routeDirection es "outbound", network.direction se establece en "OUTBOUND". |
filter.routes |
read_only_udm.additional.fields |
Cada ruta en filter.routes se agrega como un campo adicional con claves como "filterRoutes_0", "filterRoutes_1", etcétera. |
fromAddress |
network.email.from |
Las direcciones de correo electrónico de fromAddress se reemplazan en el campo network.email.from si son direcciones de correo electrónico válidas. |
guid |
metadata.product_log_id |
El valor proviene directamente del campo guid en el registro sin procesar. |
GUID |
metadata.product_log_id |
El valor proviene directamente del campo GUID en el registro sin procesar. |
headerFrom |
network.email.from |
El valor proviene directamente del campo headerFrom en el registro sin procesar. |
impostorScore |
security_result.detection_fields.impostorScore |
El valor proviene directamente del campo impostorScore en el registro sin procesar. |
malwareScore |
security_result.detection_fields.malwareScore |
El valor proviene directamente del campo malwareScore en el registro sin procesar. |
messageID |
network.email.mail_id |
El valor proviene directamente del campo messageID en el registro sin procesar. |
messageSize |
security_result.detection_fields.messageSize |
El valor proviene directamente del campo messageSize en el registro sin procesar. |
messageTime |
@timestamp |
El valor se analiza a partir del campo messageTime con el formato ISO8601 o RFC 3339. |
metadata.customerId |
principal.labels.customerId |
El valor proviene directamente del campo metadata.customerId en el registro sin procesar. |
metadata.origin.data.agent |
network.http.user_agent |
El valor proviene directamente del campo metadata.origin.data.agent en el registro sin procesar. |
metadata.origin.data.cid |
principal.user.userid |
El valor proviene directamente del campo metadata.origin.data.cid en el registro sin procesar. |
metadata.origin.data.version |
metadata.product_version |
El valor proviene directamente del campo metadata.origin.data.version en el registro sin procesar. |
msg.header.from |
read_only_udm.additional.fields.msgHeaderFrom |
El valor proviene directamente del campo msg.header.from.0 en el registro sin procesar. |
msg.header.reply-to |
network.email.reply_to |
Se extrae y se asigna la dirección de correo electrónico incluida entre <> en msg.header.reply-to.0 . |
msg.header.subject |
network.email.subject |
El valor proviene directamente del campo msg.header.subject en el registro sin procesar. |
msg.header.to |
read_only_udm.additional.fields.msgHeaderTo |
El valor proviene directamente del campo msg.header.to en el registro sin procesar. |
msg.normalizedHeader.subject |
network.email.subject |
El valor proviene directamente del campo msg.normalizedHeader.subject en el registro sin procesar. |
msg.parsedAddresses.cc |
network.email.cc |
Las direcciones de correo electrónico en msg.parsedAddresses.cc se combinan en el campo network.email.cc si son direcciones de correo electrónico válidas. |
msg.parsedAddresses.ccHashed |
read_only_udm.additional.fields |
Las direcciones de correo electrónico con codificación hash en msg.parsedAddresses.ccHashed se agregan como campos adicionales con claves como "ccHashed_0", "ccHashed_1", etcétera. |
msg.parsedAddresses.from |
read_only_udm.additional.fields.msgParsedAddressesFrom |
El valor proviene directamente del campo msg.parsedAddresses.from.0 en el registro sin procesar. |
msg.parsedAddresses.from.0 |
principal.user.email_addresses |
El valor proviene directamente del campo msg.parsedAddresses.from.0 en el registro sin procesar. |
msg.parsedAddresses.fromHashed |
read_only_udm.additional.fields.fromHashed |
El valor proviene directamente del campo msg.parsedAddresses.fromHashed.0 en el registro sin procesar. |
msg.parsedAddresses.to |
target.user.email_addresses |
Las direcciones de correo electrónico en msg.parsedAddresses.to se combinan en el campo target.user.email_addresses si son direcciones de correo electrónico válidas. |
msgParts |
read_only_udm.about |
Se crean varios objetos about, uno para cada entrada en msgParts . Se extraen los hashes, el tipo de MIME, el tamaño y otros metadatos del archivo. |
QID |
security_result.detection_fields.QID |
El valor proviene directamente del campo QID en el registro sin procesar. |
recipient |
target.user.email_addresses |
Las direcciones de correo electrónico en recipient se combinan en el campo target.user.email_addresses si son direcciones de correo electrónico válidas. |
replyToAddress |
network.email.reply_to |
Las direcciones de correo electrónico de replyToAddress se reemplazan en el campo network.email.reply_to si son direcciones de correo electrónico válidas. |
sender |
principal.user.email_addresses |
El valor proviene directamente del campo sender en el registro sin procesar, si es una dirección de correo electrónico válida. |
senderIP |
principal.ip |
El valor proviene directamente del campo senderIP en el registro sin procesar. |
sm.from |
network.email.from |
El valor proviene directamente del campo sm.from en el registro sin procesar. |
sm.msgid |
network.email.mail_id |
El valor proviene directamente del campo sm.msgid en el registro sin procesar, después de quitar "<" y ">". |
sm.proto |
network.application_protocol |
El valor proviene directamente del campo sm.proto en el registro sin procesar. |
sm.qid |
security_result.detection_fields.QUID |
El valor proviene directamente del campo sm.qid en el registro sin procesar. |
sm.relay |
intermediary.hostname , intermediary.ip |
El nombre de host y la dirección IP se extraen de sm.relay con grok. |
sm.stat |
security_result.detection_fields.Stat |
La primera palabra de sm.stat se extrae con Grok y se asigna. |
sm.to |
network.email.to |
Las direcciones de correo electrónico en sm.to se combinan en el campo network.email.to si son direcciones de correo electrónico válidas. |
spamScore |
security_result.detection_fields.spamScore |
El valor proviene directamente del campo spamScore en el registro sin procesar. |
subject |
network.email.subject |
El valor proviene directamente del campo subject en el registro sin procesar. |
threat |
security_result.detection_fields.threat |
El valor proviene directamente del campo threat en el registro sin procesar. |
threatsInfoMap |
security_result.detection_fields |
Los pares clave-valor de cada entrada en threatsInfoMap se agregan como campos de detección. |
threatType |
security_result.detection_fields.threatType |
El valor proviene directamente del campo threatType en el registro sin procesar. |
tls.cipher |
network.tls.cipher |
El valor proviene directamente del campo tls.cipher en el registro sin procesar, a menos que sea "NONE". |
tls.verify |
security_result.action_details |
El valor proviene directamente del campo tls.verify en el registro sin procesar. |
tls.version |
network.tls.version |
El valor proviene directamente del campo tls.version en el registro sin procesar, a menos que la codificación sea "NONE". |
toAddresses |
network.email.to |
Las direcciones de correo electrónico en toAddresses se combinan en el campo network.email.to si son direcciones de correo electrónico válidas. |
ts |
@timestamp |
El valor se analiza a partir del campo ts con el formato ISO8601 o RFC 3339, después de un procesamiento previo para controlar los segundos fraccionarios adicionales. |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.