Recopila registros de ManageEngine Exchange Reporter Plus
En este documento, se explica cómo configurar ManageEngine Exchange Reporter Plus para enviar registros a Google Security Operations a través de webhooks.
ManageEngine Exchange Reporter Plus es una solución de informes, auditoría y supervisión basada en la Web para entornos de Microsoft Exchange Server y Exchange Online. Proporciona informes integrales sobre los tamaños de los buzones, el tráfico de correo electrónico, las carpetas públicas, los registros de Exchange ActiveSync y los registros de auditoría para las actividades del administrador y los cambios de configuración en las implementaciones híbridas de Exchange.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Una instancia de Google SecOps
- ManageEngine Exchange Reporter Plus instalado y configurado para supervisar Exchange Server o Exchange Online
- Acceso administrativo a la consola web de ManageEngine Exchange Reporter Plus
- Acceso a la Google Cloud Console (para la creación de claves de API)
Crea un feed de webhook en Google SecOps
Crea el feed
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- En la siguiente página, haz clic en Configurar un solo feed.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
ManageEngine Exchange Reporter Plus Logs). - Selecciona Webhook como el Tipo de origen.
- Selecciona ManageEngine Exchange Reporter Plus como el Tipo de registro.
- Haz clic en Siguiente.
- Especifica valores para los siguientes parámetros de entrada:
- Delimitador de división (opcional): Ingresa
\npara dividir eventos de varias líneas. - Espacio de nombres del recurso: Es el espacio de nombres del recurso.
- Etiquetas de transferencia: Es la etiqueta que se aplicará a los eventos de este feed.
- Delimitador de división (opcional): Ingresa
- Haz clic en Siguiente.
- Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Genera y guarda la clave secreta
Después de crear el feed, debes generar una clave secreta para la autenticación:
- En la página de detalles del feed, haz clic en Generar clave secreta.
- Un diálogo muestra la clave secreta.
- Copia y guarda la clave secreta de forma segura.
Importante: La clave secreta solo se muestra una vez y no se puede recuperar más adelante. Si la pierdes, tendrás que generar una nueva.
Obtén la URL del extremo del feed
- Ve a la pestaña Detalles del feed.
- En la sección Endpoint Information, copia la URL del extremo del feed.
El formato de la URL es el siguiente:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateo
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateGuarda esta URL para los próximos pasos.
Haz clic en Listo.
Crea una clave de API de Google Cloud
Chronicle requiere una clave de API para la autenticación. Crea una clave de API restringida en la Google Cloud Console.
Crea la clave de API
- Ve a la página Credenciales de la consola de Google Cloud.
- Selecciona tu proyecto (el proyecto asociado con tu instancia de Chronicle).
- Haz clic en Crear credenciales > Clave de API.
- Se creará una clave de API y se mostrará en un diálogo.
- Haz clic en Editar clave de API para restringir la clave.
Restringe la clave de API
- En la página de configuración de la clave de API, haz lo siguiente:
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
Chronicle Webhook API Key).
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
- En Restricciones de API, haz lo siguiente:
- Selecciona Restringir clave.
- En el menú desplegable Seleccionar APIs, busca y selecciona Google SecOps API (o Chronicle API).
- Haz clic en Guardar.
- Copia el valor de la clave de API del campo Clave de API en la parte superior de la página.
- Guarda la clave de API de forma segura.
Configura el webhook de ManageEngine Exchange Reporter Plus
Construye la URL del webhook
Combina la URL del extremo de Chronicle, la clave de API y la clave secreta:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Ejemplo:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
Configura el reenvío de registros en Exchange Reporter Plus
- Accede a la consola web de ManageEngine Exchange Reporter Plus como administrador.
- Ve a Configuración > Administrador > Configuración general > Reenvío de registros.
- Selecciona la casilla de verificación Habilitar reenvío de registros.
- Haz clic en la pestaña Webhook.
- Proporciona los siguientes detalles de configuración:
- Método HTTP: Selecciona POST.
- URL de HTTP: Pega la URL completa del webhook que creaste en el paso anterior (la URL del extremo de Chronicle con la clave de API y la clave secreta agregadas como parámetros de búsqueda).
- En la sección Configuración avanzada, haz lo siguiente:
- Haz clic en Encabezados de solicitud HTTP.
- Agrega el siguiente encabezado:
- Key:
Content-Type - Value:
application/json
- Key:
Haz clic en Guardar.
Verifica el reenvío de registros
- Después de guardar la configuración, Exchange Reporter Plus comenzará a reenviar los registros de auditoría a Google SecOps a través del extremo del webhook.
- Accede a la consola de Google SecOps y verifica que los registros aparezcan en la interfaz de Search con la etiqueta de transferencia
MANAGE_ENGINE_REPORTER_PLUS.
Configuración de firewall
Asegúrate de que estén configuradas las siguientes reglas de firewall.
Saliente desde el servidor de Exchange Reporter Plus:
- Protocolo: HTTPS (TCP 443)
- Destino: Extremo regional de Chronicle (
malachiteingestion-pa.googleapis.como tu extremo regional) - Propósito: Entrega de registros a Google SecOps a través de webhook
Referencia de métodos de autenticación
Los feeds de webhook de Chronicle admiten varios métodos de autenticación. Elige el método que admite tu proveedor.
Método 1: Encabezados personalizados (recomendado)
Si tu proveedor admite encabezados HTTP personalizados, usa este método para mejorar la seguridad.
Formato de la solicitud:
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" }
Ventajas:
- La clave y el secreto de la API no son visibles en la URL
- Más seguro (los encabezados no se registran en los registros de acceso al servidor web)
- Método preferido cuando el proveedor lo admite
Método 2: Parámetros de consulta
Si tu proveedor no admite encabezados personalizados, agrega credenciales a la URL.
Formato de URL:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Ejemplo:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...Formato de la solicitud:
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
Desventajas: - Las credenciales son visibles en la URL. - Es posible que se registren en los registros de acceso del servidor web. - Son menos seguras que los encabezados.
Método 3: Híbrido (URL + encabezado)
Algunas configuraciones usan la clave de API en la URL y la clave secreta en el encabezado.
Formato de la solicitud:
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" }
Nombres de encabezados de autenticación
Chronicle acepta los siguientes nombres de encabezado para la autenticación:
Para la clave de API, haz lo siguiente:
x-goog-chronicle-auth(recomendada)X-Goog-Chronicle-Auth(no distingue mayúsculas de minúsculas)
Para la clave secreta, haz lo siguiente:
x-chronicle-auth(recomendada)X-Chronicle-Auth(no distingue mayúsculas de minúsculas)
Límites y prácticas recomendadas para webhooks
Límites de solicitudes
| Límite | Valor |
|---|---|
| Tamaño máximo de la solicitud | 4 MB |
| QPS máx. (consultas por segundo) | 15,000 |
| Tiempo de espera de la solicitud | 30 segundos |
| Comportamiento de reintento | Automática con retirada exponencial |
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
| msg.OrganizationId | additional.fields | Etiquetas combinadas con la clave "OrganizationId" y el valor de msg.OrganizationId; la clave "MailboxGuid" y el valor de msg.MailboxGuid; la clave "RecordType" y el valor de msg.RecordType |
| msg.MailboxGuid | additional.fields | |
| msg.RecordType | additional.fields | |
| msg.CreationTime | metadata.event_type | Se establece en el valor de event_type si no está vacío; de lo contrario, se establece en "USER_UNCATEGORIZED" si msg.Operation == "Update"; de lo contrario, se establece en "USER_CREATION" si msg.Operation == "Create" y msg.MailboxOwnerUPN no está vacío; de lo contrario, se establece en "USER_UNCATEGORIZED" si msg.Operation == "Create"; de lo contrario, se establece en "USER_UNCATEGORIZED" si msg.UserId no está vacío; de lo contrario, se establece en "STATUS_UPDATE" si msg.ClientIP no está vacío; de lo contrario, se establece en "GENERIC_EVENT". |
| msg.Operation | metadata.product_event_type | Valor copiado directamente |
| msg.Id | metadata.product_log_id | Valor copiado directamente |
| msg.ClientVersion | metadata.product_version | Valor de msg.ClientVersion si no está vacío; de lo contrario, msg.Version se convierte en una cadena. |
| msg.Version | metadata.product_version | |
| AffectedItems.0.InternetMessageId | network.email.mail_id | Gsub < |
| AffectedItems | network.email.subject | Se analizó como JSON, se extrajo el elemento Subject y se combinó si se encontró. |
| msg.ClientInfoString | network.http.user_agent | Valor de msg.ClientInfoString si no está vacío; de lo contrario, msg.Client |
| msg.Client | network.http.user_agent | |
| msg.ClientProcessName | principal.application | Valor copiado directamente |
| msg.OriginatingServer | principal.hostname | Se extrae con el patrón de Grok si se realiza correctamente; de lo contrario, se copia el valor directamente. |
| clientIP | principal.ip | Se extrajo de msg.ClientIP con grok |
| clientPort | principal.port | Se extrae de msg.ClientIP con grok y se convierte en un número entero. |
| msg.UserKey | principal.user.attribute.labels | Establece la clave de la etiqueta en "UserKey", el valor en msg.UserKey y la combinación. |
| msg.UserType | principal.user.attribute.roles | Establece roles.name en msg.UserType, combinado |
| msg.UserId | principal.user.email_addresses | Se fusiona si msg.UserId coincide con la regex de correo electrónico |
| msg.UserId | principal.user.userid | Valor copiado directamente |
| msg.MailboxOwnerSid | principal.user.windows_sid | Valor de msg.MailboxOwnerSid si no está vacío; de lo contrario, msg.LogonUserSid |
| msg.LogonUserSid | principal.user.windows_sid | |
| security_result | security_result | Se combinó a partir del hash de security_result |
| security_result_action | security_result.action | Se combinó de security_result_action |
| msg.ResultStatus | security_result.action_details | Valor copiado directamente |
| msg.RecordType | security_result.detection_fields | Se convirtió en cadena, se estableció la clave "RecordType", se estableció el valor en msg.RecordType y se combinó. |
| msg.OrganizationName | target.administrative_domain | Valor copiado directamente |
| msg.DestFolder | target.file.full_path | Se extrajeron fileId y filePath con grok, se reemplazaron las barras inversas con gsubs y se concatenaron como fileId/filePath. |
| host | target.hostname | Valor copiado directamente |
| msg.Folder | target.process.parent_process.file.full_path | Se extrajeron parentFileId y parentFilePath con grok, se reemplazaron las barras inversas con gsubs y se concatenaron como parentFileId/parentFilePath. |
| msg.MailboxOwnerUPN | target.user.email_addresses | Se combina si coincide con la regex de correo electrónico |
| msg.MailboxOwnerUPN | target.user.user_display_name | Se establece si contiene un espacio. |
| msg.MailboxOwnerUPN | target.user.userid | Se establece si no es un correo electrónico y no hay espacio. |
| metadata.product_name | metadata.product_name | Configurado como "Administrar motor" |
| metadata.vendor_name | metadata.vendor_name | Establece el valor en "Administrar Engine Reporter Plus". |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.