Recolha registos do GitLab
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:
- Aceda a Definições do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na página seguinte, clique em Configurar um único feed.
- No campo Nome do feed, introduza um nome para o feed (por exemplo, Registos do GitLab).
- Selecione Webhook como o Tipo de origem.
- Selecione Gitlab como o Tipo de registo.
- Clicar em Seguinte.
- 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.
- Delimitador de divisão: o delimitador usado para separar linhas de registo, como
- Clicar em Seguinte.
- Reveja a configuração do feed no ecrã Finalizar e, de seguida, clique em Enviar.
- Clique em Gerar chave secreta para gerar uma chave secreta para autenticar este feed.
- 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.
- 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.
- Clique em Concluído.
Crie uma chave da API para o feed de webhook
Aceda à Google Cloud consola > Credenciais.
Clique em Criar credenciais e, de seguida, selecione Chave de API.
Restrinja o acesso da chave da API à API Chronicle.
Especifique o URL do ponto final
- Na aplicação cliente, especifique o URL do ponto final HTTPS fornecido no feed do webhook.
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
- Abra o navegador de Internet e aceda ao projeto do GitLab para o qual quer configurar o webhook.
- No seu projeto, aceda a Definições > Webhooks.
- Clique em Adicionar novo webhook.
- No campo URL, cole o URL do ponto final do Google SecOps.
- Clique em Adicionar cabeçalho personalizado.
- Escreva X-Webhook-Access-Key no campo Nome do cabeçalho.
- No campo Valor do cabeçalho, copie a chave secreta gerada durante a configuração do feed do Google SecOps.
- Clique em Adicionar cabeçalho personalizado.
- Escreva X-goog-api-key no campo Nome do cabeçalho.
- 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.
- 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.
- Para compreender melhor a finalidade dos webhooks, atribua-lhe um nome significativo, como Webhook do Google SecOps.
- Certifique-se de que a caixa de verificação Ativar validação SSL está selecionada. Isto é fundamental para uma comunicação segura.
- 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.