Raccogliere i log di sicurezza di ServiceNow

Supportato in:

Questo documento spiega come inviare eventi di sicurezza di ServiceNow a Google Security Operations utilizzando un feed webhook. Il parser di ServiceNow Security è progettato per gli eventi di sicurezza di ServiceNow Instance Security Center, come accessi non riusciti, accessi SNC, accessi amministratore, rappresentazione e aumento dei privilegi di sicurezza (vedi Eventi di sicurezza di ServiceNow Instance Security Center). Un'integrazione ServiceNow pubblica ogni evento in formato JSON in un endpoint webhook di Google SecOps, dove il parser lo normalizza nel modello UDM (Unified Data Model).

Il parser riconosce cinque valori di evento: Failed Login, Admin Login, SNC Login, Impersonation e Security Elevation. Ogni valore corrisponde a un evento ServiceNow registrato nella coda sysevent. Questo documento crea un feed webhook, un'inclusione script che esegue il POST nel feed e quattro azioni script che vengono attivate sui record sysevent corrispondenti e chiamano l'inclusione script.

Dopo questa configurazione una tantum, ServiceNow inoltra automaticamente ogni nuovo evento di sicurezza a Google SecOps. Non sono necessarie ulteriori azioni da parte dell'amministratore.

Prima di iniziare

Assicurati di soddisfare i seguenti prerequisiti:

  • Un'istanza Google SecOps.
  • Un'istanza ServiceNow con un account utente con il ruolo admin o diritti per System Definition (Definizione di sistema) > Script Includes (Includi script), System Properties (Proprietà di sistema) e System Policy (Policy di sistema) > Events (Eventi) > Script Actions (Azioni script) e Registry (Registro).
  • Un'attivazione esistente di ServiceNow Instance Security Center. ISC è in fase di fine vendita e non può essere attivato su nuove istanze.
  • Accesso con privilegi alla console Google Google Cloud (per la creazione della chiave API).

Crea un feed webhook in Google SecOps

Le sezioni seguenti descrivono come creare un feed webhook in Google SecOps.

Creare il feed

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo feed.
  3. Nella pagina successiva, fai clic su Configura un singolo feed.
  4. Nel campo Nome feed, inserisci un nome per il feed (ad esempio, ServiceNow Security Events).
  5. Seleziona Webhook come Tipo di origine.
  6. Seleziona ServiceNow Security come Tipo di log.
  7. Fai clic su Avanti.
  8. Specifica i valori per i seguenti parametri di input:

    • Delimitatore di divisione: inserisci \n quando l'integrazione invia più di un evento JSON per richiesta. Lascia vuoto se ogni richiesta contiene un singolo evento.
    • Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
    • Etichette di importazione: l'etichetta applicata agli eventi di questo feed.
  9. Fai clic su Avanti.

  10. Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.

Genera e salva la chiave segreta

  1. Nella pagina dei dettagli del feed, fai clic su Genera chiave segreta.
  2. Copia e salva la chiave segreta in un luogo sicuro.

Recuperare l'URL dell'endpoint del feed

  1. Vai alla scheda Dettagli del feed.
  2. Nella sezione Endpoint Information (Informazioni sull'endpoint), copia l'URL dell'endpoint del feed. Il formato dell'URL è:

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

    oppure, per un endpoint regionale:

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  3. Salva questo URL per un passaggio successivo.

  4. Fai clic su Fine.

Crea una chiave API Google Cloud

  1. Vai alla pagina Credenziali della console Google Google Cloud .
  2. Seleziona il progetto associato alla tua istanza di Google SecOps.
  3. Fai clic su Crea credenziali > Chiave API.
  4. Fai clic su Modifica chiave API per limitare la chiave.
  5. Nel campo Nome, inserisci un nome descrittivo (ad esempio, ServiceNow Webhook API Key).
  6. Nella sezione Restrizioni delle API:

    1. Seleziona Limita chiave.
    2. Nell'elenco Seleziona API, seleziona API Google SecOps.
  7. Fai clic su Salva.

  8. Copia la chiave API e salvala in una posizione sicura.

Archiviare le credenziali di Google SecOps in ServiceNow

Archivia l'URL e le credenziali dell'endpoint come proprietà di sistema ServiceNow in modo che il codice di integrazione non contenga segreti.

  1. In ServiceNow, vai a System Properties > sys_properties.list.
  2. Fai clic su Nuovo e fornisci i seguenti dettagli di configurazione:

    • Nome: x_chronicle.endpoint_url
    • Valore: incolla l'URL dell'endpoint del feed.
    • Tipo: string
  3. Fai clic su Invia.

  4. Fai clic su Nuovo e fornisci i seguenti dettagli di configurazione:

    • Nome: x_chronicle.api_key
    • Valore: incolla la chiave API. Google Cloud
    • Tipo: password2
  5. Fai clic su Invia.

  6. Fai clic su Nuovo e fornisci i seguenti dettagli di configurazione:

    • Nome: x_chronicle.secret_key
    • Valore: incolla la chiave segreta del feed Google SecOps.
    • Tipo: password2
  7. Fai clic su Invia.

Crea l'inclusione script dell'utilità webhook

Questo Script Include pubblica un payload JSON nell'endpoint webhook di Google SecOps utilizzando l'API con ambito ServiceNow sn_ws.RESTMessageV2. La chiave API e la chiave segreta vengono inviate come intestazioni HTTP.

  1. Vai a Definizione di sistema > Includi script.
  2. Fai clic su New (Nuovo).
  3. Fornisci i seguenti dettagli di configurazione:

    • Nome: ChronicleWebhookUtil
    • Nome API: ChronicleWebhookUtil
    • Client callable (Richiamabile dal client): non selezionato
    • Attivo: selezionato
  4. Nel campo Script, inserisci il seguente codice:

    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. Fai clic su Invia.

Verificare il registro eventi

Un'azione script viene attivata solo quando il nome dell'evento esiste nel Registro eventi (tabella sysevent_register). ServiceNow fornisce i cinque eventi utilizzati da questa integrazione, ma vale la pena confermarlo perché una voce mancante non produce alcun errore e l'azione script non viene mai eseguita.

  1. In ServiceNow, vai a System Policy > Events > Registry (sysevent_register.list).
  2. Filtra la colonna Nome evento per ciascuna delle seguenti voci e verifica che esista un record:

    • login
    • login.failed
    • impersonation.start
    • security.elevated_role.enabled
  3. Se manca una voce, fai clic su Nuovo, imposta il campo Nome evento sul valore mancante, imposta Tabella su Global [global] e fai clic su Invia.

Crea le azioni dello script

Ogni azione dello script si iscrive a un nome evento ServiceNow. Quando ServiceNow inserisce un record corrispondente nella coda sysevent, viene eseguita l'azione script, vengono letti i parametri evento e viene chiamato ChronicleWebhookUtil per pubblicare il payload.

Il parser esegue il mapping dei seguenti eventi ServiceNow:

Valore event del parser Nome evento ServiceNow Trigger
Failed Login login.failed Tentativo di accesso non riuscito (qualsiasi metodo di autenticazione).
Admin Login login Accesso riuscito da parte di un utente con il ruolo admin.
SNC Login login Accesso riuscito da parte di un utente con il ruolo snc_external.
Impersonation impersonation.start Un amministratore inizia a utilizzare l'identità di un altro utente.
Security Elevation security.elevated_role.enabled Un utente esegue l'upgrade a security_admin o a un altro ruolo con privilegi elevati.

login e login.failed impostano parm1 sul nome utente e parm2 sull'IP di origine. Gli altri eventi seguono la stessa convenzione parm1/parm2, ma i contenuti esatti dipendono dalla versione di ServiceNow. Apri la voce del registro per ogni evento e verifica che la descrizione Parameters corrisponda allo script descritto in seguito. Modifica i riferimenti parm1 o parm2 se il registry è diverso.

Crea l'azione dello script di accesso non riuscito

  1. Vai a Norme di sistema > Eventi > Azioni script.
  2. Fai clic su New (Nuovo).
  3. Fornisci i seguenti dettagli di configurazione:

    • Nome: Chronicle - Failed Login
    • Nome evento: login.failed
    • Attivo: selezionato
  4. Nel campo Script, inserisci il seguente codice:

    (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. Fai clic su Invia.

Crea l'azione dello script di accesso

Questa azione di script viene attivata a ogni accesso riuscito e inoltra il record solo quando l'utente che ha eseguito l'accesso ha il ruolo admin o snc_external. Il campo event è impostato di conseguenza.

  1. Vai a Norme di sistema > Eventi > Azioni script.
  2. Fai clic su New (Nuovo).
  3. Fornisci i seguenti dettagli di configurazione:

    • Nome: Chronicle - Login
    • Nome evento: login
    • Attivo: selezionato
  4. Nel campo Script, inserisci il seguente codice:

    (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. Fai clic su Invia.

Crea l'azione dello script di rappresentazione

  1. Vai a Norme di sistema > Eventi > Azioni script.
  2. Fai clic su New (Nuovo).
  3. Fornisci i seguenti dettagli di configurazione:

    • Nome: Chronicle - Impersonation
    • Nome evento: impersonation.start
    • Attivo: selezionato
  4. Nel campo Script, inserisci il seguente codice:

    (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. Fai clic su Invia.

Crea l'azione dello script di elevazione della sicurezza

  1. Vai a Norme di sistema > Eventi > Azioni script.
  2. Fai clic su New (Nuovo).
  3. Fornisci i seguenti dettagli di configurazione:

    • Nome: Chronicle - Security Elevation
    • Nome evento: security.elevated_role.enabled
    • Attivo: selezionato
  4. Nel campo Script, inserisci il seguente codice:

    (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. Fai clic su Invia.

Verificare l'integrazione

Utilizza uno dei seguenti approcci.

Verificare con un evento sintetico

Per testare immediatamente ogni azione dello script senza attendere un evento di sicurezza reale, esegui le seguenti operazioni per mettere in coda l'evento da uno script in background:

  1. In ServiceNow, vai a System Definition > Scripts - Background.
  2. Nel campo Esegui script, inserisci una delle seguenti righe e fai clic su Esegui script:

    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. Attendi fino a un minuto affinché il job di Event Manager elabori la coda.

Verifica con un evento reale

Produci uno dei seguenti eventi di sicurezza mappati in ServiceNow per verificare l'integrazione:

  • Accesso non riuscito: apri /login.do in una finestra del browser privata e invia una password non valida.
  • Accesso amministratore: accedi con un utente con il ruolo admin da un indirizzo IP diverso da quello che utilizzi di solito.
  • Furto d'identità: da un account amministratore, impersona un altro utente.
  • Elevazione della sicurezza: esegui l'upgrade al ruolo security_admin da un utente con il ruolo admin.

Conferma inoltro

  1. In ServiceNow, vai a System Policy > Events > Event Log (sysevent.list) e verifica che venga visualizzato un record con il nome dell'evento corrispondente.
  2. In ServiceNow, vai a System Logs (Log di sistema) > System Log (Log di sistema) > All (Tutti) e verifica che venga visualizzato un messaggio informativo [Chronicle] Event sent: ... con stato 200, 201 o 204. Un messaggio [Chronicle] Failed to send event o [Chronicle] Exception sending event indica un problema di credenziali o connettività.
  3. In Google SecOps, esegui una ricerca UDM per metadata.vendor_name = "SERVICENOW" e metadata.product_name = "SERVICENOW_SECURITY".
  4. Verifica che l'evento venga visualizzato con metadata.event_type impostato su USER_LOGIN o USER_CHANGE_PERMISSIONS e che principal.user.userid sia compilato.

Riferimento ai metodi di autenticazione

I feed webhook di Google SecOps accettano la chiave API e la chiave segreta come intestazioni HTTP o come parametri di ricerca URL. Questa guida utilizza il metodo delle intestazioni perché sn_ws.RESTMessageV2 supporta le intestazioni personalizzate, il che consente di tenere le credenziali fuori dagli URL e dai log di accesso al server.

Intestazioni utilizzate in questa guida:

  • X-goog-api-key: la Google Cloud chiave API per l'API Google SecOps.
  • X-Webhook-Access-Key: la chiave segreta del feed generata da Google SecOps.

Se un'integrazione non può inviare intestazioni personalizzate, aggiungi le credenziali all'URL dell'endpoint:

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

Limiti e best practice per i webhook

Limite Valore
Dimensioni massime della richiesta 4 MB
QPS max (query al secondo) 15.000
Timeout richieste 30 secondi
Comportamento di ripetizione Automatico con backoff esponenziale

Per controllare il volume, invia solo gli eventi di sicurezza richiesti dai tuoi rilevamenti e raggruppa più eventi per richiesta con il delimitatore di divisione \n quando l'origine produce eventi in burst.

Per ulteriori informazioni sui feed Google SecOps, consulta la documentazione sui feed Google SecOps. Per informazioni sui requisiti per ogni tipo di feed, consulta Configurazione dei feed per tipo.

Se riscontri problemi durante la creazione dei feed, contatta l'assistenza Google SecOps.

Tabella di mappatura UDM

Campo log Mappatura UDM Logica
event extensions.auth.type Mappato: "Failed Login", "SNC Login", "Admin Login", "Impersonation"MACHINE
event_created metadata.event_timestamp Analizzato come yyyy-MM-dd HH:mm:ss
event_type metadata.event_type Rinominate/mappate
event metadata.product_event_type Mappato quando event != ``
ip_address principal.ip Unita
user principal.user.userid Mappato quando user != ``
created_by target.user.userid Mappato quando created_by != ``
snc_user target.user.userid Mappato quando snc_user != ``
timestamp event1.idm.read_only_udm.metadata.event_timestamp Mappato dal log delle modifiche
data.sys_id event1.idm.read_only_udm.metadata.product_log_id Mappato dal log delle modifiche
data.message_data event1.idm.read_only_udm.metadata.description Mappato dal log delle modifiche
data.source event1.idm.read_only_udm.principal.resource.name Mappato dal log delle modifiche
source event1.idm.read_only_udm.additional.fields Mappato dal log delle modifiche
data.sys_created_on event1.idm.read_only_udm.metadata.collected_timestamp Mappato dal log delle modifiche
data.sys_created_by event1.idm.read_only_udm.principal.user.userid Mappato dal log delle modifiche
data.user event1.idm.read_only_udm.principal.user.userid Mappato dal log delle modifiche
source_instance event1.idm.read_only_udm.principal.namespace Mappato dal log delle modifiche
data.role event1.idm.read_only_udm.target.resource.attribute.roles Mappato dal log delle modifiche
data.granted_by event1.idm.read_only_udm.target.user.userid Mappato dal log delle modifiche
data.level event1.idm.read_only_udm.security_result.severity Mappato dal log delle modifiche
data.state event1.idm.read_only_udm.security_result.action_details Mappato dal log delle modifiche

Log delle modifiche

Visualizza il log delle modifiche per questo parser

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.