Coletar registros de 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 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
- 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. Após o 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 o 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 da fonte: 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 do 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 é definido inicialmente 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.