Coletar registros do GitLab

Compatível com:

Visão geral

Esse analisador extrai campos dos registros JSON do GitLab, normaliza-os no modelo de dados unificado (UDM) e enriquece os dados com contexto adicional. Ele processa vários tipos de eventos do GitLab, com foco em ações do usuário, acesso a recursos e resultados de segurança, além de informações relacionadas à rede e ao aplicativo. O analisador também realiza a lógica com base em funções e ações no GitLab, categorizando eventos e atribuindo gravidades adequadas.

Antes de começar

Verifique se você atende aos seguintes pré-requisitos:

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

Configurar feeds

Há dois pontos de entrada diferentes para configurar feeds na plataforma do Google SecOps:

  • Configurações do SIEM > Feeds
  • Central de conteúdo > Pacotes de conteúdo

Configure feeds em "Configurações do SIEM" > "Feeds".

Para configurar um feed, siga estas etapas:

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Na próxima página, clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, Registros do GitLab).
  5. Selecione Webhook como o Tipo de origem.
  6. Selecione Gitlab como o Tipo de registro.
  7. Clique em Próxima.
  8. Opcional: especifique valores para os seguintes parâmetros de entrada:
    • Delimitador de divisão: o delimitador usado para separar linhas de registro, como \n.
    • Namespace do recurso: o namespace do recurso.
    • Rótulos de ingestão: o rótulo aplicado aos eventos deste feed.
  9. Clique em Próxima.
  10. Revise a configuração do feed na tela Finalizar e clique em Enviar.
  11. Clique em Gerar chave secreta para autenticar o feed.
  12. Copie e armazene a chave secreta. Não é possível ver essa chave secreta novamente. Se necessário, você pode gerar uma nova chave secreta, mas isso torna a anterior obsoleta.
  13. Na guia Detalhes, copie o URL do endpoint do feed no campo Informações do endpoint. É necessário especificar esse URL de endpoint no aplicativo cliente.
  14. Clique em Concluído.

Configurar feeds na Central de conteúdo

Especifique valores para os seguintes campos:

  • Delimitador de divisão: o delimitador usado para separar linhas de registro, como \n.

Opções avançadas

  • Nome do feed: um valor pré-preenchido que identifica o feed.
  • Tipo de origem: método usado para coletar registros no Google SecOps.
  • Namespace do recurso: namespace associado ao feed.
  • Rótulos de ingestão: rótulos aplicados a todos os eventos deste feed.

  • Clique em Gerar chave secreta para autenticar o feed.

  • Copie e armazene a chave secreta. Não é possível ver essa chave secreta novamente. Se necessário, você pode gerar uma nova chave secreta, mas isso torna a anterior obsoleta.

  • Na guia Detalhes, copie o URL do endpoint do feed no campo Informações do endpoint. É necessário especificar esse URL de endpoint no aplicativo cliente.

Criar uma chave de API para o feed de webhook

  1. Acesse console doGoogle Cloud > Credenciais.

    Ir para Credenciais

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

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

Especifique o URL do endpoint

  1. No aplicativo cliente, especifique o URL do endpoint HTTPS fornecido no feed do webhook.
  2. Ative a autenticação especificando a chave de 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 de API como um cabeçalho em vez de no URL. Se o cliente de webhook não aceitar cabeçalhos personalizados, especifique a chave de API e a chave secreta usando parâmetros de consulta no seguinte formato:

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

Substitua:

  • ENDPOINT_URL: o URL do endpoint do feed.
  • API_KEY: a chave de API para autenticar no Google Security Operations.
  • SECRET: a chave secreta gerada para autenticar o feed.

Configurar um webhook no GitLab para o Google SecOps

  1. Abra seu navegador da Web e acesse o projeto do GitLab em que você quer configurar o webhook.
  2. No seu projeto, acesse Configurações > Webhooks.
  3. Clique em Adicionar novo webhook.
  4. No campo URL, cole o URL do endpoint do Google SecOps.
  5. Clique em Adicionar cabeçalho personalizado.
  6. Digite 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. Digite X-goog-api-key no campo Nome do cabeçalho.
  10. No campo Valor do cabeçalho, copie a chave de API gerada durante a configuração do feed do Google SecOps. Observação: para aumentar a segurança, gere um token secreto e adicione-o à configuração do webhook do GitLab e à configuração correspondente do feed do Google SecOps. Isso ajuda a verificar a autenticidade dos webhooks recebidos.
  11. Escolha os eventos do GitLab que vão acionar o webhook. Por exemplo, você pode selecionar Enviar eventos para enviar dados ao Google SecOps sempre que o código for enviado ao repositório. Considere com cuidado quais eventos são relevantes para suas necessidades de monitoramento de segurança. O excesso de eventos pode causar uma carga desnecessária.
  12. Para entender melhor a finalidade dos webhooks, dê um nome significativo a eles, como Webhook do Google SecOps.
  13. Verifique se a caixa de seleção Ativar verificação SSL está marcada. Isso é essencial para uma comunicação segura.
  14. Clique em Adicionar webhook para salvar sua configuração.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
author_id principal.user.userid Convertido em string.
author_name principal.user.email_addresses Se o valor corresponder a uma expressão regular de endereço de e-mail.
author_name principal.user.user_display_name Se o valor não corresponder a uma expressão regular de endereço de e-mail.
details.as principal.resource.attribute.labels Adicionado como um rótulo com a chave "as".
details.add principal.resource.attribute.labels Adicionado como um rótulo com a chave "add".
details.as principal.user.role_name O valor do campo de registro bruto.
details.as principal.user.attribute.roles.type Definido como "ADMINISTRATOR" se details.as for "Proprietário", "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 registro bruto.
details.custom_message.action security_result.summary O valor do campo de registro bruto.
details.entity_path target.file.full_path O valor do campo de registro bruto.
details.target_id target.resource.id Convertido em string.
entity_path target.file.full_path O valor do campo de registro bruto.
entity_type target.resource.attribute.labels Adicionado como um rótulo com a chave "Tipo de entidade".
event_type metadata.product_event_type O valor do campo de registro bruto.
insertId metadata.product_log_id O valor do campo de registro bruto.
ip_address principal.ip, principal.asset.ip O valor do campo de registro bruto.
jsonPayload.action additional.fields Adicionado como um campo com a chave "action" e valor de string.
jsonPayload.controller additional.fields Adicionado como um campo com a chave "controller" e valor de string.
jsonPayload.correlation_id principal.asset_id Prefixo "id: ".
jsonPayload.cpu_s additional.fields Adicionado como um campo com a chave "cpu_s" e valor de string.
jsonPayload.details.custom_message.protocol network.application_protocol Definido como "UNKNOWN_APPLICATION_PROTOCOL" se o valor for "web". Caso contrário, será convertido para maiúsculas. Também adicionado como um campo extra com a chave "Protocolo de aplicativo" se o valor for "web".
jsonPayload.mem_total_bytes additional.fields Adicionado como um campo com a chave "mem_total_bytes" e valor de string.
jsonPayload.meta_caller_id additional.fields Adicionado como um campo com a chave "Caller Id" e valor de string.
jsonPayload.meta_client_id target.user.userid O valor do campo de registro bruto.
jsonPayload.meta_feature_category additional.fields Adicionado como um campo com a chave "Categoria do recurso" e valor de string.
jsonPayload.meta_remote_ip principal.ip, principal.asset.ip O valor do campo de registro bruto, analisado como uma matriz JSON e mesclado aos campos de IP.
jsonPayload.meta_user principal.user.userid Usado como substituto se jsonPayload.username estiver vazio.
jsonPayload.method network.http.method O valor do campo de registro bruto.
jsonPayload.path target.process.file.full_path O valor do campo de registro bruto.
jsonPayload.pid target.process.pid Convertido em string.
jsonPayload.remote_ip principal.ip, principal.asset.ip O valor do campo de registro bruto.
jsonPayload.request_urgency additional.fields Adicionado como um campo com a chave "Urgência da solicitação" e 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 para inteiro se não for "ACTIVE".
jsonPayload.ua network.http.user_agent O valor do campo de registro bruto.
jsonPayload.username principal.user.userid O valor do campo de registro bruto.
jsonPayload.worker_id principal.application O valor do campo de registro bruto.
labels.instance_name principal.hostname, principal.asset.hostname O valor bruto do campo de registro, usado se a mensagem contiver "Removendo usuário".
logName security_result.category_details O valor do campo de registro bruto.
message security_result.summary O valor bruto do campo de registro, usado se jsonPayload.severity for "ERROR".
protoPayload.@type additional.fields Adicionado como um campo com a chave "protoPayload type" e valor de string.
protoPayload.authenticationInfo.principalEmail principal.user.email_addresses, principal.user.userid O valor do campo de registro bruto.
protoPayload.authenticationInfo.principalSubject additional.fields Adicionado como um campo com a chave "authenticationInfo principalSubject" e valor de string.
protoPayload.authenticationInfo.serviceAccountKeyName additional.fields Adicionado como um campo com a chave "authenticationInfo serviceAccountKeyName" e valor de string.
protoPayload.authorizationInfo target.resource.attribute.labels, security_result.action Os valores nesse campo são adicionados como rótulos com chaves prefixadas com "authenticationInfo". O security_result.action é definido como "ALLOW" se um valor em granted for verdadeiro e "BLOCK" se for falso. Campos aninhados, como resourceAttributes, também são adicionados como rótulos com chaves prefixadas com "authenticationInfo_resourceAttributes".
protoPayload.methodName additional.fields Adicionado como um campo com a chave "protoPayload methodName" e valor de string.
protoPayload.request.@type additional.fields Adicionado como um campo com a chave "Request Type" e valor de string.
protoPayload.request.resource target.resource.attribute.labels Adicionado como um rótulo com a chave "Recurso de solicitação".
protoPayload.requestMetadata.callerIp additional.fields Adicionado como um campo com a chave "requestMetadata callerIp" e valor de string.
protoPayload.requestMetadata.callerSuppliedUserAgent additional.fields Adicionado como um campo com a chave "requestMetadata callerSuppliedUserAgent" e valor de string.
protoPayload.serviceName additional.fields Adicionado como um campo com a chave "serviceName" e valor de string.
protoPayload.status.code additional.fields Adicionado como um campo com a chave "protoPayload status code" e 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 valor de string. Se um endereço de e-mail puder ser extraído da mensagem, ele será adicionado a target.user.email_addresses e target.user.userid.
receiveTimestamp metadata.event_timestamp, timestamp Analisado como o carimbo de data/hora do evento.
resource.labels.project_id target.resource.attribute.labels Adicionado como um rótulo com a chave "Project id".
resource.labels.zone target.cloud.availability_zone O valor do campo de registro bruto.
resource.type target.cloud.environment Defina 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 Mesclado com logName.
security_result.description security_result.description Derivado de jsonPayload.details.custom_message.
security_result.severity security_result.severity Derivado de severity ou jsonPayload.severity.
security_result.summary security_result.summary Derivado 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 nesse campo são adicionados como rótulos.
target_details target.resource.attribute.labels Adicionado como um rótulo com a chave "Detalhes da segmentação".
target_type target.resource.attribute.labels Adicionado como um rótulo com a chave "target type".
timestamp timestamp O valor do campo de registro bruto. Definido com base na presença dos campos principal e de destino. O padrão é "GENERIC_EVENT" se nenhuma condição específica for atendida. Os valores possíveis são "USER_RESOURCE_UPDATE_CONTENT", "USER_RESOURCE_ACCESS" e "USER_UNCATEGORIZED". Defina como "GITLAB". Defina como "GITLAB".

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