Coletar registros de auditoria do GitHub
Visão geral
Esse analisador processa os registros de auditoria do GitHub no formato JSON. Ele limpa a entrada removendo vários campos, realiza várias operações de grok e de chave-valor com base no campo process_type para extrair informações relevantes, mapeia os campos extraídos para a UDM e estrutura a saída para a ingestão do Google SecOps. Ele também lida com casos extremos específicos e realiza transformações de dados para diferentes subtipos de registro nos registros de auditoria do GitHub.
Antes de começar
- Verifique se você tem uma instância do Google SecOps.
- Verifique se você tem acesso privilegiado aos repositórios do GitHub.
Configurar um feed no Google SecOps para processar os registros do GitHub
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed (por exemplo, Logs do GitHub).
- Selecione Webhook como o Tipo de origem.
- Selecione GitHub como o Tipo de registro.
- Clique em Próxima.
- 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 de recursos: o namespace de recursos.
- Rótulos de ingestão: o rótulo aplicado aos eventos desse feed.
- Delimitador de divisão: o delimitador usado para separar linhas de registro, como
- Clique em Próxima.
- Revise a configuração do feed na tela Finalizar e clique em Enviar.
- Clique em Gerar chave secreta para gerar uma chave secreta para autenticar esse feed.
- Copie e armazene a chave secreta. Não é possível acessar essa chave secreta novamente. Se necessário, você pode gerar uma nova chave secreta, mas essa ação torna a chave secreta 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.
- Clique em Concluído.
Criar uma chave de API para o feed de webhook
Acesse o console do Google Cloud > Credenciais.
Clique em Criar credenciais e, em seguida, selecione Chave de API.
Restrinja o acesso da chave de API à API Google Security Operations.
Especificar o URL do endpoint
- No aplicativo cliente, especifique o URL do endpoint HTTPS fornecido no feed de webhook.
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 especificar no URL. Se o cliente do webhook não tiver suporte a 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 autenticação no Google Security Operations.SECRET
: a chave secreta gerada para autenticar o feed.
Criar um webhook no GitHub
Este guia apresenta instruções detalhadas para criar um webhook no GitHub e enviar dados ao Google SecOps.
- Acesse seu repositório do GitHub.
- Acesse Configurações.
- Clique em Webhooks.
- Clique em Add webhook.
- No campo URL do payload, insira o URL do endpoint de API Google SecOps.
Selecione application/json como o tipo de conteúdo.
Opcional: para aumentar a segurança, defina um secret. Isso gera uma assinatura para payloads de webhook, permitindo que você verifique a autenticidade deles no Google SecOps. Se você usar um secret, configure-o também no seu feed do Google SecOps.
Escolha os eventos que acionam o webhook. Para um registro abrangente, selecione Deixe-me selecionar eventos individuais e marque os eventos relevantes (por exemplo, Push, Pedido de pull, Issue). Se você não tiver certeza, comece com Somente o evento
push
.Verifique se a caixa de seleção Active está marcada.
Clique em Adicionar webhook para salvar a configuração.
Tabela de mapeamento do UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
_document_id |
read_only_udm.additional.fields.[].key , read_only_udm.additional.fields.[].value.string_value |
O _document_id do registro bruto é 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 é 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 usuário que executa 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 um rótulo na matriz principal.user.attribute.labels . |
actor_ip |
read_only_udm.principal.ip |
O endereço IP do usuário é mapeado para principal.ip . |
actor_location.country_code |
read_only_udm.principal.location.country_or_region |
O código de país do ator é mapeado para principal.location.country_or_region . |
application_name |
read_only_udm.target.application |
O nome do aplicativo é 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 é associado a target.user.company_name e como um par de 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 um rótulo dentro do array target.resource.attribute.labels . |
config.url |
read_only_udm.target.url |
O URL de configuração é mapeado para target.url . |
created_at |
read_only_udm.metadata.event_timestamp |
O carimbo de data/hora created_at é convertido para o formato apropriado e mapeado para metadata.event_timestamp . |
data.cancelled_at |
read_only_udm.extensions.vulns.vulnerabilities.scan_end_time |
O carimbo de data/hora data.cancelled_at é convertido e mapeado para extensions.vulns.vulnerabilities.scan_end_time . |
data.email |
read_only_udm.target.email |
O endereço de e-mail do campo de dados é 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 um rótulo 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 rótulos 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 um rótulo na matriz security_result.about.labels . |
data.head_sha |
read_only_udm.target.file.sha256 |
O cabeçalho SHA do campo de dados é 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 um rótulo na matriz target.resource.attribute.labels . |
data.started_at |
read_only_udm.extensions.vulns.vulnerabilities.scan_start_time |
O carimbo de data/hora data.started_at é convertido e mapeado para extensions.vulns.vulnerabilities.scan_start_time . |
data.team |
read_only_udm.target.user.group_identifiers |
A equipe 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 um rótulo 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 um rótulo no array 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 da execução do fluxo de trabalho do campo de dados é mapeado como um rótulo 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 e-mail, a parte do nome de usuário será extraída e mapeada para target.user.userid , e o e-mail completo será adicionado a target.user.email_addresses . Caso contrário, o valor inteiro será mapeado para target.user.userid . |
external_identity_username |
read_only_udm.target.user.user_display_name |
O nome de usuário da identidade externa é mapeado para target.user.user_display_name . |
hashed_token |
read_only_udm.network.session_id |
O token com hash é mapeado para network.session_id . |
org |
read_only_udm.target.administrative_domain |
A organização é 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 "PARTICULAR", e outros valores são mapeados para "PÚBLICO". |
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 é 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 da solicitação é mapeado como um par de chave-valor em additional.fields . |
request_method |
read_only_udm.network.http.method |
O método de solicitação é convertido em letras maiúsculas e mapeado para network.http.method . |
route |
read_only_udm.additional.fields.[].key , read_only_udm.additional.fields.[].value.string_value |
O caminho é mapeado como um par de chave-valor em additional.fields . |
status_code |
read_only_udm.network.http.response_code |
O código de status é convertido em um 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 do token é 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 escopos do token 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 letras maiúsculas e mapeado para network.application_protocol . |
url_path |
read_only_udm.target.url |
O caminho do URL é mapeado para target.url . |
user |
read_only_udm.target.user.user_display_name |
O usuário é 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 user agent é mapeado para network.http.user_agent , e a versão analisada é mapeada para network.http.parsed_user_agent . |
user_id |
read_only_udm.target.user.userid |
O ID do usuário é 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 um rótulo 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 um rótulo na matriz security_result.about.labels . |
workflow_run.head_sha |
read_only_udm.target.file.sha256 |
O SHA da execução do cabeçalho do fluxo de trabalho é 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 da execução do fluxo de trabalho é mapeado como um rótulo 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 da execução do fluxo de trabalho é mapeado como um rótulo no array security_result.about.labels . |
(Parser Logic) | 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 . O padrão é USER_RESOURCE_ACCESS se nenhuma outra condição específica for atendida. |
(Parser Logic) | read_only_udm.metadata.log_type |
O tipo de registro é codificado como "GITHUB". |
(Parser Logic) | read_only_udm.metadata.product_name |
O nome do produto está fixado em "GITHUB". |
(Parser Logic) | read_only_udm.metadata.vendor_name |
O nome do fornecedor está fixado em "GITHUB". |
(Parser Logic) | read_only_udm.target.resource.resource_type |
O tipo de recurso é definido como STORAGE_OBJECT quando o campo repo está presente. |
(Parser Logic) | read_only_udm.target.resource.type |
O tipo de recurso é derivado do campo action . |
(Parser Logic) | 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. |
(Parser Logic) | 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 registros git-daemon , "fatal" é mapeado para "CRITICAL". |
(Parser Logic) | read_only_udm.network.application_protocol |
O protocolo do aplicativo é derivado dos campos protocol , proto , babeld_proto , transport_protocol_name ou raw.protocol , convertidos em maiúsculas e verificados como "HTTP", "HTTPS" e "SSH". |
(Parser Logic) | read_only_udm.network.application_protocol_version |
A versão do protocolo do aplicativo é derivada do campo http_version , se presente. |
(Parser Logic) | read_only_udm.network.http.parsed_user_agent |
O agente do usuário analisado é derivado dos campos user_agent , column5 , http_ua ou content , se presentes. |
(Parser Logic) | read_only_udm.network.received_bytes |
Os bytes recebidos são derivados dos campos column3 , read_bytes , fs_recv ou uploaded_bytes , se presentes, e convertidos em um número inteiro não assinado. |
(Parser Logic) | read_only_udm.network.received_packets |
Os pacotes recebidos são derivados do campo client_recv , se presente, convertendo-o em um número inteiro. |
(Parser Logic) | read_only_udm.network.response_code |
O código de resposta é derivado dos campos column2 , status , status_code ou http_status , se presentes, convertendo em um número inteiro. |
(Parser Logic) | read_only_udm.network.sent_bytes |
Os bytes enviados são derivados do campo client_sent , se presente, e convertidos em um número inteiro sem sinal. |
(Parser Logic) | read_only_udm.network.sent_packets |
Os pacotes enviados são derivados do campo fs_sent , se presente, convertendo em um número inteiro. |
(Parser Logic) | read_only_udm.network.session_duration.seconds |
A duração da sessão em segundos é derivada do campo time_duration , se presente, convertendo em um número inteiro. |
(Parser Logic) | read_only_udm.target.file.full_path |
O caminho completo do arquivo de destino é derivado dos campos path , git_dir ou dir , se presentes. |
(Parser Logic) | read_only_udm.target.file.sha1 |
O SHA1 do arquivo de destino é derivado do campo sha , se presente. |
(Parser Logic) | read_only_udm.target.hostname |
O nome de host de destino é derivado do campo client_hostname , se presente. |
(Parser Logic) | read_only_udm.target.ip |
O IP de destino é derivado dos campos x_real_ip , remote_address , client_ip ou remote_addr , se presentes. |
(Parser Logic) | read_only_udm.target.location.name |
O nome do local de destino é derivado dos campos datacenter ou public_repo , se presentes. |
(Parser Logic) | read_only_udm.target.port |
A porta de destino é derivada dos campos client_port , dstp ou remote_port , se presentes, e convertida em um número inteiro. |
(Parser Logic) | read_only_udm.target.process.command_line |
A linha de comando do processo de destino é derivada dos campos command , ssh_cmd , cmdline ou cmd , se presentes. |
(Parser Logic) | read_only_udm.target.process.parent_process.pid |
O ID do processo pai do processo de destino é derivado do campo ppid , se presente, e convertido em uma string. |
(Parser Logic) | read_only_udm.target.process.pid |
O ID do processo de destino é derivado do campo pid , se presente, e convertido em uma string. |
(Parser Logic) | 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 presentes. Também pode ser criado a partir de path_info e query_string . |
(Parser Logic) | read_only_udm.target.user.attribute.roles.[].name |
As funções de usuário de destino são derivadas dos campos actor_type ou user_type , se presentes. |
(Parser Logic) | read_only_udm.target.user.email_addresses |
Os endereços de e-mail do usuário de destino são derivados do campo external_identity_nameid , se for um endereço de e-mail. |
(Parser Logic) | read_only_udm.target.user.group_identifiers |
Os identificadores do grupo de usuários de destino são derivados do campo data.team , se presente. |
(Parser Logic) | read_only_udm.target.user.userid |
O ID do usuário de destino é derivado dos campos userid , external_identity_nameid , current_user , member , user_id , actor_id ou raw.user_id , se presentes. |
(Parser Logic) | read_only_udm.target.user.user_display_name |
O nome de exibição do usuário de destino é derivado dos campos login , user , external_identity_username , user_login ou raw.login , se presentes. |
(Parser Logic) | read_only_udm.principal.asset.asset_id |
O ID do recurso principal é derivado do campo guid , com o prefixo "GUID: ". |
(Parser Logic) | read_only_udm.principal.hostname |
O nome de host principal é derivado dos campos hostname , request_host , host ou principal_hostname , se presentes. |
(Parser Logic) | 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 presentes. |
(Parser Logic) | read_only_udm.principal.location.country_or_region |
O país ou a região do local principal é derivado do campo actor_location.country_code , se presente. |
(Parser Logic) | read_only_udm.principal.port |
A porta principal é derivada dos campos srcp ou log:source:port , se presentes, e convertida em um número inteiro. |
(Parser Logic) | read_only_udm.principal.resource.name |
O nome do recurso principal é derivado do campo service.name , se presente. |
(Parser Logic) | read_only_udm.principal.resource.product_object_id |
O ID do objeto do produto de recurso principal é derivado dos campos service.instance.id ou subject_id , se presentes. |
(Parser Logic) | read_only_udm.principal.url |
O URL principal é derivado do campo repo , se presente. |
(Parser Logic) | read_only_udm.principal.user.userid |
O ID do usuário principal é derivado do campo repository_owner_id , se presente, e convertido em uma string. |
(Parser Logic) | read_only_udm.principal.user.user_display_name |
O nome de exibição do usuário principal é derivado do campo repo_name , se presente. |
(Parser Logic) | read_only_udm.intermediary.hostname |
O nome de host intermediário é derivado do campo hostname , se presente. |
(Parser Logic) | read_only_udm.intermediary.ip |
O IP intermediário é derivado dos campos x_forwarded_for ou xff_ip , se presentes. |
(Parser Logic) | read_only_udm.metadata.description |
A descrição dos metadados é derivada dos campos content , at ou raw.message , se presentes. |
(Parser Logic) | read_only_udm.metadata.product_event_type |
O tipo de evento do produto é derivado dos campos process_type ou action , se presentes. |
(Parser Logic) | read_only_udm.metadata.product_log_id |
O ID de registro do produto é derivado dos campos github_request_id , id , request_id ou raw.request_id , se presentes. |
(Parser Logic) | read_only_udm.metadata.product_version |
A versão do produto é derivada do campo version , se presente. |
(Parser Logic) | read_only_udm.security_result.about.labels.[].key , read_only_udm.security_result.about.labels.[].value |
Vários rótulos são adicionados à 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 . |
(Parser Logic) | 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 presentes. |
(Parser Logic) | read_only_udm.security_result.severity_details |
Os detalhes de gravidade do resultado de segurança são derivados do campo userid , se presente. |
(Parser Logic) | read_only_udm.security_result.summary |
O resumo dos resultados de segurança é derivado dos campos creason , action ou reason , se presentes. |
(Parser Logic) | read_only_udm.network.http.referral_url |
O URL de referência HTTP é derivado dos campos column4 ou referer , se presentes. |
(Parser Logic) | read_only_udm.network.http.user_agent |
O user agent HTTP é derivado dos campos column5 , http_ua ou user_agent , se presentes. |
(Parser Logic) | read_only_udm.network.sent_bytes |
Os bytes enviados pela rede são derivados dos campos client_sent ou fs_sent , se presentes, e convertidos em um número inteiro não assinado. |
(Parser Logic) | read_only_udm.additional.fields.[].key , read_only_udm.additional.fields.[].value.string_value |
Muitos campos são mapeados condicionalmente como pares de 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 é detalhada no código do analisador. |
(Parser Logic) | 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 . |
(Parser Logic) | 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 rótulos na matriz target.resource.attribute.labels . |
(Parser Logic) | read_only_udm.metadata.event_timestamp |
Se o carimbo de data/hora não estiver disponível diretamente em um formato compatível, o analisador tentará extrair e convertê-lo de vários campos, incluindo ts , now , created_at , Timestamp , time e raw.now . |
(Parser Logic) | read_only_udm.network.http.method |
O método HTTP é derivado dos campos method , column1 , request_method , http_method ou raw.method , sendo convertido em letras maiúsculas. |
(Parser Logic) | read_only_udm.target.application |
O aplicativo de destino é derivado dos campos process , program ou app , se presentes. |
Alterações
2023-12-18
- Correção de bugs:
- Se "process_type" for "github_production", adicione um padrão Grok para extrair "kv_data".
- Se "process_type" for "github_production", mapeie "user" para "target.user.user_display_name".
- Se "process_type" for "github_production", mapeie "user_id" para "target.user.userid".
- "Referrer" foi mapeado para "network.http.referral_url".
- "user_session_id" foi mapeado para "network.session_id".
- "ip" foi mapeado para "principal.ip".
- "from" foi mapeado para "additional.fields".
- "request_category" foi associado a "additional.fields".
- Mapeamos "device_cookie" para "additional.fields".
- "operation_type" foi associado a "additional.fields".
- "category_type" foi associado a "additional.fields".
- Mapeamos "note" para "additional.fields".
- Mapeamos "read" para "additional.fields".
- "pre_perform_allocation_count" foi mapeado para "additional.fields".
- O "back-end" foi mapeado para "additional.fields".
- "queue" foi mapeado para "additional.fields".
- Mapeamos "class" para "additional.fields".
- O "success" foi mapeado para "additional.fields".
- "controller_action" foi mapeado para "security_result.detection_fields".
- "two_factor" foi mapeado para "security_result.detection_fields".
2023-10-25
- Quando "public_repo" for "false", defina "target.location.name" como "PRIVATE". Caso contrário, defina como "PUBLIC".
2023-10-11
- Mapeamos "user_agent" para "network.http.user_agent" e "network.http.parsed_user_agent".
- "request_method" foi associado a "network.http.method".
- Mapeamos "application_name" para "target.application".
- "status_code" foi associado a "network.http.response_code".
- "url_path" foi associado a "target.url".
- Mapeamos "user_id" para "target.userid".
- "transport_protocol_name" foi associado a "network.application_protocol".
- "raw.now" foi mapeado para "metadata.event_timestamp".
- "raw.ip" foi mapeado para "principal.ip".
- "raw.request_id" foi associado a "metadata.product_log_id".
- "raw.repo" foi mapeado para "target.url".
- Mapeamos "raw.action" para "security_result.summary".
- "raw.protocol" foi associado a "network.application_protocol".
- "raw.message" foi mapeado para "metadata.description".
- "raw.at" foi mapeado para "security_result.action".
- "raw.login" foi mapeado para "target.user_display_name".
- "raw.user_id" foi mapeado para "target.userid".
- Mapeamos "raw.failure_reason", "raw.failure_type", "raw.raw_login" e "raw.from" para "additional.fields".
- Mapeou "programmatic_access_type", "actor_id", "token_id", "token_scopes", "integration", "query_string", "rate_limit_remaining", "request_body", "route", "business", "org_id", "repo_id", "public_repo", "_document_id", "operation_type", "repository_public" para "additional.fields".
2023-07-31
- Correção de bugs:
- "On_error" foi adicionado aos padrões do Grok.
- "workflow_run.id" foi mapeado para "target.resource.attribute.labels".
- "workflow_run.event" foi associado a "additional.fields".
- "workflow_run.actor.login" foi associado a "principal.user.userid".
- "workflow_run.head_branch" foi associado a "security_result.about.labels".
- "workflow_run.head_sha" foi mapeado para "target.file.sha256".
- Mapeamos "enterprise.name" para "additional.fields".
- "workflow.name" foi associado a "security_result.about.labels".
- "workflow_run.workflow_id" foi associado a "security_result.about.labels".
2023-06-22
- Adição de suporte aos formatos de registro de syslog "github_auth", "haproxy", "github_access", "github_unicorn", "github_production", "hookshot-go", "babeld", "github_gitauth", "babeld2hydro", "authzd", "gitrpcd", "agent", "git-daemon", "github_resqued", "sudo", "systemd" e "github_audit".
2023-06-09
- Enhancement-
- "external_identity_nameid" foi mapeado para "target.user.email_addresses" se estiver no formato de e-mail.
- Extraia o nome de usuário de "external_identity_nameid" e mapeie para "target.user.userid".
2023-01-13
- Enhancement-
- "actor_ip" foi mapeado para "principal.ip".
- "Hashed_token" foi mapeado para "network.session_id".
- "external_identity_nameid" foi associado a "target.user.userid "
- "external_identity_username" foi associado a "target.user.user_display_name".
2022-11-28
- Melhoria: mapeamento de "config.url" para "target.url".
2022-07-07
- Melhoria: os registros de formato JSON recém-ingeridos com a ação "git.clone","git.push" e "workflows.prepared_workflow_job" foram processados e analisados.
- "job_name" mapeado para "target.resource.attribute.labels".
- "job_workflow_ref" mapeado para "target.resource.attribute.labels".
- "runner_group_id" mapeado para "target.resource.attribute.labels".
- "runner_group_name" mapeado para "target.resource.attribute.labels".
- "runner_name" mapeado para "target.resource.attribute.labels".
- "runner_id" mapeado para "target.resource.attribute.labels".
- "workflow_run_id" mapeado para "target.resource.attribute.labels".
- "actor_location.country_code" mapeado para "principal.location.country_or_region".