Recopila registros de seguridad de ServiceNow

Compatible con:

En este documento, se explica cómo enviar eventos de seguridad de ServiceNow a Google Security Operations a través de un feed de webhook. El analizador de seguridad de ServiceNow está diseñado para los eventos de seguridad del Centro de seguridad de instancias de ServiceNow, como los inicios de sesión fallidos, los inicios de sesión de SNC, los inicios de sesión de administrador, la suplantación y la elevación de seguridad (consulta Eventos de seguridad del Centro de seguridad de instancias de ServiceNow). Una integración de ServiceNow publica cada evento como JSON en un extremo de webhook de Google SecOps, donde el analizador lo normaliza en el Modelo de datos unificado (UDM).

El analizador reconoce cinco valores de eventos: Failed Login, Admin Login, SNC Login, Impersonation y Security Elevation. Cada valor corresponde a un evento de ServiceNow registrado en la cola sysevent. En este documento, se crea un feed de webhook, un Script Include que envía una solicitud POST al feed y cuatro acciones de secuencia de comandos que se activan en los registros sysevent coincidentes y llaman al Script Include.

Después de esta configuración única, ServiceNow reenvía automáticamente cada evento de seguridad nuevo a Google SecOps. No se requiere ninguna otra acción del administrador.

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos previos:

  • Es una instancia de Google SecOps.
  • Una instancia de ServiceNow con una cuenta de usuario que tenga el rol de admin o derechos para System Definition > Script Includes, System Properties, System Policy > Events > Script Actions y Registry
  • Una activación existente de Instance Security Center de ServiceNow El ISC ya no está a la venta y no se puede activar en instancias nuevas.
  • Acceso con privilegios a la consola de Google Google Cloud (para la creación de claves de API)

Crea un feed de webhook en Google SecOps

En las siguientes secciones, se describe cómo crear un feed de webhook en Google SecOps.

Crea el feed

  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 Seguridad de ServiceNow como el Tipo de registro.
  7. Haz clic en Siguiente.
  8. Especifica valores para los siguientes parámetros de entrada:

    • Delimitador de división: Ingresa \n cuando la integración envíe más de un evento JSON por solicitud. Déjalo vacío si cada solicitud contiene un solo evento.
    • Espacio de nombres del recurso: Es el espacio de nombres del recurso.
    • Etiquetas de transferencia: Es la etiqueta que se aplica a los eventos de este feed.
  9. Haz clic en Siguiente.

  10. Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.

Genera y guarda la clave secreta

  1. En la página de detalles del feed, haz clic en Generar clave secreta.
  2. Copia y guarda la clave secreta en una ubicación segura.

Obtén la URL del extremo del feed

  1. Ve a la pestaña Detalles del feed.
  2. En la sección Endpoint Information, copia la URL del extremo del feed. El formato de la URL es el siguiente:

    https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    

    O bien, para un extremo regional:

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  3. Guarda esta URL para un paso posterior.

  4. Haz clic en Listo.

Crea una Google Cloud clave de API

  1. Ve a la página Credenciales de la consola de Google Google Cloud .
  2. Selecciona el proyecto asociado con tu instancia de Google SecOps.
  3. Haz clic en Crear credenciales > Clave de API.
  4. Haz clic en Editar clave de API para restringir la clave.
  5. En el campo Nombre, ingresa un nombre descriptivo (por ejemplo, ServiceNow Webhook API Key).
  6. En Restricciones de API, haz lo siguiente:

    1. Selecciona Restringir clave.
    2. En la lista Select APIs, selecciona Google SecOps API.
  7. Haz clic en Guardar.

  8. Copia la clave de API y guárdala en una ubicación segura.

Almacena las credenciales de Google SecOps en ServiceNow

Almacena la URL del extremo y las credenciales como propiedades del sistema de ServiceNow para que el código de integración no contenga secretos.

  1. En ServiceNow, ve a System Properties > sys_properties.list.
  2. Haz clic en Nuevo y proporciona los siguientes detalles de configuración:

    • Nombre: x_chronicle.endpoint_url
    • Valor: Pega la URL del extremo del feed.
    • Tipo: string
  3. Haz clic en Enviar.

  4. Haz clic en Nuevo y proporciona los siguientes detalles de configuración:

    • Nombre: x_chronicle.api_key
    • Value: Pega la clave de la API Google Cloud .
    • Tipo: password2
  5. Haz clic en Enviar.

  6. Haz clic en Nuevo y proporciona los siguientes detalles de configuración:

    • Nombre: x_chronicle.secret_key
    • Valor: Pega la clave secreta del feed de Google SecOps.
    • Tipo: password2
  7. Haz clic en Enviar.

Crea la utilidad de webhook Script Include

Este Script Include publica una carga útil JSON en el extremo del webhook de Google SecOps con la API con alcance sn_ws.RESTMessageV2 de ServiceNow. La clave de API y la clave secreta se envían como encabezados HTTP.

  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() {
            this.endpointURL = gs.getProperty('x_chronicle.endpoint_url');
            this.apiKey = gs.getProperty('x_chronicle.api_key');
            this.secretKey = gs.getProperty('x_chronicle.secret_key');
        },
    
        // payload: a plain object whose keys match the required JSON contract.
        sendEvent: function(payload) {
            try {
                if (!this.endpointURL || !this.apiKey || !this.secretKey) {
                    gs.error('[Chronicle] Missing configuration. Check System Properties: x_chronicle.*');
                    return false;
                }
    
                var request = new sn_ws.RESTMessageV2();
                request.setEndpoint(this.endpointURL);
                request.setHttpMethod('POST');
                request.setRequestHeader('Content-Type', 'application/json');
                request.setRequestHeader('X-goog-api-key', this.apiKey);
                request.setRequestHeader('X-Webhook-Access-Key', this.secretKey);
                request.setRequestBody(JSON.stringify(payload));
    
                var response = request.execute();
                var statusCode = response.getStatusCode();
    
                if (statusCode == 200 || statusCode == 201 || statusCode == 204) {
                    gs.info('[Chronicle] Event sent: ' + payload.event + ' | Status: ' + statusCode);
                    return true;
                }
    
                gs.error('[Chronicle] Failed to send event: ' + payload.event + ' | Status: ' + statusCode + ' | Response: ' + response.getBody());
                return false;
            } catch (ex) {
                gs.error('[Chronicle] Exception sending event: ' + ex.message);
                return false;
            }
        },
    
        type: 'ChronicleWebhookUtil'
    };
    
  5. Haz clic en Enviar.

Verifica el registro de eventos

Una acción de secuencia de comandos solo se activa cuando su nombre de evento existe en el Registro de eventos (tabla sysevent_register). ServiceNow envía los cinco eventos que usa esta integración de forma predeterminada, pero vale la pena confirmar, ya que una entrada faltante no produce ningún error y la acción de secuencia de comandos nunca se ejecuta.

  1. En ServiceNow, ve a System Policy > Events > Registry (sysevent_register.list).
  2. Filtra la columna Nombre del evento para cada una de las siguientes entradas y confirma que existe un registro:

    • login
    • login.failed
    • impersonation.start
    • security.elevated_role.enabled
  3. Si falta una entrada, haz clic en Nuevo, establece el campo Nombre del evento en el valor faltante, establece Tabla en Global [global] y haz clic en Enviar.

Crea las acciones de secuencia de comandos

Cada acción de secuencia de comandos se suscribe a un nombre de evento de ServiceNow. Cuando ServiceNow inserta un registro coincidente en la cola sysevent, se ejecuta la acción de secuencia de comandos, se leen los parámetros del evento y se llama a ChronicleWebhookUtil para publicar la carga útil.

El analizador se asigna a los siguientes eventos de ServiceNow:

Valor de event del analizador Nombre del evento de ServiceNow Activador
Failed Login login.failed Se produjo un error al intentar acceder (con cualquier método de autenticación).
Admin Login login Acceso exitoso de un usuario con el rol de admin.
SNC Login login Acceso exitoso de un usuario con el rol de snc_external.
Impersonation impersonation.start Un administrador comienza a suplantar la identidad de otro usuario.
Security Elevation security.elevated_role.enabled Un usuario se eleva a security_admin o a otro rol con privilegios altos.

login y login.failed establecen parm1 en el nombre de usuario y parm2 en la IP de origen. Los demás eventos siguen la misma convención de parm1/parm2, pero el contenido exacto depende de la versión de ServiceNow. Abre la entrada del registro de cada evento y confirma que la descripción de Parameters coincida con la secuencia de comandos que se describe más adelante. Ajusta las referencias de parm1 o parm2 si tu registro es diferente.

Crea la acción de secuencia de comandos de inicio de sesión fallido

  1. Ve a System Policy > Events > Script Actions.
  2. Haz clic en Nuevo.
  3. Proporciona los siguientes detalles de configuración:

    • Nombre: Chronicle - Failed Login
    • Nombre del evento: login.failed
    • Activo: Marcado
  4. En el campo Script, ingresa el siguiente código:

    (function runAction(/*GlideRecord*/ current, /*GlideRecord*/ event) {
        new ChronicleWebhookUtil().sendEvent({
            event: 'Failed Login',
            event_created: event.sys_created_on.getValue(),
            user: event.parm1.toString(),
            ip_address: event.parm2.toString()
        });
    })(current, event);
    
  5. Haz clic en Enviar.

Crea la acción de secuencia de comandos de acceso

Esta acción de secuencia de comandos se activa cada vez que se accede correctamente y reenvía el registro solo cuando el usuario que accedió tiene el rol de admin o snc_external. El campo event se establece según corresponda.

  1. Ve a System Policy > Events > Script Actions.
  2. Haz clic en Nuevo.
  3. Proporciona los siguientes detalles de configuración:

    • Nombre: Chronicle - Login
    • Nombre del evento: login
    • Activo: Marcado
  4. En el campo Script, ingresa el siguiente código:

    (function runAction(/*GlideRecord*/ current, /*GlideRecord*/ event) {
        var userName = event.parm1.toString();
        var ipAddress = event.parm2.toString();
    
        var user = new GlideRecord('sys_user');
        if (!user.get('user_name', userName)) {
            return;
        }
    
        function hasRole(roleName) {
            var role = new GlideRecord('sys_user_has_role');
            role.addQuery('user', user.sys_id);
            role.addQuery('role.name', roleName);
            role.query();
            return role.next();
        }
    
        var eventValue;
        if (hasRole('snc_external')) {
            eventValue = 'SNC Login';
        } else if (hasRole('admin')) {
            eventValue = 'Admin Login';
        } else {
            return;
        }
    
        new ChronicleWebhookUtil().sendEvent({
            event: eventValue,
            event_created: event.sys_created_on.getValue(),
            user: userName,
            ip_address: ipAddress
        });
    })(current, event);
    
  5. Haz clic en Enviar.

Crea la acción de secuencia de comandos de suplantación

  1. Ve a System Policy > Events > Script Actions.
  2. Haz clic en Nuevo.
  3. Proporciona los siguientes detalles de configuración:

    • Nombre: Chronicle - Impersonation
    • Nombre del evento: impersonation.start
    • Activo: Marcado
  4. En el campo Script, ingresa el siguiente código:

    (function runAction(/*GlideRecord*/ current, /*GlideRecord*/ event) {
        new ChronicleWebhookUtil().sendEvent({
            event: 'Impersonation',
            event_created: event.sys_created_on.getValue(),
            user: event.parm1.toString(),       // impersonator
            snc_user: event.parm2.toString()    // impersonated user
        });
    })(current, event);
    
  5. Haz clic en Enviar.

Crea la acción de secuencia de comandos de elevación de seguridad

  1. Ve a System Policy > Events > Script Actions.
  2. Haz clic en Nuevo.
  3. Proporciona los siguientes detalles de configuración:

    • Nombre: Chronicle - Security Elevation
    • Nombre del evento: security.elevated_role.enabled
    • Activo: Marcado
  4. En el campo Script, ingresa el siguiente código:

    (function runAction(/*GlideRecord*/ current, /*GlideRecord*/ event) {
        new ChronicleWebhookUtil().sendEvent({
            event: 'Security Elevation',
            event_created: event.sys_created_on.getValue(),
            user: event.parm1.toString()
        });
    })(current, event);
    
  5. Haz clic en Enviar.

Verifica la integración

Usa uno de los siguientes enfoques.

Verifica con un evento sintético

Para probar cada acción de secuencia de comandos de inmediato sin esperar un evento de seguridad real, haz lo siguiente para poner en cola el evento desde una secuencia de comandos en segundo plano:

  1. En ServiceNow, ve a System Definition > Scripts - Background.
  2. En el campo Ejecutar secuencia de comandos, ingresa una de las siguientes líneas y haz clic en Ejecutar secuencia de comandos:

    gs.eventQueue('login.failed', null, 'test.user', '203.0.113.45');
    gs.eventQueue('login', null, 'admin', '203.0.113.45');
    gs.eventQueue('impersonation.start', null, 'admin', 'test.user');
    gs.eventQueue('security.elevated_role.enabled', null, 'admin', 'security_admin');
    
  3. Espera hasta un minuto para que el trabajo del Administrador de eventos procese la cola.

Verifica con un evento real

Para verificar la integración, genera uno de los siguientes eventos de seguridad asignados en ServiceNow:

  • Failed Login: Abre /login.do en una ventana de navegador privada y envía una contraseña no válida.
  • Acceso de administrador: Accede con un usuario que tenga el rol de admin desde una dirección IP diferente de la habitual.
  • Suplantación de identidad: Desde una cuenta de administrador, suplantar la identidad de otro usuario
  • Elevación de seguridad: Eleva a la función security_admin desde un usuario que tiene la función admin.

Confirmar el reenvío

  1. En ServiceNow, ve a System Policy > Events > Event Log (sysevent.list) y confirma que aparezca un registro con el nombre del evento correspondiente.
  2. En ServiceNow, ve a Registros del sistema > Registro del sistema > Todos y confirma que aparezca un mensaje de información [Chronicle] Event sent: ... con el estado 200, 201 o 204. Un mensaje [Chronicle] Failed to send event o [Chronicle] Exception sending event indica un problema de credenciales o de conectividad.
  3. En Google SecOps, ejecuta una búsqueda de UDM para metadata.vendor_name = "SERVICENOW" y metadata.product_name = "SERVICENOW_SECURITY".
  4. Confirma que el evento aparezca con metadata.event_type establecido en USER_LOGIN o USER_CHANGE_PERMISSIONS, y que principal.user.userid esté propagado.

Referencia de métodos de autenticación

Los feeds de webhook de Google SecOps aceptan la clave de API y la clave secreta como encabezados HTTP o como parámetros de consulta de URL. En esta guía, se usa el método de encabezados porque sn_ws.RESTMessageV2 admite encabezados personalizados, lo que mantiene las credenciales fuera de las URLs y los registros de acceso al servidor.

Encabezados que se usan en esta guía:

  • X-goog-api-key: Es la clave de la Google Cloud API de Google SecOps.
  • X-Webhook-Access-Key: Es la clave secreta del feed que genera Google SecOps.

Si una integración no puede enviar encabezados personalizados, agrega las credenciales a la URL del endpoint:

<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>

Límites y prácticas recomendadas para los Webhooks

Límite Valor
Tamaño máximo de la solicitud 4 MB
QPS máx. (consultas por segundo) 15,000
Tiempo de espera de la solicitud 30 segundos
Comportamiento de reintento Automática con retirada exponencial

Para controlar el volumen, envía solo los eventos de seguridad que requieren tus detecciones y agrupa varios eventos por solicitud con el delimitador de división \n cuando la fuente produce eventos en ráfagas.

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 registro Asignación de UDM Lógica
event extensions.auth.type Asignado: "Failed Login", "SNC Login", "Admin Login", "Impersonation"MACHINE
event_created metadata.event_timestamp Se analizó como yyyy-MM-dd HH:mm:ss
event_type metadata.event_type Se cambió el nombre o se asignó
event metadata.product_event_type Se asigna cuando event != ""
ip_address principal.ip Combinado
user principal.user.userid Se asigna cuando user != ""
created_by target.user.userid Se asigna cuando created_by != ""
snc_user target.user.userid Se asigna cuando snc_user != ""
timestamp event1.idm.read_only_udm.metadata.event_timestamp Se asignó desde el registro de cambios
data.sys_id event1.idm.read_only_udm.metadata.product_log_id Se asignó desde el registro de cambios
data.message_data event1.idm.read_only_udm.metadata.description Se asignó desde el registro de cambios
data.source event1.idm.read_only_udm.principal.resource.name Se asignó desde el registro de cambios
source event1.idm.read_only_udm.additional.fields Se asignó desde el registro de cambios
data.sys_created_on event1.idm.read_only_udm.metadata.collected_timestamp Se asignó desde el registro de cambios
data.sys_created_by event1.idm.read_only_udm.principal.user.userid Se asignó desde el registro de cambios
data.user event1.idm.read_only_udm.principal.user.userid Se asignó desde el registro de cambios
source_instance event1.idm.read_only_udm.principal.namespace Se asignó desde el registro de cambios
data.role event1.idm.read_only_udm.target.resource.attribute.roles Se asignó desde el registro de cambios
data.granted_by event1.idm.read_only_udm.target.user.userid Se asignó desde el registro de cambios
data.level event1.idm.read_only_udm.security_result.severity Se asignó desde el registro de cambios
data.state event1.idm.read_only_udm.security_result.action_details Se asignó desde el registro de cambios

Registro de cambios

Consulta el registro de cambios de este analizador

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.