Recoger registros de seguridad de ServiceNow
En este documento se explica cómo exportar eventos de seguridad de ServiceNow a Google Security Operations mediante webhooks salientes configurados a través de reglas de negocio. Una etiqueta de ingestión 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 negocio 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:
- Push basado en eventos: los eventos se envían inmediatamente cuando se crean o se actualizan.
- Tiempo real: latencia baja (segundos)
- Exportación selectiva: configure las tablas y los eventos que quiera exportar
- No es una exportación en bloque: no envía datos históricos.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Una instancia de Google SecOps
- Una instancia de ServiceNow con el complemento Respuesta a incidentes de seguridad (SIR) instalado
- Una cuenta de usuario de ServiceNow con los siguientes roles:
adminosn_si.admin(para crear reglas de negocio)- Acceso a Definición del sistema > Reglas de negocio
- Acceso a Definición del sistema > Incluye scripts
- Acceso privilegiado a la consola de Google Google Cloud (para crear claves de API)
Tablas de seguridad de ServiceNow para exportar
Las siguientes tablas contienen datos relevantes para la seguridad para el análisis de SIEM:
| Tabla | API Name | Descripción | Prioridad |
|---|---|---|---|
| Incidente de seguridad | sn_si_incident |
Incidentes e investigaciones de seguridad | ALTO |
| Observable | sn_si_observable |
Indicadores de compromiso: direcciones IP, dominios y hashes de archivos | ALTO |
| Registro del sistema | syslog |
Eventos de autenticación y errores de inicio de sesión | MEDIUM |
| Auditoría | sys_audit |
Cambios a nivel de campo y modificaciones de permisos | MEDIUM |
| Asignación de roles de usuario | sys_user_has_role |
Concesiones o revocaciones de roles | BAJO |
| Hallazgo de seguridad | sn_si_finding |
Detecciones y resultados de seguridad | BAJO |
En esta guía se ofrecen ejemplos de reglas de negocio para las tablas de prioridad ALTA. Puedes ampliar la integración a otras tablas siguiendo el mismo patrón.
Configurar un feed en Google SecOps para ingerir eventos de seguridad de ServiceNow
Configurar el feed de webhook
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Añadir feed.
- En la página siguiente, haga clic en Configurar un solo feed.
- En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo,
ServiceNow Security Events). - Selecciona Webhook como Tipo de fuente.
- Selecciona Seguridad de ServiceNow como Tipo de registro.
- Haz clic en Siguiente.
Configurar parámetros de feed
Especifique los valores de los siguientes parámetros de entrada:
- Delimitador de división: introduce
\npara separar las líneas de registro. - Espacio de nombres de recursos: el espacio de nombres de recursos.
- Etiquetas de ingesta: etiquetas aplicadas a todos los eventos de este feed.
- Delimitador de división: introduce
Haz clic en Siguiente.
Revise la configuración de su nuevo feed en la pantalla Finalizar y, a continuación, haga clic en Enviar.
Generar una clave secreta y obtener la URL del endpoint
- Haz clic en Generar clave secreta para generar una clave secreta que autentique este feed.
Copia y guarda la clave secreta en un lugar seguro.
Ve a la pestaña Detalles.
Copia la URL del endpoint del feed del campo Endpoint Information (Información del endpoint).
- Ejemplo de URL de endpoint:
https://malachiteingestion-pa.googleapis.com/v2/unstructured/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/logTypes/SERVICENOW_SECURITY:import
- Ejemplo de URL de endpoint:
Haz clic en Listo.
Crear una clave de API para la autenticación
- Ve a la página Credenciales de la consolaGoogle Cloud .
- Haz clic en Crear credenciales y, a continuación, selecciona Clave de API.
- Haz clic en Restringir clave.
- En Restricciones de la API:
- Selecciona Restringir clave.
- Selecciona API de Google SecOps (API de Chronicle).
- Haz clic en Guardar.
- Copia la clave de API y guárdala en un lugar seguro.
Configurar las credenciales de integración de ServiceNow
Almacena las credenciales de Google SecOps como propiedades del sistema de ServiceNow para proteger el acceso.
- En ServiceNow, ve a Propiedades del sistema > sys_properties.list.
- Haz clic en New (Nuevo).
- Crea la primera propiedad:
- Nombre:
x_chronicle.endpoint_url - Valor: pega la URL del endpoint del feed del paso anterior.
- Tipo:
string
- Nombre:
- Haz clic en Enviar.
- Haga clic en Nuevo para crear la segunda propiedad:
- Nombre:
x_chronicle.api_key - Valor: pega la Google Cloud clave de API.
- Tipo:
password(cifra el valor)
- Nombre:
- Haz clic en Enviar.
- Haga 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(cifra el valor)
- Nombre:
- Haz clic en Enviar.
Crear un Script Include de utilidad de webhook reutilizable
Este Script Include proporciona una función reutilizable para enviar eventos a Google SecOps desde cualquier regla de negocio.
- Ve a Definición del sistema > Incluir scripts.
- Haz clic en New (Nuevo).
- Proporcione los siguientes detalles de configuración:
- Nombre:
ChronicleWebhookUtil - Nombre de la API:
ChronicleWebhookUtil - Client callable (Se puede llamar desde el cliente): sin marcar
- Activo: marcada
- Nombre:
En el campo Script, introduce 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.
Crear 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 quieras exportar a Google SecOps.
Regla de negocio: incidentes de seguridad
Esta regla de negocio exporta eventos de incidentes de seguridad a Google SecOps.
- Ve a Definición del sistema > Reglas de negocio.
- Haz clic en New (Nuevo).
Proporciona los siguientes detalles de configuración:
Cuándo ejecutarlo:
Campo Valor Nombre Chronicle - Export Security IncidentTabla Security Incident [sn_si_incident]Activo Marcada Avanzada Marcada Cuándo afterInsertar Marcada Actualizar Marcada Eliminar Opcional (marca esta opción para hacer un seguimiento de las eliminaciones) Pedido 100Haz clic en la pestaña Advanced (Opciones avanzadas), ve al campo Script e introduce 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 empresarial: observables (IOCs)
Esta regla de negocio exporta datos observables (direcciones IP, dominios y hashes de archivos) a Google SecOps.
- Ve a Definición del sistema > Reglas de negocio.
- Haz clic en New (Nuevo).
Proporciona los siguientes detalles de configuración:
Campo Valor Nombre Chronicle - Export ObservableTabla Observable [sn_si_observable]Activo Marcada Avanzada Marcada Cuándo afterInsertar Marcada Actualizar Marcada Pedido 100Haz clic en la pestaña Advanced (Opciones avanzadas), ve al campo Script e introduce 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 de negocio: eventos de inicio de sesión del sistema
Esta regla de negocio exporta eventos de autenticación e inicio de sesión a Google SecOps.
- Ve a Definición del sistema > Reglas de negocio.
- Haz clic en New (Nuevo).
Proporciona los siguientes detalles de configuración:
Campo Valor Nombre Chronicle - Export System LogTabla System Log [syslog]Activo Marcada Avanzada Marcada Cuándo afterInsertar Marcada Pedido 100Condición current.level == "error" || current.source.indexOf("login") != -1Haz clic en la pestaña Advanced (Opciones avanzadas), ve al campo Script e introduce 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 negocio: registro de auditoría (cambios en los permisos)
Esta regla de negocio exporta los cambios a nivel de campo con fines de registro de auditoría.
- Ve a Definición del sistema > Reglas de negocio.
- Haz clic en New (Nuevo).
Proporciona los siguientes detalles de configuración:
Campo Valor Nombre Chronicle - Export Audit ChangesTabla Audit [sys_audit]Activo Marcada Avanzada Marcada Cuándo afterInsertar Marcada Pedido 100Condición Consulta la siguiente secuencia de comandos Estado (filtrar solo los cambios críticos):
```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 Advanced (Opciones avanzadas), ve al campo Script e introduce 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 de usuario
Exporta las concesiones y revocaciones de roles para realizar auditorías de seguridad.
Crea una regla de negocio 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);
Hallazgos de seguridad
Exporta detecciones y resultados de seguridad.
Crea una regla de negocio 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 de los feeds de Google SecOps. Para obtener información sobre los requisitos de cada tipo de feed, consulta el artículo Configuración de feeds por tipo.
Si tienes problemas al crear feeds, ponte en contacto con el equipo de Asistencia de SecOps de Google.
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 ha informado o activado 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 o hash) |
type (observable) |
security_result.detection_fields.value |
Tipo de observable (dirección IP, dominio, hash de archivo) |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.