Raccogliere i log di sicurezza di ServiceNow

Supportato in:

Questo documento spiega come esportare gli eventi di sicurezza di ServiceNow in Google Security Operations utilizzando i webhook in uscita configurati tramite le regole aziendali. Un'etichetta di importazione identifica il parser che normalizza i dati di log non elaborati in formato UDM strutturato.

Architettura di integrazione

  • Questa integrazione utilizza le regole aziendali di ServiceNow per inviare gli eventi di sicurezza a Google SecOps in tempo reale:

    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)
    

Caratteristiche dell'integrazione:

  • Push basato su eventi: eventi inviati immediatamente dopo la creazione o l'aggiornamento
  • In tempo reale: bassa latenza (secondi)
  • Esportazione selettiva: configura le tabelle e gli eventi da esportare
  • Nessuna esportazione collettiva: non invia dati storici

Prima di iniziare

Assicurati di soddisfare i seguenti prerequisiti:

  • Un'istanza Google SecOps
  • Un'istanza ServiceNow con il plug-in Security Incident Response (SIR) installato
  • Un account utente ServiceNow con i seguenti ruoli:
    • admin o sn_si.admin (per creare regole aziendali)
    • Accesso a System Definition (Definizione di sistema) > Business Rules (Regole aziendali)
    • Accesso a System Definition > Script Includes
  • Accesso con privilegi alla console Google Google Cloud (per la creazione della chiave API)

Tabelle di ServiceNow Security per l'esportazione

Le seguenti tabelle contengono dati pertinenti alla sicurezza per l'analisi SIEM:

Tabella Nome API Descrizione Priorità
Incidente di sicurezza sn_si_incident Incidenti di sicurezza, indagini ALTA
Osservabile sn_si_observable Indicatori di compromissione: indirizzi IP, domini, hash di file ALTA
Log di sistema syslog Eventi di autenticazione, errori di accesso MEDIUM
Controlla sys_audit Modifiche a livello di campo, modifiche alle autorizzazioni MEDIUM
Assegnazione dei ruoli utente sys_user_has_role Concessioni/revoche di ruoli BASSA
Risultato sulla sicurezza sn_si_finding Rilevamenti e risultati di sicurezza BASSA

Questa guida fornisce esempi di regole aziendali per le tabelle con priorità ALTA. Puoi estendere l'integrazione ad altre tabelle utilizzando lo stesso pattern.

Configura un feed in Google SecOps per importare gli eventi di sicurezza di ServiceNow

Configurare il feed webhook

  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.

Configurare i parametri del feed

  1. Specifica i valori per i seguenti parametri di input:

    • Delimitatore di divisione: inserisci \n per separare le righe di log.
    • Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
    • Etichette di importazione: etichette applicate a tutti gli eventi di questo feed.
  2. Fai clic su Avanti.

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

Genera la chiave segreta e recupera l'URL dell'endpoint

  1. Fai clic su Genera chiave segreta per generare una chiave segreta per autenticare questo feed.
  2. Copia e salva la chiave segreta in un luogo sicuro.

  3. Vai alla scheda Dettagli.

  4. Copia l'URL dell'endpoint del feed dal campo Endpoint Information (Informazioni sull'endpoint).

    • Esempio di URL dell'endpoint: https://malachiteingestion-pa.googleapis.com/v2/unstructured/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/logTypes/SERVICENOW_SECURITY:import
  5. Fai clic su Fine.

Crea chiave API per l'autenticazione

  1. Vai alla pagina Credenziali della consoleGoogle Cloud .
  2. Fai clic su Crea credenziali e poi seleziona Chiave API.
  3. Fai clic su Limita chiave.
  4. In Limitazioni API:
    • Seleziona Limita chiave.
    • Seleziona API Google SecOps (API Chronicle).
  5. Fai clic su Salva.
  6. Copia la chiave API e salvala in una posizione sicura.

Configurare le credenziali di integrazione di ServiceNow

Archivia le credenziali di Google SecOps come proprietà di sistema ServiceNow per un accesso sicuro.

  1. In ServiceNow, vai a System Properties > sys_properties.list.
  2. Fai clic su New (Nuovo).
  3. Crea la prima proprietà:
    • Nome: x_chronicle.endpoint_url
    • Valore: incolla l'URL dell'endpoint del feed del passaggio precedente.
    • Tipo: string
  4. Fai clic su Invia.
  5. Fai clic su Nuovo per creare la seconda proprietà:
    • Nome: x_chronicle.api_key
    • Valore: incolla la chiave API Google Cloud
    • Tipo: password (questo valore viene criptato)
  6. Fai clic su Invia.
  7. Fai clic su Nuovo per creare la terza proprietà:
    • Nome: x_chronicle.secret_key
    • Valore: incolla la chiave segreta del feed Google SecOps
    • Tipo: password (questo valore viene criptato)
  8. Fai clic su Invia.

Crea un'inclusione script di utilità webhook riutilizzabile

Questo Script Include fornisce una funzione riutilizzabile per l'invio di eventi a Google SecOps da qualsiasi regola aziendale.

  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: selezionata
  4. Nel campo Script, inserisci il seguente codice:

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

Crea regole aziendali per l'esportazione di eventi

Le regole aziendali vengono attivate automaticamente quando i record vengono creati o aggiornati nelle tabelle ServiceNow. Crea una regola aziendale per ogni tabella che vuoi esportare in Google SecOps.

Regola aziendale: incidenti di sicurezza

Questa regola aziendale esporta gli eventi degli incidenti di sicurezza in Google SecOps.

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

    Quando eseguire:

    Campo Valore
    Nome Chronicle - Export Security Incident
    Tabella Security Incident [sn_si_incident]
    Attivo Selezionata
    Avanzata Selezionata
    Quando after
    Inserisci Selezionata
    Aggiorna Selezionata
    Elimina (Facoltativo) Seleziona questa opzione per monitorare le eliminazioni.
    Ordine 100
  4. Fai clic sulla scheda Avanzate, vai al campo Script e inserisci il seguente codice:

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

Regola aziendale: indicatori osservabili (IOC)

Questa regola aziendale esporta i dati osservabili (indirizzi IP, domini, hash dei file) in Google SecOps.

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

    Campo Valore
    Nome Chronicle - Export Observable
    Tabella Observable [sn_si_observable]
    Attivo Selezionata
    Avanzata Selezionata
    Quando after
    Inserisci Selezionata
    Aggiorna Selezionata
    Ordine 100
  4. Fai clic sulla scheda Avanzate, vai al campo Script e inserisci il seguente codice:

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

Regola aziendale: eventi di accesso al sistema

Questa regola aziendale esporta gli eventi di autenticazione e accesso in Google SecOps.

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

    Campo Valore
    Nome Chronicle - Export System Log
    Tabella System Log [syslog]
    Attivo Selezionata
    Avanzata Selezionata
    Quando after
    Inserisci Selezionata
    Ordine 100
    Condizione current.level == "error" || current.source.indexOf("login") != -1
  4. Fai clic sulla scheda Avanzate, vai al campo Script e inserisci il seguente codice:

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

Regola aziendale: audit trail (modifiche alle autorizzazioni)

Questa regola aziendale esporta le modifiche a livello di campo a scopo di audit trail.

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

    Campo Valore
    Nome Chronicle - Export Audit Changes
    Tabella Audit [sys_audit]
    Attivo Selezionata
    Avanzata Selezionata
    Quando after
    Inserisci Selezionata
    Ordine 100
    Condizione Vedi lo script seguente

    Condizione (filtra solo le modifiche critiche):

    ```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. Fai clic sulla scheda Avanzate, vai al campo Script e inserisci il seguente codice:

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

(Facoltativo) Tabelle aggiuntive per l'esportazione

Modifiche all'assegnazione dei ruoli utente

Esporta le concessioni e le revoche dei ruoli per il controllo della sicurezza.

  • Crea una regola aziendale nella tabella 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);
    

Risultati sulla sicurezza

Esporta i rilevamenti e i risultati di sicurezza.

  • Crea una regola aziendale nella tabella 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);
    

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

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

Tabella di mappatura UDM

Campo ServiceNow Mappatura UDM Logic
number metadata.product_event_type Numero dell'incidente o dell'evento
short_description security_result.summary Breve descrizione dell'evento di sicurezza
severity security_result.severity Livello di gravità dell'evento
priority security_result.priority Priorità dell'evento
caller principal.user.userid Utente che ha segnalato o attivato l'evento
affected_user target.user.userid Utente interessato dall'evento di sicurezza
assigned_to security_result.action_details Analista assegnato all'incidente
sys_created_on metadata.event_timestamp Timestamp della creazione dell'evento
value (osservabile) network.ip o network.dns.questions.name Valore osservabile (IP, dominio, hash)
type (osservabile) security_result.detection_fields.value Tipo di osservabile (indirizzo IP, dominio, hash del file)

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