Raccogliere i log di ManageEngine Exchange Reporter Plus
Questo documento spiega come configurare ManageEngine Exchange Reporter Plus per inviare i log a Google Security Operations utilizzando i webhook.
ManageEngine Exchange Reporter Plus è una soluzione di reporting, controllo e monitoraggio basata sul web per gli ambienti Microsoft Exchange Server ed Exchange Online. Fornisce report completi su dimensioni delle caselle postali, traffico email, cartelle pubbliche, log Exchange ActiveSync e log di controllo per le attività di amministrazione e le modifiche alla configurazione nelle implementazioni Exchange ibride.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- ManageEngine Exchange Reporter Plus installato e configurato per monitorare Exchange Server o Exchange Online
- Accesso amministrativo alla console web di ManageEngine Exchange Reporter Plus
- Accesso a Google Cloud Console (per la creazione della chiave API)
Crea un feed webhook in Google SecOps
Creare il feed
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
ManageEngine Exchange Reporter Plus Logs). - Seleziona Webhook come Tipo di origine.
- Seleziona ManageEngine Exchange Reporter Plus come Tipo di log.
- Fai clic su Avanti.
- Specifica i valori per i seguenti parametri di input:
- (Facoltativo) Delimitatore di divisione: inserisci
\nper dividere gli eventi su più righe. - Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset
- Etichette di importazione: l'etichetta da applicare agli eventi di questo feed
- (Facoltativo) Delimitatore di divisione: inserisci
- Fai clic su Avanti.
- Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Genera e salva la chiave segreta
Dopo aver creato il feed, devi generare una chiave segreta per l'autenticazione:
- Nella pagina dei dettagli del feed, fai clic su Genera chiave segreta.
- Una finestra di dialogo mostra la chiave segreta.
- Copia e salva la chiave segreta in modo sicuro.
Importante: la chiave segreta viene visualizzata una sola volta e non può essere recuperata in un secondo momento. Se la perdi, devi generare una nuova chiave segreta.
Recuperare l'URL dell'endpoint del feed
- Vai alla scheda Dettagli del feed.
- Nella sezione Endpoint Information (Informazioni sull'endpoint), copia l'URL dell'endpoint del feed.
Il formato dell'URL è:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateo
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateSalva questo URL per i passaggi successivi.
Fai clic su Fine.
Creare una chiave API Google Cloud
Chronicle richiede una chiave API per l'autenticazione. Crea una chiave API con limitazioni nella Google Cloud Console.
Crea la chiave API
- Vai alla pagina Credenziali della console Google Cloud.
- Seleziona il tuo progetto (quello associato alla tua istanza di Chronicle).
- Fai clic su Crea credenziali > Chiave API.
- Viene creata una chiave API e visualizzata in una finestra di dialogo.
- Fai clic su Modifica chiave API per limitare la chiave.
Limitare la chiave API
- Nella pagina delle impostazioni Chiave API:
- Nome: inserisci un nome descrittivo (ad esempio,
Chronicle Webhook API Key)
- Nome: inserisci un nome descrittivo (ad esempio,
- In Limitazioni API:
- Seleziona Limita chiave.
- Nel menu a discesa Seleziona API, cerca e seleziona API Google SecOps (o API Chronicle).
- Fai clic su Salva.
- Copia il valore della chiave API dal campo Chiave API nella parte superiore della pagina.
- Salva la chiave API in modo sicuro.
Configurare il webhook di ManageEngine Exchange Reporter Plus
Costruisci l'URL webhook
Combina l'URL dell'endpoint Chronicle, la chiave API e la chiave segreta:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Esempio:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
Configurare l'inoltro dei log in Exchange Reporter Plus
- Accedi alla console web ManageEngine Exchange Reporter Plus come amministratore.
- Vai a Impostazioni > Amministrazione > Impostazioni generali > Log Forwarder.
- Seleziona la casella di controllo Abilita inoltro log.
- Fai clic sulla scheda Webhook.
- Fornisci i seguenti dettagli di configurazione:
- Metodo HTTP: seleziona POST.
- URL HTTP: incolla l'URL webhook completo creato nel passaggio precedente (l'URL dell'endpoint Chronicle con la chiave API e la chiave segreta aggiunte come parametri di ricerca).
- Nella sezione Impostazioni avanzate:
- Fai clic su Intestazioni delle richieste HTTP.
- Aggiungi la seguente intestazione:
- Chiave:
Content-Type - Valore:
application/json
- Chiave:
Fai clic su Salva.
Verificare l'inoltro dei log
- Dopo aver salvato la configurazione, Exchange Reporter Plus inizierà a inoltrare i log di controllo a Google SecOps tramite l'endpoint webhook.
- Accedi alla console Google SecOps e verifica che i log vengano visualizzati nell'interfaccia Ricerca con l'etichetta di importazione
MANAGE_ENGINE_REPORTER_PLUS.
Configurazione del firewall
Assicurati che siano configurate le seguenti regole firewall.
In uscita dal server Exchange Reporter Plus:
- Protocollo: HTTPS (TCP 443)
- Destinazione: endpoint regionale di Chronicle (
malachiteingestion-pa.googleapis.como il tuo endpoint regionale) - Scopo: consegna dei log a Google SecOps tramite webhook
Riferimento ai metodi di autenticazione
I feed webhook di Chronicle supportano più metodi di autenticazione. Scegli il metodo supportato dal tuo fornitore.
Metodo 1: intestazioni personalizzate (consigliato)
Se il tuo fornitore supporta le intestazioni HTTP personalizzate, utilizza questo metodo per una maggiore sicurezza.
Formato della richiesta:
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" }
Vantaggi:
- Chiave API e secret non visibili nell'URL
- Più sicuro (le intestazioni non vengono registrate nei log di accesso del server web)
- Metodo preferito se supportato dal fornitore
Metodo 2: parametri di query
Se il fornitore non supporta le intestazioni personalizzate, aggiungi le credenziali all'URL.
Formato dell'URL:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Esempio:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...Formato della richiesta:
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
Svantaggi: - Credenziali visibili nell'URL - Potrebbero essere registrate nei log di accesso del web server - Meno sicure degli header
Metodo 3: ibrido (URL + intestazione)
Alcune configurazioni utilizzano la chiave API nell'URL e la chiave segreta nell'intestazione.
Formato della richiesta:
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" }
Nomi delle intestazioni di autenticazione
Chronicle accetta i seguenti nomi di intestazione per l'autenticazione:
Per la chiave API:
x-goog-chronicle-auth(consigliata)X-Goog-Chronicle-Auth(senza distinzione tra maiuscole e minuscole)
Per la chiave segreta:
x-chronicle-auth(consigliata)X-Chronicle-Auth(senza distinzione tra maiuscole e minuscole)
Limiti e best practice per i webhook
Limiti per le richieste
| Limite | Valore |
|---|---|
| Dimensioni massime della richiesta | 4 MB |
| QPS max (query al secondo) | 15.000 |
| Timeout richieste | 30 secondi |
| Comportamento di ripetizione | Automatico con backoff esponenziale |
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
| msg.OrganizationId | additional.fields | Etichette unite con la chiave "OrganizationId" e il valore di msg.OrganizationId; la chiave "MailboxGuid" e il valore di msg.MailboxGuid; la chiave "RecordType" e il valore di msg.RecordType |
| msg.MailboxGuid | additional.fields | |
| msg.RecordType | additional.fields | |
| msg.CreationTime | metadata.event_type | Impostato sul valore di event_type se non è vuoto; altrimenti "USER_UNCATEGORIZED" se msg.Operation == "Update"; altrimenti "USER_CREATION" se msg.Operation == "Create" e msg.MailboxOwnerUPN non è vuoto; altrimenti "USER_UNCATEGORIZED" se msg.Operation == "Create"; altrimenti "USER_UNCATEGORIZED" se msg.UserId non è vuoto; altrimenti "STATUS_UPDATE" se msg.ClientIP non è vuoto; altrimenti "GENERIC_EVENT" |
| msg.Operation | metadata.product_event_type | Valore copiato direttamente |
| msg.Id | metadata.product_log_id | Valore copiato direttamente |
| msg.ClientVersion | metadata.product_version | Valore di msg.ClientVersion se non è vuoto, altrimenti msg.Version convertito in stringa |
| msg.Version | metadata.product_version | |
| AffectedItems.0.InternetMessageId | network.email.mail_id | Gsub < |
| AffectedItems | network.email.subject | Analizzato come JSON, elemento estratto.Soggetto, unito se trovato |
| msg.ClientInfoString | network.http.user_agent | Valore di msg.ClientInfoString se non è vuoto, altrimenti msg.Client |
| msg.Client | network.http.user_agent | |
| msg.ClientProcessName | principal.application | Valore copiato direttamente |
| msg.OriginatingServer | principal.hostname | Estratto utilizzando il pattern grok, se l'operazione va a buon fine, altrimenti il valore viene copiato direttamente |
| clientIP | principal.ip | Estratto da msg.ClientIP utilizzando grok |
| clientPort | principal.port | Estratto da msg.ClientIP utilizzando grok, convertito in numero intero |
| msg.UserKey | principal.user.attribute.labels | Imposta la chiave dell'etichetta su "UserKey", il valore su msg.UserKey, unito |
| msg.UserType | principal.user.attribute.roles | Imposta roles.name su msg.UserType, unito |
| msg.UserId | principal.user.email_addresses | Unito se msg.UserId corrisponde all'espressione regolare dell'email |
| msg.UserId | principal.user.userid | Valore copiato direttamente |
| msg.MailboxOwnerSid | principal.user.windows_sid | Valore di msg.MailboxOwnerSid se non è vuoto, altrimenti msg.LogonUserSid |
| msg.LogonUserSid | principal.user.windows_sid | |
| security_result | security_result | Unito dall'hash security_result |
| security_result_action | security_result.action | Unito da security_result_action |
| msg.ResultStatus | security_result.action_details | Valore copiato direttamente |
| msg.RecordType | security_result.detection_fields | Convertito in stringa, impostata la chiave "RecordType", valore su msg.RecordType, unito |
| msg.OrganizationName | target.administrative_domain | Valore copiato direttamente |
| msg.DestFolder | target.file.full_path | FileId e filePath estratti utilizzando grok, barre rovesciate gsubs, concatenati come fileId/filePath |
| host | target.hostname | Valore copiato direttamente |
| msg.Folder | target.process.parent_process.file.full_path | Sono stati estratti parentFileId e parentFilePath utilizzando grok, sono state sostituite le barre rovesciate e sono stati concatenati come parentFileId/parentFilePath |
| msg.MailboxOwnerUPN | target.user.email_addresses | Unito se corrisponde all'espressione regolare dell'email |
| msg.MailboxOwnerUPN | target.user.user_display_name | Imposta se contiene spazio |
| msg.MailboxOwnerUPN | target.user.userid | Imposta se non è un'email e non c'è spazio |
| metadata.product_name | metadata.product_name | Imposta su "Manage Engine" |
| metadata.vendor_name | metadata.vendor_name | Imposta su "Manage Engine Reporter Plus" |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.