GitLab-Protokolle erfassen
Übersicht
Dieser Parser extrahiert Felder aus GitLab-JSON-Protokollen, normalisiert sie in das Unified Data Model (UDM) und ergänzt die Daten um zusätzlichen Kontext. Es verarbeitet verschiedene GitLab-Ereignistypen, wobei der Schwerpunkt auf Nutzeraktionen, Ressourcenzugriff und Sicherheitsergebnissen liegt. Außerdem werden netzwerk- und anwendungsbezogene Informationen verarbeitet. Der Parser führt auch Logik basierend auf Rollen und Aktionen in GitLab aus, kategorisiert Ereignisse und weist ihnen die entsprechenden Schweregrade zu.
Hinweise
- Sie benötigen eine Google SecOps-Instanz.
- Sie benötigen erhöhte Zugriffsrechte für GitLab.
Feed in Google SecOps für die Aufnahme der GitLab-Protokolle konfigurieren
- Gehen Sie zu SIEM-Einstellungen > Feeds.
- Klicken Sie auf Neu hinzufügen.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. GitLab-Protokolle.
- Wählen Sie als Quelltyp Webhook aus.
- Wählen Sie Gitlab als Logtyp aus.
- Klicken Sie auf Weiter.
- Optional: Geben Sie Werte für die folgenden Eingabeparameter an:
- Trennzeichen für die Aufteilung: Das Trennzeichen, mit dem Logzeilen getrennt werden, z. B.
\n
. - Asset-Namespace: der Asset-Namespace.
- Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet wird.
- Trennzeichen für die Aufteilung: Das Trennzeichen, mit dem Logzeilen getrennt werden, z. B.
- Klicken Sie auf Weiter.
- Überprüfen Sie die Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.
- Klicken Sie auf Secret-Schlüssel generieren, um einen Secret-Schlüssel zur Authentifizierung dieses Feeds zu generieren.
- Kopieren und speichern Sie den geheimen Schlüssel. Sie können diesen geheimen Schlüssel nicht noch einmal aufrufen. Bei Bedarf können Sie einen neuen Secret-Schlüssel generieren. Dadurch wird der vorherige Secret-Schlüssel jedoch ungültig.
- Kopieren Sie auf dem Tab Details die Feedendpunkt-URL aus dem Feld Endpunktinformationen. Sie müssen diese Endpunkt-URL in Ihrer Clientanwendung angeben.
- Klicken Sie auf Fertig.
API-Schlüssel für den Webhook-Feed erstellen
Rufen Sie die Google Cloud Console > Anmeldedaten auf.
Klicken Sie auf Anmeldedaten erstellen und wählen Sie anschließend API-Schlüssel aus.
Beschränken Sie den API-Schlüsselzugriff auf die Google Security Operations API.
Endpunkt-URL angeben
- Geben Sie in Ihrer Clientanwendung die HTTPS-Endpunkt-URL an, die im Webhook-Feed angegeben ist.
Aktiviere die Authentifizierung, indem du den API-Schlüssel und den geheimen Schlüssel als Teil der benutzerdefinierten Kopfzeile im folgenden Format angibst:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
Empfehlung: Geben Sie den API-Schlüssel als Header an, anstatt ihn in der URL anzugeben. Wenn Ihr Webhook-Client keine benutzerdefinierten Header unterstützt, können Sie den API-Schlüssel und den geheimen Schlüssel mithilfe von Suchparametern im folgenden Format angeben:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Ersetzen Sie Folgendes:
ENDPOINT_URL
: die URL des Feedendpunkts.API_KEY
: Der API-Schlüssel, mit dem Sie sich bei Google Security Operations authentifizieren.SECRET
: den geheimen Schlüssel, den Sie zur Authentifizierung des Feeds generiert haben.
Webhook in GitLab für Google SecOps konfigurieren
- Öffnen Sie Ihren Webbrowser und rufen Sie das GitLab-Projekt auf, für das Sie den Webhook konfigurieren möchten.
- Klicken Sie in Ihrem Projekt auf Einstellungen > Webhooks.
- Klicken Sie auf Neuen Webhook hinzufügen.
- Fügen Sie in das Feld URL die Endpunkt-URL von Google SecOps ein.
- Klicken Sie auf Benutzerdefinierten Header hinzufügen.
- Geben Sie im Feld Header-Name den Wert X-Webhook-Access-Key ein.
- Kopieren Sie in das Feld Header-Wert den geheimen Schlüssel, der während der Konfiguration des Google SecOps-Feeds generiert wurde.
- Klicken Sie auf Benutzerdefinierten Header hinzufügen.
- Geben Sie X-goog-api-key in das Feld Header-Name ein.
- Kopieren Sie für das Feld Header-Wert den API-Schlüssel, der bei der Konfiguration des Google SecOps-Feeds generiert wurde. Hinweis: Für eine bessere Sicherheit können Sie ein geheimes Token generieren und sowohl der GitLab-Webhook-Konfiguration als auch der entsprechenden Google SecOps-Feed-Konfiguration hinzufügen. So lässt sich die Authentizität eingehender Webhooks prüfen.
- Wählen Sie die GitLab-Ereignisse aus, die den Webhook auslösen sollen. Sie können beispielsweise Push-Ereignisse auswählen, um jedes Mal, wenn Code in das Repository gepusht wird, Daten an Google SecOps zu senden. Überlegen Sie genau, welche Ereignisse für Ihre Sicherheitsüberwachung relevant sind. Zu viele Ereignisse können zu unnötigen Lasten führen.
- Geben Sie dem Webhook einen aussagekräftigen Namen, z. B. Google SecOps-Webhook, damit Sie den Zweck des Webhooks besser nachvollziehen können.
- Das Kästchen SSL-Überprüfung aktivieren muss angeklickt sein. Das ist für eine sichere Kommunikation entscheidend.
- Klicken Sie auf Webhook hinzufügen, um die Konfiguration zu speichern.
UDM-Zuordnungstabelle
Logfeld | UDM-Zuordnung | Logik |
---|---|---|
author_id |
principal.user.userid |
In String umgewandelt. |
author_name |
principal.user.email_addresses |
Wenn der Wert mit einem regulären Ausdruck für E-Mail-Adressen übereinstimmt. |
author_name |
principal.user.user_display_name |
Wenn der Wert nicht mit einem E-Mail-Adressen-Regex übereinstimmt. |
details.as |
principal.resource.attribute.labels |
Als Label mit dem Schlüssel „as“ hinzugefügt. |
details.add |
principal.resource.attribute.labels |
Als Label mit dem Schlüssel „add“ hinzugefügt. |
details.as |
principal.user.role_name |
Der Wert des Rohlogs. |
details.as |
principal.user.attribute.roles.type |
Legen Sie „ADMINISTRATOR“ fest, wenn details.as „Inhaber“ ist, „SERVICE_ACCOUNT“, wenn details.as „Entwickler“, „Maintainer“ oder „Melder“ ist, und „TYPE_UNSPECIFIED“, wenn details.as „Gast“ ist. |
details.custom_message |
security_result.description |
Der Wert des Rohlogs. |
details.custom_message.action |
security_result.summary |
Der Wert des Rohlogs. |
details.entity_path |
target.file.full_path |
Der Wert des Rohlogs. |
details.target_id |
target.resource.id |
In String umgewandelt. |
entity_path |
target.file.full_path |
Der Wert des Rohlogs. |
entity_type |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „Entity Type“ hinzugefügt. |
event_type |
metadata.product_event_type |
Der Wert des Rohlogs. |
insertId |
metadata.product_log_id |
Der Wert des Rohlogs. |
ip_address |
principal.ip , principal.asset.ip |
Der Wert des Rohlogs. |
jsonPayload.action |
additional.fields |
Als Feld mit dem Schlüssel „action“ und dem Stringwert hinzugefügt. |
jsonPayload.controller |
additional.fields |
Als Feld mit dem Schlüssel „controller“ und dem Stringwert hinzugefügt. |
jsonPayload.correlation_id |
principal.asset_id |
Sie beginnt mit „id:“. |
jsonPayload.cpu_s |
additional.fields |
Als Feld mit dem Schlüssel „cpu_s“ und dem Stringwert hinzugefügt. |
jsonPayload.details.custom_message.protocol |
network.application_protocol |
Wird auf „UNKNOWN_APPLICATION_PROTOCOL“ gesetzt, wenn der Wert „web“ ist, andernfalls in Großbuchstaben konvertiert. Wird auch als zusätzliches Feld mit dem Schlüssel „Application Protocol“ hinzugefügt, wenn der Wert „web“ ist. |
jsonPayload.mem_total_bytes |
additional.fields |
Als Feld mit dem Schlüssel „mem_total_bytes“ und dem Stringwert hinzugefügt. |
jsonPayload.meta_caller_id |
additional.fields |
Als Feld mit dem Schlüssel „Caller-ID“ und dem Stringwert hinzugefügt. |
jsonPayload.meta_client_id |
target.user.userid |
Der Wert des Rohlogs. |
jsonPayload.meta_feature_category |
additional.fields |
Als Feld mit dem Schlüssel „Feature Category“ und dem Stringwert hinzugefügt. |
jsonPayload.meta_remote_ip |
principal.ip , principal.asset.ip |
Der Wert des Rohlogfelds, der als JSON-Array geparst und in die IP-Felder zusammengeführt wird. |
jsonPayload.meta_user |
principal.user.userid |
Wird als Fallback verwendet, wenn jsonPayload.username leer ist. |
jsonPayload.method |
network.http.method |
Der Wert des Rohlogs. |
jsonPayload.path |
target.process.file.full_path |
Der Wert des Rohlogs. |
jsonPayload.pid |
target.process.pid |
In String umgewandelt. |
jsonPayload.remote_ip |
principal.ip , principal.asset.ip |
Der Wert des Rohlogs. |
jsonPayload.request_urgency |
additional.fields |
Als Feld mit dem Schlüssel „Request Urgency“ und dem Stringwert hinzugefügt. |
jsonPayload.severity |
security_result.severity |
Legen Sie „INFORMATIONAL“ fest, wenn der Wert „INFO“ ist, „ERROR“, wenn der Wert „ERROR“ ist, und „MEDIUM“, wenn der Wert „NOTICE“ ist. |
jsonPayload.status |
network.http.response_code |
Wird in eine Ganzzahl umgewandelt, wenn der Wert nicht „AKTIV“ ist. |
jsonPayload.ua |
network.http.user_agent |
Der Wert des Rohlogs. |
jsonPayload.username |
principal.user.userid |
Der Wert des Rohlogs. |
jsonPayload.worker_id |
principal.application |
Der Wert des Rohlogs. |
labels.instance_name |
principal.hostname , principal.asset.hostname |
Der Wert des Rohlogs, der verwendet wird, wenn die Nachricht „Nutzer wird entfernt“ enthält. |
logName |
security_result.category_details |
Der Wert des Rohlogs. |
message |
security_result.summary |
Der Wert des Rohlogs, der verwendet wird, wenn jsonPayload.severity „ERROR“ ist. |
protoPayload.@type |
additional.fields |
Als Feld mit dem Schlüssel „protoPayload type“ und dem Stringwert hinzugefügt. |
protoPayload.authenticationInfo.principalEmail |
principal.user.email_addresses , principal.user.userid |
Der Wert des Rohlogs. |
protoPayload.authenticationInfo.principalSubject |
additional.fields |
Als Feld mit dem Schlüssel „authenticationInfo principalSubject“ und dem Stringwert hinzugefügt. |
protoPayload.authenticationInfo.serviceAccountKeyName |
additional.fields |
Wird als Feld mit dem Schlüssel „authenticationInfo serviceAccountKeyName“ und dem Stringwert hinzugefügt. |
protoPayload.authorizationInfo |
target.resource.attribute.labels , security_result.action |
Die Werte in diesem Feld werden als Labels mit Schlüsseln hinzugefügt, die mit „authenticationInfo“ beginnen. security_result.action wird auf „ALLOW“ gesetzt, wenn ein Wert in granted „wahr“ ist, und auf „BLOCK“, wenn er „falsch“ ist. Verschachtelte Felder wie resourceAttributes werden ebenfalls als Labels mit Schlüsseln hinzugefügt, die mit „authenticationInfo_resourceAttributes“ beginnen. |
protoPayload.methodName |
additional.fields |
Wird als Feld mit dem Schlüssel „protoPayload methodName“ und dem Stringwert hinzugefügt. |
protoPayload.request.@type |
additional.fields |
Als Feld mit dem Schlüssel „Request Type“ und dem Stringwert hinzugefügt. |
protoPayload.request.resource |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „Request resource“ hinzugefügt. |
protoPayload.requestMetadata.callerIp |
additional.fields |
Wird als Feld mit dem Schlüssel „requestMetadata callerIp“ und dem Stringwert hinzugefügt. |
protoPayload.requestMetadata.callerSuppliedUserAgent |
additional.fields |
Als Feld mit dem Schlüssel „requestMetadata callerSuppliedUserAgent“ und dem Stringwert hinzugefügt. |
protoPayload.serviceName |
additional.fields |
Wird als Feld mit dem Schlüssel „serviceName“ und einem Stringwert hinzugefügt. |
protoPayload.status.code |
additional.fields |
Als Feld mit dem Schlüssel „protoPayload status code“ und dem Stringwert hinzugefügt. |
protoPayload.status.message |
additional.fields , target.user.email_addresses , target.user.userid |
Als Feld mit dem Schlüssel „protoPayload status message“ und dem Stringwert hinzugefügt. Wenn eine E-Mail-Adresse aus der Nachricht extrahiert werden kann, wird sie zu target.user.email_addresses und target.user.userid hinzugefügt. |
receiveTimestamp |
metadata.event_timestamp , timestamp |
Wird als Zeitstempel des Ereignisses geparst. |
resource.labels.project_id |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „Project id“ hinzugefügt. |
resource.labels.zone |
target.cloud.availability_zone |
Der Wert des Rohlogs. |
resource.type |
target.cloud.environment |
Legen Sie „GOOGLE_CLOUD_PLATFORM“ fest, wenn der Wert mit „gce“ übereinstimmt. |
security_result.action |
security_result.action |
Abgeleitet von protoPayload.authorizationInfo.granted . |
security_result.category_details |
security_result.category_details |
Mit logName zusammengeführt |
security_result.description |
security_result.description |
Abgeleitet von jsonPayload.details.custom_message . |
security_result.severity |
security_result.severity |
Abgeleitet von severity oder jsonPayload.severity . |
security_result.summary |
security_result.summary |
Abgeleitet von jsonPayload.details.custom_message.action oder jsonPayload.message . |
severity |
security_result.severity |
Legen Sie „INFORMATIONAL“ fest, wenn der Wert „INFO“ ist, „ERROR“, wenn der Wert „ERROR“ ist, und „MEDIUM“, wenn der Wert „NOTICE“ ist. |
sourceLocation |
principal.resource.attribute.labels |
Werte in diesem Feld werden als Labels hinzugefügt. |
target_details |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „Target Details“ hinzugefügt. |
target_type |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „target type“ hinzugefügt. |
timestamp |
timestamp |
Der Wert des Rohlogs. Wird basierend auf der Anwesenheit von Haupt- und Zielfeldern festgelegt. Wenn keine bestimmte Bedingung erfüllt ist, wird standardmäßig „GENERIC_EVENT“ verwendet. Mögliche Werte sind „USER_RESOURCE_UPDATE_CONTENT“, „USER_RESOURCE_ACCESS“ und „USER_UNCATEGORIZED“. Legen Sie diesen Wert auf „GITLAB“ fest. Legen Sie diesen Wert auf „GITLAB“ fest. |
Änderungen
2024-04-08
- „custom_message.action“ wurde in „security_result.summary“ geändert.
- „ip_address“ wurde zu „principal.ip“ zugeordnet.
- „applicationProtocol“ wurde in „network.application_protocol“ geändert.
- „details.author_name“ wurde in „principal.user.email_addresses“ geändert
- „author_id“ wurde „principal.user.userid“ zugeordnet.
- „target_id“ wurde „target.resource.id“ zugeordnet.
- „details.entity_path“ wurde mit „target.file.full_path“ verknüpft.
- „event_type“ wurde in „product_event_type“ umgewandelt.
- „target_type“, „entity_type“ und „target_details“ wurden in „resource.attribute.labels“ überführt.
2023-10-20
- Die Felder, die mit „db_“ beginnen, wurden „additional_fields“ zugeordnet.
- Die Felder, die mit „redis_“ beginnen, wurden „additional_fields“ zugeordnet.
- „severity“ oder „jsonPayload.severity“ wurde „security_result.severity“ zugeordnet, wenn der Wert „ERROR“ oder „NOTICE“ ist.
- „jsonPayload.correlation_id“ wurde „principal.asset_id“ zugeordnet.
- „Nicht zugeordnete Felder von jsonPayload“ wurden „additional_fields“ zugeordnet.
- „jsonPayload.worker_id“ wurde auf „principal.application“ zugeordnet.
- „jsonPayload.method“ wurde in „network.http.method“ geändert.
- „jsonPayload.pid“ wurde auf „target.process.pid“ zugeordnet.
- „jsonPayload.status“ wurde in „network.http.response_code“ umgewandelt.
- „resource.labels.zone“ wurde in „target.cloud.availability_zone“ umgewandelt.
- „resource.type“ wurde auf „target.cloud.environment“ zugeordnet.
- „jsonPayload.meta_user“ wurde auf „target.user.userid“ zugeordnet.
- „jsonPayload.username“ wurde „principal.user.userid“ zugeordnet.
- „jsonPayload.remote_ip“ wurde auf „principal.ip“ zugeordnet.
- „jsonPayload.ua“ wurde in „network.http.user_agent“ umgewandelt.
- „jsonPayload.meta_client_id“ wurde auf „target.user.userid“ zugeordnet.
- „jsonPayload.path“ wurde auf „target.process.file.full_path“ zugeordnet.
- „protoPayload.authenticationInfo.principalEmail“ wurde in „principal.user.email_addresses“ umgewandelt.
- Zusätzliche Felder in „protoPayload“ wurden „additional.fields“ zugeordnet.
- Es wurde eine bedingte Prüfung hinzugefügt, um sicherzustellen, dass die erforderliche Zuordnung vorhanden ist, bevor „metadata.event_type“ zugeordnet wird.
2023-10-10
- „jsonPayload.details.as“ wurde auf „principal.resource.attribute.labels“ und „principal.user.role_name“ zugeordnet.
- Legen Sie „principal_role.type“ auf „ADMINISTRATOR“ fest, wenn „jsonPayload.details.as“ mit „Owner“ übereinstimmt.
- Legen Sie „principal_role.type“ auf „SERVICE_ACCOUNT“ fest, wenn „jsonPayload.details.as“ in den Protokollen entweder auf „Entwickler“, „Maintainer“ oder „Melder“ gesetzt ist.
- Legen Sie „principal_role.type“ auf „TYPE_UNSPECIFIED“ fest, wenn „jsonPayload.details.as“ in Protokollen mit dem Wert „Gast“ übereinstimmt.
- „jsonPayload.details.add“ wurde auf „principal.resource.attribute.labels“ zugeordnet.
- „jsonPayload.entity_type“ wurde in „target.resource.attribute.labels“ umgewandelt.
2023-08-31
- Neu erstellter Parser.