Recolha registos de auditoria do GitHub

Compatível com:

Vista geral

Este analisador processa registos de auditoria do GitHub no formato JSON. Limpa a entrada removendo vários campos, executa várias operações grok e de valor-chave com base no campo process_type para extrair informações relevantes, mapeia os campos extraídos para o UDM e estrutura a saída para carregamento do Google SecOps. Também processa casos extremos específicos e realiza transformações de dados para diferentes subtipos de registos nos registos de auditoria do GitHub.

Antes de começar

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

  • Instância do Google SecOps.
  • Acesso privilegiado a repositórios do GitHub.

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 GitHub).
  5. Selecione Webhook como o Tipo de origem.
  6. Selecione GitHub 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.
  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 de API à API Google Security Operations.

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.

Crie um webhook no GitHub

Este guia fornece instruções passo a passo para criar um webhook no GitHub para enviar dados para o Google SecOps.

  1. Navegue para o seu repositório do GitHub.
  2. Aceda a Definições.
  3. Clique em Webhooks.
  4. Clique em Adicionar webhook.
  5. No campo URL de carga útil, introduza o URL do ponto final da API Google SecOps.
  6. Selecione application/json como o Tipo de conteúdo.

    Opcional: para maior segurança, defina um segredo. Isto gera uma assinatura para payloads de webhook, o que lhe permite verificar a respetiva autenticidade no lado do Google SecOps. Se usar um segredo, configure-o também no feed do Google SecOps.

  7. Escolha os eventos que acionam o webhook. Para um registo abrangente, selecione Permitir-me selecionar eventos individuais e selecione os eventos relevantes (por exemplo, Push, Pedido de obtenção, Problema). Se não tiver a certeza, comece com Apenas o evento push.

  8. Certifique-se de que a caixa de verificação Ativo está selecionada.

  9. Clique em Adicionar webhook para guardar a configuração.

Tabela de mapeamento da UDM

Campo de registo Mapeamento de UDM Lógica
_document_id read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value O _document_id do registo não processado é mapeado para um par de chave-valor na matriz additional.fields no UDM.
action read_only_udm.metadata.product_event_type, read_only_udm.security_result.summary O campo action está mapeado para product_event_type nos metadados e summary no security_result.
actor read_only_udm.principal.user.userid O campo actor, que representa o utilizador que realiza a ação, é mapeado para principal.user.userid.
actor_id read_only_udm.principal.user.attribute.labels.[].key, read_only_udm.principal.user.attribute.labels.[].value O actor_id é mapeado como uma etiqueta na matriz principal.user.attribute.labels.
actor_ip read_only_udm.principal.ip O endereço IP do ator está mapeado para principal.ip.
actor_location.country_code read_only_udm.principal.location.country_or_region O código do país do ator está mapeado para principal.location.country_or_region.
application_name read_only_udm.target.application O nome da aplicação está mapeado para target.application.
business read_only_udm.target.user.company_name, read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value O nome da empresa é mapeado para target.user.company_name e como um par chave-valor em additional.fields.
business_id read_only_udm.target.resource.attribute.labels.[].key, read_only_udm.target.resource.attribute.labels.[].value O ID da empresa é mapeado como uma etiqueta na matriz target.resource.attribute.labels.
config.url read_only_udm.target.url O URL de configuração está mapeado para target.url.
created_at read_only_udm.metadata.event_timestamp A data/hora created_at é convertida para o formato adequado e mapeada para metadata.event_timestamp.
data.cancelled_at read_only_udm.extensions.vulns.vulnerabilities.scan_end_time A data/hora data.cancelled_at é convertida e mapeada para extensions.vulns.vulnerabilities.scan_end_time.
data.email read_only_udm.target.email O endereço de email do campo de dados está mapeado para target.email.
data.event read_only_udm.security_result.about.labels.[].key, read_only_udm.security_result.about.labels.[].value O evento do campo de dados é mapeado como uma etiqueta na matriz security_result.about.labels.
data.events read_only_udm.security_result.about.labels.[].key, read_only_udm.security_result.about.labels.[].value Os eventos do campo de dados são mapeados como etiquetas na matriz security_result.about.labels.
data.head_branch read_only_udm.security_result.about.labels.[].key, read_only_udm.security_result.about.labels.[].value O ramo principal do campo de dados é mapeado como uma etiqueta na matriz security_result.about.labels.
data.head_sha read_only_udm.target.file.sha256 O SHA do cabeçalho do campo de dados está mapeado para target.file.sha256.
data.hook_id read_only_udm.target.resource.attribute.labels.[].key, read_only_udm.target.resource.attribute.labels.[].value O ID do gancho do campo de dados é mapeado como uma etiqueta na matriz target.resource.attribute.labels.
data.started_at read_only_udm.extensions.vulns.vulnerabilities.scan_start_time A data/hora data.started_at é convertida e mapeada para extensions.vulns.vulnerabilities.scan_start_time.
data.team read_only_udm.target.user.group_identifiers A equipa do campo de dados é mapeada para target.user.group_identifiers.
data.trigger_id read_only_udm.security_result.about.labels.[].key, read_only_udm.security_result.about.labels.[].value O ID do acionador do campo de dados é mapeado como uma etiqueta na matriz security_result.about.labels.
data.workflow_id read_only_udm.security_result.about.labels.[].key, read_only_udm.security_result.about.labels.[].value O ID do fluxo de trabalho do campo de dados é mapeado como uma etiqueta na matriz security_result.about.labels.
data.workflow_run_id read_only_udm.security_result.about.labels.[].key, read_only_udm.security_result.about.labels.[].value O ID de execução do fluxo de trabalho do campo de dados é mapeado como uma etiqueta na matriz security_result.about.labels.
enterprise.name read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value O nome da empresa é mapeado como um par de chave-valor em additional.fields.
external_identity_nameid read_only_udm.target.user.userid, read_only_udm.target.user.email_addresses Se o external_identity_nameid for um endereço de email, a parte do nome de utilizador é extraída e mapeada para target.user.userid, e o email completo é adicionado a target.user.email_addresses. Caso contrário, todo o valor é mapeado para target.user.userid.
external_identity_username read_only_udm.target.user.user_display_name O nome de utilizador da identidade externa está mapeado para target.user.user_display_name.
hashed_token read_only_udm.network.session_id O token com hash está mapeado para network.session_id.
org read_only_udm.target.administrative_domain A organização está mapeada para target.administrative_domain.
org_id read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value O ID da organização é mapeado como um par de chave-valor em additional.fields.
programmatic_access_type read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value O tipo de acesso programático é mapeado como um par de chave-valor em additional.fields.
public_repo read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value, read_only_udm.target.location.name O valor public_repo determina o valor mapeado para um par de chave-valor em additional.fields e target.location.name. "false" é mapeado para "PRIVATE" e outros valores são mapeados para "PUBLIC".
query_string read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value A string de consulta é mapeada como um par de chave-valor em additional.fields.
rate_limit_remaining read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value O limite de taxa restante é mapeado como um par de chave-valor em additional.fields.
repo read_only_udm.target.resource.name O repositório está mapeado para target.resource.name.
repo_id read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value O ID do repositório é mapeado como um par de chave-valor em additional.fields.
repository_public read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value A flag pública do repositório é mapeada como um par de chave-valor em additional.fields.
request_body read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value O corpo do pedido é mapeado como um par de chave-valor em additional.fields.
request_method read_only_udm.network.http.method O método de pedido é convertido em maiúsculas e mapeado para network.http.method.
route read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value A rota é mapeada como um par de chave-valor em additional.fields.
status_code read_only_udm.network.http.response_code O código de estado é convertido num número inteiro e mapeado para network.http.response_code.
token_id read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value O ID da chave é mapeado como um par de chave-valor em additional.fields.
token_scopes read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value Os âmbitos dos tokens são mapeados como um par de chave-valor em additional.fields.
transport_protocol_name read_only_udm.network.application_protocol O nome do protocolo de transporte é convertido em maiúsculas e mapeado para network.application_protocol.
url_path read_only_udm.target.url O caminho do URL está mapeado para target.url.
user read_only_udm.target.user.user_display_name O utilizador está mapeado para target.user.user_display_name.
user_agent read_only_udm.network.http.user_agent, read_only_udm.network.http.parsed_user_agent O agente do utilizador é mapeado para network.http.user_agent e a respetiva versão analisada é mapeada para network.http.parsed_user_agent.
user_id read_only_udm.target.user.userid O ID do utilizador está mapeado para target.user.userid.
workflow.name read_only_udm.security_result.about.labels.[].key, read_only_udm.security_result.about.labels.[].value O nome do fluxo de trabalho é mapeado como uma etiqueta na matriz security_result.about.labels.
workflow_run.event read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value O evento de execução do fluxo de trabalho é mapeado como um par de chave-valor em additional.fields.
workflow_run.head_branch read_only_udm.security_result.about.labels.[].key, read_only_udm.security_result.about.labels.[].value O ramo principal da execução do fluxo de trabalho é mapeado como uma etiqueta na matriz security_result.about.labels.
workflow_run.head_sha read_only_udm.target.file.sha256 O SHA do cabeçalho da execução do fluxo de trabalho está mapeado para target.file.sha256.
workflow_run.id read_only_udm.target.resource.attribute.labels.[].key, read_only_udm.target.resource.attribute.labels.[].value O ID de execução do fluxo de trabalho é mapeado como uma etiqueta na matriz target.resource.attribute.labels.
workflow_run.workflow_id read_only_udm.security_result.about.labels.[].key, read_only_udm.security_result.about.labels.[].value O ID do fluxo de trabalho de execução do fluxo de trabalho é mapeado como uma etiqueta na matriz security_result.about.labels.
(Lógica do analisador) read_only_udm.metadata.event_type O tipo de evento é determinado pelo analisador com base na presença e nos valores de outros campos, como data.team, action e actor. A predefinição é USER_RESOURCE_ACCESS se não for cumprida nenhuma outra condição específica.
(Lógica do analisador) read_only_udm.metadata.log_type O tipo de registo está codificado como "GITHUB".
(Lógica do analisador) read_only_udm.metadata.product_name O nome do produto está codificado como "GITHUB".
(Lógica do analisador) read_only_udm.metadata.vendor_name O nome do fornecedor está codificado como "GITHUB".
(Lógica do analisador) read_only_udm.target.resource.resource_type O tipo de recurso está definido como STORAGE_OBJECT quando o campo repo está presente.
(Lógica do analisador) read_only_udm.target.resource.type O tipo de recurso é derivado do campo action.
(Lógica do analisador) read_only_udm.security_result.action A ação de segurança (ALLOW/BLOCK) é derivada dos campos at ou raw.at, se estiverem presentes e forem iguais a "success" ou não.
(Lógica do analisador) read_only_udm.security_result.severity A gravidade da segurança é derivada dos campos level ou SeverityText, se estiverem presentes. "INFO" é mapeado para "INFORMATIONAL", "WARN" para "MEDIUM" e outros valores são mapeados diretamente. Para os registos git-daemon, "fatal" é mapeado para "CRITICAL".
(Lógica do analisador) read_only_udm.network.application_protocol O protocolo de aplicação é derivado dos campos protocol, proto, babeld_proto, transport_protocol_name ou raw.protocol, convertendo-se em maiúsculas e verificando se existem "HTTP", "HTTPS" e "SSH".
(Lógica do analisador) read_only_udm.network.application_protocol_version A versão do protocolo de aplicação é derivada do campo http_version, se estiver presente.
(Lógica do analisador) read_only_udm.network.http.parsed_user_agent O agente do utilizador analisado é derivado dos campos user_agent, column5, http_ua ou content, se estiverem presentes.
(Lógica do analisador) read_only_udm.network.received_bytes Os bytes recebidos são derivados dos campos column3, read_bytes, fs_recv ou uploaded_bytes, se presentes, convertidos num número inteiro não assinado.
(Lógica do analisador) read_only_udm.network.received_packets Os pacotes recebidos são derivados do campo client_recv, se estiver presente, convertendo-se num número inteiro.
(Lógica do analisador) read_only_udm.network.response_code O código de resposta é derivado dos campos column2, status, status_code ou http_status, se presentes, convertendo-os num número inteiro.
(Lógica do analisador) read_only_udm.network.sent_bytes Os bytes enviados são derivados do campo client_sent, se estiver presente, convertendo-o num número inteiro sem sinal.
(Lógica do analisador) read_only_udm.network.sent_packets Os pacotes enviados são derivados do campo fs_sent, se estiver presente, convertendo-o num número inteiro.
(Lógica do analisador) read_only_udm.network.session_duration.seconds A duração da sessão em segundos é derivada do campo time_duration, se estiver presente, convertendo-o num número inteiro.
(Lógica do analisador) read_only_udm.target.file.full_path O caminho completo do ficheiro de destino é derivado dos campos path, git_dir ou dir, se estiverem presentes.
(Lógica do analisador) read_only_udm.target.file.sha1 O SHA1 do ficheiro de destino é derivado do campo sha, se estiver presente.
(Lógica do analisador) read_only_udm.target.hostname O nome do anfitrião de destino é derivado do campo client_hostname, se estiver presente.
(Lógica do analisador) read_only_udm.target.ip O IP de destino é derivado dos campos x_real_ip, remote_address, client_ip ou remote_addr, se estiverem presentes.
(Lógica do analisador) read_only_udm.target.location.name O nome da localização de destino é derivado dos campos datacenter ou public_repo, se estiverem presentes.
(Lógica do analisador) read_only_udm.target.port A porta de destino é derivada dos campos client_port, dstp ou remote_port, se presentes, convertendo-se num número inteiro.
(Lógica do analisador) read_only_udm.target.process.command_line A linha de comandos do processo de destino é derivada dos campos command, ssh_cmd, cmdline ou cmd, se estiverem presentes.
(Lógica do analisador) read_only_udm.target.process.parent_process.pid O ID do processo principal do processo de destino é derivado do campo ppid, se estiver presente, convertendo-o numa string.
(Lógica do analisador) read_only_udm.target.process.pid O ID do processo de destino é derivado do campo pid, se estiver presente, convertendo-o numa string.
(Lógica do analisador) read_only_udm.target.url O URL de destino é derivado dos campos url, http_url, request_url, http_request, dest_url, config.url ou url_path, se estiverem presentes. Também pode ser construído a partir de path_info e query_string.
(Lógica do analisador) read_only_udm.target.user.attribute.roles.[].name As funções de utilizador de destino são derivadas dos campos actor_type ou user_type, se estiverem presentes.
(Lógica do analisador) read_only_udm.target.user.email_addresses Os endereços de email do utilizador de destino são derivados do campo external_identity_nameid se for um endereço de email.
(Lógica do analisador) read_only_udm.target.user.group_identifiers Os identificadores do grupo de utilizadores de destino são derivados do campo data.team, se estiver presente.
(Lógica do analisador) read_only_udm.target.user.userid O ID do utilizador de destino é derivado dos campos userid, external_identity_nameid, current_user, member, user_id, actor_id ou raw.user_id, se estiverem presentes.
(Lógica do analisador) read_only_udm.target.user.user_display_name O nome a apresentar do utilizador de destino é derivado dos campos login, user, external_identity_username, user_login ou raw.login, se estiverem presentes.
(Lógica do analisador) read_only_udm.principal.asset.asset_id O ID do recurso principal é derivado do campo guid, com o prefixo "GUID: ".
(Lógica do analisador) read_only_udm.principal.hostname O nome do anfitrião principal é derivado dos campos hostname, request_host, host ou principal_hostname, se estiverem presentes.
(Lógica do analisador) read_only_udm.principal.ip O IP principal é derivado dos campos column6, ip, x_real_ip, remote_address, raw.ip, actor_ip ou log:source:ip, se estiverem presentes.
(Lógica do analisador) read_only_udm.principal.location.country_or_region O país ou a região da localização principal é derivado do campo actor_location.country_code, se estiver presente.
(Lógica do analisador) read_only_udm.principal.port A porta principal é derivada dos campos srcp ou log:source:port, se estiverem presentes, convertendo-se num número inteiro.
(Lógica do analisador) read_only_udm.principal.resource.name O nome do recurso principal é derivado do campo service.name, se estiver presente.
(Lógica do analisador) read_only_udm.principal.resource.product_object_id O ID do objeto do produto do recurso principal é derivado dos campos service.instance.id ou subject_id, se estiverem presentes.
(Lógica do analisador) read_only_udm.principal.url O URL principal é derivado do campo repo, se estiver presente.
(Lógica do analisador) read_only_udm.principal.user.userid O ID do utilizador principal é derivado do campo repository_owner_id, se estiver presente, convertendo-o numa string.
(Lógica do analisador) read_only_udm.principal.user.user_display_name O nome a apresentar do utilizador principal é derivado do campo repo_name, se estiver presente.
(Lógica do analisador) read_only_udm.intermediary.hostname O nome de anfitrião do intermediário é derivado do campo hostname, se estiver presente.
(Lógica do analisador) read_only_udm.intermediary.ip O IP intermediário é derivado dos campos x_forwarded_for ou xff_ip, se estiverem presentes.
(Lógica do analisador) read_only_udm.metadata.description A descrição dos metadados é derivada dos campos content, at ou raw.message, se estiverem presentes.
(Lógica do analisador) read_only_udm.metadata.product_event_type O tipo de evento do produto é derivado dos campos process_type ou action, se estiverem presentes.
(Lógica do analisador) read_only_udm.metadata.product_log_id O ID do registo do produto é derivado dos campos github_request_id, id, request_id ou raw.request_id, se estiverem presentes.
(Lógica do analisador) read_only_udm.metadata.product_version A versão do produto é derivada do campo version, se estiver presente.
(Lógica do analisador) read_only_udm.security_result.about.labels.[].key, read_only_udm.security_result.about.labels.[].value São adicionadas várias etiquetas à matriz security_result.about.labels com base na presença e nos valores de campos como data.events, data.workflow_id, workflow.name, data.head_branch, data.trigger_id, data.workflow_run_id e data.event.
(Lógica do analisador) read_only_udm.security_result.description A descrição do resultado de segurança é derivada dos campos auth_status, data_msg, msg, Body, desc ou content, se estiverem presentes.
(Lógica do analisador) read_only_udm.security_result.severity_details Os detalhes da gravidade do resultado de segurança são derivados do campo userid, se estiver presente.
(Lógica do analisador) read_only_udm.security_result.summary O resumo dos resultados de segurança é derivado dos campos creason, action ou reason, se estiverem presentes.
(Lógica do analisador) read_only_udm.network.http.referral_url O URL de referência HTTP é derivado dos campos column4 ou referer, se estiverem presentes.
(Lógica do analisador) read_only_udm.network.http.user_agent O agente do utilizador HTTP é derivado dos campos column5, http_ua ou user_agent, se estiverem presentes.
(Lógica do analisador) read_only_udm.network.sent_bytes Os bytes enviados pela rede são derivados dos campos client_sent ou fs_sent, se estiverem presentes, convertendo-se num número inteiro não assinado.
(Lógica do analisador) read_only_udm.additional.fields.[].key, read_only_udm.additional.fields.[].value.string_value Muitos campos são mapeados condicionalmente como pares chave-valor na matriz additional.fields, incluindo auth_fingerprint, controller, oauth_access_id, oauth_application_id, oauth_scopes, route, worker_request_count, repo, repo_visibility, auth, content_length, elapsed, catalog_service, action, method, failure_type, failure_reason, hashed_token, token_type, gitauth_version, enterprise.name, programmatic_access_type, token_id, token_scopes, integration, query_string, rate_limit_remaining, request_body, org_id, repo_id, repository_public, raw.method, raw.failure_type, raw.failure_reason, raw.from, raw.raw_login, device_cookie, operation, operation_type, category_type, business, note, read, pre_perform_allocation_count, backend, queue, class, success, env, job_id e job. A lógica específica de cada campo está detalhada no código do analisador.
(Lógica do analisador) read_only_udm.security_result.detection_fields.[].key, read_only_udm.security_result.detection_fields.[].value Os campos controller_action, two_factor, delay_time, queued_time, delivery_build, delivery_send e stages são mapeados condicionalmente para a matriz security_result.detection_fields.
(Lógica do analisador) read_only_udm.target.resource.attribute.labels.[].key, read_only_udm.target.resource.attribute.labels.[].value Os campos hook_id, job_name, job_workflow_ref, runner_group_id, runner_group_name, runner_name, runner_id, workflow_run_id e business_id são mapeados condicionalmente como etiquetas na matriz target.resource.attribute.labels.
(Lógica do analisador) read_only_udm.metadata.event_timestamp Se a data/hora não estiver diretamente disponível num formato suportado, o analisador tenta extraí-la e convertê-la a partir de vários campos, incluindo ts, now, created_at, Timestamp, time e raw.now.
(Lógica do analisador) read_only_udm.network.http.method O método HTTP é derivado dos campos method, column1, request_method, http_method ou raw.method, convertendo-os em letras maiúsculas.
(Lógica do analisador) read_only_udm.target.application A aplicação de destino é derivada dos campos process, program ou app, se estiverem presentes.

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