Raccogli i log di GitLab

Versione parser: 9.0

Supportata in:

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:

  1. Vai a Impostazioni > Gestione dei dati > Feed. Se utilizzi una piattaforma solo SIEM, vai a Impostazioni > Feed.
  2. Fai clic su Aggiungi nuovo feed.
  3. Nella pagina successiva, fai clic su Configura un singolo feed.
  4. Nel campo Nome feed, inserisci un nome per il feed (ad esempio, GitLab Logs).
  5. Seleziona Webhook come Tipo di origine.
  6. Seleziona GitLab come Tipo di log.
  7. Fai clic su Avanti.
  8. (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.
  9. Fai clic su Avanti.
  10. Rivedi la configurazione del feed nella schermata Finalizza, quindi fai clic su Invia.
  11. Fai clic su Genera chiave segreta per generare una chiave segreta per autenticare questo feed.
  12. 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.
  13. Nella scheda Dettagli, copia l'URL dell'endpoint del feed dal campo Informazioni sull'endpoint. Devi specificare questo URL dell'endpoint nell'applicazione client.
  14. Fai clic su Fine.

Crea una chiave API per il feed del webhook

  1. Vai alla consoleGoogle Cloud > Credenziali.

    Vai a credenziali

  2. Fai clic su Crea credenziali e poi seleziona Chiave API.

  3. Limita l'accesso della chiave API all'API Chronicle.

Specifica l'URL dell'endpoint

  1. Nell'applicazione client, specifica l'URL dell'endpoint HTTPS fornito nel feed del webhook.
  2. 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 = SECRET
    

    Suggerimento: 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

  1. Apri il browser web e vai al progetto GitLab per cui vuoi configurare il webhook.
  2. Nel progetto, vai a Settings (Impostazioni) > Webhooks (Webhook).
  3. Fai clic su Aggiungi nuovo webhook.
  4. Nel campo URL, incolla l'URL dell'endpoint Google SecOps.
  5. Fai clic su Aggiungi intestazione personalizzata.
  6. Digita X-Webhook-Access-Key nel campo Nome intestazione.
  7. Per il campo Header Value (Valore intestazione), copia la chiave secret generata durante la configurazione del feed di Google SecOps.
  8. Fai clic su Aggiungi intestazione personalizzata.
  9. Digita X-goog-api-key nel campo Header Name (Nome intestazione).
  10. 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.
  11. 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.
  12. Per comprendere meglio lo scopo del webhook, assegnagli un nome significativo, ad esempio Webhook Google SecOps.
  13. Assicurati che la casella di controllo Enable SSL verification (Abilita verifica SSL) sia selezionata. Questo è fondamentale per una comunicazione sicura.
  14. 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.