Recopila registros de seguridad de ServiceNow

Se admite en los siguientes sistemas operativos:

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

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

Configura los parámetros del feed

  1. Especifica valores para los siguientes parámetros de entrada:

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

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

  1. Haz clic en Generar clave secreta para generar una clave secreta que autentique este feed.
  2. Copia y guarda la clave secreta en una ubicación segura.

  3. Ve a la pestaña Detalles.

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

Crea una clave de API para la autenticación

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

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

  1. Ve a System Definition > Script Includes.
  2. Haz clic en Nuevo.
  3. Proporciona los siguientes detalles de configuración:
    • Nombre: ChronicleWebhookUtil
    • Nombre de la API: ChronicleWebhookUtil
    • Client callable: Sin marcar
    • Activo: Marcado
  4. 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'
    };
    
  5. 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.

  1. Ve a System Definition > Business Rules.
  2. Haz clic en Nuevo.
  3. Proporciona los siguientes detalles de configuración:

    Cuándo ejecutarla:

    Campo Valor
    Nombre Chronicle - Export Security Incident
    Tabla Security Incident [sn_si_incident]
    Activo Marcado
    Aspectos avanzados Marcado
    Cuándo after
    Insertar Marcado
    Actualizar Marcado
    Borrar Opcional (marca esta casilla para hacer un seguimiento de los borrados)
    Order 100
  4. Haz 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);
    
  5. 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.

  1. Ve a System Definition > Business Rules.
  2. Haz clic en Nuevo.
  3. Proporciona los siguientes detalles de configuración:

    Campo Valor
    Nombre Chronicle - Export Observable
    Tabla Observable [sn_si_observable]
    Activo Marcado
    Aspectos avanzados Marcado
    Cuándo after
    Insertar Marcado
    Actualizar Marcado
    Order 100
  4. 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 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 comercial: Eventos de acceso al sistema

Esta regla de negocio exporta los eventos de autenticación y acceso a Google SecOps.

  1. Ve a System Definition > Business Rules.
  2. Haz clic en Nuevo.
  3. Proporciona los siguientes detalles de configuración:

    Campo Valor
    Nombre Chronicle - Export System Log
    Tabla System Log [syslog]
    Activo Marcado
    Aspectos avanzados Marcado
    Cuándo after
    Insertar Marcado
    Order 100
    Afección current.level == "error" || current.source.indexOf("login") != -1
  4. 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 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 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.

  1. Ve a System Definition > Business Rules.
  2. Haz clic en Nuevo.
  3. Proporciona los siguientes detalles de configuración:

    Campo Valor
    Nombre Chronicle - Export Audit Changes
    Tabla Audit [sys_audit]
    Activo Marcado
    Aspectos avanzados Marcado
    Cuándo after
    Insertar Marcado
    Order 100
    Afecció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'
    ```
    
  4. 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);
    
  5. 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.