Recopila registros de Proofpoint On-Demand
Este analizador extrae campos de los registros JSON On-Demand de Proofpoint y los transforma en el formato UDM. Controla dos formatos de registro principales: uno que contiene metadatos de correo electrónico y otro que contiene detalles de transacciones SMTP, y usa lógica condicional para analizar los campos de forma adecuada y propagar los campos de la UDM según los datos disponibles. El analizador también realiza la limpieza de datos, como quitar caracteres innecesarios y convertir marcas de tiempo.
Antes de comenzar
- Asegúrate de tener una instancia de Google Security Operations.
- Asegúrate de tener la licencia de Syslog remoto a pedido de Proofpoint.
- Asegúrate de tener acceso con privilegios a Proofpoint.
Configura el acceso a la API de Proofpoint on Demand
- Accede al portal de administración de Proofpoint.
- Copia el ID del clúster, que se muestra en la interfaz de administración junto al número de versión.
- Selecciona Configuración > Administración de claves de API.
- Haz clic en Crear para mostrar el diálogo Crear clave de API nueva.
- Ingresa un Nombre único (por ejemplo, Google SecOps).
- Genera la clave de API.
- Selecciona Ver detalles en el menú de la nueva clave de API.
- Copia la clave de API.
Configura un feed en Google SecOps para transferir registros de Proofpoint On Demand (PoD)
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar nueva.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Registros de PoD).
- Selecciona API de terceros como el Tipo de origen.
- Selecciona Proofpoint On Demand como el tipo de registro.
- 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
key:<value>
. - ID de clúster: Ingresa el ID de clúster de Proofpoint que copiaste antes.
- Espacio de nombres de recursos: Es el espacio de nombres de recursos.
- Etiquetas de transferencia: Es la etiqueta que se aplica a los eventos de este feed.
- 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.
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 antes del 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 el algoritmo de cifrado 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á presente. |
envelope.rcpts |
network.email.to |
Las direcciones de correo electrónico en envelope.rcpts se combinan en el campo network.email.to si son válidas. También se combina con sm.to o toAddresses si está presente. |
envelope.rcptsHashed |
read_only_udm.additional.fields |
Las direcciones de correo electrónico con hash en envelope.rcptsHashed se agregan como campos adicionales con claves como "toHashed_0", "toHashed_1", etcétera. |
eventTime |
@timestamp |
El valor se analiza 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 tls.verify esté presente. |
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. |
fromAddress |
network.email.from |
Las direcciones de correo electrónico en fromAddress se reemplazan en el campo network.email.from si son 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 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 |
La dirección de correo electrónico encerrada entre <> en msg.header.reply-to.0 se extrae y asigna. |
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 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 válidas. |
msgParts |
read_only_udm.about |
Se crean varios objetos about, uno para cada entrada en msgParts . Se extraen los hashes de archivos, el tipo de MIME, el tamaño y otros metadatos. |
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 válidas. |
replyToAddress |
network.email.reply_to |
Las direcciones de correo electrónico en replyToAddress se reemplazan en el campo network.email.reply_to si son 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 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 el algoritmo de cifrado sea “NONE”. |
toAddresses |
network.email.to |
Las direcciones de correo electrónico en toAddresses se combinan en el campo network.email.to si son válidas. |
ts |
@timestamp |
El valor se analiza desde el campo ts con el formato ISO8601 o RFC 3339, después de un procesamiento previo para controlar los segundos fraccionarios adicionales. |
Cambios
2024-11-28
- Mejora:
- Se asignaron "msgParts.metadata.company" y "msgParts.metadata.author" a "security_result.detection_fields".
- Se quitó la asignación duplicada de "email.subject".
- Se cambió la asignación de los campos "filter.modules.dmarc.authResults" de "additional.fields" a "security_result.detection_fields".
2024-08-28
- Mejora:
- Se cambió la clave "security_result.detection_fields" de "filterQid" a "qid".
2024-08-21
- Mejora:
- Se asignó "metadata.origin.data.cid" a "additional.fields".
2024-07-22
- Mejora:
- Si "about.file.size" es un número entero sin signo válido, se asigna "msgPart.detectedSizeBytes" a "about.file.size".
- Se agregó compatibilidad con el nuevo patrón de registros SYSLOG.
2024-07-09
- Mejora:
- Se asignó "msg.header.x-mailer" a "additional.fields".
2024-07-09
- Mejora:
- Se asignó "msg.header.x-mailer" a "additional.fields".
2023-11-13
- Se asignó "subject" a "network.email.subject".
- Se asignó "messageID" a "network.email.mail_id".
- Se asignó "fromAddress" a "network.email.from".
- Se asignó "ccAddresses" a "network.email.cc".
- Se asignó "replyToAddress" a "network.email.reply_to".
- Se asignó "toAddresses" a "network.email.to".
- Se asignó "sender" a "principal.user.email_addresses".
- Se asignó "senderIP" a "principal.ip".
- Se asignó "recipient" a "target.user.email_addresses".
- Se asignaron "spamScore", "phishScore", "threatsInfoMap", "impostorScore", "malwareScore" y "" a "security_result.detection_fields".
2023-10-26
- Se asignó "msg.headeparsedAddressesr.from.0" a "principal.user.email_addresses".
- Se modificaron las asignaciones de usar campos del UDM obsoletos a campos alternativos.
- Se agregó la asignación de "about.labels" a "about.resource.attribute.labels".
- Se agregó la asignación de "principal.labels" a "principal.resource.attribute.labels".
2023-06-05
- Se agregó una verificación a "msg.header.reply-to.0" antes de la asignación a la AUA para verificar si es un array de correos electrónicos.
- Se agregó una verificación que no sea "-1" a "msgPart.detectedSizeBytes" antes de la asignación a la UDM.
2022-07-14
- Se mejoró la asignación del siguiente elemento al elemento UDM:
- Se asignaron idiomas a additional.fields.
- Definiciones asignadas a security_result.summary.
- Se asignó el motor a metadata.product_version.
2022-06-29
- Mejora: Se agregó gsub para quitar "<>" de los campos "sm.msgid" y "msg.header.message-id.0" asignados a "network.email.mail_id".
2022-05-20
- Se realizaron mejoras para asignar los siguientes elementos a elementos de la UDM:
- Se asignaron "tls.verify" y "filter.disposition" a "security_result.action_details".
- Se asignó "filter.modules.dmarc.authResults.result" a "additional.fields".
- Se asignaron "filter.quarantine.module", "filter.quarantine.folder", "filter.quarantine.type", "filter.quarantine.folderId", "filter.modules.spam.scores.overall", "filter.modules.spam.scores.engine", "filter.modules.spam.scores.classifiers.spam", "filter.modules.spam.scores.classifiers.mlxlog", "filter.modules.spam.scores.classifiers.phish", "filter.modules.spam.scores.classifiers.impostor", "filter.modules.spam.scores.classifiers.lowpriority", "filter.modules.spam.scores.classifiers.mlx", "filter.modules.spam.scores.classifiers.bulk", "filter.modules.spam.scores.classifiers.suspect", "filter.modules.spam.scores.classifiers.malware", "filter.modules.spam.scores.classifiers.adult" a "security_result.detection_fields".
2022-04-13
- Se mejoró la asignación del siguiente elemento al elemento UDM:
- Se asignó filter.modules.av.virusNames a "security_result.threat_name".