Coletar registros DNS do Cisco Umbrella
Este documento explica como coletar registros de DNS do Cisco Umbrella em um feed do Google Security Operations usando um bucket do AWS S3. O analisador processa registros formatados em JSON e CSV. Ele extrai campos, renomeia-os para corresponder à UDM, processa diferentes versões e formatos de registros (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 da 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
- Faça login no painel do Cisco Umbrella.
- Acesse Administrador > Gerenciamento de registros.
- Selecione a opção Usar um bucket do Amazon S3 gerenciado pela Cisco.
- Informe os seguintes detalhes de configuração:
- Selecione uma região: escolha uma região mais próxima de você para reduzir a latência.
- Selecione uma duração de retenção: escolha o período. A duração da retenção é de 7, 14 ou 30 dias. Depois do período selecionado, os dados são excluídos e não podem ser recuperados. Se o ciclo de ingestão for regular, use um período mais curto. É possível mudar a duração da retenção depois.
- Clique em Salvar.
- Clique em Continuar para confirmar suas seleções e receber a notificação de ativação.
Na janela Ativação concluída que aparece, os valores de Chave de acesso e Chave secreta são exibidos. - Copie os valores de Chave de acesso e Chave secreta. Se você perder essas chaves, será necessário gerá-las novamente.
- Clique em Entendi > Continuar.
- Uma página de resumo mostra a configuração e o nome do bucket. Você pode ativar ou desativar a geração de registros conforme exigido pela sua organização. No entanto, os registros são limpos com base na duração da retenção, independentemente da adição de novos dados.
Opcional: configurar chaves de acesso do usuário para um bucket do AWS S3 autogerenciado
- Faça login no Console de Gerenciamento da AWS.
- Crie um usuário seguindo este guia: Como criar um usuário do IAM.
- Selecione o usuário criado.
- Selecione a guia Credenciais de segurança.
- Clique em Criar chave de acesso na seção Chaves de acesso.
- Selecione Serviço de terceiros como o Caso de uso.
- Clique em Próxima.
- Opcional: adicione uma tag de descrição.
- Clique em Criar chave de acesso.
- Clique em Fazer o download do arquivo CSV para salvar a chave de acesso e a chave de acesso secreta para uso posterior.
- Clique em Concluído.
- Selecione a guia Permissões.
- Clique em Adicionar permissões na seção Políticas de permissões.
- Selecione Adicionar permissões.
- Selecione Anexar políticas diretamente.
- Pesquise e selecione a política AmazonS3FullAccess.
- Clique em Próxima.
- Clique em Adicionar permissões
Opcional: configurar um bucket do Amazon S3 autogerenciado
Faça login no Console de Gerenciamento da AWS.
Acesse S3.
Clique em Criar bucket.
Informe os seguintes detalhes de configuração:
- Nome do bucket: informe um nome para o bucket do Amazon S3.
- Região: selecione uma região.
Clique em Criar.
Opcional: configure uma política de bucket para o bucket do AWS S3 autogerenciado
- Clique no bucket recém-criado para abrir.
- Selecione Propriedades > Permissões.
- Na lista Permissões, clique em Adicionar política de bucket.
Insira a política de bucket pré-configurada 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_NAMEpelo nome do bucket do Amazon S3 que você informou.
- Substitua
Clique em Salvar.
Opcional: verificação obrigatória para bucket do Amazon S3 autogerenciado
- No painel Cisco Umbrella, selecione Admin > Log management > Amazon S3.
- No campo Nome do bucket, especifique o nome exato do bucket do Amazon S3 e clique em Verificar.
- 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. - Faça o download do arquivo
README_FROM_UMBRELLA.txte abra-o usando um editor de texto. - Copie e salve o token exclusivo do Cisco Umbrella do arquivo.
- Acesse o painel do Cisco Umbrella.
- No campo Número do token, especifique o token e clique em Salvar.
- 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 seu bucket, confira novamente a sintaxe do nome dele e revise a configuração.
Configurar um feed no Google SecOps para ingerir os registros de DNS do Cisco Umbrella
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed, por exemplo, Registros de DNS do Cisco Umbrella.
- Selecione Amazon S3 V2 como o Tipo de origem.
- Selecione DNS do Cisco Umbrella como o Tipo de registro.
- Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
- URI do S3: o URI do bucket.
s3:/BUCKET_NAME/- Substitua
BUCKET_NAMEpelo nome real do bucket.
- Substitua
- Opções de exclusão de fontes: selecione a opção de exclusão de acordo com sua preferência.
- URI do S3: o URI do bucket.
Clique em Próxima.
Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Tabela de mapeamento da UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
action |
security_result.action_details |
O valor é extraído 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 é extraído do campo amp.disposition. |
amp.malware |
security_result.detection_fields[].key |
O valor é ampMalware. |
amp.malware |
security_result.detection_fields[].value |
O valor é extraído do campo amp.malware. |
amp.score |
security_result.detection_fields[].key |
O valor é ampScore. |
amp.score |
security_result.detection_fields[].value |
O valor é extraído do campo amp.score. |
blocked_categories |
security_result.category_details |
O valor é extraído do campo blocked_categories. |
blockedfiletype |
security_result.detection_fields[].key |
O valor é egress type. |
blockedfiletype |
security_result.detection_fields[].value |
O valor é extraído do campo blockedfiletype. |
bundleid |
additional.fields[].key |
O valor é bundleid. |
bundleid |
additional.fields[].value.string_value |
O valor é extraído do campo bundleid. |
categories[] |
security_result.category_details |
O valor é extraído 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 uma marcação de tempo. |
column10 |
network.http.user_agent |
O valor é extraído do campo column10. |
column10 |
additional.fields[].value.string_value |
O valor é extraído do campo column10. |
column11 |
target.port |
O valor é extraído do campo column11. |
column12 |
principal.resource.name |
O valor é extraído do campo column12. |
column13 |
security_result.rule_id |
O valor é extraído do campo column13. |
column14 |
security_result.action_details |
O valor é extraído do campo column14. |
column2 |
principal.user.user_display_name |
O valor é extraído do campo column2. |
column2 |
principal.user.userid |
O valor é extraído do campo column2. |
column2 |
principal.location.name |
O valor é extraído do campo column2. |
column3 |
principal.hostname |
O valor é extraído do campo column3. |
column3 |
principal.user.product_object_id |
O valor é extraído do campo column3. |
column3 |
principal.location.city |
O valor é extraído do campo column3. |
column3 |
additional.fields[].value.string_value |
O valor é extraído do campo column3. |
column4 |
principal.asset.ip |
O valor é extraído do campo column4. |
column4 |
principal.ip |
O valor é extraído do campo column4. |
column4 |
principal.port |
O valor é extraído do campo column4. |
column5 |
principal.asset.ip |
O valor é extraído do campo column5. |
column5 |
principal.ip |
O valor é extraído do campo column5. |
column5 |
target.asset.ip |
O valor é extraído do campo column5. |
column5 |
target.ip |
O valor é extraído do campo column5. |
column6 |
security_result.action_details |
O valor é extraído do campo column6. |
column6 |
target.port |
O valor é extraído do campo column6. |
column7 |
network.received_bytes |
O valor é extraído do campo column7. |
column7 |
additional.fields[].value.string_value |
O valor é extraído do campo column7. |
column8 |
principal.asset.ip |
O valor é extraído do campo column8. |
column8 |
principal.ip |
O valor é extraído do campo column8. |
column8 |
target.url |
O valor é extraído do campo column8. |
column9 |
principal.port |
O valor é extraído do campo column9. |
column9 |
network.http.referral_url |
O valor é extraído do campo column9. |
data_center_name |
principal.resource.name |
O valor é extraído 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 é extraído do campo datacenter.label. |
destinationip |
target.asset.ip |
O valor é extraído do campo destinationip. |
destinationip |
target.ip |
O valor é extraído do campo destinationip. |
direction |
network.direction |
O valor é extraído do campo direction e convertido em maiúsculas. |
domain |
network.dns.questions[].name |
O valor é extraído do campo domain, com o ponto final removido, se presente. |
dstPort |
target.port |
O valor é extraído do campo dstPort. |
dstip |
target.asset.ip |
O valor é extraído do campo dstip. |
dstip |
target.ip |
O valor é extraído do campo dstip. |
egress.ip |
security_result.detection_fields[].key |
O valor é egress ip. |
egress.ip |
security_result.detection_fields[].value |
O valor é extraído do campo egress.ip. |
egress.type |
security_result.detection_fields[].key |
O valor é egress type. |
egress.type |
security_result.detection_fields[].value |
O valor é extraído do campo egress.type. |
externalip |
principal.asset.ip |
O valor é extraído do campo externalip. |
externalip |
principal.ip |
O valor é extraído do campo externalip. |
forwardingmethod |
additional.fields[].key |
O valor é forwardingmethod. |
forwardingmethod |
additional.fields[].value.string_value |
O valor é extraído do campo forwardingmethod. |
granular_identity |
principal.user.user_display_name |
O valor é extraído do campo granular_identity se granular_identity e most_granular_identity estiverem presentes. Caso contrário, ele será 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 é extraído do campo granular_identity. |
granular_identity |
principal.location.name |
O valor é extraído do campo granular_identity. |
identity_types |
additional.fields[].value.string_value |
O valor é extraído do campo identity_types. |
identities[] |
principal.user.product_object_id |
O valor é extraído do campo identities[]. |
identities |
principal.user.product_object_id |
O valor é extraído do campo identities. |
internalip |
principal.asset.ip |
O valor é extraído do campo internalip. |
internalip |
principal.ip |
O valor é extraído do campo internalip. |
isolated.fileaction |
security_result.detection_fields[].key |
O valor é isolated fileaction. |
isolated.fileaction |
security_result.detection_fields[].value |
O valor é extraído do campo isolated.fileaction. |
isolated.state |
security_result.detection_fields[].key |
O valor é isolated state. |
isolated.state |
security_result.detection_fields[].value |
O valor é extraído do campo isolated.state. |
most_granular_identity |
principal.user.identityType |
O valor é extraído do campo most_granular_identity se granular_identity e most_granular_identity estiverem presentes. Caso contrário, ele será extraído do campo _policy_identity_type. |
nat_destination_ip |
principal.asset.ip |
O valor é extraído do campo nat_destination_ip. |
nat_destination_ip |
principal.ip |
O valor é extraído do campo nat_destination_ip. |
odns_categories |
security_result.category_details |
O valor é extraído do campo odns_categories. |
policy.ruleid |
security_result.rule_id |
O valor é extraído do campo policy.ruleid. |
policy.rulesetid |
security_result.detection_fields[].key |
O valor é rulesetid. |
policy.rulesetid |
security_result.detection_fields[].value |
O valor é extraído do campo policy.rulesetid. |
policy.timebasedrule |
security_result.detection_fields[].key |
O valor é timebasedrule. |
policy.timebasedrule |
security_result.detection_fields[].value |
O valor é extraído do campo policy.timebasedrule. |
port |
target.port |
O valor é extraído 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 é extraído do campo querytype e mapeado para um valor numérico com base no tipo de registro DNS. |
referer |
network.http.referral_url |
O valor é extraído do campo referer. |
requestmethod |
network.http.method |
O valor é extraído do campo requestmethod. |
requestsize |
network.sent_bytes |
O valor é extraído do campo requestsize e convertido em um número inteiro sem sinal. |
response |
additional.fields[].value.string_value |
O valor é extraído do campo response. |
responsecode |
network.http.response_code |
O valor é extraído do campo responsecode. |
responsefilename |
target.file.names |
O valor é extraído do campo responsefilename. |
responsesize |
network.received_bytes |
O valor é extraído do campo responsesize e convertido em um número inteiro sem sinal. |
returncode |
network.dns.response_code |
O valor é extraído 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 é extraído do campo securityoverridden. |
sha256 |
target.file.sha256 |
O valor é extraído do campo sha256. |
source_ip |
principal.asset.ip |
O valor é extraído do campo source_ip, se ele existir nos registros JSON, ou de column3, nos registros CSV. |
source_ip |
principal.ip |
O valor é extraído do campo source_ip, se ele existir nos registros JSON, ou de column3, nos registros CSV. |
srcPort |
principal.port |
O valor é extraído do campo srcPort. |
statuscode |
network.http.response_code |
O valor é extraído do campo statuscode. |
tenantcontrols |
additional.fields[].key |
O valor é tenantcontrols. |
tenantcontrols |
additional.fields[].value.string_value |
O valor é extraído 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 é extraído do campo tunnel_name. |
tunnel_type |
metadata.product_event_type |
O valor é extraído do campo tunnel_type. |
type |
additional.fields[].key |
O valor é type. |
type |
additional.fields[].value.string_value |
O valor é extraído do campo type. |
url |
target.url |
O valor é extraído do campo url. |
useragent |
network.http.user_agent |
O valor é extraído do campo useragent. |
verdict |
security_result.action_details |
O valor é extraído do campo verdict. |
warnstatus |
security_result.detection_fields[].key |
O valor é warnstatus. |
warnstatus |
security_result.detection_fields[].value |
O valor é extraído 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á mudado 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 DNS. O valor é derivado do campo useragent ou column10 usando o filtro parseduseragent. O valor é extraído 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 é extraído 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 para 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 do Google SecOps.