Collecter les journaux ManageEngine Exchange Reporter Plus
Ce document explique comment configurer ManageEngine Exchange Reporter Plus pour envoyer des journaux à Google Security Operations à l'aide de webhooks.
ManageEngine Exchange Reporter Plus est une solution Web de création de rapports, d'audit et de surveillance pour les environnements Microsoft Exchange Server et Exchange Online. Il fournit des rapports complets sur la taille des boîtes aux lettres, le trafic d'e-mails, les dossiers publics, les journaux Exchange ActiveSync et les journaux d'audit pour les activités d'administrateur et les modifications de configuration dans les déploiements Exchange hybrides.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
- Une instance Google SecOps
- ManageEngine Exchange Reporter Plus installé et configuré pour surveiller Exchange Server ou Exchange Online
- Accès administrateur à la console Web ManageEngine Exchange Reporter Plus
- Accès à la Google Cloud Console (pour créer une clé API)
Créer un flux de webhook dans Google SecOps
Créer le flux
- 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,
ManageEngine Exchange Reporter Plus Logs). - Sélectionnez Webhook comme type de source.
- Sélectionnez ManageEngine Exchange Reporter Plus comme type de journal.
- Cliquez sur Suivant.
- Spécifiez les valeurs des paramètres d'entrée suivants :
- Délimiteur de fractionnement (facultatif) : saisissez
\npour fractionner les événements multilignes. - Espace de noms de l'élément : espace de noms de l'élément
- Libellés d'ingestion : libellé à appliquer aux événements de ce flux
- Délimiteur de fractionnement (facultatif) : saisissez
- Cliquez sur Suivant.
- Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.
Générer et enregistrer une clé secrète
Après avoir créé le flux, vous devez générer une clé secrète pour l'authentification :
- Sur la page d'informations sur le flux, cliquez sur Générer une clé secrète.
- Une boîte de dialogue affiche la clé secrète.
- Copiez et enregistrez la clé secrète de manière sécurisée.
Important : La clé secrète ne s'affiche qu'une seule fois et ne peut pas être récupérée ultérieurement. Si vous la perdez, vous devrez générer une nouvelle clé secrète.
Obtenir l'URL du point de terminaison du flux
- Accédez à l'onglet Détails du flux.
- Dans la section Endpoint Information (Informations sur le point de terminaison), copiez l'URL du point de terminaison du flux.
Le format d'URL est le suivant :
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateou
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateEnregistrez cette URL pour les étapes suivantes.
Cliquez sur OK.
Créer une clé API Google Cloud
Chronicle nécessite une clé API pour l'authentification. Créez une clé API restreinte dans la Google Cloud Console.
Créer la clé API
- Accédez à la page Identifiants de la console Google Cloud.
- Sélectionnez votre projet (celui associé à votre instance Chronicle).
- Cliquez sur Créer des identifiants> Clé API.
- Une clé API est créée et affichée dans une boîte de dialogue.
- Cliquez sur Modifier la clé API pour la restreindre.
Restreindre la clé API
- Sur la page des paramètres Clé API :
- Nom : saisissez un nom descriptif (par exemple,
Chronicle Webhook API Key).
- Nom : saisissez un nom descriptif (par exemple,
- Sous Restrictions relatives aux API :
- Sélectionnez Restreindre la clé.
- Dans le menu déroulant Sélectionner des API, recherchez et sélectionnez Google SecOps API (ou Chronicle API).
- Cliquez sur Enregistrer.
- Copiez la valeur de la clé API depuis le champ Clé API en haut de la page.
- Enregistrez la clé API de manière sécurisée.
Configurer le webhook ManageEngine Exchange Reporter Plus
Créer l'URL du webhook
Combinez l'URL du point de terminaison Chronicle, la clé API et la clé secrète :
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Exemple :
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
Configurer le transfert de journaux dans Exchange Reporter Plus
- Connectez-vous à la console Web ManageEngine Exchange Reporter Plus en tant qu'administrateur.
- Accédez à Paramètres> Admin> Paramètres généraux> Transmetteur de journaux.
- Cochez la case Activer le transfert de journaux.
- Cliquez sur l'onglet Webhook.
- Fournissez les informations de configuration suivantes :
- Méthode HTTP : sélectionnez POST.
- URL HTTP : collez l'URL complète du webhook construite à l'étape précédente (l'URL du point de terminaison Chronicle avec la clé API et la clé secrète ajoutées en tant que paramètres de requête).
- Dans la section Paramètres avancés :
- Cliquez sur En-têtes de requête HTTP.
- Ajoutez l'en-tête suivant :
- Key (Clé) :
Content-Type - Valeur :
application/json
- Key (Clé) :
Cliquez sur Enregistrer.
Vérifier le transfert de journaux
- Une fois la configuration enregistrée, Exchange Reporter Plus commence à transférer les journaux d'audit vers Google SecOps via le point de terminaison du webhook.
- Connectez-vous à la console Google SecOps et vérifiez que les journaux s'affichent dans l'interface Rechercher avec le libellé d'ingestion
MANAGE_ENGINE_REPORTER_PLUS.
Configuration du pare-feu
Assurez-vous que les règles de pare-feu suivantes sont configurées.
Sortant du serveur Exchange Reporter Plus :
- Protocole : HTTPS (TCP 443)
- Destination : point de terminaison régional Chronicle (
malachiteingestion-pa.googleapis.comou votre point de terminaison régional) - Objectif : diffusion des journaux vers Google SecOps via un webhook
Référence des méthodes d'authentification
Les flux de webhook Chronicle sont compatibles avec plusieurs méthodes d'authentification. Choisissez la méthode acceptée par votre fournisseur.
Méthode 1 : En-têtes personnalisés (recommandée)
Si votre fournisseur accepte les en-têtes HTTP personnalisés, utilisez cette méthode pour une meilleure sécurité.
Format de la demande :
POST <ENDPOINT_URL> HTTP/1.1 Content-Type: application/json x-goog-chronicle-auth: <API_KEY> x-chronicle-auth: <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
Avantages :
- Clé API et code secret non visibles dans l'URL
- Plus sécurisé (les en-têtes ne sont pas consignés dans les journaux d'accès au serveur Web)
- Méthode à privilégier lorsque le fournisseur la prend en charge
Méthode 2 : Paramètres de requête
Si votre fournisseur n'accepte pas les en-têtes personnalisés, ajoutez les identifiants à l'URL.
Format de l'URL :
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Exemple :
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...Format de la demande :
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
Inconvénients : - Les identifiants sont visibles dans l'URL. - Ils peuvent être enregistrés dans les journaux d'accès du serveur Web. - Ils sont moins sécurisés que les en-têtes.
Méthode 3 : Hybride (URL + en-tête)
Certaines configurations utilisent une clé API dans l'URL et une clé secrète dans l'en-tête.
Format de la demande :
POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1 Content-Type: application/json x-chronicle-auth: <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
Noms des en-têtes d'authentification
Chronicle accepte les noms d'en-tête suivants pour l'authentification :
Pour la clé API :
x-goog-chronicle-auth(recommandé)X-Goog-Chronicle-Auth(non sensible à la casse)
Pour la clé secrète :
x-chronicle-auth(recommandé)X-Chronicle-Auth(non sensible à la casse)
Limites et bonnes pratiques concernant les webhooks
Limites de requêtes
| Limite | Valeur |
|---|---|
| Taille maximale de la requête | 4 Mo |
| RPS (requêtes par seconde) max. | 15 000 |
| Délai avant expiration de la requête | 30 seconds |
| Comportement de nouvelle tentative | Automatique avec intervalle exponentiel entre les tentatives |
Table de mappage UDM
| Champ de journal | Mappage UDM | Logique |
|---|---|---|
| msg.OrganizationId | additional.fields | Libellés fusionnés avec la clé "OrganizationId" et la valeur de msg.OrganizationId ; la clé "MailboxGuid" et la valeur de msg.MailboxGuid ; la clé "RecordType" et la valeur de msg.RecordType |
| msg.MailboxGuid | additional.fields | |
| msg.RecordType | additional.fields | |
| msg.CreationTime | metadata.event_type | Défini sur la valeur de event_type si elle n'est pas vide ; sinon, "USER_UNCATEGORIZED" si msg.Operation == "Update" ; sinon, "USER_CREATION" si msg.Operation == "Create" et msg.MailboxOwnerUPN n'est pas vide ; sinon, "USER_UNCATEGORIZED" si msg.Operation == "Create" ; sinon, "USER_UNCATEGORIZED" si msg.UserId n'est pas vide ; sinon, "STATUS_UPDATE" si msg.ClientIP n'est pas vide ; sinon, "GENERIC_EVENT". |
| msg.Operation | metadata.product_event_type | Valeur copiée directement |
| msg.Id | metadata.product_log_id | Valeur copiée directement |
| msg.ClientVersion | metadata.product_version | Valeur de msg.ClientVersion si elle n'est pas vide, sinon msg.Version converti en chaîne |
| msg.Version | metadata.product_version | |
| AffectedItems.0.InternetMessageId | network.email.mail_id | Gsub < |
| AffectedItems | network.email.subject | Analysé au format JSON, élément extrait "Subject", fusionné si trouvé |
| msg.ClientInfoString | network.http.user_agent | Valeur de msg.ClientInfoString si elle n'est pas vide, sinon msg.Client |
| msg.Client | network.http.user_agent | |
| msg.ClientProcessName | principal.application | Valeur copiée directement |
| msg.OriginatingServer | principal.hostname | Extrait à l'aide du modèle grok, si l'opération réussit, sinon la valeur est copiée directement |
| clientIP | principal.ip | Extrait de msg.ClientIP à l'aide de grok |
| clientPort | principal.port | Extrait de msg.ClientIP à l'aide de grok, converti en entier |
| msg.UserKey | principal.user.attribute.labels | Définissez la clé du libellé sur "UserKey", la valeur sur msg.UserKey et l'état sur "Fusionné". |
| msg.UserType | principal.user.attribute.roles | Définir roles.name sur msg.UserType, fusionné |
| msg.UserId | principal.user.email_addresses | Fusionné si msg.UserId correspond à l'expression régulière de l'adresse e-mail |
| msg.UserId | principal.user.userid | Valeur copiée directement |
| msg.MailboxOwnerSid | principal.user.windows_sid | Valeur de msg.MailboxOwnerSid si elle n'est pas vide, sinon msg.LogonUserSid |
| msg.LogonUserSid | principal.user.windows_sid | |
| security_result | security_result | Fusionné à partir du hachage security_result |
| security_result_action | security_result.action | Fusionné à partir de security_result_action |
| msg.ResultStatus | security_result.action_details | Valeur copiée directement |
| msg.RecordType | security_result.detection_fields | Converti en chaîne, clé "RecordType" définie, valeur définie sur msg.RecordType, fusionnée |
| msg.OrganizationName | target.administrative_domain | Valeur copiée directement |
| msg.DestFolder | target.file.full_path | Extraction de fileId et filePath à l'aide de grok, remplacement des barres obliques inverses, concaténation sous la forme fileId/filePath |
| hôte | target.hostname | Valeur copiée directement |
| msg.Folder | target.process.parent_process.file.full_path | Extraction de parentFileId et parentFilePath à l'aide de grok, remplacement des barres obliques inverses, concaténation sous la forme parentFileId/parentFilePath |
| msg.MailboxOwnerUPN | target.user.email_addresses | Fusionné si l'adresse e-mail correspond à l'expression régulière |
| msg.MailboxOwnerUPN | target.user.user_display_name | Définir si contient un espace |
| msg.MailboxOwnerUPN | target.user.userid | Définir si ce n'est pas un e-mail et qu'il n'y a pas d'espace |
| metadata.product_name | metadata.product_name | Définissez la valeur sur "ManageEngine". |
| metadata.vendor_name | metadata.vendor_name | Définissez-le sur "ManageEngine Reporter Plus". |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.