收集 ManageEngine Exchange Reporter Plus 記錄
本文說明如何設定 ManageEngine Exchange Reporter Plus,透過 Webhook 將記錄檔推送至 Google Security Operations。
ManageEngine Exchange Reporter Plus 是一套網頁式報表、稽核和監控解決方案,適用於 Microsoft Exchange Server 和 Exchange Online 環境。這項工具可針對混合式 Exchange 部署作業中的信箱大小、電子郵件流量、公用資料夾、Exchange ActiveSync 記錄,以及管理員活動和設定變更的稽核記錄,提供完整報表。
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體
- 已安裝並設定 ManageEngine Exchange Reporter Plus,可監控 Exchange Server 或 Exchange Online
- ManageEngine Exchange Reporter Plus 網路主控台的管理員存取權
- 存取 Google Cloud 控制台 (用於建立 API 金鑰)
在 Google SecOps 中建立 Webhook 動態饋給
建立動態饋給
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 在下一個頁面中,按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
ManageEngine Exchange Reporter Plus Logs)。 - 選取「Webhook」做為「來源類型」。
- 選取「ManageEngine Exchange Reporter Plus」做為「記錄類型」。
- 點選「下一步」。
- 指定下列輸入參數的值:
- 分割分隔符號 (選用):輸入
\n分割多行事件。 - 資產命名空間:資產命名空間
- 擷取標籤:要套用至這個動態饋給事件的標籤
- 分割分隔符號 (選用):輸入
- 點選「下一步」。
- 在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)。
產生並儲存密鑰
建立動態饋給後,您必須產生用於驗證的密鑰:
- 在動態饋給詳細資料頁面中,按一下「產生密鑰」。
- 對話方塊會顯示密鑰。
- 複製並妥善儲存密鑰。
重要事項:密鑰只會顯示一次,之後便無法擷取,如果遺失,請產生新的密鑰。
取得動態消息端點網址
- 前往動態消息的「詳細資料」分頁。
- 在「端點資訊」部分,複製「動態消息端點網址」。
網址格式為:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate或
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate請儲存這個網址,以供後續步驟使用。
按一下 [完成]。
建立 Google Cloud API 金鑰
Chronicle 需要 API 金鑰才能進行驗證。在 Google Cloud 控制台中建立受限制的 API 金鑰。
建立 API 金鑰
- 前往 Google Cloud 控制台的「憑證」頁面。
- 選取專案 (與 Chronicle 執行個體相關聯的專案)。
- 依序按一下「建立憑證」>「API 金鑰」。
- 系統會建立 API 金鑰,並在對話方塊中顯示。
- 按一下「編輯 API 金鑰」即可限制金鑰。
限制 API 金鑰
- 在「API 金鑰」設定頁面中:
- 名稱:輸入描述性名稱 (例如
Chronicle Webhook API Key)
- 名稱:輸入描述性名稱 (例如
- 在「API 限制」下方:
- 選取「Restrict key」(限制金鑰)。
- 在「選取 API」下拉式選單中,搜尋並選取「Google SecOps API」 (或「Chronicle API」)。
- 按一下 [儲存]。
- 從頁面頂端的「API key」(API 金鑰) 欄位複製 API 金鑰值。
- 安全地儲存 API 金鑰。
設定 ManageEngine Exchange Reporter Plus Webhook
建構 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 網頁控制台。
- 依序前往「設定」>「管理」>「一般設定」>「記錄轉送站」。
- 勾選「Enable Log Forwarding」(啟用記錄轉送) 核取方塊。
- 按一下「Webhook」分頁標籤。
- 請提供下列設定詳細資料:
- HTTP 方法:選取「POST」。
- HTTP 網址:貼上在上一個步驟中建構的完整 Webhook 網址 (Chronicle 端點網址,並附加 API 金鑰和密鑰做為查詢參數)。
- 在「進階設定」部分:
- 按一下「HTTP Request Headers」(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 饋給支援多種驗證方法。選擇供應商支援的方法。
方法 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 金鑰和密鑰
- 更安全 (標頭不會記錄在網路伺服器存取記錄中)
- 如果供應商支援,則為首選方法
方法 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" }
缺點: - 憑證會顯示在網址中 - 可能會記錄在網頁伺服器存取記錄中 - 安全性不如標頭
方法 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) 上限 | 15,000 |
| 要求逾時 | 30 秒 |
| 重試行為 | 自動重試 (指數輪詢) |
UDM 對應表
| 記錄欄位 | UDM 對應 | 邏輯 |
|---|---|---|
| msg.OrganizationId | additional.fields | 合併的標籤,包含來自 msg.OrganizationId 的「OrganizationId」鍵和值;來自 msg.MailboxGuid 的「MailboxGuid」鍵和值;來自 msg.RecordType 的「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.Version |
| msg.Version | metadata.product_version | |
| AffectedItems.0.InternetMessageId | network.email.mail_id | Gsub < |
| AffectedItems | network.email.subject | 剖析為 JSON,擷取項目。主旨,如果找到則合併 |
| msg.ClientInfoString | network.http.user_agent | 如果 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.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 |
| 主機 | 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 專業人員尋求答案。