Recolha registos do GitLab

Compatível com:

Vista geral

Este analisador extrai campos dos registos JSON do GitLab, normaliza-os no modelo de dados unificado (UDM) e enriquece os dados com contexto adicional. Processa vários tipos de eventos do GitLab, focando-se nas ações dos utilizadores, no acesso aos recursos e nos resultados de segurança, ao mesmo tempo que processa informações relacionadas com a rede e a aplicação. O analisador também executa lógica com base em funções e ações no GitLab, categorizando eventos e atribuindo gravidades adequadas.

Antes de começar

Certifique-se de que tem os seguintes pré-requisitos:

  • Instância do Google SecOps.
  • Acesso privilegiado ao GitLab.

Configure feeds

Para configurar um feed, siga estes passos:

  1. Aceda a Definições do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Na página seguinte, clique em Configurar um único feed.
  4. No campo Nome do feed, introduza um nome para o feed (por exemplo, Registos do GitLab).
  5. Selecione Webhook como o Tipo de origem.
  6. Selecione Gitlab como o Tipo de registo.
  7. Clicar em Seguinte.
  8. Opcional: especifique valores para os seguintes parâmetros de entrada:
    • Delimitador de divisão: o delimitador usado para separar linhas de registo, como \n.
    • Espaço de nomes do recurso: o espaço de nomes do recurso.
    • Etiquetas de carregamento: a etiqueta aplicada aos eventos deste feed.
  9. Clicar em Seguinte.
  10. Reveja a configuração do feed no ecrã Finalizar e, de seguida, clique em Enviar.
  11. Clique em Gerar chave secreta para gerar uma chave secreta para autenticar este feed.
  12. Copie e armazene a chave secreta. Não pode ver esta chave secreta novamente. Se necessário, pode regenerar uma nova chave secreta, mas esta ação torna a chave secreta anterior obsoleta.
  13. No separador Detalhes, copie o URL do ponto final do feed do campo Informações do ponto final. Tem de especificar este URL do ponto final na sua aplicação cliente.
  14. Clique em Concluído.

Crie uma chave da API para o feed de webhook

  1. Aceda à Google Cloud consola > Credenciais.

    Aceder a Credenciais

  2. Clique em Criar credenciais e, de seguida, selecione Chave de API.

  3. Restrinja o acesso da chave da API à API Chronicle.

Especifique o URL do ponto final

  1. Na aplicação cliente, especifique o URL do ponto final HTTPS fornecido no feed do webhook.
  2. Ative a autenticação especificando a chave da API e a chave secreta como parte do cabeçalho personalizado no seguinte formato:

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

    Recomendação: especifique a chave da API como um cabeçalho em vez de a especificar no URL. Se o seu cliente de webhook não suportar cabeçalhos personalizados, pode especificar a chave da API e a chave secreta através de parâmetros de consulta no seguinte formato:

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

Substitua o seguinte:

  • ENDPOINT_URL: o URL do ponto final do feed.
  • API_KEY: a chave da API para autenticar no Google Security Operations.
  • SECRET: a chave secreta que gerou para autenticar o feed.

Configure um webhook no GitLab para o Google SecOps

  1. Abra o navegador de Internet e aceda ao projeto do GitLab para o qual quer configurar o webhook.
  2. No seu projeto, aceda a Definições > Webhooks.
  3. Clique em Adicionar novo webhook.
  4. No campo URL, cole o URL do ponto final do Google SecOps.
  5. Clique em Adicionar cabeçalho personalizado.
  6. Escreva X-Webhook-Access-Key no campo Nome do cabeçalho.
  7. No campo Valor do cabeçalho, copie a chave secreta gerada durante a configuração do feed do Google SecOps.
  8. Clique em Adicionar cabeçalho personalizado.
  9. Escreva X-goog-api-key no campo Nome do cabeçalho.
  10. No campo Valor do cabeçalho, copie a chave da API gerada durante a configuração do feed do Google SecOps. Nota: para maior segurança, gere um token secreto e adicione-o à configuração do webhook do GitLab e à configuração do feed do Google SecOps correspondente. Isto ajuda a validar a autenticidade dos webhooks recebidos.
  11. Escolha os eventos do GitLab que devem acionar o webhook. Por exemplo, pode selecionar Enviar eventos para enviar dados para o Google SecOps sempre que o código for enviado para o repositório. Considere cuidadosamente que eventos são relevantes para as suas necessidades de monitorização de segurança. Demasiados eventos podem levar a um carregamento desnecessário.
  12. Para compreender melhor a finalidade dos webhooks, atribua-lhe um nome significativo, como Webhook do Google SecOps.
  13. Certifique-se de que a caixa de verificação Ativar validação SSL está selecionada. Isto é fundamental para uma comunicação segura.
  14. Clique em Adicionar webhook para guardar a configuração.

Tabela de mapeamento da UDM

Campo de registo Mapeamento de UDM Lógica
author_id principal.user.userid Convertido em string.
author_name principal.user.email_addresses Se o valor corresponder a uma regex de endereço de email.
author_name principal.user.user_display_name Se o valor não corresponder a uma regex de endereço de email.
details.as principal.resource.attribute.labels Adicionado como uma etiqueta com a chave "as".
details.add principal.resource.attribute.labels Adicionado como uma etiqueta com a chave "add".
details.as principal.user.role_name O valor do campo de registo não processado.
details.as principal.user.attribute.roles.type Definido como "ADMINISTRATOR" se details.as for "Owner", "SERVICE_ACCOUNT" se details.as for "Developer", "Maintainer" ou "Reporter" e "TYPE_UNSPECIFIED" se details.as for "Guest".
details.custom_message security_result.description O valor do campo de registo não processado.
details.custom_message.action security_result.summary O valor do campo de registo não processado.
details.entity_path target.file.full_path O valor do campo de registo não processado.
details.target_id target.resource.id Convertido em string.
entity_path target.file.full_path O valor do campo de registo não processado.
entity_type target.resource.attribute.labels Adicionado como uma etiqueta com a chave "Tipo de entidade".
event_type metadata.product_event_type O valor do campo de registo não processado.
insertId metadata.product_log_id O valor do campo de registo não processado.
ip_address principal.ip, principal.asset.ip O valor do campo de registo não processado.
jsonPayload.action additional.fields Adicionado como um campo com a chave "action" e o valor de string.
jsonPayload.controller additional.fields Adicionado como um campo com a chave "controller" e o valor de string.
jsonPayload.correlation_id principal.asset_id Com o prefixo "id: ".
jsonPayload.cpu_s additional.fields Adicionado como um campo com a chave "cpu_s" e o valor de string.
jsonPayload.details.custom_message.protocol network.application_protocol Definido como "UNKNOWN_APPLICATION_PROTOCOL" se o valor for "web". Caso contrário, é convertido em maiúsculas. Também é adicionado como um campo adicional com a chave "Application Protocol" se o valor for "web".
jsonPayload.mem_total_bytes additional.fields Adicionado como um campo com a chave "mem_total_bytes" e o valor de string.
jsonPayload.meta_caller_id additional.fields Adicionado como um campo com a chave "Caller Id" e o valor de string.
jsonPayload.meta_client_id target.user.userid O valor do campo de registo não processado.
jsonPayload.meta_feature_category additional.fields Adicionado como um campo com a chave "Feature Category" e o valor de string.
jsonPayload.meta_remote_ip principal.ip, principal.asset.ip O valor do campo de registo não processado, analisado como uma matriz JSON e unido aos campos de IP.
jsonPayload.meta_user principal.user.userid Usado como alternativa se jsonPayload.username estiver vazio.
jsonPayload.method network.http.method O valor do campo de registo não processado.
jsonPayload.path target.process.file.full_path O valor do campo de registo não processado.
jsonPayload.pid target.process.pid Convertido em string.
jsonPayload.remote_ip principal.ip, principal.asset.ip O valor do campo de registo não processado.
jsonPayload.request_urgency additional.fields Adicionado como um campo com a chave "Urgência do pedido" e o valor de string.
jsonPayload.severity security_result.severity Definido como "INFORMATIONAL" se o valor for "INFO", "ERROR" se o valor for "ERROR" e "MEDIUM" se o valor for "NOTICE".
jsonPayload.status network.http.response_code Convertido em número inteiro se não for "ACTIVE".
jsonPayload.ua network.http.user_agent O valor do campo de registo não processado.
jsonPayload.username principal.user.userid O valor do campo de registo não processado.
jsonPayload.worker_id principal.application O valor do campo de registo não processado.
labels.instance_name principal.hostname, principal.asset.hostname O valor do campo de registo não processado, usado se a mensagem contiver "Removing user" (A remover utilizador).
logName security_result.category_details O valor do campo de registo não processado.
message security_result.summary O valor do campo de registo não processado, usado se jsonPayload.severity for "ERROR".
protoPayload.@type additional.fields Adicionado como um campo com a chave "protoPayload type" e o valor de string.
protoPayload.authenticationInfo.principalEmail principal.user.email_addresses, principal.user.userid O valor do campo de registo não processado.
protoPayload.authenticationInfo.principalSubject additional.fields Adicionado como um campo com a chave "authenticationInfo principalSubject" e o valor de string.
protoPayload.authenticationInfo.serviceAccountKeyName additional.fields Adicionado como um campo com a chave "authenticationInfo serviceAccountKeyName" e o valor da string.
protoPayload.authorizationInfo target.resource.attribute.labels, security_result.action Os valores neste campo são adicionados como etiquetas com chaves com o prefixo "authenticationInfo". O valor security_result.action é definido como "ALLOW" (PERMITIR) se um valor em granted for verdadeiro e "BLOCK" (BLOQUEAR) se for falso. Os campos aninhados, como resourceAttributes, também são adicionados como etiquetas com chaves com o prefixo "authenticationInfo_resourceAttributes".
protoPayload.methodName additional.fields Adicionado como um campo com a chave "protoPayload methodName" e o valor de string.
protoPayload.request.@type additional.fields Adicionado como um campo com a chave "Tipo de pedido" e o valor de string.
protoPayload.request.resource target.resource.attribute.labels Adicionado como uma etiqueta com a chave "Request resource".
protoPayload.requestMetadata.callerIp additional.fields Adicionado como um campo com a chave "requestMetadata callerIp" e o valor de string.
protoPayload.requestMetadata.callerSuppliedUserAgent additional.fields Adicionado como um campo com a chave "requestMetadata callerSuppliedUserAgent" e o valor de string.
protoPayload.serviceName additional.fields Adicionado como um campo com a chave "serviceName" e o valor de string.
protoPayload.status.code additional.fields Adicionado como um campo com a chave "protoPayload status code" e o valor de string.
protoPayload.status.message additional.fields, target.user.email_addresses, target.user.userid Adicionado como um campo com a chave "protoPayload status message" e o valor de string. Se for possível extrair um endereço de email da mensagem, este é adicionado a target.user.email_addresses e target.user.userid.
receiveTimestamp metadata.event_timestamp, timestamp Analisado como a data/hora do evento.
resource.labels.project_id target.resource.attribute.labels Adicionado como uma etiqueta com a chave "Project id".
resource.labels.zone target.cloud.availability_zone O valor do campo de registo não processado.
resource.type target.cloud.environment Definido como "GOOGLE_CLOUD_PLATFORM" se o valor corresponder a "gce".
security_result.action security_result.action Derivado de protoPayload.authorizationInfo.granted.
security_result.category_details security_result.category_details Unido a logName.
security_result.description security_result.description Derivado de jsonPayload.details.custom_message.
security_result.severity security_result.severity Derivados de severity ou jsonPayload.severity.
security_result.summary security_result.summary Derivados de jsonPayload.details.custom_message.action ou jsonPayload.message.
severity security_result.severity Definido como "INFORMATIONAL" se o valor for "INFO", "ERROR" se o valor for "ERROR" e "MEDIUM" se o valor for "NOTICE".
sourceLocation principal.resource.attribute.labels Os valores neste campo são adicionados como etiquetas.
target_details target.resource.attribute.labels Adicionado como uma etiqueta com a chave "Detalhes do alvo".
target_type target.resource.attribute.labels Adicionado como uma etiqueta com a chave "target type".
timestamp timestamp O valor do campo de registo não processado. Definido com base na presença de campos principais e de destino. A predefinição é "GENERIC_EVENT" se não for cumprida nenhuma condição específica. Os valores possíveis são "USER_RESOURCE_UPDATE_CONTENT", "USER_RESOURCE_ACCESS", "USER_UNCATEGORIZED". Definido como "GITLAB". Definido como "GITLAB".

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.