ServiceNow-Sicherheitslogs erfassen
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
adminoder 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
- Rufen Sie die SIEM-Einstellungen > Feeds auf.
- Klicken Sie auf Neuen Feed hinzufügen.
- Klicken Sie auf der nächsten Seite auf Einen einzelnen Feed konfigurieren.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B.
ServiceNow Security Events. - Wählen Sie Webhook als Quelltyp aus.
- Wählen Sie ServiceNow Security als Log type (Protokolltyp) aus.
- Klicken Sie auf Weiter.
Geben Sie Werte für die folgenden Eingabeparameter an:
- Trennzeichen für Aufteilung: Geben Sie
\nein, 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.
- Trennzeichen für Aufteilung: Geben Sie
Klicken Sie auf Weiter.
Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.
Secret-Schlüssel generieren und speichern
- Klicken Sie auf der Feed-Detailseite auf Secret Key generieren.
Kopieren und speichern Sie den geheimen Schlüssel an einem sicheren Ort.
Feed-Endpunkt-URL abrufen
- Rufen Sie den Tab Details des Feeds auf.
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:batchCreateoder für einen regionalen Endpunkt:
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateSpeichern Sie diese URL für einen späteren Schritt.
Klicken Sie auf Fertig.
Google Cloud API-Schlüssel erstellen
- Rufen Sie die Seite „Anmeldedaten“ in der Google Google Cloud Console auf.
- Wählen Sie das Projekt aus, das mit Ihrer Google SecOps-Instanz verknüpft ist.
- Klicken Sie auf Anmeldedaten erstellen > API-Schlüssel.
- Klicken Sie auf API-Schlüssel bearbeiten, um den Schlüssel einzuschränken.
- Geben Sie im Feld Name einen aussagekräftigen Namen ein, z. B.
ServiceNow Webhook API Key. Gehen Sie unter API-Einschränkungen so vor:
- Wählen Sie Schlüssel einschränken aus.
- Wählen Sie in der Liste APIs auswählen die Option Google SecOps API aus.
Klicken Sie auf Speichern.
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.
- Rufen Sie in ServiceNow System Properties > sys_properties.list auf.
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
- Name:
Klicken Sie auf Senden.
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
- Name:
Klicken Sie auf Senden.
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
- Name:
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.
- Gehen Sie zu System Definition> Script Includes.
- Klicken Sie auf Neu.
Geben Sie die folgenden Konfigurationsdetails an:
- Name:
ChronicleWebhookUtil - API-Name:
ChronicleWebhookUtil - Client callable: Nicht aktiviert
- Aktiv: Aktiviert
- Name:
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' };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.
- Gehen Sie in ServiceNow zu System Policy > Events > Registry (
sysevent_register.list). Filtern Sie die Spalte Ereignisname nach jedem der folgenden Einträge und prüfen Sie, ob ein Datensatz vorhanden ist:
loginlogin.failedimpersonation.startsecurity.elevated_role.enabled
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
- Rufen Sie Systemrichtlinie > Ereignisse > Script-Aktionen auf.
- Klicken Sie auf Neu.
Geben Sie die folgenden Konfigurationsdetails an:
- Name:
Chronicle - Failed Login - Name des Ereignisses:
login.failed - Aktiv: Aktiviert
- Name:
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);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.
- Rufen Sie Systemrichtlinie > Ereignisse > Script-Aktionen auf.
- Klicken Sie auf Neu.
Geben Sie die folgenden Konfigurationsdetails an:
- Name:
Chronicle - Login - Name des Ereignisses:
login - Aktiv: Aktiviert
- Name:
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);Klicken Sie auf Senden.
Aktion für die Identitätsübernahme erstellen
- Rufen Sie Systemrichtlinie > Ereignisse > Script-Aktionen auf.
- Klicken Sie auf Neu.
Geben Sie die folgenden Konfigurationsdetails an:
- Name:
Chronicle - Impersonation - Name des Ereignisses:
impersonation.start - Aktiv: Aktiviert
- Name:
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);Klicken Sie auf Senden.
Sicherheitserhöhungsskript-Aktion erstellen
- Rufen Sie Systemrichtlinie > Ereignisse > Script-Aktionen auf.
- Klicken Sie auf Neu.
Geben Sie die folgenden Konfigurationsdetails an:
- Name:
Chronicle - Security Elevation - Name des Ereignisses:
security.elevated_role.enabled - Aktiv: Aktiviert
- Name:
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);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:
- Rufen Sie in ServiceNow System Definition > Scripts – Background auf.
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');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.doin 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
adminauf die Rollesecurity_admin.
Weiterleitung bestätigen
- 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. - 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 eventoder[Chronicle] Exception sending eventweist auf ein Problem mit Anmeldedaten oder der Verbindung hin. - Führen Sie in Google SecOps eine UDM-Suche nach
metadata.vendor_name = "SERVICENOW"undmetadata.product_name = "SERVICENOW_SECURITY"aus. - Prüfen Sie, ob das Ereignis mit
metadata.event_typeaufUSER_LOGINoderUSER_CHANGE_PERMISSIONSfestgelegt ist und obprincipal.user.useridausgefü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