收集 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 实例
  • 已安装安全突发事件响应 (SIR) 插件的 ServiceNow 实例
  • 具有以下角色的 ServiceNow 用户账号:
    • adminsn_si.admin(用于创建业务规则)
    • 访问系统定义 > 业务规则
    • 访问系统定义 > 脚本包含
  • 对 Google Google Cloud 控制台的特权访问权限(用于创建 API 密钥)

要导出的 ServiceNow Security 表

下表包含与安全相关的 SIEM 分析数据:

API 名称 说明 优先级
安全事件 sn_si_incident 安全事件、调查 HIGH
Observable sn_si_observable IOC:IP 地址、网域、文件哈希值 HIGH
系统日志 syslog 身份验证事件、登录失败 MEDIUM
审核 sys_audit 字段级更改、权限修改 MEDIUM
用户角色分配 sys_user_has_role 角色授予/撤消
安全发现结果 sn_si_finding 安全检测和发现结果

本指南提供了 HIGH 优先级表的业务规则示例。您可以按照相同的模式将集成范围扩展到其他表格。

在 Google SecOps 中配置 Feed 以注入 ServiceNow Security 事件

设置网络钩子 Feed

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 在下一页上,点击配置单个 Feed
  4. Feed 名称字段中,输入 Feed 的名称(例如 ServiceNow Security Events)。
  5. 选择 Webhook 作为来源类型
  6. 选择 ServiceNow Security 作为日志类型
  7. 点击下一步

配置 Feed 参数

  1. 为以下输入参数指定值:

    • 拆分分隔符:输入 \n 以分隔日志行。
    • 资产命名空间资产命名空间
    • 提取标签:应用于相应 Feed 中所有事件的标签。
  2. 点击下一步

  3. 最终确定界面中查看新的 Feed 配置,然后点击提交

生成密钥并检索端点网址

  1. 点击生成密钥,生成用于对此 Feed 进行身份验证的密钥。
  2. 复制并保存密钥,将其保存在安全的位置。

  3. 点击详细信息标签页。

  4. 端点信息字段中复制 Feed 端点网址。

    • 端点网址示例: 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. 点击创建凭据,然后选择 API 密钥
  3. 点击限制密钥
  4. API 限制下:
    • 选择限制密钥
    • 选择 Google SecOps API (Chronicle API)。
  5. 点击保存
  6. 复制 API 密钥并将其保存在安全的位置。

配置 ServiceNow 集成凭据

将 Google SecOps 凭据存储为 ServiceNow 系统属性,以实现安全访问。

  1. 在 ServiceNow 中,依次前往系统属性 > sys_properties.list
  2. 点击 New(新建)。
  3. 创建第一个房源:
    • 名称x_chronicle.endpoint_url
    • :粘贴上一步中的 Feed 端点网址
    • 类型string
  4. 点击提交
  5. 点击新建以创建第二个媒体资源:
    • 名称x_chronicle.api_key
    • :粘贴 Google Cloud API 密钥
    • 类型password(用于加密值)
  6. 点击提交
  7. 点击新建以创建第三个属性:
    • 名称x_chronicle.secret_key
    • :粘贴 Google SecOps Feed 密钥
    • 类型password(用于加密值)
  8. 点击提交

创建可重复使用的 Webhook 实用程序脚本包含

此脚本包含提供了一个可重用的函数,用于从任何业务规则向 Google SecOps 发送事件。

  1. 前往系统定义 > 脚本包含
  2. 点击 New(新建)。
  3. 提供以下配置详细信息:
    • 名称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 SecOps。

  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 Feed,请参阅 Google SecOps Feed 文档。如需了解每种 Feed 类型的要求,请参阅按类型划分的 Feed 配置

如果您在创建 Feed 时遇到问题,请与 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 专业人士的解答。