GITHUB
Este documento explica como carregar registos de auditoria do GitHub para o Google Security Operations através do Amazon S3. O analisador tenta extrair dados do campo "message" usando vários padrões grok, processando formatos JSON e não JSON. Com base no "process_type" extraído, aplica uma lógica de análise específica através de grok, kv e outros filtros para mapear os dados de registo não processados no esquema do modelo de dados unificado (UDM).
Antes de começar
Certifique-se de que tem os seguintes pré-requisitos:
- Instância do Google SecOps.
 - Acesso privilegiado ao inquilino do GitHub Enterprise Cloud com autorizações de proprietário da empresa.
 - Acesso privilegiado à AWS (S3, IAM).
 
Recolha os pré-requisitos do GitHub Enterprise Cloud (acesso empresarial)
- Inicie sessão na consola do administrador do GitHub Enterprise Cloud.
 - Aceda a Definições empresariais > Definições > Registo de auditoria > Streaming de registos.
 - Certifique-se de que tem autorizações de proprietário empresarial para configurar o streaming de registos de auditoria.
 - Copie e guarde numa localização segura os seguintes detalhes:
- Nome do GitHub Enterprise
 - Nomes das organizações na empresa
 
 
Configure o contentor do AWS S3 e a gestão de identidade e de acesso para o Google SecOps
- Crie um contentor do Amazon S3 seguindo este manual do utilizador: Criar um contentor
 - Guarde o nome e a região do contentor para referência futura (por exemplo, 
github-audit-logs). - Crie um utilizador seguindo este guia do utilizador: criar um utilizador do IAM.
 - Selecione o utilizador criado.
 - Selecione o separador Credenciais de segurança.
 - Clique em Criar chave de acesso na secção Chaves de acesso.
 - Selecione Serviço de terceiros como Exemplo de utilização.
 - Clicar em Seguinte.
 - Opcional: adicione uma etiqueta de descrição.
 - Clique em Criar chave de acesso.
 - Clique em Transferir ficheiro .CSV para guardar a chave de acesso e a chave de acesso secreta para referência futura.
 - Clique em Concluído.
 
Configure a política IAM para o streaming do GitHub S3
- Na consola da AWS, aceda a IAM > Políticas > Criar política > separador JSON.
 - Copie e cole a seguinte política.
 JSON da política (substitua
github-audit-logsse tiver introduzido um nome de contentor diferente):{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::github-audit-logs/*" } ] }Clique em Seguinte > Criar política.
Dê um nome à política
GitHubAuditStreamingPolicye clique em Criar política.Volte ao utilizador do IAM criado anteriormente.
Selecione o separador Autorizações.
Clique em Adicionar autorizações > Anexar políticas diretamente.
Pesquise e selecione
GitHubAuditStreamingPolicy.Clique em Seguinte > Adicionar autorizações.
Configure o streaming do registo de auditoria do GitHub Enterprise Cloud
- Inicie sessão no GitHub Enterprise Cloud como proprietário da empresa.
 - Clique na sua foto do perfil e, de seguida, em Definições empresariais.
 - Na barra lateral da conta empresarial, clique em Definições > Registo de auditoria > Streaming de registos.
 - Selecione Configurar stream e clique em Amazon S3.
 - Em Autenticação, clique em Chaves de acesso.
 - Indique os seguintes detalhes de configuração:
- Região: selecione a região do contentor (por exemplo, 
us-east-1). - Segmento: escreva o nome do segmento para o qual quer fazer streaming (por exemplo, 
github-audit-logs). - ID da chave de acesso: introduza o ID da chave de acesso do utilizador do IAM.
 - Chave secreta: introduza a chave secreta do utilizador do IAM.
 
 - Região: selecione a região do contentor (por exemplo, 
 - Clique em Verificar ponto final para confirmar que o GitHub consegue estabelecer ligação e escrever no ponto final do Amazon S3.
 - Depois de validar o ponto final com êxito, clique em Guardar.
 
Crie um utilizador e chaves da IAM só de leitura para o Google SecOps
- Aceda a AWS Console > IAM > Users > Add users.
 - Clique em Adicionar utilizadores.
 - Indique os seguintes detalhes de configuração:
- Utilizador: introduza 
secops-reader. - Tipo de acesso: selecione Chave de acesso – Acesso programático.
 
 - Utilizador: introduza 
 - Clique em Criar utilizador.
 - Anexe a política de leitura mínima (personalizada): Users > secops-reader > Permissions > Add permissions > Attach policies directly > Create policy.
 JSON:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::github-audit-logs/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::github-audit-logs" } ] }Nome =
secops-reader-policy.Clique em Criar política > procure/selecione > Seguinte > Adicionar autorizações.
Crie uma chave de acesso para
secops-reader: Credenciais de segurança > Chaves de acesso > Criar chave de acesso > transfira o ficheiro.CSV(vai colar estes valores no feed).
Configure um feed no Google SecOps para carregar registos do GitHub
- Aceda a Definições do SIEM > Feeds.
 - Clique em + Adicionar novo feed.
 - No campo Nome do feed, introduza um nome para o feed (por exemplo, 
GitHub audit logs). - Selecione Amazon S3 V2 como o Tipo de origem.
 - Selecione GitHub como o Tipo de registo.
 - Clicar em Seguinte.
 - Especifique valores para os seguintes parâmetros de entrada:
- URI do S3: 
s3://github-audit-logs/ - Opções de eliminação de origens: selecione a opção de eliminação de acordo com a sua preferência.
 - Idade máxima do ficheiro: inclua ficheiros modificados no último número de dias. A predefinição é 180 dias.
 - ID da chave de acesso: chave de acesso do utilizador com acesso ao contentor do S3.
 - Chave de acesso secreta: chave secreta do utilizador com acesso ao contentor do S3.
 - Espaço de nomes do recurso: o espaço de nomes do recurso.
 - Etiquetas de carregamento: a etiqueta aplicada aos eventos deste feed.
 
 - URI do S3: 
 - Clicar em Seguinte.
 - Reveja a nova configuração do feed no ecrã Finalizar e, de seguida, clique em Enviar.
 
Tabela de mapeamento do UDM
| Campo de registo | Mapeamento de UDM | Lógica | 
|---|---|---|
actor | 
principal.user.userid | 
O valor é retirado do campo actor. | 
actor_id | 
principal.user.attribute.labels.value | 
O valor é retirado do campo actor_id. | 
actor_ip | 
principal.ip | 
O valor é retirado do campo actor_ip. | 
actor_location.country_code | 
principal.location.country_or_region | 
O valor é retirado do campo actor_location.country_code. | 
application_name | 
target.application | 
O valor é retirado do campo application_name. | 
business | 
target.user.company_name | 
O valor é retirado do campo business. | 
business_id | 
target.resource.attribute.labels.value | 
O valor é retirado do campo business_id. | 
config.url | 
target.url | 
O valor é retirado do campo config.url. | 
created_at | 
metadata.event_timestamp | 
O valor é convertido de milissegundos UNIX numa indicação de tempo. | 
data.cancelled_at | 
extensions.vulns.vulnerabilities.scan_end_time | 
O valor é convertido do formato ISO8601 para uma indicação de tempo. | 
data.email | 
target.email | 
O valor é retirado do campo data.email. | 
data.event | 
security_result.about.labels.value | 
O valor é retirado do campo data.event. | 
data.events | 
security_result.about.labels.value | 
O valor é retirado do campo data.events. | 
data.head_branch | 
security_result.about.labels.value | 
O valor é retirado do campo data.head_branch. | 
data.head_sha | 
target.file.sha256 | 
O valor é retirado do campo data.head_sha. | 
data.hook_id | 
target.resource.attribute.labels.value | 
O valor é retirado do campo data.hook_id. | 
data.started_at | 
extensions.vulns.vulnerabilities.scan_start_time | 
O valor é convertido do formato ISO8601 para uma indicação de tempo. | 
data.team | 
target.user.group_identifiers | 
O valor é retirado do campo data.team. | 
data.trigger_id | 
security_result.about.labels.value | 
O valor é retirado do campo data.trigger_id. | 
data.workflow_id | 
security_result.about.labels.value | 
O valor é retirado do campo data.workflow_id. | 
data.workflow_run_id | 
security_result.about.labels.value | 
O valor é retirado do campo data.workflow_run_id. | 
enterprise.name | 
additional.fields.value.string_value | 
O valor é retirado do campo enterprise.name. | 
external_identity_nameid | 
target.user.email_addresses | 
Se o valor for um endereço de email, é adicionado à matriz target.user.email_addresses. | 
external_identity_nameid | 
target.user.userid | 
O valor é retirado do campo external_identity_nameid. | 
external_identity_username | 
target.user.user_display_name | 
O valor é retirado do campo external_identity_username. | 
hashed_token | 
network.session_id | 
O valor é retirado do campo hashed_token. | 
job_name | 
target.resource.attribute.labels.value | 
O valor é retirado do campo job_name. | 
job_workflow_ref | 
target.resource.attribute.labels.value | 
O valor é retirado do campo job_workflow_ref. | 
org | 
target.administrative_domain | 
O valor é retirado do campo org. | 
org_id | 
additional.fields.value.string_value | 
O valor é retirado do campo org_id. | 
programmatic_access_type | 
additional.fields.value.string_value | 
O valor é retirado do campo programmatic_access_type. | 
public_repo | 
additional.fields.value.string_value | 
O valor é retirado do campo public_repo. | 
public_repo | 
target.location.name | 
Se o valor for "false", é mapeado para "PRIVATE". Caso contrário, é mapeado para "PUBLIC". | 
query_string | 
additional.fields.value.string_value | 
O valor é retirado do campo query_string. | 
rate_limit_remaining | 
additional.fields.value.string_value | 
O valor é retirado do campo rate_limit_remaining. | 
repo | 
target.resource.name | 
O valor é retirado do campo repo. | 
repo_id | 
additional.fields.value.string_value | 
O valor é retirado do campo repo_id. | 
repository_public | 
additional.fields.value.string_value | 
O valor é retirado do campo repository_public. | 
request_body | 
additional.fields.value.string_value | 
O valor é retirado do campo request_body. | 
request_method | 
network.http.method | 
O valor é convertido em letras maiúsculas. | 
route | 
additional.fields.value.string_value | 
O valor é retirado do campo route. | 
status_code | 
network.http.response_code | 
O valor é convertido num número inteiro. | 
timestamp | 
metadata.event_timestamp | 
O valor é convertido de milissegundos UNIX numa indicação de tempo. | 
token_id | 
additional.fields.value.string_value | 
O valor é retirado do campo token_id. | 
token_scopes | 
additional.fields.value.string_value | 
O valor é retirado do campo token_scopes. | 
transport_protocol_name | 
network.application_protocol | 
O valor é convertido em letras maiúsculas. | 
url_path | 
target.url | 
O valor é retirado do campo url_path. | 
user | 
target.user.user_display_name | 
O valor é retirado do campo user. | 
user_agent | 
network.http.user_agent | 
O valor é retirado do campo user_agent. | 
user_agent | 
network.http.parsed_user_agent | 
O valor é analisado. | 
user_id | 
target.user.userid | 
O valor é retirado do campo user_id. | 
workflow.name | 
security_result.about.labels.value | 
O valor é retirado do campo workflow.name. | 
workflow_run.actor.login | 
principal.user.userid | 
O valor é retirado do campo workflow_run.actor.login. | 
workflow_run.event | 
additional.fields.value.string_value | 
O valor é retirado do campo workflow_run.event. | 
workflow_run.head_branch | 
security_result.about.labels.value | 
O valor é retirado do campo workflow_run.head_branch. | 
workflow_run.head_sha | 
target.file.sha256 | 
O valor é retirado do campo workflow_run.head_sha. | 
workflow_run.id | 
target.resource.attribute.labels.value | 
O valor é retirado do campo workflow_run.id. | 
workflow_run.workflow_id | 
security_result.about.labels.value | 
O valor é retirado do campo workflow_run.workflow_id. | 
| N/A | metadata.event_type | 
O valor é determinado com base nos campos action e actor. Se o campo action contiver "_member", o valor é definido como "USER_RESOURCE_UPDATE_PERMISSIONS". Se o campo action não estiver vazio e o campo actor não estiver vazio, o valor é definido como "USER_RESOURCE_UPDATE_CONTENT". Caso contrário, o valor é definido como "USER_RESOURCE_ACCESS". | 
| N/A | metadata.log_type | 
O valor está definido como "GITHUB". | 
| N/A | metadata.product_name | 
O valor está definido como "GITHUB". | 
| N/A | metadata.vendor_name | 
O valor está definido como "GITHUB". | 
| N/A | target.resource.resource_type | 
O valor é definido como "STORAGE_OBJECT". | 
| N/A | security_result.about.labels.key | 
O valor é definido como uma string constante com base no campo data correspondente. Por exemplo, para data.workflow_id, a chave está definida como "Workflow Id". | 
| N/A | target.resource.attribute.labels.key | 
O valor é definido como uma string constante com base no campo data correspondente. Por exemplo, para data.hook_id, a chave está definida como "Hook Id". | 
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.