收集 ManageEngine Exchange Reporter Plus 日志
本文档介绍了如何配置 ManageEngine Exchange Reporter Plus,以使用 Webhook 将日志推送到 Google Security Operations。
ManageEngine Exchange Reporter Plus 是一款基于 Web 的报告、审核和监控解决方案,适用于 Microsoft Exchange Server 和 Exchange Online 环境。它可针对混合 Exchange 部署中的邮箱大小、电子邮件流量、公用文件夹、Exchange ActiveSync 日志以及管理员活动和配置更改的审核日志提供全面的报告。
准备工作
确保您满足以下前提条件:
- 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 网络控制台。
- 依次前往设置 > 管理员 > 常规设置 > 日志转发器。
- 选中启用日志转发复选框。
- 点击 Webhook 标签页。
- 提供以下配置详细信息:
- HTTP 方法:选择 POST。
- HTTP 网址:粘贴在上一步中构建的完整网络钩子网址(附加了 API 密钥和密钥作为查询参数的 Chronicle 端点网址)。
- 在高级设置部分中:
- 点击 HTTP 请求标头。
- 添加以下标头:
- 键:
Content-Type - 值:
application/json
- 键:
点击保存。
验证日志转发
- 保存配置后,Exchange Reporter Plus 将开始通过网络钩子端点将审核日志转发到 Google SecOps。
- 登录 Google SecOps 控制台,并验证日志是否显示在搜索界面中,且带有提取标签
MANAGE_ENGINE_REPORTER_PLUS。
防火墙配置
确保已配置以下防火墙规则。
从 Exchange Reporter Plus 服务器出站:
- 协议:HTTPS (TCP 443)
- 目标:Chronicle 区域端点(
malachiteingestion-pa.googleapis.com或您的区域端点) - 用途:通过网络钩子将日志传送给 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 中的值;否则,如果 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,使用 gsub 反斜杠,并连接为 fileId/filePath |
| 主机 | target.hostname | 直接复制值 |
| msg.Folder | target.process.parent_process.file.full_path | 使用 grok 提取 parentFileId 和 parentFilePath,使用 gsubs 反斜杠,并将其串联为 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 | 设置为“管理引擎” |
| metadata.vendor_name | metadata.vendor_name | 设置为“Manage Engine Reporter Plus” |
更新日志
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。