ServiceNow-Sicherheitslogs erfassen

Unterstützt in:

In diesem Dokument wird beschrieben, wie Sie ServiceNow-Sicherheitsereignisse mit ausgehenden Webhooks, die über Geschäftsregeln konfiguriert werden, in Google Security Operations exportieren. Ein Erfassungslabel identifiziert den Parser, der Rohdaten in das strukturierte UDM-Format normalisiert.

Integrationsarchitektur

  • Bei dieser Integration werden ServiceNow-Geschäftsregeln verwendet, um Sicherheitsereignisse in Echtzeit an Google SecOps zu senden:

    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)
    

Eigenschaften der Integration:

  • Ereignisgesteuerter Push: Ereignisse werden sofort gesendet, wenn sie erstellt oder aktualisiert werden.
  • Echtzeit: niedrige Latenz (Sekunden)
  • Selektiver Export: Konfigurieren Sie, welche Tabellen und Ereignisse exportiert werden sollen.
  • Kein Bulk-Export: Es werden keine Verlaufsdaten gesendet.

Hinweise

Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:

  • Eine Google SecOps-Instanz
  • Eine ServiceNow-Instanz mit installiertem Security Incident Response (SIR)-Plug-in
  • Ein ServiceNow-Nutzerkonto mit den folgenden Rollen:
    • admin oder sn_si.admin (zum Erstellen von Geschäftsregeln)
    • Zugriff auf System Definition > Business Rules (Systemdefinition > Geschäftsregeln)
    • Zugriff auf System Definition> Script Includes
  • Privilegierter Zugriff auf die Google Google Cloud -Konsole (zum Erstellen von API-Schlüsseln)

ServiceNow Security-Tabellen für den Export

Die folgenden Tabellen enthalten sicherheitsrelevante Daten für die SIEM-Analyse:

Tabelle API-Name Beschreibung Priorität
Sicherheitsvorfall sn_si_incident Sicherheitsrelevante Zwischenfälle, Untersuchungen HOCH
Observable sn_si_observable IOCs: IP-Adressen, Domains, Dateihashes HOCH
Systemprotokoll syslog Authentifizierungsereignisse, Anmeldefehler MEDIUM
Audit sys_audit Änderungen auf Feldebene, Berechtigungsänderungen MEDIUM
Nutzerrollenzuweisung sys_user_has_role Rollenzuweisungen/-entzüge NIEDRIG
Sicherheitsergebnis sn_si_finding Sicherheitserkennungen und ‑ergebnisse NIEDRIG

In diesem Leitfaden finden Sie Beispiele für Geschäftsregeln für die Tabellen mit HOHER Priorität. Sie können die Integration mit demselben Muster auf zusätzliche Tabellen ausweiten.

Feed in Google SecOps konfigurieren, um ServiceNow-Sicherheitsereignisse aufzunehmen

Webhook-Feed einrichten

  1. Rufen Sie die SIEM-Einstellungen > Feeds auf.
  2. Klicken Sie auf Neuen Feed hinzufügen.
  3. Klicken Sie auf der nächsten Seite auf Einen einzelnen Feed konfigurieren.
  4. Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. ServiceNow Security Events.
  5. Wählen Sie Webhook als Quelltyp aus.
  6. Wählen Sie ServiceNow Security als Log type (Protokolltyp) aus.
  7. Klicken Sie auf Weiter.

Feedparameter konfigurieren

  1. Geben Sie Werte für die folgenden Eingabeparameter an:

    • Trennzeichen für Aufteilung: Geben Sie \n ein, um Logzeilen zu trennen.
    • Asset-Namespace: Der Asset-Namespace.
    • Aufnahmelabels: Labels, die auf alle Ereignisse aus diesem Feed angewendet werden.
  2. Klicken Sie auf Weiter.

  3. Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.

Secret-Schlüssel generieren und Endpunkt-URL abrufen

  1. Klicken Sie auf Geheimen Schlüssel generieren, um einen geheimen Schlüssel zur Authentifizierung dieses Feeds zu generieren.
  2. Kopieren Sie den geheimen Schlüssel und speichern Sie ihn an einem sicheren Ort.

  3. Wechseln Sie zum Tab Details.

  4. Kopieren Sie die Feed-Endpunkt-URL aus dem Feld Endpoint Information (Endpunktinformationen).

    • Beispiel für eine Endpunkt-URL: https://malachiteingestion-pa.googleapis.com/v2/unstructured/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/logTypes/SERVICENOW_SECURITY:import
  5. Klicken Sie auf Fertig.

API-Schlüssel für die Authentifizierung erstellen

  1. Rufen Sie in der Google Cloud Console die Seite „Anmeldedaten“ auf.
  2. Klicken Sie auf Anmeldedaten erstellen und wählen Sie anschließend API-Schlüssel aus.
  3. Klicken Sie auf Schlüssel einschränken.
  4. Gehen Sie unter API-Einschränkungen so vor:
    • Wählen Sie Schlüssel einschränken aus.
    • Wählen Sie Google SecOps API (Chronicle API) aus.
  5. Klicken Sie auf Speichern.
  6. Kopieren Sie den API-Schlüssel und speichern Sie ihn an einem sicheren Ort.

Anmeldedaten für die ServiceNow-Integration konfigurieren

Speichern Sie die Google SecOps-Anmeldedaten als ServiceNow-Systemeigenschaften für den sicheren Zugriff.

  1. Rufen Sie in ServiceNow System Properties > sys_properties.list auf.
  2. Klicken Sie auf Neu.
  3. Erste Property erstellen:
    • Name: x_chronicle.endpoint_url
    • Wert: Fügen Sie die Feedendpunkt-URL aus dem vorherigen Schritt ein.
    • Typ: string
  4. Klicken Sie auf Senden.
  5. Klicken Sie auf Neu, um die zweite Property zu erstellen:
    • Name: x_chronicle.api_key
    • Wert: Fügen Sie den Google Cloud API-Schlüssel ein.
    • Typ: password (damit wird der Wert verschlüsselt)
  6. Klicken Sie auf Senden.
  7. Klicken Sie auf Neu, um die dritte Property zu erstellen:
    • Name: x_chronicle.secret_key
    • Wert: Fügen Sie den geheimen Schlüssel des Google SecOps-Feeds ein.
    • Typ: password (damit wird der Wert verschlüsselt)
  8. Klicken Sie auf Senden.

Wiederverwendbares Script Include für Webhook-Utility erstellen

Dieses Script Include bietet eine wiederverwendbare Funktion zum Senden von Ereignissen an Google SecOps über eine beliebige Geschäftsregel.

  1. Gehen Sie zu System Definition> Script Includes.
  2. Klicken Sie auf Neu.
  3. Geben Sie die folgenden Konfigurationsdetails an:
    • Name: ChronicleWebhookUtil
    • API-Name: ChronicleWebhookUtil
    • Client callable (Vom Client aufrufbar): Nicht aktiviert
    • Aktiv: Aktiviert
  4. Geben Sie im Feld Skript den folgenden Code ein:

    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. Klicken Sie auf Senden.

Geschäftsregeln für den Ereignisexport erstellen

Geschäftsregeln werden automatisch ausgelöst, wenn Datensätze in ServiceNow-Tabellen erstellt oder aktualisiert werden. Erstellen Sie eine Geschäftsregel für jede Tabelle, die Sie in Google SecOps exportieren möchten.

Geschäftsregel: Sicherheitsvorfälle

Mit dieser Geschäftsregel werden Sicherheitsvorfallereignisse nach Google SecOps exportiert.

  1. Rufen Sie System Definition> Business Rules auf.
  2. Klicken Sie auf Neu.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    Ausführungszeitpunkt:

    Feld Wert
    Name Chronicle - Export Security Incident
    Tabelle Security Incident [sn_si_incident]
    Aktiv Aktiviert
    Erweitert Aktiviert
    Wann after
    Einfügen Aktiviert
    Aktualisieren Aktiviert
    Löschen Optional (Häkchen setzen, um Löschungen zu erfassen)
    Order 100
  4. Klicken Sie auf den Tab Erweitert, rufen Sie das Feld Script auf und geben Sie den folgenden Code ein:

    (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. Klicken Sie auf Senden.

Geschäftsregel: Observables (IOCs)

Mit dieser Geschäftsregel werden beobachtbare Daten (IP-Adressen, Domains, Dateihashes) in Google SecOps exportiert.

  1. Rufen Sie System Definition> Business Rules auf.
  2. Klicken Sie auf Neu.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    Feld Wert
    Name Chronicle - Export Observable
    Tabelle Observable [sn_si_observable]
    Aktiv Aktiviert
    Erweitert Aktiviert
    Wann after
    Einfügen Aktiviert
    Aktualisieren Aktiviert
    Order 100
  4. Klicken Sie auf den Tab Erweitert, rufen Sie das Feld Script auf und geben Sie den folgenden Code ein:

    (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. Klicken Sie auf Senden.

Geschäftsregel: Systemanmeldeereignisse

Mit dieser Geschäftsregel werden Authentifizierungs- und Anmeldeereignisse in Google SecOps exportiert.

  1. Rufen Sie System Definition> Business Rules auf.
  2. Klicken Sie auf Neu.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    Feld Wert
    Name Chronicle - Export System Log
    Tabelle System Log [syslog]
    Aktiv Aktiviert
    Erweitert Aktiviert
    Wann after
    Einfügen Aktiviert
    Order 100
    Bedingung current.level == "error" || current.source.indexOf("login") != -1
  4. Klicken Sie auf den Tab Erweitert, rufen Sie das Feld Script auf und geben Sie den folgenden Code ein:

    (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. Klicken Sie auf Senden.

Geschäftsregel: Audit-Trail (Berechtigungsänderungen)

Mit dieser Geschäftsregel werden Änderungen auf Feldebene für Prüfzwecke exportiert.

  1. Rufen Sie System Definition> Business Rules auf.
  2. Klicken Sie auf Neu.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    Feld Wert
    Name Chronicle - Export Audit Changes
    Tabelle Audit [sys_audit]
    Aktiv Aktiviert
    Erweitert Aktiviert
    Wann after
    Einfügen Aktiviert
    Order 100
    Bedingung Sehen Sie sich das folgende Skript an:

    Bedingung (nur kritische Änderungen filtern):

    ```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. Klicken Sie auf den Tab Erweitert, rufen Sie das Feld Script auf und geben Sie den folgenden Code ein:

    (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. Klicken Sie auf Senden.

Optional: Zusätzliche Tabellen für den Export

Änderungen bei der Zuweisung von Nutzerrollen

Rollenzuweisungen und ‑entziehungen für Sicherheitsprüfungen exportieren

  • Erstellen Sie eine Geschäftsregel für die Tabelle 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);
    

Sicherheitsergebnisse

Sicherheitserkennungen und ‑ergebnisse exportieren

  • Erstellen Sie eine Geschäftsregel für die Tabelle 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);
    

Weitere Informationen zu Google SecOps-Feeds finden Sie in der Dokumentation zu Google SecOps-Feeds. Informationen zu den Anforderungen für die einzelnen Feedtypen finden Sie unter Feedkonfiguration nach Typ.

Wenn beim Erstellen von Feeds Probleme auftreten, wenden Sie sich an den Google SecOps-Support.

UDM-Zuordnungstabelle

ServiceNow-Feld UDM-Zuordnung Logik
number metadata.product_event_type Nummer des Vorfalls oder Ereignisses
short_description security_result.summary Kurze Beschreibung des Sicherheitsereignisses
severity security_result.severity Schweregrad des Ereignisses
priority security_result.priority Ereignispriorität
caller principal.user.userid Nutzer, der das Ereignis gemeldet oder ausgelöst hat
affected_user target.user.userid Nutzer, der von dem Sicherheitsereignis betroffen ist
assigned_to security_result.action_details Dem Vorfall zugewiesener Analyst
sys_created_on metadata.event_timestamp Zeitstempel der Ereigniserstellung
value (beobachtbar) network.ip oder network.dns.questions.name Beobachtbarer Wert (IP, Domain, Hash)
type (beobachtbar) security_result.detection_fields.value Beobachtbarer Typ (IP-Adresse, Domain, Datei-Hash)

Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten