Recoger registros de GitLab
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:
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Añadir feed.
- En la página siguiente, haga clic en Configurar un solo feed.
- En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo, Registros de GitLab).
- Selecciona Webhook como Tipo de fuente.
- Selecciona Gitlab como Tipo de registro.
- Haz clic en Siguiente.
- 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.
- Delimitador de división: el delimitador que se usa para separar las líneas de registro, como
- Haz clic en Siguiente.
- Revise la configuración del feed en la pantalla Finalizar y, a continuación, haga clic en Enviar.
- Haz clic en Generar clave secreta para generar una clave secreta que autentique este feed.
- 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.
- 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.
- Haz clic en Listo.
Crear una clave de API para la feed de webhook
Ve a la consolaGoogle Cloud > Credenciales.
Haz clic en Crear credenciales y, a continuación, selecciona Clave de API.
Restringe el acceso de la clave de API a la API Chronicle.
Especificar la URL del endpoint
- En tu aplicación cliente, especifica la URL del endpoint HTTPS proporcionada en el feed de webhook.
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
- Abre tu navegador web y ve al proyecto de GitLab para el que quieras configurar el webhook.
- En tu proyecto, ve a Ajustes > Webhooks.
- Haz clic en Añadir webhook.
- En el campo URL, pega la URL del endpoint de SecOps de Google.
- Haz clic en Añadir encabezado personalizado.
- Escribe X-Webhook-Access-Key en el campo Nombre de encabezado.
- En el campo Valor del encabezado, copia la clave secreta generada durante la configuración de la feed de Google SecOps.
- Haz clic en Añadir encabezado personalizado.
- Escribe X-goog-api-key en el campo Nombre del encabezado.
- 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.
- 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.
- Para entender mejor la finalidad de los webhooks, asígnale un nombre descriptivo, como Webhook de Google SecOps.
- Asegúrate de que la casilla Habilitar verificación SSL esté marcada. Esto es fundamental para que la comunicación sea segura.
- 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.