ServiceNow-Sicherheitslogs erfassen

Unterstützt in:

In diesem Dokument wird beschrieben, wie Sie ServiceNow-Sicherheitsereignisse über einen Webhook-Feed an Google Security Operations senden. Der ServiceNow Security-Parser ist für Sicherheitsereignisse des ServiceNow Instance Security Center konzipiert, z. B. fehlgeschlagene Logins, SNC-Logins, Administrator-Logins, Identitätsdiebstahl und Sicherheitserhöhung (siehe ServiceNow Instance Security Center-Sicherheitsereignisse). Bei einer ServiceNow-Integration wird jedes Ereignis als JSON an einen Google SecOps-Webhook-Endpunkt gesendet, wo es vom Parser in das einheitliche Datenmodell (Unified Data Model, UDM) normalisiert wird.

Der Parser erkennt fünf Ereigniswerte: Failed Login, Admin Login, SNC Login, Impersonation und Security Elevation. Jeder Wert entspricht einem registrierten ServiceNow-Ereignis in der Warteschlange sysevent. In diesem Dokument wird ein Webhook-Feed, ein Script Include, das POST-Anfragen an den Feed sendet, und vier Script Actions erstellt, die für die übereinstimmenden sysevent-Datensätze ausgelöst werden und das Script Include aufrufen.

Nach dieser einmaligen Einrichtung leitet ServiceNow jedes neue Sicherheitsereignis automatisch an Google SecOps weiter. Es sind keine weiteren Maßnahmen des Administrators erforderlich.

Hinweis

Prüfen Sie, ob die folgenden Voraussetzungen erfüllt sind:

  • Eine Google SecOps-Instanz.
  • Eine ServiceNow-Instanz mit einem Nutzerkonto mit der Rolle admin oder Berechtigungen für System Definition > Script Includes, System Properties, System Policy > Events > Script Actions und Registry.
  • Eine vorhandene Aktivierung von ServiceNow Instance Security Center. ISC ist nicht mehr im Angebot und kann nicht auf neuen Instanzen aktiviert werden.
  • Privilegierter Zugriff auf die Google Google Cloud -Konsole (zum Erstellen von API-Schlüsseln).

Webhook-Feed in Google SecOps erstellen

In den folgenden Abschnitten wird beschrieben, wie Sie einen Webhook-Feed in Google SecOps erstellen.

Feed erstellen

  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.
  8. Geben Sie Werte für die folgenden Eingabeparameter an:

    • Trennzeichen für Aufteilung: Geben Sie \n ein, wenn bei der Integration mehr als ein JSON-Ereignis pro Anfrage gesendet wird. Lassen Sie das Feld leer, wenn jede Anfrage ein einzelnes Ereignis enthält.
    • Asset-Namespace: der Asset-Namespace.
    • Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet wird.
  9. Klicken Sie auf Weiter.

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

Secret-Schlüssel generieren und speichern

  1. Klicken Sie auf der Feed-Detailseite auf Secret Key generieren.
  2. Kopieren und speichern Sie den geheimen Schlüssel an einem sicheren Ort.

Feed-Endpunkt-URL abrufen

  1. Rufen Sie den Tab Details des Feeds auf.
  2. Kopieren Sie im Abschnitt Endpoint Information (Endpunktinformationen) die Feed endpoint URL (Feed-Endpunkt-URL). Das URL-Format lautet:

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

    oder für einen regionalen Endpunkt:

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  3. Speichern Sie diese URL für einen späteren Schritt.

  4. Klicken Sie auf Fertig.

Google Cloud API-Schlüssel erstellen

  1. Rufen Sie die Seite „Anmeldedaten“ in der Google Google Cloud Console auf.
  2. Wählen Sie das Projekt aus, das mit Ihrer Google SecOps-Instanz verknüpft ist.
  3. Klicken Sie auf Anmeldedaten erstellen > API-Schlüssel.
  4. Klicken Sie auf API-Schlüssel bearbeiten, um den Schlüssel einzuschränken.
  5. Geben Sie im Feld Name einen aussagekräftigen Namen ein, z. B. ServiceNow Webhook API Key.
  6. Gehen Sie unter API-Einschränkungen so vor:

    1. Wählen Sie Schlüssel einschränken aus.
    2. Wählen Sie in der Liste APIs auswählen die Option Google SecOps API aus.
  7. Klicken Sie auf Speichern.

  8. Kopieren Sie den API-Schlüssel und speichern Sie ihn an einem sicheren Ort.

Google SecOps-Anmeldedaten in ServiceNow speichern

Speichern Sie die Endpunkt-URL und die Anmeldedaten als ServiceNow-Systemeigenschaften, damit der Integrationscode keine Secrets enthält.

  1. Rufen Sie in ServiceNow System Properties > sys_properties.list auf.
  2. Klicken Sie auf Neu und geben Sie die folgenden Konfigurationsdetails an:

    • Name: x_chronicle.endpoint_url
    • Wert: Fügen Sie die Feed-Endpunkt-URL ein.
    • Typ: string
  3. Klicken Sie auf Senden.

  4. Klicken Sie auf Neu und geben Sie die folgenden Konfigurationsdetails an:

    • Name: x_chronicle.api_key
    • Wert: Fügen Sie den Google Cloud API-Schlüssel ein.
    • Typ: password2
  5. Klicken Sie auf Senden.

  6. Klicken Sie auf Neu und geben Sie die folgenden Konfigurationsdetails an:

    • Name: x_chronicle.secret_key
    • Value (Wert): Fügen Sie den geheimen Schlüssel des Google SecOps-Feeds ein.
    • Typ: password2
  7. Klicken Sie auf Senden.

Script Include für das Webhook-Dienstprogramm erstellen

Dieses Script Include sendet eine JSON-Nutzlast an den Google SecOps-Webhook-Endpunkt. Dazu wird die ServiceNow-API sn_ws.RESTMessageV2 verwendet. Der API-Schlüssel und der geheime Schlüssel werden als HTTP-Header gesendet.

  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: Nicht aktiviert
    • Aktiv: Aktiviert
  4. Geben Sie im Feld Script den folgenden Code ein:

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

Ereignisregistrierung überprüfen

Eine Script-Aktion wird nur ausgelöst, wenn ihr Ereignisname in der Ereignisregistrierung (Tabelle sysevent_register) vorhanden ist. ServiceNow stellt die fünf Ereignisse, die von dieser Integration verwendet werden, standardmäßig bereit. Es ist jedoch ratsam, dies zu bestätigen, da ein fehlender Eintrag keinen Fehler erzeugt und die Script Action nie ausgeführt wird.

  1. Gehen Sie in ServiceNow zu System Policy > Events > Registry (sysevent_register.list).
  2. Filtern Sie die Spalte Ereignisname nach jedem der folgenden Einträge und prüfen Sie, ob ein Datensatz vorhanden ist:

    • login
    • login.failed
    • impersonation.start
    • security.elevated_role.enabled
  3. Wenn ein Eintrag fehlt, klicken Sie auf Neu, legen Sie das Feld Ereignisname auf den fehlenden Wert fest, legen Sie Tabelle auf Global [global] fest und klicken Sie auf Senden.

Script-Aktionen erstellen

Jede Script Action abonniert einen ServiceNow-Ereignisnamen. Wenn ServiceNow einen übereinstimmenden Datensatz in die Warteschlange sysevent einfügt, wird die Script Action ausgeführt, die Ereignisparameter werden gelesen und ChronicleWebhookUtil wird aufgerufen, um die Nutzlast zu POSTen.

Der Parser wird den folgenden ServiceNow-Ereignissen zugeordnet:

Parserwert event ServiceNow-Ereignisname Trigger
Failed Login login.failed Fehlgeschlagener Anmeldeversuch (unabhängig von der Authentifizierungsmethode).
Admin Login login Erfolgreiche Anmeldung eines Nutzers mit der Rolle admin.
SNC Login login Erfolgreiche Anmeldung eines Nutzers mit der Rolle snc_external.
Impersonation impersonation.start Ein Administrator nimmt die Identität eines anderen Nutzers an.
Security Elevation security.elevated_role.enabled Ein Nutzer wird auf die Rolle security_admin oder eine andere Rolle mit hohen Berechtigungen hochgestuft.

In login und login.failed wird parm1 auf den Nutzernamen und parm2 auf die Quell-IP festgelegt. Die anderen Ereignisse folgen derselben Konvention parm1/parm2, der genaue Inhalt hängt jedoch von Ihrer ServiceNow-Version ab. Öffnen Sie den Registrierungseintrag für jedes Ereignis und prüfen Sie, ob die Beschreibung unter Parameter mit dem später beschriebenen Script übereinstimmt. Passen Sie die Verweise auf parm1 oder parm2 an, wenn sich Ihre Registry unterscheidet.

Script-Aktion für fehlgeschlagene Anmeldungen erstellen

  1. Rufen Sie Systemrichtlinie > Ereignisse > Script-Aktionen auf.
  2. Klicken Sie auf Neu.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    • Name: Chronicle - Failed Login
    • Name des Ereignisses: login.failed
    • Aktiv: Aktiviert
  4. Geben Sie im Feld Script den folgenden Code ein:

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

Anmeldeskript-Aktion erstellen

Diese Script-Aktion wird bei jeder erfolgreichen Anmeldung ausgelöst und der Datensatz wird nur weitergeleitet, wenn der angemeldete Nutzer die Rolle admin oder snc_external hat. Das Feld event ist entsprechend festgelegt.

  1. Rufen Sie Systemrichtlinie > Ereignisse > Script-Aktionen auf.
  2. Klicken Sie auf Neu.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    • Name: Chronicle - Login
    • Name des Ereignisses: login
    • Aktiv: Aktiviert
  4. Geben Sie im Feld Script den folgenden Code ein:

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

Aktion für die Identitätsübernahme erstellen

  1. Rufen Sie Systemrichtlinie > Ereignisse > Script-Aktionen auf.
  2. Klicken Sie auf Neu.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    • Name: Chronicle - Impersonation
    • Name des Ereignisses: impersonation.start
    • Aktiv: Aktiviert
  4. Geben Sie im Feld Script den folgenden Code ein:

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

Sicherheitserhöhungsskript-Aktion erstellen

  1. Rufen Sie Systemrichtlinie > Ereignisse > Script-Aktionen auf.
  2. Klicken Sie auf Neu.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    • Name: Chronicle - Security Elevation
    • Name des Ereignisses: security.elevated_role.enabled
    • Aktiv: Aktiviert
  4. Geben Sie im Feld Script den folgenden Code ein:

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

Integration prüfen

Verwenden Sie eine der folgenden Methoden.

Mit einem synthetischen Ereignis überprüfen

Wenn Sie jede Script Action sofort testen möchten, ohne auf ein echtes Sicherheitsereignis zu warten, können Sie das Ereignis über ein Hintergrundskript in die Warteschlange stellen:

  1. Rufen Sie in ServiceNow System Definition > Scripts – Background auf.
  2. Geben Sie im Feld Skript ausführen eine der folgenden Zeilen ein und klicken Sie auf Skript ausführen:

    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. Warten Sie bis zu einer Minute, bis der Event Manager-Job die Warteschlange verarbeitet hat.

Mit einem realen Ereignis bestätigen

Erstellen Sie eines der folgenden zugeordneten Sicherheitsereignisse in ServiceNow, um die Integration zu überprüfen:

  • Fehlgeschlagene Anmeldung: Öffnen Sie /login.do in einem privaten Browserfenster und geben Sie ein ungültiges Passwort ein.
  • Administratoranmeldung: Melden Sie sich mit einem Nutzer mit der Rolle admin über eine IP-Adresse an, die sich von Ihrer üblichen IP-Adresse unterscheidet.
  • Identitätsübernahme: Ein Administrator kann die Identität eines anderen Nutzers übernehmen.
  • Sicherheitserhöhung: Erhöhen Sie die Rolle eines Nutzers mit der Rolle admin auf die Rolle security_admin.

Weiterleitung bestätigen

  1. Rufen Sie in ServiceNow System Policy > Events > Event Log (sysevent.list) auf und prüfen Sie, ob ein Datensatz mit dem entsprechenden Ereignisnamen angezeigt wird.
  2. Rufen Sie in ServiceNow System Logs > System Log > All auf und prüfen Sie, ob eine [Chronicle] Event sent: ...-Informationsmeldung mit dem Status 200, 201 oder 204 angezeigt wird. Eine Meldung vom Typ [Chronicle] Failed to send event oder [Chronicle] Exception sending event weist auf ein Problem mit Anmeldedaten oder der Verbindung hin.
  3. Führen Sie in Google SecOps eine UDM-Suche nach metadata.vendor_name = "SERVICENOW" und metadata.product_name = "SERVICENOW_SECURITY" aus.
  4. Prüfen Sie, ob das Ereignis mit metadata.event_type auf USER_LOGIN oder USER_CHANGE_PERMISSIONS festgelegt ist und ob principal.user.userid ausgefüllt ist.

Referenz zu Authentifizierungsmethoden

Google SecOps-Webhook-Feeds akzeptieren den API-Schlüssel und den geheimen Schlüssel entweder als HTTP-Header oder als URL-Abfrageparameter. In diesem Leitfaden wird die Methode mit Headern verwendet, da sn_ws.RESTMessageV2 benutzerdefinierte Header unterstützt. So werden Anmeldedaten aus URLs und Serverzugriffsprotokollen herausgehalten.

In diesem Leitfaden verwendete Überschriften:

  • X-goog-api-key: Der Google Cloud API-Schlüssel für die Google SecOps API.
  • X-Webhook-Access-Key: Der von Google SecOps generierte Feed-Secret-Schlüssel.

Wenn eine Integration keine benutzerdefinierten Headern senden kann, hängen Sie die Anmeldedaten stattdessen an die Endpunkt-URL an:

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

Webhook-Limits und Best Practices

Limit Wert
Maximale Anfragengröße 4 MB
Maximale Abfragen pro Sekunde 15.000
Zeitlimit für Anfragen 30 Sekunden
Wiederholungsverhalten Automatisch mit exponentiellem Backoff

Wenn Sie das Volumen steuern möchten, senden Sie nur die Sicherheitsereignisse, die für Ihre Erkennungen erforderlich sind, und fassen Sie mehrere Ereignisse pro Anfrage mit dem Trennzeichen \n zusammen, wenn die Quelle Ereignisse in Bursts erzeugt.

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

Logfeld UDM-Zuordnung Logik
event extensions.auth.type Zugeordnet: "Failed Login", "SNC Login", "Admin Login", "Impersonation" → MACHINE
event_created metadata.event_timestamp Geparst als yyyy-MM-dd HH:mm:ss
event_type metadata.event_type Umbenannt/zugeordnet
event metadata.product_event_type Wird zugeordnet, wenn event != ``
ip_address principal.ip Zusammengeführt
user principal.user.userid Wird zugeordnet, wenn user != ``
created_by target.user.userid Wird zugeordnet, wenn created_by != ``
snc_user target.user.userid Wird zugeordnet, wenn snc_user != ``
timestamp event1.idm.read_only_udm.metadata.event_timestamp Aus dem Änderungsprotokoll zugeordnet
data.sys_id event1.idm.read_only_udm.metadata.product_log_id Aus dem Änderungsprotokoll zugeordnet
data.message_data event1.idm.read_only_udm.metadata.description Aus dem Änderungsprotokoll zugeordnet
data.source event1.idm.read_only_udm.principal.resource.name Aus dem Änderungsprotokoll zugeordnet
source event1.idm.read_only_udm.additional.fields Aus dem Änderungsprotokoll zugeordnet
data.sys_created_on event1.idm.read_only_udm.metadata.collected_timestamp Aus dem Änderungsprotokoll zugeordnet
data.sys_created_by event1.idm.read_only_udm.principal.user.userid Aus dem Änderungsprotokoll zugeordnet
data.user event1.idm.read_only_udm.principal.user.userid Aus dem Änderungsprotokoll zugeordnet
source_instance event1.idm.read_only_udm.principal.namespace Aus dem Änderungsprotokoll zugeordnet
data.role event1.idm.read_only_udm.target.resource.attribute.roles Aus dem Änderungsprotokoll zugeordnet
data.granted_by event1.idm.read_only_udm.target.user.userid Aus dem Änderungsprotokoll zugeordnet
data.level event1.idm.read_only_udm.security_result.severity Aus dem Änderungsprotokoll zugeordnet
data.state event1.idm.read_only_udm.security_result.action_details Aus dem Änderungsprotokoll zugeordnet

Änderungsprotokoll

Änderungsprotokoll für diesen Parser ansehen

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