收集 ManageEngine Exchange Reporter Plus 日志
本文档介绍了如何配置 ManageEngine Exchange Reporter Plus 以使用 Webhook 将日志推送到 Google Security Operations。
ManageEngine Exchange Reporter Plus 是一款基于 Web 的报告、审核和监控解决方案,适用于 Microsoft Exchange Server 和 Exchange Online 环境。它提供有关邮箱大小、电子邮件流量、公用文件夹、Exchange ActiveSync 日志以及混合 Exchange 部署中管理员活动和配置更改的审核日志的全面报告。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- ManageEngine Exchange Reporter Plus 已安装并配置为监控 Exchange Server 或 Exchange Online
- 对 ManageEngine Exchange Reporter Plus Web 控制台的管理员访问权限
- 访问 Google Cloud Console(用于创建 API 密钥)
在 Google SecOps 中创建 Webhook Feed
创建 Feed
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed 。
- 在下一页上,点击配置单个 Feed 。
- 在 Feed 名称 字段中,输入 Feed 的名称(例如
ManageEngine Exchange Reporter Plus Logs)。 - 选择 Webhook 作为来源类型 。
- 选择 ManageEngine Exchange Reporter Plus 作为日志类型 。
- 点击下一步 。
- 为以下输入参数指定值:
- 拆分定界符 (可选):输入
\n以拆分多行事件。 - 资产命名空间:资产命名空间
- 提取标签:要应用于此 Feed 中事件的标签
- 拆分定界符 (可选):输入
- 点击下一步 。
- 在最终确定 屏幕中检查新 Feed 配置,然后点击提交 。
生成并保存密钥
创建 Feed 后,您必须生成一个密钥以进行身份验证:
- 在 Feed 详情页面上,点击生成密钥 。
- 对话框会显示密钥。
- 复制并妥善保存 密钥。
重要提示:密钥只会显示一次,之后无法检索。如果您丢失了密钥,则必须生成新的密钥。
获取 Feed 端点网址
- 前往 Feed 的详情 标签页。
- 在端点信息 部分,复制 Feed 端点网址 。
网址格式为:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate或
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate保存此网址,以在后续步骤中使用。
点击完成 。
创建 Google Cloud API 密钥
Chronicle 需要 API 密钥进行身份验证。在 Google Cloud Console 中创建受限 API 密钥。
创建 API 密钥
- 前往 Google Cloud 控制台的凭据页面。
- 选择您的项目(与您的 Chronicle 实例关联的项目)。
- 点击创建凭据 > API 密钥。
- 系统会创建 API 密钥,并在对话框中显示。
- 点击修改 API 密钥 以限制密钥。
限制 API 密钥
- 在 API 密钥 设置页面中:
- 名称:输入描述性名称(例如
Chronicle Webhook API Key)
- 名称:输入描述性名称(例如
- 在 API 限制 下:
- 选择限制密钥 。
- 在选择 API 下拉列表中,搜索并选择 Google SecOps API (或 Chronicle API )。
- 点击保存 。
- 从页面顶部的 API 密钥 字段中复制 API 密钥值。
- 妥善保存 API 密钥。
配置 ManageEngine Exchange Reporter Plus Webhook
构建网络钩子网址
将 Chronicle 端点网址、API 密钥和密钥组合在一起:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>示例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
在 Exchange Reporter Plus 中配置日志转发
- 以管理员身份登录 ManageEngine Exchange Reporter Plus Web 控制台。
- 依次前往设置 > 管理员 > 常规设置 > 日志转发器。
- 选中启用日志转发 复选框。
- 点击 Webhook 标签页。
- 提供以下配置详细信息:
- HTTP 方法:选择 POST。
- HTTP 网址:粘贴在上一步中构建的完整网络钩子网址(Chronicle 端点网址,其中 API 密钥和 Secret 作为查询参数附加)。
- 在高级设置 部分中:
- 点击 HTTP 请求标头 。
- 添加以下标头:
- 键:
Content-Type - 值:
application/json
- 键:
点击保存 。
验证日志转发
- 保存配置后,Exchange Reporter Plus 将开始通过 Webhook 端点将审核日志转发到 Google SecOps。
- 登录 Google SecOps 控制台,并验证日志是否显示在搜索 界面中,且带有提取标签
MANAGE_ENGINE_REPORTER_PLUS。
防火墙配置
确保已配置以下防火墙规则。
从 Exchange Reporter Plus 服务器出站:
- 协议:HTTPS (TCP 443)
- 目标:Chronicle 区域端点(
malachiteingestion-pa.googleapis.com或您的区域端点) - 用途:通过 Webhook 将日志传送到 Google SecOps
身份验证方法参考
Chronicle Webhook Feed 支持多种身份验证方法。选择您的供应商支持的方法。
方法 1:自定义标头(推荐)
如果您的供应商支持自定义 HTTP 标头,请使用此方法以提高安全性。
请求格式:
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" }
优点:
- API 密钥和密钥在网址中不可见
- 更安全(标头不会记录在 Web 服务器访问日志中)
- 如果供应商支持,则首选此方法
方法 2:查询参数
如果您的供应商不支持自定义标头,请将凭据附加到网址。
网址格式:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>示例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...请求格式:
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
缺点: - 凭据在网址中可见 - 可能会记录在 Web 服务器访问日志中 - 安全性不如标头
方法 3:混合(网址 + 标头)
某些配置在网址中使用 API 密钥,在标头中使用密钥。
请求格式:
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" }
身份验证标头名称
Chronicle 接受以下标头名称进行身份验证:
对于 API 密钥:
x-goog-chronicle-auth(推荐)X-Goog-Chronicle-Auth(不区分大小写)
对于密钥:
x-chronicle-auth(推荐)X-Chronicle-Auth(不区分大小写)
Webhook 限制和最佳实践
请求限制
| 限制 | 值 |
|---|---|
| 最大请求大小 | 4 MB |
| 最大 QPS(每秒查询次数) | 15000 |
| 请求超时 | 30 秒 |
| 重试行为 | 自动重试,使用指数退避算法 |
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| msg.OrganizationId | additional.fields | 合并标签,键为“OrganizationId”,值为 msg.OrganizationId;键为“MailboxGuid”,值为 msg.MailboxGuid;键为“RecordType”,值为 msg.RecordType |
| msg.MailboxGuid | additional.fields | |
| msg.RecordType | additional.fields | |
| msg.CreationTime | metadata.event_type | 如果 event_type 不为空,则设置为 event_type 中的值;否则,如果 msg.Operation == "Update",则设置为“USER_UNCATEGORIZED”;如果 msg.Operation == "Create" 且 msg.MailboxOwnerUPN 不为空,则设置为“USER_CREATION”;如果 msg.Operation == "Create",则设置为“USER_UNCATEGORIZED”;如果 msg.UserId 不为空,则设置为“USER_UNCATEGORIZED”;如果 msg.ClientIP 不为空,则设置为“STATUS_UPDATE”;否则设置为“GENERIC_EVENT” |
| msg.Operation | metadata.product_event_type | 直接复制值 |
| msg.Id | metadata.product_log_id | 直接复制值 |
| msg.ClientVersion | metadata.product_version | 如果 msg.ClientVersion 不为空,则使用 msg.ClientVersion 中的值;否则,将 msg.Version 转换为字符串 |
| msg.Version | metadata.product_version | |
| AffectedItems.0.InternetMessageId | network.email.mail_id | Gsub < |
| AffectedItems | network.email.subject | 解析为 JSON,提取 item.Subject,如果找到则合并 |
| msg.ClientInfoString | network.http.user_agent | 如果 msg.ClientInfoString 不为空,则使用 msg.ClientInfoString 中的值;否则使用 msg.Client |
| msg.Client | network.http.user_agent | |
| msg.ClientProcessName | principal.application | 直接复制值 |
| msg.OriginatingServer | principal.hostname | 使用 grok 模式提取,如果成功,则直接复制值 |
| clientIP | principal.ip | 使用 grok 从 msg.ClientIP 中提取 |
| clientPort | principal.port | 使用 grok 从 msg.ClientIP 中提取,转换为整数 |
| msg.UserKey | principal.user.attribute.labels | 将标签键设置为“UserKey”,将值设置为 msg.UserKey,合并 |
| msg.UserType | principal.user.attribute.roles | 将 roles.name 设置为 msg.UserType,合并 |
| msg.UserId | principal.user.email_addresses | 如果 msg.UserId 与电子邮件正则表达式匹配,则合并 |
| msg.UserId | principal.user.userid | 直接复制值 |
| msg.MailboxOwnerSid | principal.user.windows_sid | 如果 msg.MailboxOwnerSid 不为空,则使用 msg.MailboxOwnerSid 中的值;否则使用 msg.LogonUserSid |
| msg.LogonUserSid | principal.user.windows_sid | |
| security_result | security_result | 从 security_result 哈希合并 |
| security_result_action | security_result.action | 从 security_result_action 合并 |
| msg.ResultStatus | security_result.action_details | 直接复制值 |
| msg.RecordType | security_result.detection_fields | 转换为字符串,将键设置为“RecordType”,将值设置为 msg.RecordType,合并 |
| msg.OrganizationName | target.administrative_domain | 直接复制值 |
| msg.DestFolder | target.file.full_path | 使用 grok 提取 fileId 和 filePath,替换反斜杠,连接为 fileId/filePath |
| host | target.hostname | 直接复制值 |
| msg.Folder | target.process.parent_process.file.full_path | 使用 grok 提取 parentFileId 和 parentFilePath,替换反斜杠,连接为 parentFileId/parentFilePath |
| msg.MailboxOwnerUPN | target.user.email_addresses | 如果与电子邮件正则表达式匹配,则合并 |
| msg.MailboxOwnerUPN | target.user.user_display_name | 如果包含空格,则设置 |
| msg.MailboxOwnerUPN | target.user.userid | 如果不是电子邮件且不包含空格,则设置 |
| metadata.product_name | metadata.product_name | 设置为“Manage Engine” |
| metadata.vendor_name | metadata.vendor_name | 设置为“Manage Engine Reporter Plus” |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。