Raccogli i log di GitLab
Versione parser: 9.0
Questo parser estrae i campi dai log JSON di GitLab, li normalizza nel formato Unified Data Model (UDM) e arricchisce i dati con un contesto aggiuntivo. Gestisce vari tipi di eventi GitLab, concentrandosi sulle azioni degli utenti, sull'accesso alle risorse e sui risultati di sicurezza, elaborando al contempo informazioni relative alla rete e alle applicazioni. Il parser esegue anche la logica in base ai ruoli e alle azioni all'interno di GitLab, categorizzando gli eventi e assegnando le gravità appropriate.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Istanza Google SecOps.
- Accesso privilegiato a GitLab.
Configura i feed
Per configurare un feed:
- Vai a Impostazioni > Gestione dei dati > Feed. Se utilizzi una piattaforma solo SIEM, vai a Impostazioni > Feed.
- Fai clic su Aggiungi nuovo feed.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio, GitLab Logs).
- Seleziona Webhook come Tipo di origine.
- Seleziona GitLab come Tipo di log.
- Fai clic su Avanti.
- (Facoltativo) Specifica i valori per i seguenti parametri di input:
- Delimitatore di suddivisione: il delimitatore utilizzato per separare le righe di log, ad esempio
\n. - Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
- Etichette di importazione: l'etichetta applicata agli eventi di questo feed.
- Delimitatore di suddivisione: il delimitatore utilizzato per separare le righe di log, ad esempio
- Fai clic su Avanti.
- Rivedi la configurazione del feed nella schermata Finalizza, quindi fai clic su Invia.
- Fai clic su Genera chiave segreta per generare una chiave segreta per autenticare questo feed.
- Copia e memorizza la chiave secret. Non potrai più visualizzare questa chiave segreta. Se necessario, puoi rigenerare una nuova chiave secret, ma questa azione rende obsoleta la chiave secret precedente.
- Nella scheda Dettagli, copia l'URL dell'endpoint del feed dal campo Informazioni sull'endpoint. Devi specificare questo URL dell'endpoint nell'applicazione client.
- Fai clic su Fine.
Crea una chiave API per il feed del webhook
Vai alla consoleGoogle Cloud > Credenziali.
Fai clic su Crea credenziali e poi seleziona Chiave API.
Limita l'accesso della chiave API all'API Chronicle.
Specifica l'URL dell'endpoint
- Nell'applicazione client, specifica l'URL dell'endpoint HTTPS fornito nel feed del webhook.
Attiva l'autenticazione specificando la chiave API e la chiave segreta come parte dell'intestazione personalizzata nel seguente formato:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRETSuggerimento: specifica la chiave API come intestazione anziché nell'URL. Se il tuo client webhook non supporta le intestazioni personalizzate, puoi specificare la chiave API e la chiave segreta utilizzando parametri di ricerca nel seguente formato:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Sostituisci quanto segue:
ENDPOINT_URL: l'URL dell'endpoint del feed.API_KEY: la chiave API per l'autenticazione in Google Security Operations.SECRET: la chiave segreta che hai generato per autenticare il feed.
Configura un webhook in GitLab per Google SecOps
- Apri il browser web e vai al progetto GitLab per cui vuoi configurare il webhook.
- Nel progetto, vai a Settings (Impostazioni) > Webhooks (Webhook).
- Fai clic su Aggiungi nuovo webhook.
- Nel campo URL, incolla l'URL dell'endpoint Google SecOps.
- Fai clic su Aggiungi intestazione personalizzata.
- Digita X-Webhook-Access-Key nel campo Nome intestazione.
- Per il campo Header Value (Valore intestazione), copia la chiave secret generata durante la configurazione del feed di Google SecOps.
- Fai clic su Aggiungi intestazione personalizzata.
- Digita X-goog-api-key nel campo Header Name (Nome intestazione).
- Nel campo Header Value (Valore intestazione), copia la chiave API generata durante la configurazione del feed di Google SecOps. Nota: per una maggiore sicurezza, genera un token secret e aggiungilo sia alla configurazione del webhook GitLab sia alla configurazione del feed Google SecOps corrispondente. In questo modo è possibile verificare l'autenticità dei webhook in entrata.
- Scegli gli eventi GitLab che devono attivare il webhook. Ad esempio, puoi selezionare Eventi push per inviare dati a Google SecOps ogni volta che viene eseguito il push del codice nel repository. Valuta attentamente quali eventi sono pertinenti alle tue esigenze di monitoraggio della sicurezza. Un numero eccessivo di eventi può causare un carico non necessario.
- Per comprendere meglio lo scopo del webhook, assegnagli un nome significativo, ad esempio Webhook Google SecOps.
- Assicurati che la casella di controllo Enable SSL verification (Abilita verifica SSL) sia selezionata. Questo è fondamentale per una comunicazione sicura.
- Fai clic su Aggiungi webhook per salvare la configurazione.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logica |
|---|---|---|
author_id |
principal.user.userid |
Convertito in stringa. |
author_name |
principal.user.email_addresses |
Se il valore corrisponde a un'espressione regolare dell'indirizzo email. |
author_name |
principal.user.user_display_name |
Se il valore non corrisponde a un'espressione regolare dell'indirizzo email. |
details.as |
principal.resource.attribute.labels |
Aggiunto come etichetta con chiave "as". |
details.add |
principal.resource.attribute.labels |
Aggiunta come etichetta con chiave "add". |
details.as |
principal.user.role_name |
Il valore del campo del log non elaborato. |
details.as |
principal.user.attribute.roles.type |
Imposta su "ADMINISTRATOR" se details.as è "Proprietario", "SERVICE_ACCOUNT" se details.as è "Developer", "Maintainer" o "Reporter" e "TYPE_UNSPECIFIED" se details.as è "Guest". |
details.custom_message |
security_result.description |
Il valore del campo del log non elaborato. |
details.custom_message.action |
security_result.summary |
Il valore del campo del log non elaborato. |
details.entity_path |
target.file.full_path |
Il valore del campo del log non elaborato. |
details.target_id |
target.resource.id |
Convertito in stringa. |
entity_path |
target.file.full_path |
Il valore del campo del log non elaborato. |
entity_type |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "Tipo di entità". |
event_type |
metadata.product_event_type |
Il valore del campo del log non elaborato. |
insertId |
metadata.product_log_id |
Il valore del campo del log non elaborato. |
ip_address |
principal.ip, principal.asset.ip |
Il valore del campo del log non elaborato. |
jsonPayload.action |
additional.fields |
Aggiunto come campo con chiave "action" e valore stringa. |
jsonPayload.controller |
additional.fields |
Aggiunto come campo con chiave "controller" e valore stringa. |
jsonPayload.correlation_id |
principal.asset_id |
Con il prefisso "id: ". |
jsonPayload.cpu_s |
additional.fields |
Aggiunto come campo con chiave "cpu_s" e valore stringa. |
jsonPayload.details.custom_message.protocol |
network.application_protocol |
Impostato su "UNKNOWN_APPLICATION_PROTOCOL" se il valore è "web", altrimenti convertito in lettere maiuscole. Aggiunto anche come campo aggiuntivo con chiave "Application Protocol" se il valore è "web". |
jsonPayload.mem_total_bytes |
additional.fields |
Aggiunto come campo con chiave "mem_total_bytes" e valore stringa. |
jsonPayload.meta_caller_id |
additional.fields |
Aggiunto come campo con chiave "Caller Id" e valore stringa. |
jsonPayload.meta_client_id |
target.user.userid |
Il valore del campo del log non elaborato. |
jsonPayload.meta_feature_category |
additional.fields |
Aggiunto come campo con chiave "Feature Category" e valore stringa. |
jsonPayload.meta_remote_ip |
principal.ip, principal.asset.ip |
Il valore del campo del log non elaborato, analizzato come array JSON e unito ai campi IP. |
jsonPayload.meta_user |
principal.user.userid |
Utilizzato come riserva se jsonPayload.username è vuoto. |
jsonPayload.method |
network.http.method |
Il valore del campo del log non elaborato. |
jsonPayload.path |
target.process.file.full_path |
Il valore del campo del log non elaborato. |
jsonPayload.pid |
target.process.pid |
Convertito in stringa. |
jsonPayload.remote_ip |
principal.ip, principal.asset.ip |
Il valore del campo del log non elaborato. |
jsonPayload.request_urgency |
additional.fields |
Aggiunto come campo con chiave "Urgenza della richiesta" e valore stringa. |
jsonPayload.severity |
security_result.severity |
Imposta su "INFORMATIONAL" se il valore è "INFO", "ERROR" se il valore è "ERROR" e "MEDIUM" se il valore è "NOTICE". |
jsonPayload.status |
network.http.response_code |
Convertito in numero intero se non è "ACTIVE". |
jsonPayload.ua |
network.http.user_agent |
Il valore del campo del log non elaborato. |
jsonPayload.username |
principal.user.userid |
Il valore del campo del log non elaborato. |
jsonPayload.worker_id |
principal.application |
Il valore del campo del log non elaborato. |
labels.instance_name |
principal.hostname, principal.asset.hostname |
Il valore del campo del log non elaborato, utilizzato se il messaggio contiene "Rimozione dell'utente". |
logName |
security_result.category_details |
Il valore del campo del log non elaborato. |
message |
security_result.summary |
Il valore del campo del log non elaborato, utilizzato se jsonPayload.severity è "ERROR". |
protoPayload.@type |
additional.fields |
Aggiunto come campo con chiave "tipo protoPayload" e valore stringa. |
protoPayload.authenticationInfo.principalEmail |
principal.user.email_addresses, principal.user.userid |
Il valore del campo del log non elaborato. |
protoPayload.authenticationInfo.principalSubject |
additional.fields |
Aggiunto come campo con chiave "authenticationInfo principalSubject" e valore stringa. |
protoPayload.authenticationInfo.serviceAccountKeyName |
additional.fields |
Aggiunto come campo con chiave "authenticationInfo serviceAccountKeyName" e valore stringa. |
protoPayload.authorizationInfo |
target.resource.attribute.labels, security_result.action |
I valori di questo campo vengono aggiunti come etichette con chiavi precedute dal prefisso "authenticationInfo". security_result.action è impostato su "ALLOW" se un valore all'interno di granted è true e su "BLOCK" se è false. Anche i campi nidificati come resourceAttributes vengono aggiunti come etichette con chiavi precedute dal prefisso "authenticationInfo_resourceAttributes". |
protoPayload.methodName |
additional.fields |
Aggiunto come campo con chiave "protoPayload methodName" e valore stringa. |
protoPayload.request.@type |
additional.fields |
Aggiunto come campo con chiave "Request Type" e valore stringa. |
protoPayload.request.resource |
target.resource.attribute.labels |
Aggiunta come etichetta con la chiave "Richiedi risorsa". |
protoPayload.requestMetadata.callerIp |
additional.fields |
Aggiunto come campo con chiave "requestMetadata callerIp" e valore stringa. |
protoPayload.requestMetadata.callerSuppliedUserAgent |
additional.fields |
Aggiunto come campo con chiave "requestMetadata callerSuppliedUserAgent" e valore stringa. |
protoPayload.serviceName |
additional.fields |
Aggiunto come campo con chiave "serviceName" e valore stringa. |
protoPayload.status.code |
additional.fields |
Aggiunto come campo con chiave "protoPayload codice di stato" e valore stringa. |
protoPayload.status.message |
additional.fields, target.user.email_addresses, target.user.userid |
Aggiunto come campo con chiave "protoPayload status message" e valore stringa. Se è possibile estrarre un indirizzo email dal messaggio, questo viene aggiunto a target.user.email_addresses e target.user.userid. |
receiveTimestamp |
metadata.event_timestamp, timestamp |
Analizzato come timestamp dell'evento. |
resource.labels.project_id |
target.resource.attribute.labels |
Aggiunto come etichetta con la chiave "ID progetto". |
resource.labels.zone |
target.cloud.availability_zone |
Il valore del campo del log non elaborato. |
resource.type |
target.cloud.environment |
Imposta su "GOOGLE_CLOUD_PLATFORM" se il valore corrisponde a "gce". |
security_result.action |
security_result.action |
Derivato da protoPayload.authorizationInfo.granted. |
security_result.category_details |
security_result.category_details |
Unito a logName. |
security_result.description |
security_result.description |
Derivato da jsonPayload.details.custom_message. |
security_result.severity |
security_result.severity |
Derivato da severity o jsonPayload.severity. |
security_result.summary |
security_result.summary |
Derivato da jsonPayload.details.custom_message.action o jsonPayload.message. |
severity |
security_result.severity |
Imposta su "INFORMATIONAL" se il valore è "INFO", "ERROR" se il valore è "ERROR" e "MEDIUM" se il valore è "NOTICE". |
sourceLocation |
principal.resource.attribute.labels |
I valori di questo campo vengono aggiunti come etichette. |
target_details |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "Target Details". |
target_type |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "target type". |
timestamp |
timestamp |
Il valore del campo del log non elaborato. Impostato in base alla presenza dei campi principal e target. Il valore predefinito è "GENERIC_EVENT" se non viene soddisfatta alcuna condizione specifica. I valori possibili sono "USER_RESOURCE_UPDATE_CONTENT", "USER_RESOURCE_ACCESS", "USER_UNCATEGORIZED". Impostato su "GITLAB". Impostato su "GITLAB". |
Log delle modifiche
Visualizza il log delle modifiche per questo parser
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.