Recoger registros de seguridad de ServiceNow

Disponible en:

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:
    • admin o sn_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

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Añadir feed.
  3. En la página siguiente, haga clic en Configurar un solo feed.
  4. En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo, ServiceNow Security Events).
  5. Selecciona Webhook como Tipo de fuente.
  6. Selecciona Seguridad de ServiceNow como Tipo de registro.
  7. Haz clic en Siguiente.

Configurar parámetros de feed

  1. Especifique los valores de los siguientes parámetros de entrada:

    • Delimitador de división: introduce \n para 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.
  2. Haz clic en Siguiente.

  3. 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

  1. Haz clic en Generar clave secreta para generar una clave secreta que autentique este feed.
  2. Copia y guarda la clave secreta en un lugar seguro.

  3. Ve a la pestaña Detalles.

  4. 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
  5. Haz clic en Listo.

Crear una clave de API para la autenticación

  1. Ve a la página Credenciales de la consolaGoogle Cloud .
  2. Haz clic en Crear credenciales y, a continuación, selecciona Clave de API.
  3. Haz clic en Restringir clave.
  4. En Restricciones de la API:
    • Selecciona Restringir clave.
    • Selecciona API de Google SecOps (API de Chronicle).
  5. Haz clic en Guardar.
  6. 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.

  1. En ServiceNow, ve a Propiedades del sistema > sys_properties.list.
  2. Haz clic en New (Nuevo).
  3. Crea la primera propiedad:
    • Nombre: x_chronicle.endpoint_url
    • Valor: pega la URL del endpoint del feed del paso anterior.
    • Tipo: string
  4. Haz clic en Enviar.
  5. 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)
  6. Haz clic en Enviar.
  7. 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)
  8. 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.

  1. Ve a Definición del sistema > Incluir scripts.
  2. Haz clic en New (Nuevo).
  3. 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
  4. 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'
    };
    
  5. 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.

  1. Ve a Definición del sistema > Reglas de negocio.
  2. Haz clic en New (Nuevo).
  3. Proporciona los siguientes detalles de configuración:

    Cuándo ejecutarlo:

    Campo Valor
    Nombre Chronicle - Export Security Incident
    Tabla Security Incident [sn_si_incident]
    Activo Marcada
    Avanzada Marcada
    Cuándo after
    Insertar Marcada
    Actualizar Marcada
    Eliminar Opcional (marca esta opción para hacer un seguimiento de las eliminaciones)
    Pedido 100
  4. Haz 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);
    
  5. 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.

  1. Ve a Definición del sistema > Reglas de negocio.
  2. Haz clic en New (Nuevo).
  3. Proporciona los siguientes detalles de configuración:

    Campo Valor
    Nombre Chronicle - Export Observable
    Tabla Observable [sn_si_observable]
    Activo Marcada
    Avanzada Marcada
    Cuándo after
    Insertar Marcada
    Actualizar Marcada
    Pedido 100
  4. Haz 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);
    
  5. 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.

  1. Ve a Definición del sistema > Reglas de negocio.
  2. Haz clic en New (Nuevo).
  3. Proporciona los siguientes detalles de configuración:

    Campo Valor
    Nombre Chronicle - Export System Log
    Tabla System Log [syslog]
    Activo Marcada
    Avanzada Marcada
    Cuándo after
    Insertar Marcada
    Pedido 100
    Condición current.level == "error" || current.source.indexOf("login") != -1
  4. Haz 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);
    
  5. 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.

  1. Ve a Definición del sistema > Reglas de negocio.
  2. Haz clic en New (Nuevo).
  3. Proporciona los siguientes detalles de configuración:

    Campo Valor
    Nombre Chronicle - Export Audit Changes
    Tabla Audit [sys_audit]
    Activo Marcada
    Avanzada Marcada
    Cuándo after
    Insertar Marcada
    Pedido 100
    Condició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'
    ```
    
  4. 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);
    
  5. 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.