GITHUB

Compatível com:

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)

  1. Inicie sessão na consola do administrador do GitHub Enterprise Cloud.
  2. Aceda a Definições empresariais > Definições > Registo de auditoria > Streaming de registos.
  3. Certifique-se de que tem autorizações de proprietário empresarial para configurar o streaming de registos de auditoria.
  4. 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

  1. Crie um contentor do Amazon S3 seguindo este manual do utilizador: Criar um contentor
  2. Guarde o nome e a região do contentor para referência futura (por exemplo, github-audit-logs).
  3. Crie um utilizador seguindo este guia do utilizador: criar um utilizador do IAM.
  4. Selecione o utilizador criado.
  5. Selecione o separador Credenciais de segurança.
  6. Clique em Criar chave de acesso na secção Chaves de acesso.
  7. Selecione Serviço de terceiros como Exemplo de utilização.
  8. Clicar em Seguinte.
  9. Opcional: adicione uma etiqueta de descrição.
  10. Clique em Criar chave de acesso.
  11. Clique em Transferir ficheiro .CSV para guardar a chave de acesso e a chave de acesso secreta para referência futura.
  12. Clique em Concluído.

Configure a política IAM para o streaming do GitHub S3

  1. Na consola da AWS, aceda a IAM > Políticas > Criar política > separador JSON.
  2. Copie e cole a seguinte política.
  3. 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/*"
        }
    ]
    }
    
  4. Clique em Seguinte > Criar política.

  5. Dê um nome à política GitHubAuditStreamingPolicy e clique em Criar política.

  6. Volte ao utilizador do IAM criado anteriormente.

  7. Selecione o separador Autorizações.

  8. Clique em Adicionar autorizações > Anexar políticas diretamente.

  9. Pesquise e selecione GitHubAuditStreamingPolicy.

  10. Clique em Seguinte > Adicionar autorizações.

Configure o streaming do registo de auditoria do GitHub Enterprise Cloud

  1. Inicie sessão no GitHub Enterprise Cloud como proprietário da empresa.
  2. Clique na sua foto do perfil e, de seguida, em Definições empresariais.
  3. Na barra lateral da conta empresarial, clique em Definições > Registo de auditoria > Streaming de registos.
  4. Selecione Configurar stream e clique em Amazon S3.
  5. Em Autenticação, clique em Chaves de acesso.
  6. 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.
  7. Clique em Verificar ponto final para confirmar que o GitHub consegue estabelecer ligação e escrever no ponto final do Amazon S3.
  8. 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

  1. Aceda a AWS Console > IAM > Users > Add users.
  2. Clique em Adicionar utilizadores.
  3. Indique os seguintes detalhes de configuração:
    • Utilizador: introduza secops-reader.
    • Tipo de acesso: selecione Chave de acesso – Acesso programático.
  4. Clique em Criar utilizador.
  5. Anexe a política de leitura mínima (personalizada): Users > secops-reader > Permissions > Add permissions > Attach policies directly > Create policy.
  6. 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"
        }
    ]
    }
    
  7. Nome = secops-reader-policy.

  8. Clique em Criar política > procure/selecione > Seguinte > Adicionar autorizações.

  9. 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

  1. Aceda a Definições do SIEM > Feeds.
  2. Clique em + Adicionar novo feed.
  3. No campo Nome do feed, introduza um nome para o feed (por exemplo, GitHub audit logs).
  4. Selecione Amazon S3 V2 como o Tipo de origem.
  5. Selecione GitHub como o Tipo de registo.
  6. Clicar em Seguinte.
  7. 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.
  8. Clicar em Seguinte.
  9. 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.