收集 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 用户账号:
admin或sn_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
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 在下一页上,点击配置单个 Feed。
- 在Feed 名称字段中,输入 Feed 的名称(例如
ServiceNow Security Events)。 - 选择 Webhook 作为来源类型。
- 选择 ServiceNow Security 作为日志类型。
- 点击下一步。
配置 Feed 参数
为以下输入参数指定值:
- 拆分分隔符:输入
\n以分隔日志行。 - 资产命名空间:资产命名空间。
- 提取标签:应用于相应 Feed 中所有事件的标签。
- 拆分分隔符:输入
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
生成密钥并检索端点网址
- 点击生成密钥,生成用于对此 Feed 进行身份验证的密钥。
复制并保存密钥,将其保存在安全的位置。
点击详细信息标签页。
从端点信息字段中复制 Feed 端点网址。
- 端点网址示例:
https://malachiteingestion-pa.googleapis.com/v2/unstructured/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/logTypes/SERVICENOW_SECURITY:import
- 端点网址示例:
点击完成。
创建用于身份验证的 API 密钥
- 前往 Google Cloud 控制台的“凭据”页面。
- 点击创建凭据,然后选择 API 密钥。
- 点击限制密钥。
- 在 API 限制下:
- 选择限制密钥。
- 选择 Google SecOps API (Chronicle API)。
- 点击保存。
- 复制 API 密钥并将其保存在安全的位置。
配置 ServiceNow 集成凭据
将 Google SecOps 凭据存储为 ServiceNow 系统属性,以实现安全访问。
- 在 ServiceNow 中,依次前往系统属性 > sys_properties.list。
- 点击 New(新建)。
- 创建第一个房源:
- 名称:
x_chronicle.endpoint_url - 值:粘贴上一步中的 Feed 端点网址
- 类型:
string
- 名称:
- 点击提交。
- 点击新建以创建第二个媒体资源:
- 名称:
x_chronicle.api_key - 值:粘贴 Google Cloud API 密钥
- 类型:
password(用于加密值)
- 名称:
- 点击提交。
- 点击新建以创建第三个属性:
- 名称:
x_chronicle.secret_key - 值:粘贴 Google SecOps Feed 密钥
- 类型:
password(用于加密值)
- 名称:
- 点击提交。
创建可重复使用的 Webhook 实用程序脚本包含
此脚本包含提供了一个可重用的函数,用于从任何业务规则向 Google SecOps 发送事件。
- 前往系统定义 > 脚本包含。
- 点击 New(新建)。
- 提供以下配置详细信息:
- 名称:
ChronicleWebhookUtil - API 名称:
ChronicleWebhookUtil - 客户端可调用:未选中
- 有效:已选中
- 名称:
在脚本字段中,输入以下代码:
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 SecOps。
- 依次前往系统定义 > 业务规则。
- 点击 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 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.ip 或 network.dns.questions.name |
可观测值(IP、网域、哈希) |
type(可观测) |
security_result.detection_fields.value |
可观测对象类型(IP 地址、网域、文件哈希) |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。