Recopilar registros de Proofpoint On-Demand
En este documento se explica cómo ingerir registros de Proofpoint On-Demand en Google Security Operations mediante la integración de la API integrada. El analizador extrae campos de los registros JSON y los transforma al formato UDM de Chronicle. Gestiona dos formatos de registro principales: uno que contiene metadatos de correo electrónico y otro que contiene detalles de transacciones SMTP. Utiliza lógica condicional para analizar los campos de forma adecuada y rellenar los campos del modelo de datos unificado (UDM) en función de los datos disponibles. El analizador también limpia los datos, por ejemplo, eliminando caracteres extraños y convirtiendo marcas de tiempo.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Instancia de Google SecOps
- Licencia de Proofpoint On-Demand Remote Syslog
- Acceso privilegiado a Proofpoint
Configurar el acceso a la API On-Demand de Proofpoint
- Inicia sesión en el portal Administración de Proofpoint.
- Copia tu ID de clúster (que se muestra en la esquina superior derecha de la interfaz de gestión, junto al número de versión).
- Ve a Ajustes > Gestión de claves de API.
- Haz clic en Crear nuevo para abrir el cuadro de diálogo Crear clave de API.
- Introduce un nombre único (por ejemplo,
Google SecOps Key
). - Genera la clave de API.
- Selecciona Ver detalles en el menú de los tres puntos de la nueva clave de API.
- Copia la clave de API.
Configurar feeds
Para configurar un feed, sigue estos pasos:
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Añadir feed.
- En la página siguiente, haga clic en Configurar un solo feed.
- En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo,
PoD Logs
). - Seleccione API de terceros como Tipo de fuente.
- Seleccione el tipo de registro Proofpoint On-Demand.
- Haz clic en Siguiente.
Especifique los valores de los siguientes parámetros de entrada:
- Encabezados HTTP de autenticación: introduce la clave de API de Proofpoint en formato
Authorization: Bearer {API_KEY}
y añade una línea nueva con los siguientes datos de WebSocket-Key:Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==
. - ID de clúster: introduce el ID de clúster de Proofpoint que has copiado anteriormente.
- Encabezados HTTP de autenticación: introduce la clave de API de Proofpoint en formato
Haz clic en Siguiente.
Revise la configuración del feed en la pantalla Finalizar y, a continuación, haga 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 procede directamente del campo classification del registro sin procesar. |
cluster |
security_result.detection_fields.cluster |
El valor procede directamente del campo cluster del registro sin procesar. |
completelyRewritten |
security_result.detection_fields.completelyRewritten |
El valor procede directamente del campo completelyRewritten del registro sin procesar. |
connection.country |
principal.location.country_or_region |
El valor procede directamente del campo connection.country del registro sin procesar, a menos que sea "**". |
connection.host |
principal.hostname |
El valor procede directamente del campo connection.host del registro sin procesar. |
connection.ip |
principal.ip |
El valor procede directamente del campo connection.ip del 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 que aparece antes de 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 procede directamente del campo connection.tls.inbound.cipher del registro sin procesar, a menos que sea "NONE". |
connection.tls.inbound.version |
network.tls.version |
El valor procede directamente del campo connection.tls.inbound.version del registro sin procesar, a menos que la cifra sea "NONE". |
envelope.from |
network.email.from |
El valor procede directamente del campo envelope.from del registro sin procesar. También se sustituye por sm.from o fromAddress si están presentes. |
envelope.rcpts |
network.email.to |
Las direcciones de correo de 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án presentes. |
envelope.rcptsHashed |
read_only_udm.additional.fields |
Las direcciones de correo cifradas con hash de envelope.rcptsHashed se añaden como campos adicionales con claves como "toHashed_0", "toHashed_1", etc. |
eventTime |
@timestamp |
El valor se analiza a partir del campo eventTime con el formato ISO8601 o RFC 3339. |
eventType |
security_result.summary |
El valor procede directamente del campo eventType del registro sin procesar. |
filter.disposition |
security_result.action_details |
El valor procede directamente del campo filter.disposition del registro sin procesar, a menos que esté presente tls.verify . |
filter.modules.av.virusNames.0 |
security_result.threat_name |
El valor procede directamente del campo filter.modules.av.virusNames.0 del registro sin procesar. |
filter.modules.dmarc.authResults |
read_only_udm.additional.fields |
El método y el resultado de cada entrada de filter.modules.dmarc.authResults se añaden como campos adicionales con claves como "authResultsMethod_0", "authResults_result_0", "authResultsMethod_1", etc. |
filter.modules.spam.langs |
read_only_udm.additional.fields |
Cada idioma de filter.modules.spam.langs se añade como un campo adicional con claves como "lang_0", "lang_1", etc. |
filter.modules.spam.safeBlockedListMatches.0.listType |
security_result.detection_fields.safeBlockedListMatches_listType |
El valor procede directamente del campo filter.modules.spam.safeBlockedListMatches.0.listType del registro sin procesar. |
filter.modules.spam.safeBlockedListMatches.0.rule |
security_result.detection_fields.safeBlockedListMatches_rule |
El valor procede directamente del campo filter.modules.spam.safeBlockedListMatches.0.rule del registro sin procesar. |
filter.modules.spam.scores.classifiers.adult |
security_result.detection_fields.adult |
El valor procede directamente del campo filter.modules.spam.scores.classifiers.adult del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.bulk |
security_result.detection_fields.bulk |
El valor procede directamente del campo filter.modules.spam.scores.classifiers.bulk del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.impostor |
security_result.detection_fields.impostor |
El valor procede directamente del campo filter.modules.spam.scores.classifiers.impostor del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.lowpriority |
security_result.detection_fields.lowpriority |
El valor procede directamente del campo filter.modules.spam.scores.classifiers.lowpriority del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.malware |
security_result.detection_fields.malware |
El valor procede directamente del campo filter.modules.spam.scores.classifiers.malware del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.mlx |
security_result.detection_fields.mlx |
El valor procede directamente del campo filter.modules.spam.scores.classifiers.mlx del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.mlxlog |
security_result.detection_fields.mlxlog |
El valor procede directamente del campo filter.modules.spam.scores.classifiers.mlxlog del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.phish |
security_result.detection_fields.phish |
El valor procede directamente del campo filter.modules.spam.scores.classifiers.phish del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.spam |
security_result.detection_fields.spam |
El valor procede directamente del campo filter.modules.spam.scores.classifiers.spam del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.classifiers.suspect |
security_result.detection_fields.suspect |
El valor procede directamente del campo filter.modules.spam.scores.classifiers.suspect del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.engine |
security_result.detection_fields.engine |
El valor procede directamente del campo filter.modules.spam.scores.engine del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.scores.overall |
security_result.detection_fields.overall |
El valor procede directamente del campo filter.modules.spam.scores.overall del registro sin procesar, si no está vacío o es 0. |
filter.modules.spam.version.definitions |
security_result.summary |
El valor procede directamente del campo filter.modules.spam.version.definitions del registro sin procesar. |
filter.modules.spam.version.engine |
metadata.product_version |
El valor procede directamente del campo filter.modules.spam.version.engine del registro sin procesar. |
filter.modules.urldefense.counts.rewritten |
read_only_udm.additional.fields.urldefenseCountsRewritten |
El valor procede directamente del campo filter.modules.urldefense.counts.rewritten del registro sin procesar. |
filter.modules.urldefense.counts.total |
security_result.detection_fields.urldefense_total |
El valor procede directamente del campo filter.modules.urldefense.counts.total del registro sin procesar. |
filter.modules.zerohour.score |
read_only_udm.additional.fields.zeroHourScore |
El valor procede directamente del campo filter.modules.zerohour.score del registro sin procesar. |
filter.origGuid |
read_only_udm.additional.fields.origGuid |
El valor procede directamente del campo filter.origGuid del registro sin procesar. |
filter.qid |
read_only_udm.additional.fields.filterQid |
El valor procede directamente del campo filter.qid del registro sin procesar. |
filter.quarantine.folder |
security_result.detection_fields.filter_quarantine_folder |
El valor procede directamente del campo filter.quarantine.folder del registro sin procesar. |
filter.quarantine.folderId |
security_result.detection_fields.filter_quarantine_folderId |
El valor procede directamente del campo filter.quarantine.quarantine.folderId del registro sin procesar. |
filter.quarantine.module |
security_result.detection_fields.filter_quarantine_module |
El valor procede directamente del campo filter.quarantine.module del registro sin procesar. |
filter.quarantine.rule |
security_result.detection_fields.filter_quarantine_rule |
El valor procede directamente del campo filter.quarantine.rule del registro sin procesar. |
filter.quarantine.type |
security_result.detection_fields.filter_quarantine_type |
El valor procede directamente del campo filter.quarantine.type del registro sin procesar. |
filter.routeDirection |
network.direction |
Si filter.routeDirection es "inbound", network.direction se define como "INBOUND". Si filter.routeDirection es "outbound", network.direction se define como "OUTBOUND". |
filter.routes |
read_only_udm.additional.fields |
Cada ruta de filter.routes se añade como un campo adicional con claves como "filterRoutes_0", "filterRoutes_1", etc. |
fromAddress |
network.email.from |
Las direcciones de correo de fromAddress se sustituyen por las del campo network.email.from si son válidas. |
guid |
metadata.product_log_id |
El valor procede directamente del campo guid del registro sin procesar. |
GUID |
metadata.product_log_id |
El valor procede directamente del campo GUID del registro sin procesar. |
headerFrom |
network.email.from |
El valor procede directamente del campo headerFrom del registro sin procesar. |
impostorScore |
security_result.detection_fields.impostorScore |
El valor procede directamente del campo impostorScore del registro sin procesar. |
malwareScore |
security_result.detection_fields.malwareScore |
El valor procede directamente del campo malwareScore del registro sin procesar. |
messageID |
network.email.mail_id |
El valor procede directamente del campo messageID del registro sin procesar. |
messageSize |
security_result.detection_fields.messageSize |
El valor procede directamente del campo messageSize del 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 procede directamente del campo metadata.customerId del registro sin procesar. |
metadata.origin.data.agent |
network.http.user_agent |
El valor procede directamente del campo metadata.origin.data.agent del registro sin procesar. |
metadata.origin.data.cid |
principal.user.userid |
El valor procede directamente del campo metadata.origin.data.cid del registro sin procesar. |
metadata.origin.data.version |
metadata.product_version |
El valor procede directamente del campo metadata.origin.data.version del registro sin procesar. |
msg.header.from |
read_only_udm.additional.fields.msgHeaderFrom |
El valor procede directamente del campo msg.header.from.0 del registro sin procesar. |
msg.header.reply-to |
network.email.reply_to |
La dirección de correo incluida entre <> en msg.header.reply-to.0 se extrae y se asigna. |
msg.header.subject |
network.email.subject |
El valor procede directamente del campo msg.header.subject del registro sin procesar. |
msg.header.to |
read_only_udm.additional.fields.msgHeaderTo |
El valor procede directamente del campo msg.header.to del registro sin procesar. |
msg.normalizedHeader.subject |
network.email.subject |
El valor procede directamente del campo msg.normalizedHeader.subject del registro sin procesar. |
msg.parsedAddresses.cc |
network.email.cc |
Las direcciones de correo de 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 cifradas con hash de msg.parsedAddresses.ccHashed se añaden como campos adicionales con claves como "ccHashed_0", "ccHashed_1", etc. |
msg.parsedAddresses.from |
read_only_udm.additional.fields.msgParsedAddressesFrom |
El valor procede directamente del campo msg.parsedAddresses.from.0 del registro sin procesar. |
msg.parsedAddresses.from.0 |
principal.user.email_addresses |
El valor procede directamente del campo msg.parsedAddresses.from.0 del registro sin procesar. |
msg.parsedAddresses.fromHashed |
read_only_udm.additional.fields.fromHashed |
El valor procede directamente del campo msg.parsedAddresses.fromHashed.0 del registro sin procesar. |
msg.parsedAddresses.to |
target.user.email_addresses |
Las direcciones de correo de 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 por cada entrada de msgParts . Se extraen los hashes, el tipo MIME, el tamaño y otros metadatos del archivo. |
QID |
security_result.detection_fields.QID |
El valor procede directamente del campo QID del registro sin procesar. |
recipient |
target.user.email_addresses |
Las direcciones de correo de recipient se combinan en el campo target.user.email_addresses si son válidas. |
replyToAddress |
network.email.reply_to |
Las direcciones de correo de replyToAddress se sustituyen por las del campo network.email.reply_to si son válidas. |
sender |
principal.user.email_addresses |
El valor procede directamente del campo sender del registro sin procesar, si se trata de una dirección de correo válida. |
senderIP |
principal.ip |
El valor procede directamente del campo senderIP del registro sin procesar. |
sm.from |
network.email.from |
El valor procede directamente del campo sm.from del registro sin procesar. |
sm.msgid |
network.email.mail_id |
El valor procede directamente del campo sm.msgid del registro sin procesar, después de eliminar "<" y ">". |
sm.proto |
network.application_protocol |
El valor procede directamente del campo sm.proto del registro sin procesar. |
sm.qid |
security_result.detection_fields.QUID |
El valor procede directamente del campo sm.qid del registro sin procesar. |
sm.relay |
intermediary.hostname , intermediary.ip |
El nombre de host y la dirección IP se extraen de sm.relay mediante grok. |
sm.stat |
security_result.detection_fields.Stat |
La primera palabra de sm.stat se extrae mediante grok y se asigna. |
sm.to |
network.email.to |
Las direcciones de correo de sm.to se combinan en el campo network.email.to si son válidas. |
spamScore |
security_result.detection_fields.spamScore |
El valor procede directamente del campo spamScore del registro sin procesar. |
subject |
network.email.subject |
El valor procede directamente del campo subject del registro sin procesar. |
threat |
security_result.detection_fields.threat |
El valor procede directamente del campo threat del registro sin procesar. |
threatsInfoMap |
security_result.detection_fields |
Los pares clave-valor de cada entrada de threatsInfoMap se añaden como campos de detección. |
threatType |
security_result.detection_fields.threatType |
El valor procede directamente del campo threatType del registro sin procesar. |
tls.cipher |
network.tls.cipher |
El valor procede directamente del campo tls.cipher del registro sin procesar, a menos que sea "NONE". |
tls.verify |
security_result.action_details |
El valor procede directamente del campo tls.verify del registro sin procesar. |
tls.version |
network.tls.version |
El valor procede directamente del campo tls.version del registro sin procesar, a menos que la cifra sea "NONE". |
toAddresses |
network.email.to |
Las direcciones de correo de toAddresses se combinan en el campo network.email.to si son válidas. |
ts |
@timestamp |
El valor se analiza a partir del campo ts con el formato ISO8601 o RFC 3339, después de un preprocesamiento para gestionar los segundos fraccionarios adicionales. |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.