Recolha registos de DNS do Cisco Umbrella
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
- Inicie sessão no painel de controlo do Cisco Umbrella.
- Aceda a Administração > Gestão de registos.
- Selecione a opção Usar um contentor do Amazon S3 gerido pela Cisco.
- 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.
- Clique em Guardar.
- 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. - Copie os valores da Chave de acesso e da Chave secreta. Se perder estas chaves, tem de as regenerar.
- Clique em OK > Continuar.
- É 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
- Inicie sessão na AWS Management Console.
- Crie um utilizador seguindo este guia do utilizador: criar um utilizador do IAM.
- Selecione o utilizador criado.
- Selecione o separador Credenciais de segurança.
- Clique em Criar chave de acesso na secção Chaves de acesso.
- Selecione Serviço de terceiros como o Exemplo de utilização.
- Clicar em Seguinte.
- Opcional: adicione uma etiqueta de descrição.
- Clique em Criar chave de acesso.
- Clique em Transferir ficheiro CSV para guardar a chave de acesso e a chave de acesso secreta para utilização posterior.
- Clique em Concluído.
- Selecione o separador Autorizações.
- Clique em Adicionar autorizações na secção Políticas de autorizações.
- Selecione Adicionar autorizações.
- Selecione Anexar políticas diretamente.
- Pesquise e selecione a política AmazonS3FullAccess.
- Clicar em Seguinte.
- Clique em Adicionar autorizações.
Opcional: configure um contentor do Amazon S3 autogerido
Inicie sessão na AWS Management Console.
Aceda ao S3.
Clique em Criar contentor.
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.
Clique em Criar.
Opcional: configure uma política de contentor para o contentor do AWS S3 autogerido
- Clique no contentor recém-criado para o abrir.
- Selecione Propriedades > Autorizações.
- Na lista Autorizações, clique em Adicionar política de contentor.
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.
- Substitua
Clique em Guardar.
Opcional: validação obrigatória para o contentor do Amazon S3 autogerido
- No painel de controlo do Cisco Umbrella, selecione Admin > Gestão de registos > Amazon S3.
- No campo Nome do contentor, especifique o nome exato do contentor do Amazon S3 e, de seguida, clique em Validar.
- 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. - Transfira o ficheiro
README_FROM_UMBRELLA.txt
e abra-o com um editor de texto. - Copie e guarde o token exclusivo do Cisco Umbrella do ficheiro.
- Aceda ao painel de controlo do Cisco Umbrella.
- No campo Número do token, especifique o token e clique em Guardar.
- 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
- Aceda a Definições do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, introduza um nome para o feed; por exemplo, Registos de DNS do Cisco Umbrella.
- Selecione Amazon S3 V2 como o Tipo de origem.
- Selecione Cisco Umbrella DNS como o Tipo de registo.
- Clicar em Seguinte.
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.
- Substitua
- Opções de eliminação de origens: selecione a opção de eliminação de acordo com a sua preferência.
- URI do S3: o URI do contentor.
Clicar em Seguinte.
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.