Recoger registros de GitLab

Disponible en:

Información general

Este analizador extrae campos de los registros JSON de GitLab, los normaliza en el modelo de datos unificado (UDM) y enriquece los datos con contexto adicional. Gestiona varios tipos de eventos de GitLab, centrándose en las acciones de los usuarios, el acceso a los recursos y los resultados de seguridad, al tiempo que procesa información relacionada con la red y las aplicaciones. El analizador también realiza operaciones lógicas basadas en los roles y las acciones de GitLab, categoriza los eventos y asigna las gravedades adecuadas.

Antes de empezar

Asegúrate de que cumples los siguientes requisitos previos:

  • Instancia de Google SecOps.
  • Acceso privilegiado a GitLab.

Configurar feeds

Para configurar un feed, sigue estos pasos:

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Añadir feed.
  3. En la página siguiente, haga clic en Configurar un solo feed.
  4. En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo, Registros de GitLab).
  5. Selecciona Webhook como Tipo de fuente.
  6. Selecciona Gitlab como Tipo de registro.
  7. Haz clic en Siguiente.
  8. Opcional: especifica los valores de los siguientes parámetros de entrada:
    • Delimitador de división: el delimitador que se usa para separar las líneas de registro, como \n.
    • Espacio de nombres de recursos: el espacio de nombres de recursos.
    • Etiquetas de ingestión: la etiqueta aplicada a los eventos de este feed.
  9. Haz clic en Siguiente.
  10. Revise la configuración del feed en la pantalla Finalizar y, a continuación, haga clic en Enviar.
  11. Haz clic en Generar clave secreta para generar una clave secreta que autentique este feed.
  12. Copia y guarda la clave secreta. No podrás volver a ver esta clave secreta. Si es necesario, puedes volver a generar una clave secreta, pero esta acción hará que la clave secreta anterior quede obsoleta.
  13. En la pestaña Detalles, copie la URL del endpoint del feed del campo Información del endpoint. Debes especificar esta URL de endpoint en tu aplicación cliente.
  14. Haz clic en Listo.

Crear una clave de API para la feed de webhook

  1. Ve a la consolaGoogle Cloud > Credenciales.

    Ir a Credenciales

  2. Haz clic en Crear credenciales y, a continuación, selecciona Clave de API.

  3. Restringe el acceso de la clave de API a la API Chronicle.

Especificar la URL del endpoint

  1. En tu aplicación cliente, especifica la URL del endpoint HTTPS proporcionada en el feed de webhook.
  2. Para habilitar la autenticación, especifica la clave de API y la clave secreta como parte del encabezado personalizado con el siguiente formato:

    X-goog-api-key = API_KEY
    X-Webhook-Access-Key = SECRET
    

    Recomendación: Especifica la clave de API como encabezado en lugar de hacerlo en la URL. Si tu cliente de webhook no admite encabezados personalizados, puedes especificar la clave de API y la clave secreta mediante parámetros de consulta con el siguiente formato:

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

Haz los cambios siguientes:

  • ENDPOINT_URL: URL del endpoint del feed.
  • API_KEY: la clave de API para autenticarte en Google Security Operations.
  • SECRET: la clave secreta que has generado para autenticar el feed.

Configurar un webhook en GitLab para Google SecOps

  1. Abre tu navegador web y ve al proyecto de GitLab para el que quieras configurar el webhook.
  2. En tu proyecto, ve a Ajustes > Webhooks.
  3. Haz clic en Añadir webhook.
  4. En el campo URL, pega la URL del endpoint de SecOps de Google.
  5. Haz clic en Añadir encabezado personalizado.
  6. Escribe X-Webhook-Access-Key en el campo Nombre de encabezado.
  7. En el campo Valor del encabezado, copia la clave secreta generada durante la configuración de la feed de Google SecOps.
  8. Haz clic en Añadir encabezado personalizado.
  9. Escribe X-goog-api-key en el campo Nombre del encabezado.
  10. En el campo Valor del encabezado, copia la clave de API generada durante la configuración del feed de Google SecOps. Nota: Para aumentar la seguridad, genera un token secreto y añádelo tanto a la configuración del webhook de GitLab como a la configuración del feed de Google SecOps correspondiente. Esto ayuda a verificar la autenticidad de los webhooks entrantes.
  11. Elige los eventos de GitLab que deberían activar el webhook. Por ejemplo, puede seleccionar Eventos de envío para enviar datos a Google SecOps cada vez que se envíe código al repositorio. Piensa detenidamente qué eventos son relevantes para tus necesidades de monitorización de seguridad. Si hay demasiados eventos, se puede producir una carga innecesaria.
  12. Para entender mejor la finalidad de los webhooks, asígnale un nombre descriptivo, como Webhook de Google SecOps.
  13. Asegúrate de que la casilla Habilitar verificación SSL esté marcada. Esto es fundamental para que la comunicación sea segura.
  14. Haz clic en Añadir webhook para guardar la configuración.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
author_id principal.user.userid Se ha convertido en una cadena.
author_name principal.user.email_addresses Si el valor coincide con una expresión regular de dirección de correo.
author_name principal.user.user_display_name Si el valor no coincide con una expresión regular de dirección de correo electrónico.
details.as principal.resource.attribute.labels Se ha añadido como etiqueta con la clave "as".
details.add principal.resource.attribute.labels Se ha añadido como etiqueta con la clave "add".
details.as principal.user.role_name Valor del campo de registro sin procesar.
details.as principal.user.attribute.roles.type Se asigna el valor "ADMINISTRATOR" si details.as es "Owner", "SERVICE_ACCOUNT" si details.as es "Developer", "Maintainer" o "Reporter", y "TYPE_UNSPECIFIED" si details.as es "Guest".
details.custom_message security_result.description Valor del campo de registro sin procesar.
details.custom_message.action security_result.summary Valor del campo de registro sin procesar.
details.entity_path target.file.full_path Valor del campo de registro sin procesar.
details.target_id target.resource.id Se ha convertido en una cadena.
entity_path target.file.full_path Valor del campo de registro sin procesar.
entity_type target.resource.attribute.labels Se ha añadido como etiqueta con la clave "Tipo de entidad".
event_type metadata.product_event_type Valor del campo de registro sin procesar.
insertId metadata.product_log_id Valor del campo de registro sin procesar.
ip_address principal.ip, principal.asset.ip Valor del campo de registro sin procesar.
jsonPayload.action additional.fields Se añade como un campo con la clave "action" y un valor de cadena.
jsonPayload.controller additional.fields Se añade como un campo con la clave "controller" y un valor de cadena.
jsonPayload.correlation_id principal.asset_id Prefijado con "id: ".
jsonPayload.cpu_s additional.fields Se ha añadido como un campo con la clave "cpu_s" y un valor de cadena.
jsonPayload.details.custom_message.protocol network.application_protocol Se asigna el valor "UNKNOWN_APPLICATION_PROTOCOL" si el valor es "web". De lo contrario, se convierte a mayúsculas. También se añade como campo adicional con la clave "Application Protocol" si el valor es "web".
jsonPayload.mem_total_bytes additional.fields Se ha añadido como un campo con la clave "mem_total_bytes" y un valor de cadena.
jsonPayload.meta_caller_id additional.fields Se añade como un campo con la clave "Caller Id" y un valor de cadena.
jsonPayload.meta_client_id target.user.userid Valor del campo de registro sin procesar.
jsonPayload.meta_feature_category additional.fields Se añade como un campo con la clave "Feature Category" y un valor de cadena.
jsonPayload.meta_remote_ip principal.ip, principal.asset.ip El valor del campo de registro sin procesar, analizado como una matriz JSON y combinado con los campos de IP.
jsonPayload.meta_user principal.user.userid Se usa como alternativa si jsonPayload.username está vacío.
jsonPayload.method network.http.method Valor del campo de registro sin procesar.
jsonPayload.path target.process.file.full_path Valor del campo de registro sin procesar.
jsonPayload.pid target.process.pid Se ha convertido en una cadena.
jsonPayload.remote_ip principal.ip, principal.asset.ip Valor del campo de registro sin procesar.
jsonPayload.request_urgency additional.fields Se añade como un campo con la clave "Request Urgency" y un valor de cadena.
jsonPayload.severity security_result.severity Se asigna el valor "INFORMATIONAL" si el valor es "INFO", "ERROR" si el valor es "ERROR" y "MEDIUM" si el valor es "NOTICE".
jsonPayload.status network.http.response_code Se convierte en un número entero si no es "ACTIVE".
jsonPayload.ua network.http.user_agent Valor del campo de registro sin procesar.
jsonPayload.username principal.user.userid Valor del campo de registro sin procesar.
jsonPayload.worker_id principal.application Valor del campo de registro sin procesar.
labels.instance_name principal.hostname, principal.asset.hostname Valor del campo de registro sin procesar, que se usa si el mensaje contiene "Removing user".
logName security_result.category_details Valor del campo de registro sin procesar.
message security_result.summary Valor del campo de registro sin procesar, que se usa si jsonPayload.severity es "ERROR".
protoPayload.@type additional.fields Se añade como un campo con la clave "protoPayload type" y el valor de cadena.
protoPayload.authenticationInfo.principalEmail principal.user.email_addresses, principal.user.userid Valor del campo de registro sin procesar.
protoPayload.authenticationInfo.principalSubject additional.fields Se añade como un campo con la clave "authenticationInfo principalSubject" y un valor de cadena.
protoPayload.authenticationInfo.serviceAccountKeyName additional.fields Se añade como un campo con la clave "authenticationInfo serviceAccountKeyName" y el valor de cadena.
protoPayload.authorizationInfo target.resource.attribute.labels, security_result.action Los valores de este campo se añaden como etiquetas con claves que empiezan por "authenticationInfo". El valor de security_result.action es "ALLOW" si un valor de granted es true y "BLOCK" si es false. Los campos anidados, como resourceAttributes, también se añaden como etiquetas con claves que tienen el prefijo "authenticationInfo_resourceAttributes".
protoPayload.methodName additional.fields Se ha añadido como un campo con la clave "protoPayload methodName" y el valor de cadena.
protoPayload.request.@type additional.fields Se añade como un campo con la clave "Request Type" y un valor de cadena.
protoPayload.request.resource target.resource.attribute.labels Se ha añadido como etiqueta con la clave "Request resource".
protoPayload.requestMetadata.callerIp additional.fields Se añade como un campo con la clave "requestMetadata callerIp" y un valor de cadena.
protoPayload.requestMetadata.callerSuppliedUserAgent additional.fields Se añade como un campo con la clave "requestMetadata callerSuppliedUserAgent" y un valor de cadena.
protoPayload.serviceName additional.fields Se ha añadido como un campo con la clave "serviceName" y un valor de cadena.
protoPayload.status.code additional.fields Se ha añadido como un campo con la clave "protoPayload status code" y un valor de cadena.
protoPayload.status.message additional.fields, target.user.email_addresses, target.user.userid Se añade como un campo con la clave "protoPayload status message" y el valor de cadena. Si se puede extraer una dirección de correo del mensaje, se añade a target.user.email_addresses y target.user.userid.
receiveTimestamp metadata.event_timestamp, timestamp Se analiza como la marca de tiempo del evento.
resource.labels.project_id target.resource.attribute.labels Se ha añadido como etiqueta con la clave "Project id".
resource.labels.zone target.cloud.availability_zone Valor del campo de registro sin procesar.
resource.type target.cloud.environment Se define como "GOOGLE_CLOUD_PLATFORM" si el valor coincide con "gce".
security_result.action security_result.action Derivado de protoPayload.authorizationInfo.granted.
security_result.category_details security_result.category_details Se ha combinado con logName.
security_result.description security_result.description Derivado de jsonPayload.details.custom_message.
security_result.severity security_result.severity Derivado de severity o jsonPayload.severity.
security_result.summary security_result.summary Derivado de jsonPayload.details.custom_message.action o jsonPayload.message.
severity security_result.severity Se asigna el valor "INFORMATIONAL" si el valor es "INFO", "ERROR" si el valor es "ERROR" y "MEDIUM" si el valor es "NOTICE".
sourceLocation principal.resource.attribute.labels Los valores de este campo se añaden como etiquetas.
target_details target.resource.attribute.labels Se añade como etiqueta con la clave "Target Details".
target_type target.resource.attribute.labels Se ha añadido como etiqueta con la clave "target type".
timestamp timestamp Valor del campo de registro sin procesar. Se define en función de la presencia de los campos principal y de destino. Si no se cumple ninguna condición específica, el valor predeterminado es "GENERIC_EVENT". Los valores posibles son "USER_RESOURCE_UPDATE_CONTENT", "USER_RESOURCE_ACCESS" y "USER_UNCATEGORIZED". Selecciona "GITLAB". Selecciona "GITLAB".

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.