收集 ServiceNow Security 記錄
本文說明如何使用透過「商務規則」設定的外送 Webhook,將 ServiceNow Security 事件匯出至 Google Security Operations。擷取標籤會識別剖析器,該剖析器會將原始記錄資料正規化為具結構性的 UDM 格式。
整合架構
這項整合功能會使用 ServiceNow 業務規則,將安全事件即時推送至 Google SecOps:
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)
整合特性:
- 事件驅動型推送:在建立或更新事件時立即傳送
- 即時:低延遲 (秒)
- 選擇性匯出:設定要匯出的資料表和事件
- 非大量匯出:不會傳送歷來資料
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體
- 已安裝 Security Incident Response (SIR) 外掛程式的 ServiceNow 執行個體
- 具備下列角色的 ServiceNow 使用者帳戶:
admin或sn_si.admin(建立業務規則)- 存取「System Definition」>「Business Rules」
- 存取「系統定義」>「指令碼包含」
- Google Google Cloud 控制台的特殊權限 (用於建立 API 金鑰)
要匯出的 ServiceNow Security 資料表
下表包含與安全性相關的資料,可用於 SIEM 分析:
| 資料表 | API 名稱 | 說明 | 優先順序 |
|---|---|---|---|
| 安全事件 | sn_si_incident |
安全事件、調查 | 高 |
| Observable | sn_si_observable |
IOC:IP 位址、網域、檔案雜湊 | 高 |
| 系統記錄 | syslog |
驗證事件、登入失敗 | MEDIUM |
| 稽核 | sys_audit |
欄位層級變更、權限修改 | MEDIUM |
| 指派使用者角色 | sys_user_has_role |
授予/撤銷角色 | 低 |
| 安全性發現項目 | sn_si_finding |
安全性偵測和發現項目 | 低 |
本指南提供高優先順序資料表的業務規則範例。您可以按照相同模式,將整合功能擴展至其他資料表。
在 Google SecOps 中設定動態饋給,擷取 ServiceNow Security 事件
設定 Webhook 動態饋給
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 在下一個頁面中,按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
ServiceNow Security Events)。 - 選取「Webhook」做為「來源類型」。
- 選取「ServiceNow Security」做為「記錄類型」。
- 點選「下一步」。
設定動態饋給參數
指定下列輸入參數的值:
- 分割分隔符號:輸入
\n分隔記錄行。 - 資產命名空間:資產命名空間。
- 擷取標籤:套用至這個動態饋給所有事件的標籤。
- 分割分隔符號:輸入
點選「下一步」。
在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)。
產生密鑰並擷取端點網址
- 按一下「產生密鑰」,產生驗證這個動態饋給的密鑰。
複製並將密鑰儲存在安全的地方。
前往「詳細資料」分頁。
從「端點資訊」欄位複製動態消息端點網址。
- 端點網址範例:
https://malachiteingestion-pa.googleapis.com/v2/unstructured/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/logTypes/SERVICENOW_SECURITY:import
- 端點網址範例:
按一下 [完成]。
建立用於驗證的 API 金鑰
- 前往Google Cloud 控制台的「憑證」頁面。
- 按一下 [Create credentials] (建立憑證),然後選取 [API key] (API 金鑰)。
- 按一下「Restrict Key」(限制金鑰)。
- 在「API 限制」下方:
- 選取「Restrict key」(限制金鑰)。
- 選取「Google SecOps API」(Chronicle API)。
- 按一下 [儲存]。
- 複製 API 金鑰,並儲存在安全地點。
設定 ServiceNow 整合憑證
將 Google SecOps 憑證儲存為 ServiceNow 系統屬性,確保存取安全。
- 在 ServiceNow 中,依序前往「System Properties」(系統屬性) > sys_properties.list。
- 點選「New」(新增)。
- 建立第一個屬性:
- Name (名稱):
x_chronicle.endpoint_url - 值:貼上上一步的動態饋給端點網址
- 類型:
string
- Name (名稱):
- 按一下「提交」。
- 按一下「New」建立第二個屬性:
- Name (名稱):
x_chronicle.api_key - 值:貼上 Google Cloud API 金鑰
- 類型:
password(這會加密值)
- Name (名稱):
- 按一下「提交」。
- 按一下「New」建立第三個屬性:
- Name (名稱):
x_chronicle.secret_key - 值:貼上 Google SecOps 摘要資訊的密鑰
- 類型:
password(這會加密值)
- Name (名稱):
- 按一下「提交」。
建立可重複使用的 Webhook 公用程式 Script Include
這個指令碼包含可重複使用的函式,可從任何業務規則將事件傳送至 Google SecOps。
- 前往「系統定義」>「指令碼包含」。
- 點選「New」(新增)。
- 請提供下列設定詳細資料:
- Name (名稱):
ChronicleWebhookUtil - API 名稱:
ChronicleWebhookUtil - 用戶端可呼叫:取消勾選
- 有效:已勾選
- Name (名稱):
在「指令碼」欄位中,輸入下列程式碼:
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' };按一下「提交」。
建立事件匯出的業務規則
在 ServiceNow 資料表中建立或更新記錄時,系統會自動觸發業務規則。為要匯出至 Google SecOps 的每個表格建立業務規則。
業務規則:安全事件
這項業務規則會將安全事件匯出至 Google Security Operations。
- 前往「系統定義」>「業務規則」。
- 點選「New」(新增)。
請提供下列設定詳細資料:
執行時機:
欄位 值 名稱 Chronicle - Export Security Incident資料表 Security Incident [sn_si_incident]已啟用 已勾選 [進階] 已勾選 時間 after插入 已勾選 更新 已勾選 刪除 選用 (勾選即可追蹤刪除作業) 訂單 100按一下「進階」分頁標籤,前往「指令碼」欄位,然後輸入下列程式碼:
(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);按一下「提交」。
業務規則:可觀測項目 (IOC)
這項業務規則會將可觀察到的資料 (IP 位址、網域、檔案雜湊) 匯出至 Google SecOps。
- 前往「系統定義」>「業務規則」。
- 點選「New」(新增)。
請提供下列設定詳細資料:
欄位 值 名稱 Chronicle - Export Observable資料表 Observable [sn_si_observable]已啟用 已勾選 [進階] 已勾選 時間 after插入 已勾選 更新 已勾選 訂單 100按一下「進階」分頁標籤,前往「指令碼」欄位,然後輸入下列程式碼:
(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);按一下「提交」。
業務規則:系統登入事件
這項業務規則會將驗證和登入事件匯出至 Google SecOps。
- 前往「系統定義」>「業務規則」。
- 點選「New」(新增)。
請提供下列設定詳細資料:
欄位 值 名稱 Chronicle - Export System Log資料表 System Log [syslog]已啟用 已勾選 [進階] 已勾選 時間 after插入 已勾選 訂單 100條件 current.level == "error" || current.source.indexOf("login") != -1按一下「進階」分頁標籤,前往「指令碼」欄位,然後輸入下列程式碼:
(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);按一下「提交」。
業務規則:稽核追蹤記錄 (權限變更)
這項業務規則會匯出欄位層級的變更,以供稽核追蹤。
- 前往「系統定義」>「業務規則」。
- 點選「New」(新增)。
請提供下列設定詳細資料:
欄位 值 名稱 Chronicle - Export Audit Changes資料表 Audit [sys_audit]已啟用 已勾選 [進階] 已勾選 時間 after插入 已勾選 訂單 100條件 請參閱下列指令碼 條件 (僅篩選重大變更):
```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' ```按一下「進階」分頁標籤,前往「指令碼」欄位,然後輸入下列程式碼:
(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);按一下「提交」。
選用:匯出其他資料表
使用者角色指派變更
匯出角色授予和撤銷記錄,以進行安全稽核。
在
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);
安全性發現項目
匯出安全偵測結果和發現。
在
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);
如要進一步瞭解 Google SecOps 動態消息,請參閱 Google SecOps 動態消息說明文件。如要瞭解各類動態饋給的規定,請參閱「依類型設定動態饋給」。
如果在建立動態饋給時遇到問題,請與 Google SecOps 支援團隊聯絡。
UDM 對應表
| ServiceNow 欄位 | UDM 對應 | 邏輯 |
|---|---|---|
number |
metadata.product_event_type |
事件或活動編號 |
short_description |
security_result.summary |
簡要說明安全事件 |
severity |
security_result.severity |
事件嚴重性等級 |
priority |
security_result.priority |
活動優先順序 |
caller |
principal.user.userid |
回報或觸發事件的使用者 |
affected_user |
target.user.userid |
受安全性事件影響的使用者 |
assigned_to |
security_result.action_details |
指派給事件的分析師 |
sys_created_on |
metadata.event_timestamp |
事件建立時間戳記 |
value (可觀察) |
network.ip或network.dns.questions.name |
可觀察值 (IP、網域、雜湊) |
type (可觀察) |
security_result.detection_fields.value |
可觀察類型 (IP 位址、網域、檔案雜湊) |
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。