收集 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 使用者帳戶:
    • adminsn_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 動態饋給

  1. 依序前往「SIEM 設定」>「動態饋給」
  2. 按一下「新增動態消息」
  3. 在下一個頁面中,按一下「設定單一動態饋給」
  4. 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如 ServiceNow Security Events)。
  5. 選取「Webhook」做為「來源類型」
  6. 選取「ServiceNow Security」做為「記錄類型」
  7. 點選「下一步」

設定動態饋給參數

  1. 指定下列輸入參數的值:

    • 分割分隔符號:輸入 \n 分隔記錄行。
    • 資產命名空間資產命名空間
    • 擷取標籤:套用至這個動態饋給所有事件的標籤。
  2. 點選「下一步」

  3. 在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)

產生密鑰並擷取端點網址

  1. 按一下「產生密鑰」,產生驗證這個動態饋給的密鑰。
  2. 複製並將密鑰儲存在安全的地方。

  3. 前往「詳細資料」分頁。

  4. 從「端點資訊」欄位複製動態消息端點網址。

    • 端點網址範例: https://malachiteingestion-pa.googleapis.com/v2/unstructured/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/logTypes/SERVICENOW_SECURITY:import
  5. 按一下 [完成]

建立用於驗證的 API 金鑰

  1. 前往Google Cloud 控制台的「憑證」頁面。
  2. 按一下 [Create credentials] (建立憑證),然後選取 [API key] (API 金鑰)
  3. 按一下「Restrict Key」(限制金鑰)
  4. 在「API 限制」下方:
    • 選取「Restrict key」(限制金鑰)
    • 選取「Google SecOps API」(Chronicle API)。
  5. 按一下 [儲存]
  6. 複製 API 金鑰,並儲存在安全地點。

設定 ServiceNow 整合憑證

將 Google SecOps 憑證儲存為 ServiceNow 系統屬性,確保存取安全。

  1. 在 ServiceNow 中,依序前往「System Properties」(系統屬性) > sys_properties.list
  2. 點選「New」(新增)
  3. 建立第一個屬性:
    • Name (名稱):x_chronicle.endpoint_url
    • :貼上上一步的動態饋給端點網址
    • 類型string
  4. 按一下「提交」
  5. 按一下「New」建立第二個屬性:
    • Name (名稱):x_chronicle.api_key
    • :貼上 Google Cloud API 金鑰
    • 類型password (這會加密值)
  6. 按一下「提交」
  7. 按一下「New」建立第三個屬性:
    • Name (名稱):x_chronicle.secret_key
    • :貼上 Google SecOps 摘要資訊的密鑰
    • 類型password (這會加密值)
  8. 按一下「提交」

建立可重複使用的 Webhook 公用程式 Script Include

這個指令碼包含可重複使用的函式,可從任何業務規則將事件傳送至 Google SecOps。

  1. 前往「系統定義」>「指令碼包含」
  2. 點選「New」(新增)
  3. 請提供下列設定詳細資料:
    • Name (名稱):ChronicleWebhookUtil
    • API 名稱ChronicleWebhookUtil
    • 用戶端可呼叫:取消勾選
    • 有效:已勾選
  4. 在「指令碼」欄位中,輸入下列程式碼:

    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'
    };
    
  5. 按一下「提交」

建立事件匯出的業務規則

在 ServiceNow 資料表中建立或更新記錄時,系統會自動觸發業務規則。為要匯出至 Google SecOps 的每個表格建立業務規則。

業務規則:安全事件

這項業務規則會將安全事件匯出至 Google Security Operations。

  1. 前往「系統定義」>「業務規則」
  2. 點選「New」(新增)
  3. 請提供下列設定詳細資料:

    執行時機:

    欄位
    名稱 Chronicle - Export Security Incident
    資料表 Security Incident [sn_si_incident]
    已啟用 已勾選
    [進階] 已勾選
    時間 after
    插入 已勾選
    更新 已勾選
    刪除 選用 (勾選即可追蹤刪除作業)
    訂單 100
  4. 按一下「進階」分頁標籤,前往「指令碼」欄位,然後輸入下列程式碼:

    (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);
    
  5. 按一下「提交」

業務規則:可觀測項目 (IOC)

這項業務規則會將可觀察到的資料 (IP 位址、網域、檔案雜湊) 匯出至 Google SecOps。

  1. 前往「系統定義」>「業務規則」
  2. 點選「New」(新增)
  3. 請提供下列設定詳細資料:

    欄位
    名稱 Chronicle - Export Observable
    資料表 Observable [sn_si_observable]
    已啟用 已勾選
    [進階] 已勾選
    時間 after
    插入 已勾選
    更新 已勾選
    訂單 100
  4. 按一下「進階」分頁標籤,前往「指令碼」欄位,然後輸入下列程式碼:

    (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);
    
  5. 按一下「提交」

業務規則:系統登入事件

這項業務規則會將驗證和登入事件匯出至 Google SecOps。

  1. 前往「系統定義」>「業務規則」
  2. 點選「New」(新增)
  3. 請提供下列設定詳細資料:

    欄位
    名稱 Chronicle - Export System Log
    資料表 System Log [syslog]
    已啟用 已勾選
    [進階] 已勾選
    時間 after
    插入 已勾選
    訂單 100
    條件 current.level == "error" || current.source.indexOf("login") != -1
  4. 按一下「進階」分頁標籤,前往「指令碼」欄位,然後輸入下列程式碼:

    (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);
    
  5. 按一下「提交」

業務規則:稽核追蹤記錄 (權限變更)

這項業務規則會匯出欄位層級的變更,以供稽核追蹤。

  1. 前往「系統定義」>「業務規則」
  2. 點選「New」(新增)
  3. 請提供下列設定詳細資料:

    欄位
    名稱 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'
    ```
    
  4. 按一下「進階」分頁標籤,前往「指令碼」欄位,然後輸入下列程式碼:

    (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);
    
  5. 按一下「提交」

選用:匯出其他資料表

使用者角色指派變更

匯出角色授予和撤銷記錄,以進行安全稽核。

  • 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.ipnetwork.dns.questions.name 可觀察值 (IP、網域、雜湊)
type (可觀察) security_result.detection_fields.value 可觀察類型 (IP 位址、網域、檔案雜湊)

還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。