Mengumpulkan log ManageEngine Exchange Reporter Plus
Dokumen ini menjelaskan cara mengonfigurasi ManageEngine Exchange Reporter Plus untuk mengirimkan log ke Google Security Operations menggunakan webhook.
ManageEngine Exchange Reporter Plus adalah solusi pelaporan, audit, dan pemantauan berbasis web untuk lingkungan Microsoft Exchange Server dan Exchange Online. Alat ini memberikan laporan komprehensif tentang ukuran kotak surat, traffic email, folder publik, log Exchange ActiveSync, dan log audit untuk aktivitas administrator dan perubahan konfigurasi dalam deployment Exchange hybrid.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps
- ManageEngine Exchange Reporter Plus diinstal dan dikonfigurasi untuk memantau Exchange Server atau Exchange Online
- Akses administratif ke konsol web ManageEngine Exchange Reporter Plus
- Akses ke Konsol Google Cloud (untuk pembuatan kunci API)
Membuat feed webhook di Google SecOps
Buat feed
- Buka Setelan SIEM > Feed.
- Klik Tambahkan Feed Baru.
- Di halaman berikutnya, klik Konfigurasi satu feed.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
ManageEngine Exchange Reporter Plus Logs). - Pilih Webhook sebagai Jenis sumber.
- Pilih ManageEngine Exchange Reporter Plus sebagai Jenis log.
- Klik Berikutnya.
- Tentukan nilai untuk parameter input berikut:
- Pemisah pemisahan (opsional): Masukkan
\nuntuk memisahkan peristiwa multi-baris. - Namespace aset: Namespace aset
- Label penyerapan: Label yang akan diterapkan ke peristiwa dari feed ini
- Pemisah pemisahan (opsional): Masukkan
- Klik Berikutnya.
- Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.
Buat dan simpan kunci rahasia
Setelah membuat feed, Anda harus membuat kunci rahasia untuk autentikasi:
- Di halaman detail feed, klik Buat Kunci Rahasia.
- Dialog akan menampilkan kunci rahasia.
- Salin dan simpan kunci rahasia dengan aman.
Penting: Kunci rahasia hanya ditampilkan satu kali dan tidak dapat diambil lagi. Jika Anda kehilangan kunci ini, Anda harus membuat kunci rahasia baru.
Mendapatkan URL endpoint feed
- Buka tab Detail untuk feed tersebut.
- Di bagian Endpoint Information, salin Feed endpoint URL.
Format URL-nya adalah:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateatau
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateSimpan URL ini untuk langkah berikutnya.
Klik Done.
Membuat kunci Google Cloud API
Chronicle memerlukan kunci API untuk autentikasi. Buat kunci API terbatas di Konsol Google Cloud.
Buat kunci API
- Buka halaman Credentials Google Cloud Console.
- Pilih project Anda (project yang terkait dengan instance Chronicle Anda).
- Klik Create credentials > API key.
- Kunci API dibuat dan ditampilkan dalam dialog.
- Klik Edit API key untuk membatasi kunci.
Membatasi kunci API
- Di halaman setelan kunci API:
- Nama: Masukkan nama deskriptif (misalnya,
Chronicle Webhook API Key)
- Nama: Masukkan nama deskriptif (misalnya,
- Di bagian Pembatasan API:
- Pilih Restrict key.
- Di drop-down Select APIs, telusuri dan pilih Google SecOps API (atau Chronicle API).
- Klik Simpan.
- Salin nilai kunci API dari kolom Kunci API di bagian atas halaman.
- Simpan kunci API dengan aman.
Mengonfigurasi webhook ManageEngine Exchange Reporter Plus
Buat URL webhook
Gabungkan URL endpoint Chronicle, kunci API, dan kunci rahasia:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Contoh:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
Mengonfigurasi penerusan log di Exchange Reporter Plus
- Login ke konsol web ManageEngine Exchange Reporter Plus sebagai administrator.
- Buka Setelan > Admin > Setelan Umum > Penerusan Log.
- Centang kotak Aktifkan Penerusan Log.
- Klik tab Webhook.
- Berikan detail konfigurasi berikut:
- Metode HTTP: Pilih POST.
- HTTP URL: Tempelkan URL webhook lengkap yang dibuat pada langkah sebelumnya (URL endpoint Chronicle dengan kunci API dan kunci rahasia yang ditambahkan sebagai parameter kueri).
- Di bagian Setelan Lanjutan:
- Klik Header Permintaan HTTP.
- Tambahkan header berikut:
- Kunci:
Content-Type - Nilai:
application/json
- Kunci:
Klik Simpan.
Memverifikasi penerusan log
- Setelah menyimpan konfigurasi, Exchange Reporter Plus akan mulai meneruskan log audit ke Google SecOps melalui endpoint webhook.
- Login ke konsol Google SecOps dan pastikan log muncul di antarmuka Search dengan label penyerapan
MANAGE_ENGINE_REPORTER_PLUS.
Konfigurasi firewall
Pastikan aturan firewall berikut dikonfigurasi.
Keluar dari server Exchange Reporter Plus:
- Protokol: HTTPS (TCP 443)
- Tujuan: Endpoint regional Chronicle (
malachiteingestion-pa.googleapis.comatau endpoint regional Anda) - Tujuan: Pengiriman log ke Google SecOps melalui webhook
Referensi metode autentikasi
Feed webhook Chronicle mendukung beberapa metode autentikasi. Pilih metode yang didukung vendor Anda.
Metode 1: Header kustom (Direkomendasikan)
Jika vendor Anda mendukung header HTTP kustom, gunakan metode ini untuk keamanan yang lebih baik.
Format permintaan:
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" }
Kelebihan:
- Kunci dan rahasia API tidak terlihat di URL
- Lebih aman (header tidak dicatat dalam log akses server web)
- Metode pilihan jika didukung oleh vendor
Metode 2: Parameter kueri
Jika vendor Anda tidak mendukung header kustom, tambahkan kredensial ke URL.
Format URL:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Contoh:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...Format permintaan:
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
Kekurangan: - Kredensial terlihat di URL - Dapat dicatat dalam log akses server web - Kurang aman dibandingkan header
Metode 3: Hybrid (URL + Header)
Beberapa konfigurasi menggunakan kunci API di URL dan kunci rahasia di header.
Format permintaan:
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" }
Nama header autentikasi
Chronicle menerima nama header berikut untuk autentikasi:
Untuk kunci API:
x-goog-chronicle-auth(direkomendasikan)X-Goog-Chronicle-Auth(tidak peka huruf besar/kecil)
Untuk kunci rahasia:
x-chronicle-auth(direkomendasikan)X-Chronicle-Auth(tidak peka huruf besar/kecil)
Batasan dan praktik terbaik webhook
Batas permintaan
| Batas | Nilai |
|---|---|
| Ukuran permintaan maksimum | 4 MB |
| QPS Maks (kueri per detik) | 15.000 |
| Waktu tunggu permintaan | 30 seconds |
| Perilaku percobaan ulang | Otomatis dengan backoff eksponensial |
Tabel pemetaan UDM
| Kolom Log | Pemetaan UDM | Logika |
|---|---|---|
| msg.OrganizationId | additional.fields | Label gabungan dengan kunci "OrganizationId" dan nilai dari msg.OrganizationId; kunci "MailboxGuid" dan nilai dari msg.MailboxGuid; kunci "RecordType" dan nilai dari msg.RecordType |
| msg.MailboxGuid | additional.fields | |
| msg.RecordType | additional.fields | |
| msg.CreationTime | metadata.event_type | Ditetapkan ke nilai dari event_type jika tidak kosong; jika tidak, "USER_UNCATEGORIZED" jika msg.Operation == "Update"; jika tidak, "USER_CREATION" jika msg.Operation == "Create" dan msg.MailboxOwnerUPN tidak kosong; jika tidak, "USER_UNCATEGORIZED" jika msg.Operation == "Create"; jika tidak, "USER_UNCATEGORIZED" jika msg.UserId tidak kosong; jika tidak, "STATUS_UPDATE" jika msg.ClientIP tidak kosong; jika tidak, "GENERIC_EVENT" |
| msg.Operation | metadata.product_event_type | Nilai disalin secara langsung |
| msg.Id | metadata.product_log_id | Nilai disalin secara langsung |
| msg.ClientVersion | metadata.product_version | Nilai dari msg.ClientVersion jika tidak kosong, atau msg.Version dikonversi menjadi string |
| msg.Version | metadata.product_version | |
| AffectedItems.0.InternetMessageId | network.email.mail_id | Gsub < |
| AffectedItems | network.email.subject | Diuraikan sebagai JSON, item yang diekstrak.Subjek, digabungkan jika ditemukan |
| msg.ClientInfoString | network.http.user_agent | Nilai dari msg.ClientInfoString jika tidak kosong, atau msg.Client |
| msg.Client | network.http.user_agent | |
| msg.ClientProcessName | principal.application | Nilai disalin secara langsung |
| msg.OriginatingServer | principal.hostname | Diekstrak menggunakan pola grok, jika berhasil, jika tidak, nilai disalin secara langsung |
| clientIP | principal.ip | Diekstrak dari msg.ClientIP menggunakan grok |
| clientPort | principal.port | Diekstrak dari msg.ClientIP menggunakan grok, dikonversi menjadi bilangan bulat |
| msg.UserKey | principal.user.attribute.labels | Tetapkan kunci label ke "UserKey", nilai ke msg.UserKey, digabungkan |
| msg.UserType | principal.user.attribute.roles | Menetapkan roles.name ke msg.UserType, digabungkan |
| msg.UserId | principal.user.email_addresses | Digabungkan jika msg.UserId cocok dengan regex email |
| msg.UserId | principal.user.userid | Nilai disalin secara langsung |
| msg.MailboxOwnerSid | principal.user.windows_sid | Nilai dari msg.MailboxOwnerSid jika tidak kosong, atau msg.LogonUserSid |
| msg.LogonUserSid | principal.user.windows_sid | |
| security_result | security_result | Digabungkan dari hash security_result |
| security_result_action | security_result.action | Digabungkan dari security_result_action |
| msg.ResultStatus | security_result.action_details | Nilai disalin secara langsung |
| msg.RecordType | security_result.detection_fields | Dikonversi menjadi string, tetapkan kunci "RecordType", nilai ke msg.RecordType, digabungkan |
| msg.OrganizationName | target.administrative_domain | Nilai disalin secara langsung |
| msg.DestFolder | target.file.full_path | Mengekstrak fileId dan filePath menggunakan grok, mengganti garis miring terbalik, menggabungkan sebagai fileId/filePath |
| host | target.hostname | Nilai disalin secara langsung |
| msg.Folder | target.process.parent_process.file.full_path | Mengekstrak parentFileId dan parentFilePath menggunakan grok, mengganti garis miring terbalik dengan gsubs, menggabungkan sebagai parentFileId/parentFilePath |
| msg.MailboxOwnerUPN | target.user.email_addresses | Digabungkan jika cocok dengan regex email |
| msg.MailboxOwnerUPN | target.user.user_display_name | Setel jika berisi spasi |
| msg.MailboxOwnerUPN | target.user.userid | Tetapkan jika bukan email dan tidak ada spasi |
| metadata.product_name | metadata.product_name | Tetapkan ke "Manage Engine" |
| metadata.vendor_name | metadata.vendor_name | Setel ke "Manage Engine Reporter Plus" |
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.