Mengumpulkan log Keamanan ServiceNow
Dokumen ini menjelaskan cara mengekspor peristiwa ServiceNow Security ke Google Security Operations menggunakan webhook keluar yang dikonfigurasi melalui Aturan Bisnis. Label penyerapan mengidentifikasi parser yang menormalisasi data log mentah ke format UDM terstruktur.
Arsitektur integrasi
Integrasi ini menggunakan Aturan Bisnis ServiceNow untuk mengirimkan peristiwa keamanan ke Google SecOps secara real-time:
ServiceNow Security Tables ↓ (Business Rules trigger on insert/update) ServiceNow RESTMessageV2 API ↓ (HTTP POST) Google Security Operations Webhook Endpoint ↓ (Parser: SERVICENOW_SECURITY) Unified Data Model (UDM)
Karakteristik integrasi:
- Push berbasis peristiwa: Peristiwa dikirim segera saat dibuat atau diperbarui
- Real-time: Latensi rendah (detik)
- Ekspor selektif: Konfigurasi tabel dan peristiwa yang akan diekspor
- Bukan ekspor massal: Tidak mengirim data historis
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps
- Instance ServiceNow dengan plugin Security Incident Response (SIR) yang terinstal
- Akun pengguna ServiceNow dengan peran berikut:
adminatausn_si.admin(untuk membuat Aturan Bisnis)- Akses ke Definisi Sistem > Aturan Bisnis
- Akses ke System Definition > Script Includes
- Akses istimewa ke konsol Google Google Cloud (untuk pembuatan kunci API)
Tabel Keamanan ServiceNow untuk diekspor
Tabel berikut berisi data yang relevan dengan keamanan untuk analisis SIEM:
| Tabel | Nama API | Deskripsi | Prioritas |
|---|---|---|---|
| Insiden Keamanan | sn_si_incident |
Insiden keamanan, investigasi | TINGGI |
| Dapat diamati | sn_si_observable |
IOC: Alamat IP, domain, hash file | TINGGI |
| Log Sistem | syslog |
Peristiwa autentikasi, kegagalan login | MEDIUM |
| Audit | sys_audit |
Perubahan tingkat kolom, modifikasi izin | MEDIUM |
| Penugasan Peran Pengguna | sys_user_has_role |
Pemberian/pencabutan peran | RENDAH |
| Temuan Keamanan | sn_si_finding |
Deteksi dan temuan keamanan | RENDAH |
Panduan ini memberikan contoh Aturan Bisnis untuk tabel prioritas TINGGI. Anda dapat memperluas integrasi ke tabel tambahan menggunakan pola yang sama.
Mengonfigurasi feed di Google SecOps untuk menyerap peristiwa Keamanan ServiceNow
Menyiapkan feed webhook
- Buka Setelan SIEM > Feed.
- Klik Tambahkan Feed Baru.
- Di halaman berikutnya, klik Konfigurasi satu feed.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
ServiceNow Security Events). - Pilih Webhook sebagai Jenis sumber.
- Pilih ServiceNow Security sebagai Log type.
- Klik Berikutnya.
Mengonfigurasi parameter feed
Tentukan nilai untuk parameter input berikut:
- Pemisah pemisahan: Masukkan
\nuntuk memisahkan baris log. - Namespace aset: Namespace aset.
- Label penyerapan: Label yang diterapkan ke semua peristiwa dari feed ini.
- Pemisah pemisahan: Masukkan
Klik Berikutnya.
Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.
Buat kunci rahasia dan ambil URL endpoint
- Klik Buat Kunci Rahasia untuk membuat kunci rahasia guna mengautentikasi feed ini.
Salin dan simpan kunci rahasia di lokasi yang aman.
Buka tab Detail.
Salin URL endpoint feed dari kolom Endpoint Information.
- Contoh URL endpoint:
https://malachiteingestion-pa.googleapis.com/v2/unstructured/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/logTypes/SERVICENOW_SECURITY:import
- Contoh URL endpoint:
Klik Done.
Membuat kunci API untuk autentikasi
- Buka halaman Google Cloud console Credentials.
- Klik Create credentials, lalu pilih API key.
- Klik Restrict Key.
- Di bagian Pembatasan API:
- Pilih Restrict key.
- Pilih Google SecOps API (Chronicle API).
- Klik Simpan.
- Salin kunci API dan simpan di lokasi yang aman.
Mengonfigurasi kredensial integrasi ServiceNow
Simpan kredensial Google SecOps sebagai Properti Sistem ServiceNow untuk akses yang aman.
- Di ServiceNow, buka System Properties > sys_properties.list.
- Klik New.
- Buat properti pertama:
- Nama:
x_chronicle.endpoint_url - Nilai: Tempel URL endpoint feed dari langkah sebelumnya
- Jenis:
string
- Nama:
- Klik Kirim.
- Klik Baru untuk membuat properti kedua:
- Nama:
x_chronicle.api_key - Nilai: Tempelkan kunci API Google Cloud
- Jenis:
password(ini mengenkripsi nilai)
- Nama:
- Klik Kirim.
- Klik Baru untuk membuat properti ketiga:
- Nama:
x_chronicle.secret_key - Nilai: Tempel kunci rahasia feed Google SecOps
- Jenis:
password(ini mengenkripsi nilai)
- Nama:
- Klik Kirim.
Membuat Script Include utilitas webhook yang dapat digunakan kembali
Script Include ini menyediakan fungsi yang dapat digunakan kembali untuk mengirim peristiwa ke Google SecOps dari Aturan Bisnis mana pun.
- Buka System Definition > Script Includes.
- Klik New.
- Berikan detail konfigurasi berikut:
- Nama:
ChronicleWebhookUtil - Nama API:
ChronicleWebhookUtil - Dapat dipanggil klien: Tidak dicentang
- Aktif: Dicawang
- Nama:
Di kolom Script, masukkan kode berikut:
var ChronicleWebhookUtil = Class.create(); ChronicleWebhookUtil.prototype = { initialize: function() { // Read credentials from System Properties this.endpointURL = gs.getProperty('x_chronicle.endpoint_url'); this.apiKey = gs.getProperty('x_chronicle.api_key'); this.secretKey = gs.getProperty('x_chronicle.secret_key'); }, sendEvent: function(eventData, eventType) { try { // Validate credentials if (!this.endpointURL || !this.apiKey || !this.secretKey) { gs.error('[Chronicle] Missing configuration. Check System Properties: x_chronicle.*'); return false; } // Prepare payload var payload = { event_type: eventType, timestamp: new GlideDateTime().getDisplayValue(), data: eventData, source: "ServiceNow", source_instance: gs.getProperty('instance_name') }; // Create REST message var request = new sn_ws.RESTMessageV2(); request.setEndpoint(this.endpointURL + '?key=' + this.apiKey); request.setHttpMethod('POST'); // Set headers request.setRequestHeader('Content-Type', 'application/json'); request.setRequestHeader('x-chronicle-auth', this.secretKey); // Set request body request.setRequestBody(JSON.stringify(payload)); // Execute request var response = request.execute(); var statusCode = response.getStatusCode(); var responseBody = response.getBody(); // Check response if (statusCode == 200 || statusCode == 201 || statusCode == 204) { gs.info('[Chronicle] Event sent successfully: ' + eventType + ' | Status: ' + statusCode); return true; } else { gs.error('[Chronicle] Failed to send event: ' + eventType + ' | Status: ' + statusCode + ' | Response: ' + responseBody); return false; } } catch (ex) { gs.error('[Chronicle] Exception sending event: ' + ex.message); return false; } }, type: 'ChronicleWebhookUtil' };Klik Kirim.
Membuat Aturan Bisnis untuk ekspor peristiwa
Aturan Bisnis dipicu secara otomatis saat data dibuat atau diperbarui di tabel ServiceNow. Buat Aturan Bisnis untuk setiap tabel yang ingin Anda ekspor ke Google SecOps.
Aturan Bisnis: Insiden Keamanan
Aturan Bisnis ini mengekspor peristiwa insiden keamanan ke Google SecOps.
- Buka System Definition > Business Rules.
- Klik New.
Berikan detail konfigurasi berikut:
Waktu untuk menjalankan:
Kolom Nilai Nama Chronicle - Export Security IncidentTabel Security Incident [sn_si_incident]Aktif Dicentang Lanjutan Dicentang Kapan afterSisipkan Dicentang Update Dicentang Hapus Opsional (centang untuk melacak penghapusan) Memesan 100Klik tab Advanced, buka kolom Script, lalu masukkan kode berikut:
(function executeRule(current, previous /*null when async*/) { // Extract incident data var incidentData = { sys_id: current.getValue('sys_id'), number: current.getValue('number'), short_description: current.getValue('short_description'), description: current.getValue('description'), state: current.getDisplayValue('state'), priority: current.getDisplayValue('priority'), severity: current.getDisplayValue('severity'), risk_score: current.getValue('risk_score'), category: current.getDisplayValue('category'), subcategory: current.getDisplayValue('subcategory'), assigned_to: current.getDisplayValue('assigned_to'), assignment_group: current.getDisplayValue('assignment_group'), caller: current.getDisplayValue('caller'), affected_user: current.getDisplayValue('affected_user'), opened_at: current.getValue('opened_at'), closed_at: current.getValue('closed_at'), resolved_at: current.getValue('resolved_at'), sys_created_on: current.getValue('sys_created_on'), sys_updated_on: current.getValue('sys_updated_on'), sys_created_by: current.getValue('sys_created_by'), sys_updated_by: current.getValue('sys_updated_by'), work_notes: current.getValue('work_notes'), close_notes: current.getValue('close_notes') }; // Send to Chronicle var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(incidentData, 'security_incident'); })(current, previous);Klik Kirim.
Aturan Bisnis: Observables (IOC)
Aturan Bisnis ini mengekspor data yang dapat diamati (alamat IP, domain, hash file) ke Google SecOps.
- Buka System Definition > Business Rules.
- Klik New.
Berikan detail konfigurasi berikut:
Kolom Nilai Nama Chronicle - Export ObservableTabel Observable [sn_si_observable]Aktif Dicentang Lanjutan Dicentang Kapan afterSisipkan Dicentang Update Dicentang Memesan 100Klik tab Advanced, buka kolom Script, lalu masukkan kode berikut:
(function executeRule(current, previous) { var observableData = { sys_id: current.getValue('sys_id'), value: current.getValue('value'), type: current.getDisplayValue('type'), finding: current.getDisplayValue('finding'), sighting_count: current.getValue('sighting_count'), notes: current.getValue('notes'), security_tags: current.getValue('security_tags'), mitre_technique: current.getDisplayValue('mitre_technique'), mitre_tactic: current.getDisplayValue('mitre_tactic'), mitre_malware: current.getDisplayValue('mitre_malware'), sys_created_on: current.getValue('sys_created_on'), sys_created_by: current.getValue('sys_created_by') }; var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(observableData, 'observable'); })(current, previous);Klik Kirim.
Aturan Bisnis: Peristiwa Login Sistem
Aturan Bisnis ini mengekspor peristiwa autentikasi dan login ke Google SecOps.
- Buka System Definition > Business Rules.
- Klik New.
Berikan detail konfigurasi berikut:
Kolom Nilai Nama Chronicle - Export System LogTabel System Log [syslog]Aktif Dicentang Lanjutan Dicentang Kapan afterSisipkan Dicentang Memesan 100Kondisi current.level == "error" || current.source.indexOf("login") != -1Klik tab Advanced, buka kolom Script, lalu masukkan kode berikut:
(function executeRule(current, previous) { var logData = { sys_id: current.getValue('sys_id'), level: current.getValue('level'), source: current.getValue('source'), message: current.getValue('message'), sys_created_on: current.getValue('sys_created_on'), sys_created_by: current.getValue('sys_created_by') }; var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(logData, 'system_log'); })(current, previous);Klik Kirim.
Aturan Bisnis: Jejak Audit (Perubahan Izin)
Aturan Bisnis ini mengekspor perubahan tingkat kolom untuk tujuan jejak audit.
- Buka System Definition > Business Rules.
- Klik New.
Berikan detail konfigurasi berikut:
Kolom Nilai Nama Chronicle - Export Audit ChangesTabel Audit [sys_audit]Aktif Dicentang Lanjutan Dicentang Kapan afterSisipkan Dicentang Memesan 100Kondisi Lihat skrip berikut Kondisi (hanya memfilter perubahan penting):
```javascript current.tablename == 'sys_user_has_role' || current.tablename == 'sys_user_group_member' || current.tablename == 'sn_si_incident' || current.fieldname == 'active' || current.fieldname == 'locked_out' ```Klik tab Advanced, buka kolom Script, lalu masukkan kode berikut:
(function executeRule(current, previous) { var auditData = { sys_id: current.getValue('sys_id'), tablename: current.getValue('tablename'), documentkey: current.getValue('documentkey'), fieldname: current.getValue('fieldname'), oldvalue: current.getValue('oldvalue'), newvalue: current.getValue('newvalue'), user: current.getDisplayValue('user'), reason: current.getValue('reason'), sys_created_on: current.getValue('sys_created_on') }; var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(auditData, 'audit_change'); })(current, previous);Klik Kirim.
Opsional: Tabel tambahan untuk diekspor
Perubahan Penugasan Peran Pengguna
Mengekspor pemberian dan pencabutan peran untuk audit keamanan.
Buat Aturan Bisnis di tabel
sys_user_has_role:(function executeRule(current, previous) { var roleData = { sys_id: current.getValue('sys_id'), user: current.getDisplayValue('user'), role: current.getDisplayValue('role'), granted_by: current.getDisplayValue('granted_by'), state: current.getValue('state'), sys_created_on: current.getValue('sys_created_on') }; var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(roleData, 'role_assignment'); })(current, previous);
Temuan Keamanan
Mengekspor deteksi dan temuan keamanan.
Buat Aturan Bisnis di tabel
sn_si_finding:(function executeRule(current, previous) { var findingData = { sys_id: current.getValue('sys_id'), finding: current.getValue('finding'), confidence: current.getValue('confidence'), severity: current.getDisplayValue('severity'), observable: current.getDisplayValue('observable'), sys_created_on: current.getValue('sys_created_on') }; var chronicleUtil = new ChronicleWebhookUtil(); chronicleUtil.sendEvent(findingData, 'finding'); })(current, previous);
Untuk mengetahui informasi selengkapnya tentang feed Google SecOps, lihat dokumentasi feed Google SecOps. Untuk mengetahui informasi tentang persyaratan untuk setiap jenis feed, lihat Konfigurasi feed menurut jenis.
Jika Anda mengalami masalah saat membuat feed, hubungi dukungan SecOps Google.
Tabel pemetaan UDM
| Kolom ServiceNow | Pemetaan UDM | Logika |
|---|---|---|
number |
metadata.product_event_type |
Nomor insiden atau peristiwa |
short_description |
security_result.summary |
Deskripsi singkat peristiwa keamanan |
severity |
security_result.severity |
Tingkat keparahan peristiwa |
priority |
security_result.priority |
Prioritas acara |
caller |
principal.user.userid |
Pengguna yang melaporkan atau memicu peristiwa |
affected_user |
target.user.userid |
Pengguna yang terpengaruh oleh peristiwa keamanan |
assigned_to |
security_result.action_details |
Analis yang ditugaskan untuk menangani insiden |
sys_created_on |
metadata.event_timestamp |
Stempel waktu pembuatan acara |
value (dapat diamati) |
network.ip atau network.dns.questions.name |
Nilai yang dapat diamati (IP, domain, hash) |
type (dapat diamati) |
security_result.detection_fields.value |
Jenis yang dapat diamati (alamat IP, domain, hash file) |
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.