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-logs
se 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
GitHubAuditStreamingPolicy
e 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.