Recolha registos de DNS do Cisco Umbrella

Compatível com:

Este documento explica como recolher registos DNS do Cisco Umbrella para um feed do Google Security Operations através do contentor do AWS S3. O analisador processa registos formatados em JSON e CSV. Extrai campos, muda-lhes o nome para corresponderem ao UDM, processa diferentes versões e formatos de registos (incluindo registos de proxy e IP) e executa uma lógica específica para identidades, categorias de segurança e eventos de rede, acabando por unir os dados extraídos no esquema do UDM.

Antes de começar

  • Certifique-se de que tem uma instância do Google SecOps.
  • Certifique-se de que tem acesso privilegiado ao AWS IAM e ao S3.
  • Certifique-se de que tem acesso privilegiado ao Cisco Umbrella.

Configure um contentor do Amazon S3 gerido pela Cisco

  1. Inicie sessão no painel de controlo do Cisco Umbrella.
  2. Aceda a Administração > Gestão de registos.
  3. Selecione a opção Usar um contentor do Amazon S3 gerido pela Cisco.
  4. Indique os seguintes detalhes de configuração:
    • Selecione uma região: selecione uma região mais próxima da sua localização para uma latência mais baixa.
    • Selecione uma duração de retenção: selecione o período. A duração da retenção é de 7, 14 ou 30 dias. Após o período selecionado, os dados são eliminados e não podem ser recuperados. Se o ciclo de carregamento for regular, use um período mais curto. Pode alterar a duração da retenção mais tarde.
  5. Clique em Guardar.
  6. Clique em Continuar para confirmar as seleções e receber a notificação de ativação.
    Na janela Ativação concluída apresentada, são apresentados os valores da chave de acesso e da chave secreta.
  7. Copie os valores da Chave de acesso e da Chave secreta. Se perder estas chaves, tem de as regenerar.
  8. Clique em OK > Continuar.
  9. É apresentada uma página de resumo com a configuração e o nome do seu contentor. Pode ativar ou desativar o registo conforme exigido pela sua organização. No entanto, os registos são anulados com base na duração da retenção, independentemente da adição de novos dados.

Opcional: configure as chaves de acesso do utilizador para o contentor do AWS S3 autogerido

  1. Inicie sessão na AWS Management Console.
  2. Crie um utilizador seguindo este guia do utilizador: criar um utilizador do IAM.
  3. Selecione o utilizador criado.
  4. Selecione o separador Credenciais de segurança.
  5. Clique em Criar chave de acesso na secção Chaves de acesso.
  6. Selecione Serviço de terceiros como o Exemplo de utilização.
  7. Clicar em Seguinte.
  8. Opcional: adicione uma etiqueta de descrição.
  9. Clique em Criar chave de acesso.
  10. Clique em Transferir ficheiro CSV para guardar a chave de acesso e a chave de acesso secreta para utilização posterior.
  11. Clique em Concluído.
  12. Selecione o separador Autorizações.
  13. Clique em Adicionar autorizações na secção Políticas de autorizações.
  14. Selecione Adicionar autorizações.
  15. Selecione Anexar políticas diretamente.
  16. Pesquise e selecione a política AmazonS3FullAccess.
  17. Clicar em Seguinte.
  18. Clique em Adicionar autorizações.

Opcional: configure um contentor do Amazon S3 autogerido

  1. Inicie sessão na AWS Management Console.

  2. Aceda ao S3.

  3. Clique em Criar contentor.

  4. Faculte os seguintes detalhes de configuração:

    • Nome do contentor: indique um nome para o contentor do Amazon S3.
    • Região: selecione uma região.
  5. Clique em Criar.

Opcional: configure uma política de contentor para o contentor do AWS S3 autogerido

  1. Clique no contentor recém-criado para o abrir.
  2. Selecione Propriedades > Autorizações.
  3. Na lista Autorizações, clique em Adicionar política de contentor.
  4. Introduza a política de contentores pré-configurada da seguinte forma:

    {
      "Version": "2008-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::568526795995:user/logs"
          },
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::BUCKET_NAME/*"
        },
        {
          "Sid": "",
          "Effect": "Deny",
          "Principal": {
            "AWS": "arn:aws:iam::568526795995:user/logs"
          },
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::BUCKET_NAME/*"},
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::568526795995:user/logs"
          },
          "Action": "s3:GetBucketLocation",
          "Resource": "arn:aws:s3:::BUCKET_NAME"
        },
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::568526795995:user/logs"
          },
          "Action": "s3:ListBucket",
          "Resource": "arn:aws:s3:::BUCKET_NAME"
        }
      ]
    }
    
    • Substitua BUCKET_NAME pelo nome do contentor do Amazon S3 que indicou.
  5. Clique em Guardar.

Opcional: validação obrigatória para o contentor do Amazon S3 autogerido

  1. No painel de controlo do Cisco Umbrella, selecione Admin > Gestão de registos > Amazon S3.
  2. No campo Nome do contentor, especifique o nome exato do contentor do Amazon S3 e, de seguida, clique em Validar.
  3. Como parte do processo de validação, é carregado um ficheiro denominado README_FROM_UMBRELLA.txt do Cisco Umbrella para o seu contentor do Amazon S3. Pode ter de atualizar o navegador para ver o ficheiro Readme quando for carregado.
  4. Transfira o ficheiro README_FROM_UMBRELLA.txt e abra-o com um editor de texto.
  5. Copie e guarde o token exclusivo do Cisco Umbrella do ficheiro.
  6. Aceda ao painel de controlo do Cisco Umbrella.
  7. No campo Número do token, especifique o token e clique em Guardar.
  8. Se for bem-sucedida, recebe uma mensagem de confirmação no painel de controlo a indicar que o contentor foi validado com êxito. Se receber um erro a indicar que não é possível validar o seu contentor, verifique novamente a sintaxe do nome do contentor e reveja a configuração.

Configure um feed no Google SecOps para carregar os registos de DNS do Cisco Umbrella

  1. Aceda a Definições do SIEM > Feeds.
  2. Clique em Adicionar novo.
  3. No campo Nome do feed, introduza um nome para o feed; por exemplo, Registos de DNS do Cisco Umbrella.
  4. Selecione Amazon S3 V2 como o Tipo de origem.
  5. Selecione Cisco Umbrella DNS como o Tipo de registo.
  6. Clicar em Seguinte.
  7. Especifique valores para os seguintes parâmetros de entrada:

    • URI do S3: o URI do contentor.
      • s3:/BUCKET_NAME/
        • Substitua BUCKET_NAME pelo nome real do contentor.
    • Opções de eliminação de origens: selecione a opção de eliminação de acordo com a sua preferência.
  8. Clicar em Seguinte.

  9. Reveja a nova configuração do feed no ecrã Finalizar e, de seguida, clique em Enviar.

Tabela de mapeamento da UDM

Campo de registo Mapeamento de UDM Lógica
action security_result.action_details O valor é retirado do campo action, se existir nos registos JSON, ou de column6 ou column7 nos registos CSV, e convertido em maiúsculas (ALLOW ou BLOCK).
amp.disposition security_result.detection_fields[].key O valor é ampDisposition.
amp.disposition security_result.detection_fields[].value O valor é retirado do campo amp.disposition.
amp.malware security_result.detection_fields[].key O valor é ampMalware.
amp.malware security_result.detection_fields[].value O valor é retirado do campo amp.malware.
amp.score security_result.detection_fields[].key O valor é ampScore.
amp.score security_result.detection_fields[].value O valor é retirado do campo amp.score.
blocked_categories security_result.category_details O valor é retirado do campo blocked_categories.
blockedfiletype security_result.detection_fields[].key O valor é egress type.
blockedfiletype security_result.detection_fields[].value O valor é retirado do campo blockedfiletype.
bundleid additional.fields[].key O valor é bundleid.
bundleid additional.fields[].value.string_value O valor é retirado do campo bundleid.
categories[] security_result.category_details O valor é retirado do campo categories[].label.
column1 metadata.event_timestamp.seconds O valor é analisado a partir do campo column1 como uma data/hora. Para registos de proxy, se existirem os campos date e time, estes são combinados e analisados como uma indicação de tempo.
column10 network.http.user_agent O valor é retirado do campo column10.
column10 additional.fields[].value.string_value O valor é retirado do campo column10.
column11 target.port O valor é retirado do campo column11.
column12 principal.resource.name O valor é retirado do campo column12.
column13 security_result.rule_id O valor é retirado do campo column13.
column14 security_result.action_details O valor é retirado do campo column14.
column2 principal.user.user_display_name O valor é retirado do campo column2.
column2 principal.user.userid O valor é retirado do campo column2.
column2 principal.location.name O valor é retirado do campo column2.
column3 principal.hostname O valor é retirado do campo column3.
column3 principal.user.product_object_id O valor é retirado do campo column3.
column3 principal.location.city O valor é retirado do campo column3.
column3 additional.fields[].value.string_value O valor é retirado do campo column3.
column4 principal.asset.ip O valor é retirado do campo column4.
column4 principal.ip O valor é retirado do campo column4.
column4 principal.port O valor é retirado do campo column4.
column5 principal.asset.ip O valor é retirado do campo column5.
column5 principal.ip O valor é retirado do campo column5.
column5 target.asset.ip O valor é retirado do campo column5.
column5 target.ip O valor é retirado do campo column5.
column6 security_result.action_details O valor é retirado do campo column6.
column6 target.port O valor é retirado do campo column6.
column7 network.received_bytes O valor é retirado do campo column7.
column7 additional.fields[].value.string_value O valor é retirado do campo column7.
column8 principal.asset.ip O valor é retirado do campo column8.
column8 principal.ip O valor é retirado do campo column8.
column8 target.url O valor é retirado do campo column8.
column9 principal.port O valor é retirado do campo column9.
column9 network.http.referral_url O valor é retirado do campo column9.
data_center_name principal.resource.name O valor é retirado do campo data_center_name.
datacenter.label security_result.detection_fields[].key O valor é datacenter label.
datacenter.label security_result.detection_fields[].value O valor é retirado do campo datacenter.label.
destinationip target.asset.ip O valor é retirado do campo destinationip.
destinationip target.ip O valor é retirado do campo destinationip.
direction network.direction O valor é retirado do campo direction e convertido em maiúsculas.
domain network.dns.questions[].name O valor é retirado do campo domain, com o ponto final removido, se estiver presente.
dstPort target.port O valor é retirado do campo dstPort.
dstip target.asset.ip O valor é retirado do campo dstip.
dstip target.ip O valor é retirado do campo dstip.
egress.ip security_result.detection_fields[].key O valor é egress ip.
egress.ip security_result.detection_fields[].value O valor é retirado do campo egress.ip.
egress.type security_result.detection_fields[].key O valor é egress type.
egress.type security_result.detection_fields[].value O valor é retirado do campo egress.type.
externalip principal.asset.ip O valor é retirado do campo externalip.
externalip principal.ip O valor é retirado do campo externalip.
forwardingmethod additional.fields[].key O valor é forwardingmethod.
forwardingmethod additional.fields[].value.string_value O valor é retirado do campo forwardingmethod.
granular_identity principal.user.user_display_name O valor é retirado do campo granular_identity se estiverem presentes granular_identity e most_granular_identity. Caso contrário, é derivado do campo _policy_identity e analisado mais detalhadamente com base em identityType.
granular_identity principal.user.email_addresses O valor é extraído do campo granular_identity através de uma expressão regular.
granular_identity principal.user.first_name O valor é extraído do campo granular_identity através de uma expressão regular.
granular_identity principal.user.last_name O valor é extraído do campo granular_identity através de uma expressão regular.
granular_identity principal.user.userid O valor é extraído do campo granular_identity através de uma expressão regular.
granular_identity principal.hostname O valor é retirado do campo granular_identity.
granular_identity principal.location.name O valor é retirado do campo granular_identity.
identity_types additional.fields[].value.string_value O valor é retirado do campo identity_types.
identities[] principal.user.product_object_id O valor é retirado do campo identities[].
identities principal.user.product_object_id O valor é retirado do campo identities.
internalip principal.asset.ip O valor é retirado do campo internalip.
internalip principal.ip O valor é retirado do campo internalip.
isolated.fileaction security_result.detection_fields[].key O valor é isolated fileaction.
isolated.fileaction security_result.detection_fields[].value O valor é retirado do campo isolated.fileaction.
isolated.state security_result.detection_fields[].key O valor é isolated state.
isolated.state security_result.detection_fields[].value O valor é retirado do campo isolated.state.
most_granular_identity principal.user.identityType O valor é retirado do campo most_granular_identity se granular_identity e most_granular_identity estiverem presentes. Caso contrário, é retirado do campo _policy_identity_type.
nat_destination_ip principal.asset.ip O valor é retirado do campo nat_destination_ip.
nat_destination_ip principal.ip O valor é retirado do campo nat_destination_ip.
odns_categories security_result.category_details O valor é retirado do campo odns_categories.
policy.ruleid security_result.rule_id O valor é retirado do campo policy.ruleid.
policy.rulesetid security_result.detection_fields[].key O valor é rulesetid.
policy.rulesetid security_result.detection_fields[].value O valor é retirado do campo policy.rulesetid.
policy.timebasedrule security_result.detection_fields[].key O valor é timebasedrule.
policy.timebasedrule security_result.detection_fields[].value O valor é retirado do campo policy.timebasedrule.
port target.port O valor é retirado do campo port.
query_type_name network.dns.questions[].type A parte numérica é extraída do campo query_type_name através de uma expressão regular e convertida num número inteiro.
query_type_name additional.fields[].value.string_value A parte da string entre parênteses é extraída do campo query_type_name através de uma expressão regular.
querytype network.dns.questions[].type O valor é retirado do campo querytype e mapeado para um valor numérico com base no tipo de registo DNS.
referer network.http.referral_url O valor é retirado do campo referer.
requestmethod network.http.method O valor é retirado do campo requestmethod.
requestsize network.sent_bytes O valor é retirado do campo requestsize e convertido num número inteiro sem sinal.
response additional.fields[].value.string_value O valor é retirado do campo response.
responsecode network.http.response_code O valor é retirado do campo responsecode.
responsefilename target.file.names O valor é retirado do campo responsefilename.
responsesize network.received_bytes O valor é retirado do campo responsesize e convertido num número inteiro sem sinal.
returncode network.dns.response_code O valor é retirado do campo returncode e convertido num número inteiro sem sinal.
securityoverridden additional.fields[].key O valor é securityoverridden.
securityoverridden additional.fields[].value.string_value O valor é retirado do campo securityoverridden.
sha256 target.file.sha256 O valor é retirado do campo sha256.
source_ip principal.asset.ip O valor é retirado do campo source_ip, se existir nos registos JSON, ou de column3 nos registos CSV.
source_ip principal.ip O valor é retirado do campo source_ip, se existir nos registos JSON, ou de column3 nos registos CSV.
srcPort principal.port O valor é retirado do campo srcPort.
statuscode network.http.response_code O valor é retirado do campo statuscode.
tenantcontrols additional.fields[].key O valor é tenantcontrols.
tenantcontrols additional.fields[].value.string_value O valor é retirado do campo tenantcontrols.
timestamp metadata.event_timestamp.seconds O valor é analisado a partir do campo timestamp como uma data/hora.
tunnel_name additional.fields[].key O valor é tunnel_name.
tunnel_name additional.fields[].value.string_value O valor é retirado do campo tunnel_name.
tunnel_type metadata.product_event_type O valor é retirado do campo tunnel_type.
type additional.fields[].key O valor é type.
type additional.fields[].value.string_value O valor é retirado do campo type.
url target.url O valor é retirado do campo url.
useragent network.http.user_agent O valor é retirado do campo useragent.
verdict security_result.action_details O valor é retirado do campo verdict.
warnstatus security_result.detection_fields[].key O valor é warnstatus.
warnstatus security_result.detection_fields[].value O valor é retirado do campo warnstatus. O valor é DNS Lookup Type. A parte da string entre parênteses é extraída do campo query_type_name através de uma expressão regular ou é uma string vazia se o campo não estiver presente. O valor é DNS request and response were made. determinado com base na presença de determinados campos: NETWORK_DNS se question.name estiver presente, NETWORK_CONNECTION se principal.ip e target.ip estiverem presentes, STATUS_UPDATE se apenas principal.ip estiver presente ou GENERIC_EVENT caso contrário. O valor é UMBRELLA_DNS. O valor é Umbrella DNS. O valor é Cisco. O valor está inicialmente definido como DNS. Se requestmethod for um método HTTP válido, é alterado para HTTP. A parte numérica é extraída do campo query_type_name através de uma expressão regular e convertida num número inteiro, ou é derivada do campo querytype e mapeada para um valor numérico com base no tipo de registo de DNS. O valor é derivado do campo useragent ou column10 através do filtro parseduseragent. O valor é retirado da última parte do campo column3 após a divisão por vírgulas ou é uma string vazia se o campo não estiver presente. O valor é retirado da primeira parte do campo column3 após a divisão por vírgulas ou é retirado do campo column2 se column3 não estiver presente. O valor é extraído do campo column2 ou column3 através de uma expressão regular. O valor é extraído do campo column2 ou column3 através de uma expressão regular. O valor é extraído do campo column2 ou column3 através de uma expressão regular. O valor é extraído do campo column2 ou column3 através de uma expressão regular. O valor é derivado do campo action, column6, column7 ou verdict e convertido em maiúsculas (ALLOW ou BLOCK). O valor é definido como NETWORK_MALICIOUS se _categories contiver Malware ou NETWORK_SUSPICIOUS se _categories contiver Potentially Harmful.

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