Recopila registros de seguridad de ServiceNow
En este documento, se explica cómo exportar eventos de seguridad de ServiceNow a Google Security Operations con webhooks salientes configurados a través de reglas de negocios. Una etiqueta de transferencia identifica el analizador que normaliza los datos de registro sin procesar en formato UDM estructurado.
Arquitectura de integración
Esta integración usa reglas de negocios de ServiceNow para enviar eventos de seguridad a Google SecOps en tiempo real:
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)
Características de la integración:
- Notificaciones push basadas en eventos: Los eventos se envían de inmediato cuando se crean o actualizan.
- En tiempo real: Latencia baja (segundos)
- Exportación selectiva: Configura qué tablas y eventos exportar
- No es una exportación masiva: No envía datos históricos
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Una instancia de Google SecOps
- Una instancia de ServiceNow con el complemento Security Incident Response (SIR) instalado
- Una cuenta de usuario de ServiceNow con los siguientes roles:
adminosn_si.admin(para crear reglas comerciales)- Acceso a System Definition > Business Rules
- Acceso a System Definition > Script Includes
- Acceso con privilegios a la consola de Google Google Cloud (para la creación de claves de API)
Tablas de seguridad de ServiceNow para la exportación
Las siguientes tablas contienen datos relevantes para la seguridad para el análisis del SIEM:
| Tabla | Nombre de la API | Descripción | Prioridad |
|---|---|---|---|
| Incidente de seguridad | sn_si_incident |
Incidentes de seguridad e investigaciones | ALTA |
| Observable | sn_si_observable |
IOC: Direcciones IP, dominios, hashes de archivos | ALTA |
| Registro del sistema | syslog |
Eventos de autenticación y errores de acceso | MEDIUM |
| Auditoría | sys_audit |
Cambios a nivel del campo y modificaciones de permisos | MEDIUM |
| Asignación de rol del usuario | sys_user_has_role |
Otorgamiento o revocación de roles | BAJO |
| Resultado de seguridad | sn_si_finding |
Detecciones y hallazgos de seguridad | BAJO |
En esta guía, se proporcionan ejemplos de reglas de negocio para las tablas de prioridad ALTA. Puedes extender la integración a tablas adicionales con el mismo patrón.
Configura un feed en Google SecOps para transferir eventos de seguridad de ServiceNow
Configura el feed de webhook
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- En la siguiente página, haz clic en Configurar un solo feed.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
ServiceNow Security Events). - Selecciona Webhook como el Tipo de origen.
- Selecciona ServiceNow Security como el Tipo de registro.
- Haz clic en Siguiente.
Configura los parámetros del feed
Especifica valores para los siguientes parámetros de entrada:
- Delimitador de división: Ingresa
\npara separar las líneas de registro. - Espacio de nombres del recurso: Es el espacio de nombres del recurso.
- Etiquetas de transferencia: Son las etiquetas que se aplican a todos los eventos de este feed.
- Delimitador de división: Ingresa
Haz clic en Siguiente.
Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Genera una clave secreta y recupera la URL del extremo
- Haz clic en Generar clave secreta para generar una clave secreta que autentique este feed.
Copia y guarda la clave secreta en una ubicación segura.
Ve a la pestaña Detalles.
Copia la URL del extremo del feed del campo Información del extremo.
- URL de extremo de ejemplo:
https://malachiteingestion-pa.googleapis.com/v2/unstructured/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/logTypes/SERVICENOW_SECURITY:import
- URL de extremo de ejemplo:
Haz clic en Listo.
Crea una clave de API para la autenticación
- Ve a la página Google Cloud Credenciales de la consola.
- Haz clic en Crear credenciales y selecciona Clave de API.
- Haz clic en Restringir clave.
- En Restricciones de API, haz lo siguiente:
- Selecciona Restringir clave.
- Selecciona Google SecOps API (API de Chronicle).
- Haz clic en Guardar.
- Copia la clave de API y guárdala en una ubicación segura.
Configura las credenciales de integración de ServiceNow
Almacena las credenciales de Google SecOps como propiedades del sistema de ServiceNow para un acceso seguro.
- En ServiceNow, ve a System Properties > sys_properties.list.
- Haz clic en Nuevo.
- Crea la primera propiedad:
- Nombre:
x_chronicle.endpoint_url - Valor: Pega la URL del extremo del feed del paso anterior.
- Tipo:
string
- Nombre:
- Haz clic en Enviar.
- Haz clic en Nuevo para crear la segunda propiedad:
- Nombre:
x_chronicle.api_key - Valor: Pega la clave de la API Google Cloud .
- Tipo:
password(esto encripta el valor)
- Nombre:
- Haz clic en Enviar.
- Haz clic en Nuevo para crear la tercera propiedad:
- Nombre:
x_chronicle.secret_key - Valor: Pega la clave secreta del feed de Google SecOps.
- Tipo:
password(esto encripta el valor)
- Nombre:
- Haz clic en Enviar.
Crea una utilidad de webhook reutilizable en Script Include
Este Script Include proporciona una función reutilizable para enviar eventos a Google SecOps desde cualquier regla de negocio.
- Ve a System Definition > Script Includes.
- Haz clic en Nuevo.
- Proporciona los siguientes detalles de configuración:
- Nombre:
ChronicleWebhookUtil - Nombre de la API:
ChronicleWebhookUtil - Client callable: Sin marcar
- Activo: Marcado
- Nombre:
En el campo Script, ingresa el siguiente código:
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' };Haz clic en Enviar.
Crea reglas de negocio para la exportación de eventos
Las reglas de negocio se activan automáticamente cuando se crean o actualizan registros en las tablas de ServiceNow. Crea una regla de negocio para cada tabla que desees exportar a Google SecOps.
Regla comercial: Incidentes de seguridad
Esta regla de negocio exporta eventos de incidentes de seguridad a Google SecOps.
- Ve a System Definition > Business Rules.
- Haz clic en Nuevo.
Proporciona los siguientes detalles de configuración:
Cuándo ejecutarla:
Campo Valor Nombre Chronicle - Export Security IncidentTabla Security Incident [sn_si_incident]Activo Marcado Aspectos avanzados Marcado Cuándo afterInsertar Marcado Actualizar Marcado Borrar Opcional (marca esta casilla para hacer un seguimiento de los borrados) Order 100Haz clic en la pestaña Avanzado, ve al campo Secuencia de comandos y, luego, ingresa el siguiente código:
(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);Haz clic en Enviar.
Regla de negocio: Observables (IOC)
Esta regla de negocio exporta datos observables (direcciones IP, dominios, hashes de archivos) a Google SecOps.
- Ve a System Definition > Business Rules.
- Haz clic en Nuevo.
Proporciona los siguientes detalles de configuración:
Campo Valor Nombre Chronicle - Export ObservableTabla Observable [sn_si_observable]Activo Marcado Aspectos avanzados Marcado Cuándo afterInsertar Marcado Actualizar Marcado Order 100Haz clic en la pestaña Avanzado, ve al campo Secuencia de comandos y, luego, ingresa el siguiente código:
(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);Haz clic en Enviar.
Regla comercial: Eventos de acceso al sistema
Esta regla de negocio exporta los eventos de autenticación y acceso a Google SecOps.
- Ve a System Definition > Business Rules.
- Haz clic en Nuevo.
Proporciona los siguientes detalles de configuración:
Campo Valor Nombre Chronicle - Export System LogTabla System Log [syslog]Activo Marcado Aspectos avanzados Marcado Cuándo afterInsertar Marcado Order 100Afección current.level == "error" || current.source.indexOf("login") != -1Haz clic en la pestaña Avanzado, ve al campo Secuencia de comandos y, luego, ingresa el siguiente código:
(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);Haz clic en Enviar.
Regla de negocios: Registro de auditoría (cambios de permisos)
Esta regla de negocios exporta los cambios a nivel del campo para fines de registro de auditoría.
- Ve a System Definition > Business Rules.
- Haz clic en Nuevo.
Proporciona los siguientes detalles de configuración:
Campo Valor Nombre Chronicle - Export Audit ChangesTabla Audit [sys_audit]Activo Marcado Aspectos avanzados Marcado Cuándo afterInsertar Marcado Order 100Afección Consulta la siguiente secuencia de comandos Condición (solo para cambios críticos en el filtro):
```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' ```Haz clic en la pestaña Avanzado, ve al campo Secuencia de comandos y, luego, ingresa el siguiente código:
(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);Haz clic en Enviar.
Opcional: Tablas adicionales para exportar
Cambios en la asignación de roles del usuario
Exporta las concesiones y revocaciones de roles para la auditoría de seguridad.
Crea una regla de negocios en la tabla
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);
Resultados de seguridad
Exporta las detecciones y los hallazgos de seguridad.
Crea una regla de negocios en la tabla
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);
Para obtener más información sobre los feeds de Google SecOps, consulta la documentación sobre los feeds de Google SecOps. Para obtener información sobre los requisitos de cada tipo de feed, consulta Configuración de feeds por tipo.
Si tienes problemas para crear feeds, comunícate con el equipo de asistencia de Google SecOps.
Tabla de asignación de UDM
| Campo de ServiceNow | Asignación de UDM | Lógica |
|---|---|---|
number |
metadata.product_event_type |
Número de incidente o evento |
short_description |
security_result.summary |
Descripción breve del evento de seguridad |
severity |
security_result.severity |
Nivel de gravedad del evento |
priority |
security_result.priority |
Prioridad del evento |
caller |
principal.user.userid |
Usuario que informó o activó el evento |
affected_user |
target.user.userid |
Usuario afectado por el evento de seguridad |
assigned_to |
security_result.action_details |
Analista asignado al incidente |
sys_created_on |
metadata.event_timestamp |
Marca de tiempo de creación del evento |
value (observable) |
network.ip o network.dns.questions.name |
Valor observable (IP, dominio, hash) |
type (observable) |
security_result.detection_fields.value |
Tipo de observable (dirección IP, dominio, hash de archivo) |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.