Coletar registros DNS do Cisco Umbrella

Compatível com:

Este documento explica como coletar registros DNS do Cisco Umbrella em um feed do Google Security Operations usando o bucket do AWS S3. O analisador processa registros formatados em JSON e CSV. Ele extrai campos, renomeia-os para corresponder ao UDM, processa diferentes versões e formatos de registro (incluindo registros de proxy e IP) e executa uma lógica específica para identidades, categorias de segurança e eventos de rede, mesclando os dados extraídos no esquema do UDM.

Antes de começar

  • Verifique se você tem uma instância do Google SecOps.
  • Verifique se você tem acesso privilegiado ao AWS IAM e ao S3.
  • Verifique se você tem acesso privilegiado ao Cisco Umbrella.

Configurar um bucket do Amazon S3 gerenciado pela Cisco

  1. Faça login no painel do Cisco Umbrella.
  2. Acesse Administrador > Gerenciamento de registros.
  3. Selecione a opção Usar um bucket do Amazon S3 gerenciado pela Cisco.
  4. Informe os seguintes detalhes de configuração:
    • Selecione uma região: escolha uma região mais próxima do seu local para reduzir a latência.
    • 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 excluídos e não podem ser recuperados. Se o ciclo de transferência for regular, use um período menor. Você pode mudar a duração da retenção mais tarde.
  5. Clique em Salvar.
  6. Clique em Continuar para confirmar suas seleções e receber a notificação de ativação.
    Na janela Activation complete que aparece, os valores Access key e Secret key são exibidos.
  7. Copie os valores das chaves de acesso e secreta. Se você perder essas chaves, será necessário regenerá-las.
  8. Clique em Entendi > Continuar.
  9. Uma página de resumo mostra a configuração e o nome do bucket. É possível ativar ou desativar a geração de registros conforme necessário na sua organização. No entanto, os registros são limpos com base na duração da retenção, independentemente de novos dados serem adicionados.

Opcional: configure chaves de acesso do usuário para o bucket autogerenciado do AWS S3

  1. Faça login no Console de Gerenciamento da AWS.
  2. Crie um usuário seguindo este guia: Como criar um usuário do IAM.
  3. Selecione o Usuário criado.
  4. Selecione a guia Credenciais de segurança.
  5. Clique em Criar chave de acesso na seção Chaves de acesso.
  6. Selecione Serviço de terceiros como o caso de uso.
  7. Clique em Próxima.
  8. Opcional: adicione uma tag de descrição.
  9. Clique em Criar chave de acesso.
  10. Clique em Fazer o download do arquivo CSV para salvar a chave de acesso e a chave de acesso secreta para uso futuro.
  11. Clique em Concluído.
  12. Selecione a guia Permissões.
  13. Clique em Adicionar permissões na seção Políticas de permissões.
  14. Selecione Adicionar permissões.
  15. Selecione Anexar políticas diretamente.
  16. Pesquise e selecione a política AmazonS3FullAccess.
  17. Clique em Próxima.
  18. Clique em Adicionar permissões

Opcional: configure um bucket autogerenciado do Amazon S3

  1. Faça login no Console de Gerenciamento da AWS.

  2. Acesse S3.

  3. Clique em Criar bucket.

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

    • Nome do bucket: forneça um nome para o bucket do Amazon S3.
    • Região: selecione uma região.
  5. Clique em Criar.

Opcional: configure uma política de bucket para o bucket autogerenciado do AWS S3

  1. Clique no bucket recém-criado para abri-lo.
  2. Selecione Propriedades > Permissões.
  3. Na lista Permissões, clique em Adicionar política de bucket.
  4. Insira a política de bucket preconfigurada da seguinte maneira:

    {
      "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 bucket do Amazon S3 que você informou.
  5. Clique em Salvar.

Opcional: verificação obrigatória para bucket autogerenciado do Amazon S3

  1. No painel do Cisco Umbrella, selecione Administrador > Gerenciamento de registros > Amazon S3.
  2. No campo Nome do bucket, especifique o nome exato do bucket do Amazon S3 e clique em Verificar.
  3. Como parte do processo de verificação, um arquivo chamado README_FROM_UMBRELLA.txt é enviado do Cisco Umbrella para seu bucket do Amazon S3. Talvez seja necessário atualizar o navegador para ver o arquivo readme quando ele for enviado.
  4. Faça o download do arquivo README_FROM_UMBRELLA.txt e abra-o usando um editor de texto.
  5. Copie e salve o token exclusivo do Cisco Umbrella do arquivo.
  6. Acesse o painel do Cisco Umbrella.
  7. No campo Número do token, especifique o token e clique em Salvar.
  8. Se for bem-sucedida, você vai receber uma mensagem de confirmação no painel indicando que o bucket foi verificado. Se você receber um erro indicando que não é possível verificar o bucket, verifique novamente a sintaxe do nome do bucket e revise a configuração.

Configurar um feed no Google SecOps para processar os registros DNS do Cisco Umbrella

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo.
  3. No campo Nome do feed, insira um nome para o feed. Por exemplo, Cisco Umbrella DNS Logs.
  4. Selecione Amazon S3 como o Tipo de origem.
  5. Selecione Cisco Umbrella DNS como o Tipo de registro.
  6. Clique em Próxima.
  7. Especifique valores para os seguintes parâmetros de entrada:

    • Região: insira a região em que o bucket do Amazon S3 está localizado.
    • URI do S3: o URI do bucket.
      • s3:/BUCKET_NAME
        • Substitua BUCKET_NAME pelo nome real do bucket.
    • URI é um: selecione Diretório que inclui subdiretórios, Arquivo único ou Diretório, de acordo com a configuração do fluxo de registros.
    • Opções de exclusão da origem: selecione a opção de exclusão de acordo com sua preferência.
    • ID da chave de acesso: insira a chave de acesso do usuário com acesso ao bucket do S3.
    • Chave de acesso secreta: insira a chave secreta do usuário com acesso ao bucket do S3.
    • Opcional: Namespace do recurso: informe o namespace do recurso.
    • Opcional: Rótulos de transferência: informe o rótulo que será aplicado aos eventos desse feed.
  8. Clique em Próxima.

  9. Revise a configuração do novo feed na tela Finalizar e clique em Enviar.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
action security_result.action_details O valor é retirado do campo action, se ele existir nos registros JSON, ou de column6 ou column7 nos registros 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 do campo column1 como um carimbo de data/hora. Para registros de proxy, se os campos date e time existirem, eles serão combinados e analisados como um carimbo de data/hora.
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 para maiúsculas.
domain network.dns.questions[].name O valor é retirado do campo domain, com o ponto final removido, se 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 granular_identity e most_granular_identity estiverem presentes. Caso contrário, ele é derivado do campo _policy_identity e analisado com base em identityType.
granular_identity principal.user.email_addresses O valor é extraído do campo granular_identity usando uma expressão regular.
granular_identity principal.user.first_name O valor é extraído do campo granular_identity usando uma expressão regular.
granular_identity principal.user.last_name O valor é extraído do campo granular_identity usando uma expressão regular.
granular_identity principal.user.userid O valor é extraído do campo granular_identity usando 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, ela será extraída 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 usando uma expressão regular e convertida em um 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 usando 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 registro 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 em um 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 em um número inteiro sem sinal.
returncode network.dns.response_code O valor é retirado do campo returncode e convertido em um 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 ele existir nos registros JSON, ou de column3 nos registros CSV.
source_ip principal.ip O valor é retirado do campo source_ip, se ele existir nos registros JSON, ou de column3 nos registros 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 do campo timestamp como um carimbo de 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 usando 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 é inicialmente definido como DNS. Se requestmethod for um método HTTP válido, ele será alterado para HTTP. A parte numérica é extraída do campo query_type_name usando uma expressão regular e convertida em um número inteiro ou é derivada do campo querytype e mapeada para um valor numérico com base no tipo de registro do DNS. O valor é derivado do campo useragent ou column10 usando o 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 do campo column2 se column3 não estiver presente. O valor é extraído do campo column2 ou column3 usando uma expressão regular. O valor é extraído do campo column2 ou column3 usando uma expressão regular. O valor é extraído do campo column2 ou column3 usando uma expressão regular. O valor é extraído do campo column2 ou column3 usando uma expressão regular. O valor é derivado do campo action, column6, column7 ou verdict e convertido em maiúsculas (PERMITIR ou BLOQUEAR). O valor é definido como NETWORK_MALICIOUS se _categories contiver Malware ou NETWORK_SUSPICIOUS se _categories contiver Potentially Harmful.

Alterações

2025-01-08

Melhoria:

  • Adicionamos um novo padrão GROK para analisar dados SYSLOG.
  • Um novo padrão Grok foi adicionado para os campos responsecode e internalip.

2024-05-28

Melhoria:

  • dns_record_type foi mapeado para additional.fields.

2024-03-05

Correção de bugs:

  • Um novo padrão Grok foi adicionado para verificar se column3 tem internal_ip e internal_port.
  • Adição de suporte a registros CSV do Network Tunnel.
  • rule_id foi mapeado para security_result.rule_id.
  • dstport foi mapeado para target.port.
  • srcPort foi mapeado para principal.port.
  • _internalip foi mapeado para principal.ip.
  • dstip foi mapeado para target.ip.
  • direction foi mapeado para network.direction.
  • tunnel_name foi mapeado para additional.fields.
  • tunnel_type foi mapeado para metadata.product_event_type.
  • origin_id foi mapeado para metadata.product_log_id.
  • received_bytes foi mapeado para network.received_bytes.
  • Mapeamentos alinhados para principal.ip e principal.asset.ip.
  • Mapeamentos alinhados para target.ip e target.asset.ip.

2023-11-07

Melhoria:

  • Mapeou first_name para principal.user.first_name quando identityType é AD Users.
  • Mapeou last_name para principal.user.last_name quando identityType é AD Users.
  • Foi adicionado mapeamento JSON para identity_types para oferecer suporte ao novo padrão de valor identity em registros.

2023-09-29

Melhoria:

  • returncode foi mapeado para network.dns.response_code.
  • querytype foi mapeado para network.dns.question.type.
  • type foi mapeado para additional.fields.
  • categories foi mapeado para security_result.category_details.
  • Mapeamento de verdict para security_result.action e security_result.action_details.
  • amp.disposition foi mapeado para security_result.detection_fields.
  • amp.malware foi mapeado para security_result.detection_fields.
  • amp.score foi mapeado para security_result.detection_fields.
  • policy.rulesetid foi mapeado para security_result.detection_fields.
  • requestsize foi mapeado para network.sent_bytes.
  • responsesize foi mapeado para network.received_bytes.
  • fileName foi mapeado para target.file.names.
  • responsefilename foi mapeado para network.http.method.
  • Mapeou statuscode para network.http.response_code
  • tenantcontrols, securityoverridden e forwardingmethod foram mapeados para additional.fields.

2022-05-17

Melhoria:

  • Foram adicionadas verificações condicionais para "security_result.action".

13/04/2022

Melhoria:

  • Registros de IP analisados e registros de proxy que foram descartados anteriormente.

2022-03-23

Melhoria:

  • Novo mapeamento de campo adicionado.
  • Tipo de pesquisa DNS mapeado para marcadores.

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