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.
- Haga clic en el paquete de feeds Proofpoint.
- Seleccione el tipo de registro Proofpoint On-Demand.
- Haz clic en Siguiente.
- Especifique los valores de los siguientes parámetros de entrada:
- Tipo de fuente: API de terceros
- 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.
 Opciones avanzadas 
- Nombre del feed: un valor rellenado automáticamente que identifica el feed.
- Espacio de nombres del recurso: espacio de nombres asociado al feed.
- Etiquetas de ingestión: etiquetas aplicadas a todos los eventos de este feed.
- Haga clic en Crear feed.
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 classificationdel registro sin procesar. | 
| cluster | security_result.detection_fields.cluster | El valor procede directamente del campo clusterdel registro sin procesar. | 
| completelyRewritten | security_result.detection_fields.completelyRewritten | El valor procede directamente del campo completelyRewrittendel registro sin procesar. | 
| connection.country | principal.location.country_or_region | El valor procede directamente del campo connection.countrydel registro sin procesar, a menos que sea "**". | 
| connection.host | principal.hostname | El valor procede directamente del campo connection.hostdel registro sin procesar. | 
| connection.ip | principal.ip | El valor procede directamente del campo connection.ipdel registro sin procesar, si es una dirección IPv4 válida. También se combina consenderIP, si está presente. | 
| connection.protocol | network.application_protocol | La parte del protocolo que va antes de los dos puntos en connection.protocolse 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.cipherdel registro sin procesar, a menos que sea "NONE". | 
| connection.tls.inbound.version | network.tls.version | El valor procede directamente del campo connection.tls.inbound.versiondel registro sin procesar, a menos que la cifra sea "NONE". | 
| envelope.from | network.email.from | El valor procede directamente del campo envelope.fromdel registro sin procesar. También se sustituye porsm.fromofromAddresssi están presentes. | 
| envelope.rcpts | network.email.to | Las direcciones de correo de envelope.rcptsse combinan en el camponetwork.email.tosi son válidas. También se combina consm.tootoAddresses, si están presentes. | 
| envelope.rcptsHashed | read_only_udm.additional.fields | Las direcciones de correo cifradas con hash de envelope.rcptsHashedse añaden como campos adicionales con claves como "toHashed_0", "toHashed_1", etc. | 
| eventTime | @timestamp | El valor se analiza a partir del campo eventTimecon el formato ISO8601 o RFC 3339. | 
| eventType | security_result.summary | El valor procede directamente del campo eventTypedel registro sin procesar. | 
| filter.disposition | security_result.action_details | El valor procede directamente del campo filter.dispositiondel registro sin procesar, a menos que esté presentetls.verify. | 
| filter.modules.av.virusNames.0 | security_result.threat_name | El valor procede directamente del campo filter.modules.av.virusNames.0del 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.authResultsse 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.langsse 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.listTypedel 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.ruledel 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.adultdel 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.bulkdel 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.impostordel 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.lowprioritydel 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.malwaredel 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.mlxdel 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.mlxlogdel 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.phishdel 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.spamdel 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.suspectdel 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.enginedel 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.overalldel 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.definitionsdel registro sin procesar. | 
| filter.modules.spam.version.engine | metadata.product_version | El valor procede directamente del campo filter.modules.spam.version.enginedel registro sin procesar. | 
| filter.modules.urldefense.counts.rewritten | read_only_udm.additional.fields.urldefenseCountsRewritten | El valor procede directamente del campo filter.modules.urldefense.counts.rewrittendel registro sin procesar. | 
| filter.modules.urldefense.counts.total | security_result.detection_fields.urldefense_total | El valor procede directamente del campo filter.modules.urldefense.counts.totaldel registro sin procesar. | 
| filter.modules.zerohour.score | read_only_udm.additional.fields.zeroHourScore | El valor procede directamente del campo filter.modules.zerohour.scoredel registro sin procesar. | 
| filter.origGuid | read_only_udm.additional.fields.origGuid | El valor procede directamente del campo filter.origGuiddel registro sin procesar. | 
| filter.qid | read_only_udm.additional.fields.filterQid | El valor procede directamente del campo filter.qiddel registro sin procesar. | 
| filter.quarantine.folder | security_result.detection_fields.filter_quarantine_folder | El valor procede directamente del campo filter.quarantine.folderdel registro sin procesar. | 
| filter.quarantine.folderId | security_result.detection_fields.filter_quarantine_folderId | El valor procede directamente del campo filter.quarantine.quarantine.folderIddel registro sin procesar. | 
| filter.quarantine.module | security_result.detection_fields.filter_quarantine_module | El valor procede directamente del campo filter.quarantine.moduledel registro sin procesar. | 
| filter.quarantine.rule | security_result.detection_fields.filter_quarantine_rule | El valor procede directamente del campo filter.quarantine.ruledel registro sin procesar. | 
| filter.quarantine.type | security_result.detection_fields.filter_quarantine_type | El valor procede directamente del campo filter.quarantine.typedel registro sin procesar. | 
| filter.routeDirection | network.direction | Si filter.routeDirectiones "inbound",network.directionse define como "INBOUND". Sifilter.routeDirectiones "outbound",network.directionse define como "OUTBOUND". | 
| filter.routes | read_only_udm.additional.fields | Cada ruta de filter.routesse añade como un campo adicional con claves como "filterRoutes_0", "filterRoutes_1", etc. | 
| fromAddress | network.email.from | Las direcciones de correo de fromAddressse sustituyen por las del camponetwork.email.fromsi son válidas. | 
| guid | metadata.product_log_id | El valor procede directamente del campo guiddel registro sin procesar. | 
| GUID | metadata.product_log_id | El valor procede directamente del campo GUIDdel registro sin procesar. | 
| headerFrom | network.email.from | El valor procede directamente del campo headerFromdel registro sin procesar. | 
| impostorScore | security_result.detection_fields.impostorScore | El valor procede directamente del campo impostorScoredel registro sin procesar. | 
| malwareScore | security_result.detection_fields.malwareScore | El valor procede directamente del campo malwareScoredel registro sin procesar. | 
| messageID | network.email.mail_id | El valor procede directamente del campo messageIDdel registro sin procesar. | 
| messageSize | security_result.detection_fields.messageSize | El valor procede directamente del campo messageSizedel registro sin procesar. | 
| messageTime | @timestamp | El valor se analiza a partir del campo messageTimecon el formato ISO8601 o RFC 3339. | 
| metadata.customerId | principal.labels.customerId | El valor procede directamente del campo metadata.customerIddel registro sin procesar. | 
| metadata.origin.data.agent | network.http.user_agent | El valor procede directamente del campo metadata.origin.data.agentdel registro sin procesar. | 
| metadata.origin.data.cid | principal.user.userid | El valor procede directamente del campo metadata.origin.data.ciddel registro sin procesar. | 
| metadata.origin.data.version | metadata.product_version | El valor procede directamente del campo metadata.origin.data.versiondel registro sin procesar. | 
| msg.header.from | read_only_udm.additional.fields.msgHeaderFrom | El valor procede directamente del campo msg.header.from.0del registro sin procesar. | 
| msg.header.reply-to | network.email.reply_to | Se extrae y se asigna la dirección de correo incluida entre <> en msg.header.reply-to.0. | 
| msg.header.subject | network.email.subject | El valor procede directamente del campo msg.header.subjectdel registro sin procesar. | 
| msg.header.to | read_only_udm.additional.fields.msgHeaderTo | El valor procede directamente del campo msg.header.todel registro sin procesar. | 
| msg.normalizedHeader.subject | network.email.subject | El valor procede directamente del campo msg.normalizedHeader.subjectdel registro sin procesar. | 
| msg.parsedAddresses.cc | network.email.cc | Las direcciones de correo de msg.parsedAddresses.ccse combinan en el camponetwork.email.ccsi son válidas. | 
| msg.parsedAddresses.ccHashed | read_only_udm.additional.fields | Las direcciones de correo cifradas con hash de msg.parsedAddresses.ccHashedse 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.0del registro sin procesar. | 
| msg.parsedAddresses.from.0 | principal.user.email_addresses | El valor procede directamente del campo msg.parsedAddresses.from.0del registro sin procesar. | 
| msg.parsedAddresses.fromHashed | read_only_udm.additional.fields.fromHashed | El valor procede directamente del campo msg.parsedAddresses.fromHashed.0del registro sin procesar. | 
| msg.parsedAddresses.to | target.user.email_addresses | Las direcciones de correo de msg.parsedAddresses.tose combinan en el campotarget.user.email_addressessi 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 QIDdel registro sin procesar. | 
| recipient | target.user.email_addresses | Las direcciones de correo de recipientse combinan en el campotarget.user.email_addressessi son válidas. | 
| replyToAddress | network.email.reply_to | Las direcciones de correo de replyToAddressse sustituyen por las del camponetwork.email.reply_tosi son válidas. | 
| sender | principal.user.email_addresses | El valor procede directamente del campo senderdel registro sin procesar, si es una dirección de correo válida. | 
| senderIP | principal.ip | El valor procede directamente del campo senderIPdel registro sin procesar. | 
| sm.from | network.email.from | El valor procede directamente del campo sm.fromdel registro sin procesar. | 
| sm.msgid | network.email.mail_id | El valor procede directamente del campo sm.msgiddel registro sin procesar, después de eliminar "<" y ">". | 
| sm.proto | network.application_protocol | El valor procede directamente del campo sm.protodel registro sin procesar. | 
| sm.qid | security_result.detection_fields.QUID | El valor procede directamente del campo sm.qiddel registro sin procesar. | 
| sm.relay | intermediary.hostname,intermediary.ip | El nombre de host y la dirección IP se extraen de sm.relaymediante grok. | 
| sm.stat | security_result.detection_fields.Stat | La primera palabra de sm.statse extrae mediante grok y se asigna. | 
| sm.to | network.email.to | Las direcciones de correo de sm.tose combinan en el camponetwork.email.tosi son válidas. | 
| spamScore | security_result.detection_fields.spamScore | El valor procede directamente del campo spamScoredel registro sin procesar. | 
| subject | network.email.subject | El valor procede directamente del campo subjectdel registro sin procesar. | 
| threat | security_result.detection_fields.threat | El valor procede directamente del campo threatdel registro sin procesar. | 
| threatsInfoMap | security_result.detection_fields | Los pares clave-valor de cada entrada de threatsInfoMapse añaden como campos de detección. | 
| threatType | security_result.detection_fields.threatType | El valor procede directamente del campo threatTypedel registro sin procesar. | 
| tls.cipher | network.tls.cipher | El valor procede directamente del campo tls.cipherdel registro sin procesar, a menos que sea "NONE". | 
| tls.verify | security_result.action_details | El valor procede directamente del campo tls.verifydel registro sin procesar. | 
| tls.version | network.tls.version | El valor procede directamente del campo tls.versiondel registro sin procesar, a menos que la cifra sea "NONE". | 
| toAddresses | network.email.to | Las direcciones de correo de toAddressesse combinan en el camponetwork.email.tosi son válidas. | 
| ts | @timestamp | El valor se analiza a partir del campo tscon 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.