Collecter les journaux Proofpoint On-Demand
Ce document explique comment ingérer les journaux Proofpoint On-Demand dans Google Security Operations à l'aide de l'intégration d'API intégrée. L'analyseur extrait les champs des journaux JSON et les transforme au format UDM de Chronicle. Il gère deux formats de journaux principaux : l'un contenant des métadonnées d'e-mails et l'autre contenant des détails sur les transactions SMTP. Il utilise une logique conditionnelle pour analyser les champs de manière appropriée et remplir les champs du modèle de données unifié (UDM) en fonction des données disponibles. L'analyseur effectue également un nettoyage des données, par exemple en supprimant les caractères superflus et en convertissant les codes temporels.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Instance Google SecOps
- Licence Proofpoint On-Demand Remote Syslog
- Accès privilégié à Proofpoint
Configurer l'accès à l'API Proofpoint On-Demand
- Connectez-vous au portail Proofpoint Admin.
- Copiez votre ID de cluster (affiché en haut à droite de votre interface de gestion, à côté du numéro de version).
- Accédez à Paramètres > Gestion des clés API.
- Cliquez sur Créer pour ouvrir la boîte de dialogue Créer une clé API.
- Saisissez un nom unique (par exemple,
Google SecOps Key
). - Générez la clé API.
- Sélectionnez Afficher les détails dans le menu à trois points de la nouvelle clé API.
- Copiez la clé API.
Configurer des flux
Il existe deux points d'entrée différents pour configurer les flux dans la plate-forme Google SecOps :
- Paramètres SIEM> Flux
- Plate-forme de contenu > Packs de contenu
Configurer des flux à partir de Paramètres SIEM > Flux
Pour configurer un flux, procédez comme suit :
- Accédez à Paramètres SIEM > Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Sur la page suivante, cliquez sur Configurer un seul flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
PoD Logs
). - Sélectionnez API tierce comme Type de source.
- Sélectionnez le type de journal Proofpoint On-Demand.
- Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants :
- En-têtes HTTP d'authentification : saisissez la clé API Proofpoint au format
Authorization: Bearer {API_KEY}
, puis ajoutez une nouvelle ligne avec les données WebSocket-Key suivantes :Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==
. - ID de cluster : saisissez l'ID de cluster Proofpoint que vous avez copié précédemment.
- En-têtes HTTP d'authentification : saisissez la clé API Proofpoint au format
Cliquez sur Suivant.
Vérifiez la configuration du flux sur l'écran Finaliser, puis cliquez sur Envoyer.
Configurer des flux depuis le Hub de contenu
Indiquez les valeurs des champs suivants :
- En-têtes HTTP d'authentification : saisissez la clé API Proofpoint au format
Authorization: Bearer {API_KEY}
, puis ajoutez une nouvelle ligne avec les données WebSocket-Key suivantes :Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==
. - ID de cluster : saisissez l'ID de cluster Proofpoint que vous avez copié précédemment.
Options avancées
- Nom du flux : valeur préremplie qui identifie le flux.
- Type de source : méthode utilisée pour collecter les journaux dans Google SecOps.
- Espace de noms de l'élément : espace de noms associé au flux.
- Libellés d'ingestion : libellés appliqués à tous les événements de ce flux.
Table de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
classification |
security_result.detection_fields.classification |
La valeur provient directement du champ classification du journal brut. |
cluster |
security_result.detection_fields.cluster |
La valeur provient directement du champ cluster du journal brut. |
completelyRewritten |
security_result.detection_fields.completelyRewritten |
La valeur provient directement du champ completelyRewritten du journal brut. |
connection.country |
principal.location.country_or_region |
La valeur provient directement du champ connection.country du journal brut, sauf si elle est "**". |
connection.host |
principal.hostname |
La valeur provient directement du champ connection.host du journal brut. |
connection.ip |
principal.ip |
La valeur provient directement du champ connection.ip du journal brut, s'il s'agit d'une adresse IPv4 valide. Il est également fusionné avec senderIP , le cas échéant. |
connection.protocol |
network.application_protocol |
La partie du protocole avant le deux-points dans connection.protocol est extraite à l'aide de gsub et mappée. Par exemple, "smtp:smtp" devient "SMTP". |
connection.tls.inbound.cipher |
network.tls.cipher |
La valeur provient directement du champ connection.tls.inbound.cipher du journal brut, sauf si elle est définie sur "NONE". |
connection.tls.inbound.version |
network.tls.version |
La valeur provient directement du champ connection.tls.inbound.version du journal brut, sauf si le chiffrement est défini sur "NONE". |
envelope.from |
network.email.from |
La valeur provient directement du champ envelope.from du journal brut. Il est également remplacé par sm.from ou fromAddress , le cas échéant. |
envelope.rcpts |
network.email.to |
Les adresses e-mail de envelope.rcpts sont fusionnées dans le champ network.email.to si elles sont valides. Il est également fusionné avec sm.to ou toAddresses s'il est présent. |
envelope.rcptsHashed |
read_only_udm.additional.fields |
Les adresses e-mail hachées dans envelope.rcptsHashed sont ajoutées en tant que champs supplémentaires avec des clés telles que "toHashed_0", "toHashed_1", etc. |
eventTime |
@timestamp |
La valeur est analysée à partir du champ eventTime au format ISO8601 ou RFC 3339. |
eventType |
security_result.summary |
La valeur provient directement du champ eventType du journal brut. |
filter.disposition |
security_result.action_details |
La valeur provient directement du champ filter.disposition du journal brut, sauf si tls.verify est présent. |
filter.modules.av.virusNames.0 |
security_result.threat_name |
La valeur provient directement du champ filter.modules.av.virusNames.0 du journal brut. |
filter.modules.dmarc.authResults |
read_only_udm.additional.fields |
La méthode et le résultat de chaque entrée dans filter.modules.dmarc.authResults sont ajoutés en tant que champs supplémentaires avec des clés telles que "authResultsMethod_0", "authResults_result_0", "authResultsMethod_1", etc. |
filter.modules.spam.langs |
read_only_udm.additional.fields |
Chaque langue dans filter.modules.spam.langs est ajoutée en tant que champ supplémentaire avec des clés telles que "lang_0", "lang_1", etc. |
filter.modules.spam.safeBlockedListMatches.0.listType |
security_result.detection_fields.safeBlockedListMatches_listType |
La valeur provient directement du champ filter.modules.spam.safeBlockedListMatches.0.listType du journal brut. |
filter.modules.spam.safeBlockedListMatches.0.rule |
security_result.detection_fields.safeBlockedListMatches_rule |
La valeur provient directement du champ filter.modules.spam.safeBlockedListMatches.0.rule du journal brut. |
filter.modules.spam.scores.classifiers.adult |
security_result.detection_fields.adult |
La valeur provient directement du champ filter.modules.spam.scores.classifiers.adult du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.scores.classifiers.bulk |
security_result.detection_fields.bulk |
La valeur provient directement du champ filter.modules.spam.scores.classifiers.bulk du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.scores.classifiers.impostor |
security_result.detection_fields.impostor |
La valeur provient directement du champ filter.modules.spam.scores.classifiers.impostor du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.scores.classifiers.lowpriority |
security_result.detection_fields.lowpriority |
La valeur provient directement du champ filter.modules.spam.scores.classifiers.lowpriority du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.scores.classifiers.malware |
security_result.detection_fields.malware |
La valeur provient directement du champ filter.modules.spam.scores.classifiers.malware du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.scores.classifiers.mlx |
security_result.detection_fields.mlx |
La valeur provient directement du champ filter.modules.spam.scores.classifiers.mlx du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.scores.classifiers.mlxlog |
security_result.detection_fields.mlxlog |
La valeur provient directement du champ filter.modules.spam.scores.classifiers.mlxlog du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.scores.classifiers.phish |
security_result.detection_fields.phish |
La valeur provient directement du champ filter.modules.spam.scores.classifiers.phish du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.scores.classifiers.spam |
security_result.detection_fields.spam |
La valeur provient directement du champ filter.modules.spam.scores.classifiers.spam du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.scores.classifiers.suspect |
security_result.detection_fields.suspect |
La valeur provient directement du champ filter.modules.spam.scores.classifiers.suspect du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.scores.engine |
security_result.detection_fields.engine |
La valeur provient directement du champ filter.modules.spam.scores.engine du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.scores.overall |
security_result.detection_fields.overall |
La valeur provient directement du champ filter.modules.spam.scores.overall du journal brut, s'il n'est pas vide ni égal à 0. |
filter.modules.spam.version.definitions |
security_result.summary |
La valeur provient directement du champ filter.modules.spam.version.definitions du journal brut. |
filter.modules.spam.version.engine |
metadata.product_version |
La valeur provient directement du champ filter.modules.spam.version.engine du journal brut. |
filter.modules.urldefense.counts.rewritten |
read_only_udm.additional.fields.urldefenseCountsRewritten |
La valeur provient directement du champ filter.modules.urldefense.counts.rewritten du journal brut. |
filter.modules.urldefense.counts.total |
security_result.detection_fields.urldefense_total |
La valeur provient directement du champ filter.modules.urldefense.counts.total du journal brut. |
filter.modules.zerohour.score |
read_only_udm.additional.fields.zeroHourScore |
La valeur provient directement du champ filter.modules.zerohour.score du journal brut. |
filter.origGuid |
read_only_udm.additional.fields.origGuid |
La valeur provient directement du champ filter.origGuid du journal brut. |
filter.qid |
read_only_udm.additional.fields.filterQid |
La valeur provient directement du champ filter.qid du journal brut. |
filter.quarantine.folder |
security_result.detection_fields.filter_quarantine_folder |
La valeur provient directement du champ filter.quarantine.folder du journal brut. |
filter.quarantine.folderId |
security_result.detection_fields.filter_quarantine_folderId |
La valeur provient directement du champ filter.quarantine.quarantine.folderId du journal brut. |
filter.quarantine.module |
security_result.detection_fields.filter_quarantine_module |
La valeur provient directement du champ filter.quarantine.module du journal brut. |
filter.quarantine.rule |
security_result.detection_fields.filter_quarantine_rule |
La valeur provient directement du champ filter.quarantine.rule du journal brut. |
filter.quarantine.type |
security_result.detection_fields.filter_quarantine_type |
La valeur provient directement du champ filter.quarantine.type du journal brut. |
filter.routeDirection |
network.direction |
Si filter.routeDirection est défini sur "inbound", network.direction est défini sur "INBOUND". Si filter.routeDirection est défini sur "outbound", network.direction est défini sur "OUTBOUND". |
filter.routes |
read_only_udm.additional.fields |
Chaque itinéraire de filter.routes est ajouté en tant que champ supplémentaire avec des clés telles que "filterRoutes_0", "filterRoutes_1", etc. |
fromAddress |
network.email.from |
Les adresses e-mail de fromAddress sont remplacées dans le champ network.email.from si elles sont valides. |
guid |
metadata.product_log_id |
La valeur provient directement du champ guid du journal brut. |
GUID |
metadata.product_log_id |
La valeur provient directement du champ GUID du journal brut. |
headerFrom |
network.email.from |
La valeur provient directement du champ headerFrom du journal brut. |
impostorScore |
security_result.detection_fields.impostorScore |
La valeur provient directement du champ impostorScore du journal brut. |
malwareScore |
security_result.detection_fields.malwareScore |
La valeur provient directement du champ malwareScore du journal brut. |
messageID |
network.email.mail_id |
La valeur provient directement du champ messageID du journal brut. |
messageSize |
security_result.detection_fields.messageSize |
La valeur provient directement du champ messageSize du journal brut. |
messageTime |
@timestamp |
La valeur est analysée à partir du champ messageTime au format ISO8601 ou RFC 3339. |
metadata.customerId |
principal.labels.customerId |
La valeur provient directement du champ metadata.customerId du journal brut. |
metadata.origin.data.agent |
network.http.user_agent |
La valeur provient directement du champ metadata.origin.data.agent du journal brut. |
metadata.origin.data.cid |
principal.user.userid |
La valeur provient directement du champ metadata.origin.data.cid du journal brut. |
metadata.origin.data.version |
metadata.product_version |
La valeur provient directement du champ metadata.origin.data.version du journal brut. |
msg.header.from |
read_only_udm.additional.fields.msgHeaderFrom |
La valeur provient directement du champ msg.header.from.0 du journal brut. |
msg.header.reply-to |
network.email.reply_to |
L'adresse e-mail entre <> dans msg.header.reply-to.0 est extraite et mappée. |
msg.header.subject |
network.email.subject |
La valeur provient directement du champ msg.header.subject du journal brut. |
msg.header.to |
read_only_udm.additional.fields.msgHeaderTo |
La valeur provient directement du champ msg.header.to du journal brut. |
msg.normalizedHeader.subject |
network.email.subject |
La valeur provient directement du champ msg.normalizedHeader.subject du journal brut. |
msg.parsedAddresses.cc |
network.email.cc |
Les adresses e-mail de msg.parsedAddresses.cc sont fusionnées dans le champ network.email.cc si elles sont valides. |
msg.parsedAddresses.ccHashed |
read_only_udm.additional.fields |
Les adresses e-mail hachées dans msg.parsedAddresses.ccHashed sont ajoutées en tant que champs supplémentaires avec des clés telles que "ccHashed_0", "ccHashed_1", etc. |
msg.parsedAddresses.from |
read_only_udm.additional.fields.msgParsedAddressesFrom |
La valeur provient directement du champ msg.parsedAddresses.from.0 du journal brut. |
msg.parsedAddresses.from.0 |
principal.user.email_addresses |
La valeur provient directement du champ msg.parsedAddresses.from.0 du journal brut. |
msg.parsedAddresses.fromHashed |
read_only_udm.additional.fields.fromHashed |
La valeur provient directement du champ msg.parsedAddresses.fromHashed.0 du journal brut. |
msg.parsedAddresses.to |
target.user.email_addresses |
Les adresses e-mail de msg.parsedAddresses.to sont fusionnées dans le champ target.user.email_addresses si elles sont valides. |
msgParts |
read_only_udm.about |
Plusieurs objets "about" sont créés, un pour chaque entrée dans msgParts . Les hachages de fichier, le type MIME, la taille et d'autres métadonnées sont extraits. |
QID |
security_result.detection_fields.QID |
La valeur provient directement du champ QID du journal brut. |
recipient |
target.user.email_addresses |
Les adresses e-mail de recipient sont fusionnées dans le champ target.user.email_addresses si elles sont valides. |
replyToAddress |
network.email.reply_to |
Les adresses e-mail de replyToAddress sont remplacées dans le champ network.email.reply_to si elles sont valides. |
sender |
principal.user.email_addresses |
La valeur provient directement du champ sender du journal brut, s'il s'agit d'une adresse e-mail valide. |
senderIP |
principal.ip |
La valeur provient directement du champ senderIP du journal brut. |
sm.from |
network.email.from |
La valeur provient directement du champ sm.from du journal brut. |
sm.msgid |
network.email.mail_id |
La valeur provient directement du champ sm.msgid du journal brut, après suppression des signes "<" et ">". |
sm.proto |
network.application_protocol |
La valeur provient directement du champ sm.proto du journal brut. |
sm.qid |
security_result.detection_fields.QUID |
La valeur provient directement du champ sm.qid du journal brut. |
sm.relay |
intermediary.hostname , intermediary.ip |
Le nom d'hôte et l'adresse IP sont extraits de sm.relay à l'aide de grok. |
sm.stat |
security_result.detection_fields.Stat |
Le premier mot de sm.stat est extrait à l'aide de grok et mappé. |
sm.to |
network.email.to |
Les adresses e-mail de sm.to sont fusionnées dans le champ network.email.to si elles sont valides. |
spamScore |
security_result.detection_fields.spamScore |
La valeur provient directement du champ spamScore du journal brut. |
subject |
network.email.subject |
La valeur provient directement du champ subject du journal brut. |
threat |
security_result.detection_fields.threat |
La valeur provient directement du champ threat du journal brut. |
threatsInfoMap |
security_result.detection_fields |
Les paires clé/valeur de chaque entrée de threatsInfoMap sont ajoutées en tant que champs de détection. |
threatType |
security_result.detection_fields.threatType |
La valeur provient directement du champ threatType du journal brut. |
tls.cipher |
network.tls.cipher |
La valeur provient directement du champ tls.cipher du journal brut, sauf si elle est définie sur "NONE". |
tls.verify |
security_result.action_details |
La valeur provient directement du champ tls.verify du journal brut. |
tls.version |
network.tls.version |
La valeur provient directement du champ tls.version du journal brut, sauf si le chiffrement est défini sur "NONE". |
toAddresses |
network.email.to |
Les adresses e-mail de toAddresses sont fusionnées dans le champ network.email.to si elles sont valides. |
ts |
@timestamp |
La valeur est analysée à partir du champ ts au format ISO8601 ou RFC 3339, après un prétraitement pour gérer les secondes fractionnaires supplémentaires. |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.