Raccogliere i log di GitLab

Supportato in:

Panoramica

Questo parser estrae i campi dai log JSON di GitLab, li normalizza nel modello Unified Data Model (UDM) e arricchisce i dati con un contesto aggiuntivo. Gestisce vari tipi di eventi GitLab, concentrandosi su azioni dell'utente, accesso alle risorse e risultati di sicurezza, elaborando anche informazioni relative a rete e applicazioni. Il parser esegue anche la logica in base ai ruoli e alle azioni all'interno di GitLab, classificando gli eventi e assegnando le gravità appropriate.

Prima di iniziare

Assicurati di soddisfare i seguenti prerequisiti:

  • Istanza Google SecOps.
  • Accesso con privilegi a GitLab.

Configurare i feed

Esistono due diversi punti di accesso per configurare i feed nella piattaforma Google SecOps:

  • Impostazioni SIEM > Feed
  • Hub dei contenuti > Pacchetti di contenuti

Configura i feed da Impostazioni SIEM > Feed

Per configurare un feed:

  1. Vai a Impostazioni SIEM > 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, Log di GitLab).
  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. Controlla la configurazione del feed nella schermata Finalizza e poi 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 segreta. Non puoi visualizzare di nuovo questa chiave segreta. Se necessario, puoi rigenerare una nuova chiave segreta, ma questa azione rende obsoleta la chiave segreta 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.

Configurare i feed dall'hub dei contenuti

Specifica i valori per i seguenti campi:

  • Delimitatore di suddivisione: il delimitatore utilizzato per separare le righe di log, ad esempio \n.

Opzioni avanzate

  • Nome feed: un valore precompilato che identifica il feed.
  • Tipo di origine: metodo utilizzato per raccogliere i log in Google SecOps.
  • Spazio dei nomi dell'asset: lo spazio dei nomi associato al feed.
  • Etichette di importazione: etichette applicate a tutti gli eventi di questo feed.

  • Fai clic su Genera chiave segreta per generare una chiave segreta per autenticare questo feed.

  • Copia e memorizza la chiave segreta. Non puoi visualizzare di nuovo questa chiave segreta. Se necessario, puoi rigenerare una nuova chiave segreta, ma questa azione rende obsoleta la chiave segreta 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.

Crea una chiave API per il feed webhook

  1. Vai alla console Google 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. Nella tua applicazione client, specifica l'URL dell'endpoint HTTPS fornito nel feed 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
    

    Consiglio: specifica la chiave API come intestazione anziché nell'URL. Se il 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 a Google Security Operations.
  • SECRET: la chiave segreta che hai generato per autenticare il feed.

Configurare 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 tuo progetto, vai a Impostazioni > Webhook.
  3. Fai clic su Aggiungi nuovo webhook.
  4. Nel campo URL, incolla l'URL endpoint di Google SecOps.
  5. Fai clic su Aggiungi intestazione personalizzata.
  6. Digita X-Webhook-Access-Key nel campo Nome intestazione.
  7. Per il campo Valore intestazione, copia la chiave segreta generata durante la configurazione del feed Google SecOps.
  8. Fai clic su Aggiungi intestazione personalizzata.
  9. Digita X-goog-api-key nel campo Nome intestazione.
  10. Per il campo Valore intestazione, copia la chiave API generata durante la configurazione del feed Google SecOps. Nota: per una maggiore sicurezza, genera un token segreto 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 il codice viene inviato al repository. Valuta attentamente quali eventi sono pertinenti alle tue esigenze di monitoraggio della sicurezza. Troppi eventi possono causare un carico non necessario.
  12. Per comprendere meglio lo scopo dei webhook, assegna loro un nome significativo, ad esempio Webhook Google SecOps.
  13. Assicurati che la casella di controllo Enable SSL verification (Attiva 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 Logic
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 la chiave "as".
details.add principal.resource.attribute.labels Aggiunto come etichetta con la chiave "add".
details.as principal.user.role_name Il valore del campo di log non elaborato.
details.as principal.user.attribute.roles.type Impostato 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 di log non elaborato.
details.custom_message.action security_result.summary Il valore del campo di log non elaborato.
details.entity_path target.file.full_path Il valore del campo di log non elaborato.
details.target_id target.resource.id Convertito in stringa.
entity_path target.file.full_path Il valore del campo di log non elaborato.
entity_type target.resource.attribute.labels Aggiunto come etichetta con la chiave "Tipo di entità".
event_type metadata.product_event_type Il valore del campo di log non elaborato.
insertId metadata.product_log_id Il valore del campo di log non elaborato.
ip_address principal.ip, principal.asset.ip Il valore del campo di log non elaborato.
jsonPayload.action additional.fields Aggiunto come campo con chiave "action" e valore stringa.
jsonPayload.controller additional.fields Aggiunto come campo con la chiave "controller" e il valore stringa.
jsonPayload.correlation_id principal.asset_id Prefisso "id: ".
jsonPayload.cpu_s additional.fields Aggiunto come campo con la chiave "cpu_s" e il valore stringa.
jsonPayload.details.custom_message.protocol network.application_protocol Impostato su "UNKNOWN_APPLICATION_PROTOCOL" se il valore è "web", altrimenti convertito in maiuscolo. Aggiunto anche come campo aggiuntivo con la chiave "Protocollo applicazione" 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 "ID chiamante" e valore stringa.
jsonPayload.meta_client_id target.user.userid Il valore del campo di log non elaborato.
jsonPayload.meta_feature_category additional.fields Aggiunto come campo con la chiave "Categoria funzionalità" e il valore stringa.
jsonPayload.meta_remote_ip principal.ip, principal.asset.ip Il valore del campo 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 di log non elaborato.
jsonPayload.path target.process.file.full_path Il valore del campo di log non elaborato.
jsonPayload.pid target.process.pid Convertito in stringa.
jsonPayload.remote_ip principal.ip, principal.asset.ip Il valore del campo di log non elaborato.
jsonPayload.request_urgency additional.fields Aggiunto come campo con la chiave "Request Urgency" (Urgenza della richiesta) e valore stringa.
jsonPayload.severity security_result.severity Imposta il valore su "INFORMATIONAL" se il valore è "INFO", su "ERROR" se il valore è "ERROR" e su "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 di log non elaborato.
jsonPayload.username principal.user.userid Il valore del campo di log non elaborato.
jsonPayload.worker_id principal.application Il valore del campo di log non elaborato.
labels.instance_name principal.hostname, principal.asset.hostname Il valore del campo log non elaborato, utilizzato se il messaggio contiene "Removing user" (Rimozione dell'utente).
logName security_result.category_details Il valore del campo di log non elaborato.
message security_result.summary Il valore del campo di log non elaborato, utilizzato se jsonPayload.severity è "ERROR".
protoPayload.@type additional.fields Aggiunto come campo con chiave "Tipo di protoPayload" e valore stringa.
protoPayload.authenticationInfo.principalEmail principal.user.email_addresses, principal.user.userid Il valore del campo di 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 la chiave "authenticationInfo serviceAccountKeyName" e il valore stringa.
protoPayload.authorizationInfo target.resource.attribute.labels, security_result.action I valori all'interno di questo campo vengono aggiunti come etichette con chiavi con il 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 con il prefisso "authenticationInfo_resourceAttributes".
protoPayload.methodName additional.fields Aggiunto come campo con la chiave "protoPayload methodName" e il valore stringa.
protoPayload.request.@type additional.fields Aggiunto come campo con la chiave "Tipo di richiesta" e il valore stringa.
protoPayload.request.resource target.resource.attribute.labels Aggiunto come etichetta con la chiave "Richiedi risorsa".
protoPayload.requestMetadata.callerIp additional.fields Aggiunto come campo con la chiave "requestMetadata callerIp" e il valore stringa.
protoPayload.requestMetadata.callerSuppliedUserAgent additional.fields Aggiunto come campo con la chiave "requestMetadata callerSuppliedUserAgent" e valore stringa.
protoPayload.serviceName additional.fields Aggiunto come campo con la chiave "serviceName" e il valore stringa.
protoPayload.status.code additional.fields Aggiunto come campo con chiave "protoPayload status code" e valore stringa.
protoPayload.status.message additional.fields, target.user.email_addresses, target.user.userid Aggiunto come campo con la chiave "protoPayload status message" e il 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 di log non elaborato.
resource.type target.cloud.environment Impostato 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 il valore su "INFORMATIONAL" se il valore è "INFO", su "ERROR" se il valore è "ERROR" e su "MEDIUM" se il valore è "NOTICE".
sourceLocation principal.resource.attribute.labels I valori all'interno di questo campo vengono aggiunti come etichette.
target_details target.resource.attribute.labels Aggiunto come etichetta con la chiave "Dettagli target".
target_type target.resource.attribute.labels Aggiunta come etichetta con la chiave "target type".
timestamp timestamp Il valore del campo di log non elaborato. Impostato in base alla presenza dei campi principale e di destinazione. Se non viene soddisfatta alcuna condizione specifica, il valore predefinito è "GENERIC_EVENT". I valori possibili sono "USER_RESOURCE_UPDATE_CONTENT", "USER_RESOURCE_ACCESS", "USER_UNCATEGORIZED". Imposta su "GITLAB". Imposta su "GITLAB".

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.