Raccogliere i log DNS di Cisco Umbrella

Supportato in:

Questo documento spiega come raccogliere i log DNS di Cisco Umbrella in un feed di Google Security Operations utilizzando il bucket AWS S3. Il parser gestisce i log formattati in formato JSON e CSV. Estrae i campi, li rinomina in modo che corrispondano a UDM, gestisce diverse versioni e formati di log (inclusi i log proxy e IP) ed esegue una logica specifica per identità, categorie di sicurezza ed eventi di rete, unendo infine i dati estratti nello schema UDM.

Prima di iniziare

  • Assicurati di avere un'istanza Google SecOps.
  • Assicurati di disporre dell'accesso con privilegi ad AWS IAM e S3.
  • Assicurati di disporre dell'accesso con privilegi a Cisco Umbrella.

Configura un bucket Amazon S3 gestito da Cisco

  1. Accedi alla dashboard di Cisco Umbrella.
  2. Vai ad Amministrazione > Gestione log.
  3. Seleziona l'opzione Utilizza un bucket Amazon S3 gestito da Cisco.
  4. Fornisci i seguenti dettagli di configurazione:
    • Seleziona una regione: seleziona una regione più vicina alla tua posizione per una latenza inferiore.
    • Seleziona una durata di conservazione: seleziona il periodo di tempo. La durata della conservazione è di 7, 14 o 30 giorni. Dopo il periodo di tempo selezionato, i dati vengono eliminati e non possono essere recuperati. Se il ciclo di importazione è regolare, utilizza un periodo di tempo più breve. Puoi modificare la durata della conservazione in un secondo momento.
  5. Fai clic su Salva.
  6. Fai clic su Continua per confermare le selezioni e ricevere la notifica di attivazione.
    Nella finestra Attivazione completata visualizzata, vengono mostrati i valori di Chiave di accesso e Chiave segreta.
  7. Copia i valori di Chiave di accesso e Chiave segreta. Se perdi queste chiavi, devi rigenerarle.
  8. Fai clic su Ok > Continua.
  9. Una pagina di riepilogo mostra la configurazione e il nome del bucket. Puoi attivare o disattivare la registrazione in base alle esigenze della tua organizzazione. Tuttavia, i log vengono eliminati in base alla durata della conservazione, indipendentemente dall'aggiunta di nuovi dati.

(Facoltativo) Configura le chiavi di accesso utente per il bucket AWS S3 autogestito

  1. Accedi alla console di gestione AWS.
  2. Crea un utente seguendo questa guida utente: Creazione di un utente IAM.
  3. Seleziona l'utente creato.
  4. Seleziona la scheda Credenziali di sicurezza.
  5. Fai clic su Crea chiave di accesso nella sezione Chiavi di accesso.
  6. Seleziona Servizio di terze parti come Caso d'uso.
  7. Fai clic su Avanti.
  8. (Facoltativo) Aggiungi un tag di descrizione.
  9. Fai clic su Crea chiave di accesso.
  10. Fai clic su Scarica file CSV per salvare la chiave di accesso e la chiave di accesso segreta per un utilizzo successivo.
  11. Fai clic su Fine.
  12. Seleziona la scheda Autorizzazioni.
  13. Fai clic su Aggiungi autorizzazioni nella sezione Criteri per le autorizzazioni.
  14. Seleziona Aggiungi autorizzazioni.
  15. Seleziona Allega direttamente i criteri.
  16. Cerca e seleziona il criterio AmazonS3FullAccess.
  17. Fai clic su Avanti.
  18. Fai clic su Aggiungi autorizzazioni.

(Facoltativo) Configura un bucket Amazon S3 autogestito

  1. Accedi alla console di gestione AWS.

  2. Vai a S3.

  3. Fai clic su Crea bucket.

  4. Fornisci i seguenti dettagli di configurazione:

    • Nome bucket: fornisci un nome per il bucket Amazon S3.
    • Regione: seleziona una regione.
  5. Fai clic su Crea.

(Facoltativo) Configura un criterio del bucket per il bucket AWS S3 autogestito

  1. Fai clic sul bucket appena creato per aprirlo.
  2. Seleziona Proprietà > Autorizzazioni.
  3. Nell'elenco Autorizzazioni, fai clic su Aggiungi policy del bucket.
  4. Inserisci il criterio del bucket preconfigurato come segue:

    {
      "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"
        }
      ]
    }
    
    • Sostituisci BUCKET_NAME con il nome del bucket Amazon S3 che hai fornito.
  5. Fai clic su Salva.

(Facoltativo) Verifica obbligatoria per il bucket Amazon S3 autogestito

  1. Nella dashboard Cisco Umbrella, seleziona Amministrazione > Gestione log > Amazon S3.
  2. Nel campo Nome bucket, specifica il nome esatto del bucket Amazon S3, quindi fai clic su Verifica.
  3. Nell'ambito della procedura di verifica, viene caricato un file denominato README_FROM_UMBRELLA.txt da Cisco Umbrella al tuo bucket Amazon S3. Potresti dover aggiornare il browser per visualizzare il file Leggimi dopo il caricamento.
  4. Scarica il file README_FROM_UMBRELLA.txt e aprilo utilizzando un editor di testo.
  5. Copia e salva il token univoco Cisco Umbrella dal file.
  6. Vai alla dashboard Cisco Umbrella.
  7. Nel campo Numero token, specifica il token e fai clic su Salva.
  8. In caso di esito positivo, riceverai un messaggio di conferma nella dashboard che indica che il bucket è stato verificato correttamente. Se ricevi un errore che indica che il bucket non può essere verificato, controlla di nuovo la sintassi del nome del bucket e rivedi la configurazione.

Configura un feed in Google SecOps per importare i log DNS di Cisco Umbrella

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo.
  3. Nel campo Nome feed, inserisci un nome per il feed, ad esempio Cisco Umbrella DNS Logs.
  4. Seleziona Amazon S3 V2 come Tipo di origine.
  5. Seleziona Cisco Umbrella DNS come Tipo di log.
  6. Fai clic su Avanti.
  7. Specifica i valori per i seguenti parametri di input:

    • URI S3: l'URI del bucket.
      • s3:/BUCKET_NAME/
        • Sostituisci BUCKET_NAME con il nome effettivo del bucket.
    • Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.
  8. Fai clic su Avanti.

  9. Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.

Tabella di mappatura UDM

Campo log Mappatura UDM Logic
action security_result.action_details Il valore viene estratto dal campo action se esiste nei log JSON oppure da column6 o column7 nei log CSV e convertito in maiuscolo (ALLOW o BLOCK).
amp.disposition security_result.detection_fields[].key Il valore è ampDisposition.
amp.disposition security_result.detection_fields[].value Il valore viene estratto dal campo amp.disposition.
amp.malware security_result.detection_fields[].key Il valore è ampMalware.
amp.malware security_result.detection_fields[].value Il valore viene estratto dal campo amp.malware.
amp.score security_result.detection_fields[].key Il valore è ampScore.
amp.score security_result.detection_fields[].value Il valore viene estratto dal campo amp.score.
blocked_categories security_result.category_details Il valore viene estratto dal campo blocked_categories.
blockedfiletype security_result.detection_fields[].key Il valore è egress type.
blockedfiletype security_result.detection_fields[].value Il valore viene estratto dal campo blockedfiletype.
bundleid additional.fields[].key Il valore è bundleid.
bundleid additional.fields[].value.string_value Il valore viene estratto dal campo bundleid.
categories[] security_result.category_details Il valore viene estratto dal campo categories[].label.
column1 metadata.event_timestamp.seconds Il valore viene analizzato dal campo column1 come timestamp. Per i log proxy, se esistono i campi date e time, vengono combinati e analizzati come timestamp.
column10 network.http.user_agent Il valore viene estratto dal campo column10.
column10 additional.fields[].value.string_value Il valore viene estratto dal campo column10.
column11 target.port Il valore viene estratto dal campo column11.
column12 principal.resource.name Il valore viene estratto dal campo column12.
column13 security_result.rule_id Il valore viene estratto dal campo column13.
column14 security_result.action_details Il valore viene estratto dal campo column14.
column2 principal.user.user_display_name Il valore viene estratto dal campo column2.
column2 principal.user.userid Il valore viene estratto dal campo column2.
column2 principal.location.name Il valore viene estratto dal campo column2.
column3 principal.hostname Il valore viene estratto dal campo column3.
column3 principal.user.product_object_id Il valore viene estratto dal campo column3.
column3 principal.location.city Il valore viene estratto dal campo column3.
column3 additional.fields[].value.string_value Il valore viene estratto dal campo column3.
column4 principal.asset.ip Il valore viene estratto dal campo column4.
column4 principal.ip Il valore viene estratto dal campo column4.
column4 principal.port Il valore viene estratto dal campo column4.
column5 principal.asset.ip Il valore viene estratto dal campo column5.
column5 principal.ip Il valore viene estratto dal campo column5.
column5 target.asset.ip Il valore viene estratto dal campo column5.
column5 target.ip Il valore viene estratto dal campo column5.
column6 security_result.action_details Il valore viene estratto dal campo column6.
column6 target.port Il valore viene estratto dal campo column6.
column7 network.received_bytes Il valore viene estratto dal campo column7.
column7 additional.fields[].value.string_value Il valore viene estratto dal campo column7.
column8 principal.asset.ip Il valore viene estratto dal campo column8.
column8 principal.ip Il valore viene estratto dal campo column8.
column8 target.url Il valore viene estratto dal campo column8.
column9 principal.port Il valore viene estratto dal campo column9.
column9 network.http.referral_url Il valore viene estratto dal campo column9.
data_center_name principal.resource.name Il valore viene estratto dal campo data_center_name.
datacenter.label security_result.detection_fields[].key Il valore è datacenter label.
datacenter.label security_result.detection_fields[].value Il valore viene estratto dal campo datacenter.label.
destinationip target.asset.ip Il valore viene estratto dal campo destinationip.
destinationip target.ip Il valore viene estratto dal campo destinationip.
direction network.direction Il valore viene estratto dal campo direction e convertito in maiuscolo.
domain network.dns.questions[].name Il valore viene estratto dal campo domain, con il punto finale rimosso, se presente.
dstPort target.port Il valore viene estratto dal campo dstPort.
dstip target.asset.ip Il valore viene estratto dal campo dstip.
dstip target.ip Il valore viene estratto dal campo dstip.
egress.ip security_result.detection_fields[].key Il valore è egress ip.
egress.ip security_result.detection_fields[].value Il valore viene estratto dal campo egress.ip.
egress.type security_result.detection_fields[].key Il valore è egress type.
egress.type security_result.detection_fields[].value Il valore viene estratto dal campo egress.type.
externalip principal.asset.ip Il valore viene estratto dal campo externalip.
externalip principal.ip Il valore viene estratto dal campo externalip.
forwardingmethod additional.fields[].key Il valore è forwardingmethod.
forwardingmethod additional.fields[].value.string_value Il valore viene estratto dal campo forwardingmethod.
granular_identity principal.user.user_display_name Il valore viene preso dal campo granular_identity se sono presenti sia granular_identity che most_granular_identity. In caso contrario, viene derivato dal campo _policy_identity e analizzato ulteriormente in base a identityType.
granular_identity principal.user.email_addresses Il valore viene estratto dal campo granular_identity utilizzando un'espressione regolare.
granular_identity principal.user.first_name Il valore viene estratto dal campo granular_identity utilizzando un'espressione regolare.
granular_identity principal.user.last_name Il valore viene estratto dal campo granular_identity utilizzando un'espressione regolare.
granular_identity principal.user.userid Il valore viene estratto dal campo granular_identity utilizzando un'espressione regolare.
granular_identity principal.hostname Il valore viene estratto dal campo granular_identity.
granular_identity principal.location.name Il valore viene estratto dal campo granular_identity.
identity_types additional.fields[].value.string_value Il valore viene estratto dal campo identity_types.
identities[] principal.user.product_object_id Il valore viene estratto dal campo identities[].
identities principal.user.product_object_id Il valore viene estratto dal campo identities.
internalip principal.asset.ip Il valore viene estratto dal campo internalip.
internalip principal.ip Il valore viene estratto dal campo internalip.
isolated.fileaction security_result.detection_fields[].key Il valore è isolated fileaction.
isolated.fileaction security_result.detection_fields[].value Il valore viene estratto dal campo isolated.fileaction.
isolated.state security_result.detection_fields[].key Il valore è isolated state.
isolated.state security_result.detection_fields[].value Il valore viene estratto dal campo isolated.state.
most_granular_identity principal.user.identityType Il valore viene preso dal campo most_granular_identity se sono presenti sia granular_identity che most_granular_identity. In caso contrario, viene estratto dal campo _policy_identity_type.
nat_destination_ip principal.asset.ip Il valore viene estratto dal campo nat_destination_ip.
nat_destination_ip principal.ip Il valore viene estratto dal campo nat_destination_ip.
odns_categories security_result.category_details Il valore viene estratto dal campo odns_categories.
policy.ruleid security_result.rule_id Il valore viene estratto dal campo policy.ruleid.
policy.rulesetid security_result.detection_fields[].key Il valore è rulesetid.
policy.rulesetid security_result.detection_fields[].value Il valore viene estratto dal campo policy.rulesetid.
policy.timebasedrule security_result.detection_fields[].key Il valore è timebasedrule.
policy.timebasedrule security_result.detection_fields[].value Il valore viene estratto dal campo policy.timebasedrule.
port target.port Il valore viene estratto dal campo port.
query_type_name network.dns.questions[].type La parte numerica viene estratta dal campo query_type_name utilizzando un'espressione regolare e convertita in un numero intero.
query_type_name additional.fields[].value.string_value La parte della stringa tra parentesi viene estratta dal campo query_type_name utilizzando un'espressione regolare.
querytype network.dns.questions[].type Il valore viene estratto dal campo querytype e mappato a un valore numerico in base al tipo di record DNS.
referer network.http.referral_url Il valore viene estratto dal campo referer.
requestmethod network.http.method Il valore viene estratto dal campo requestmethod.
requestsize network.sent_bytes Il valore viene estratto dal campo requestsize e convertito in un numero intero senza segno.
response additional.fields[].value.string_value Il valore viene estratto dal campo response.
responsecode network.http.response_code Il valore viene estratto dal campo responsecode.
responsefilename target.file.names Il valore viene estratto dal campo responsefilename.
responsesize network.received_bytes Il valore viene estratto dal campo responsesize e convertito in un numero intero senza segno.
returncode network.dns.response_code Il valore viene estratto dal campo returncode e convertito in un numero intero senza segno.
securityoverridden additional.fields[].key Il valore è securityoverridden.
securityoverridden additional.fields[].value.string_value Il valore viene estratto dal campo securityoverridden.
sha256 target.file.sha256 Il valore viene estratto dal campo sha256.
source_ip principal.asset.ip Il valore viene estratto dal campo source_ip se esiste nei log JSON o da column3 nei log CSV.
source_ip principal.ip Il valore viene estratto dal campo source_ip se esiste nei log JSON o da column3 nei log CSV.
srcPort principal.port Il valore viene estratto dal campo srcPort.
statuscode network.http.response_code Il valore viene estratto dal campo statuscode.
tenantcontrols additional.fields[].key Il valore è tenantcontrols.
tenantcontrols additional.fields[].value.string_value Il valore viene estratto dal campo tenantcontrols.
timestamp metadata.event_timestamp.seconds Il valore viene analizzato dal campo timestamp come timestamp.
tunnel_name additional.fields[].key Il valore è tunnel_name.
tunnel_name additional.fields[].value.string_value Il valore viene estratto dal campo tunnel_name.
tunnel_type metadata.product_event_type Il valore viene estratto dal campo tunnel_type.
type additional.fields[].key Il valore è type.
type additional.fields[].value.string_value Il valore viene estratto dal campo type.
url target.url Il valore viene estratto dal campo url.
useragent network.http.user_agent Il valore viene estratto dal campo useragent.
verdict security_result.action_details Il valore viene estratto dal campo verdict.
warnstatus security_result.detection_fields[].key Il valore è warnstatus.
warnstatus security_result.detection_fields[].value Il valore viene estratto dal campo warnstatus. Il valore è DNS Lookup Type. La parte della stringa tra parentesi viene estratta dal campo query_type_name utilizzando un'espressione regolare oppure è una stringa vuota se il campo non è presente. Il valore è DNS request and response were made.. Determinato in base alla presenza di determinati campi: NETWORK_DNS se è presente question.name, NETWORK_CONNECTION se sono presenti sia principal.ip che target.ip, STATUS_UPDATE se è presente solo principal.ip o GENERIC_EVENT in caso contrario. Il valore è UMBRELLA_DNS. Il valore è Umbrella DNS. Il valore è Cisco. Il valore è inizialmente impostato su DNS. Se requestmethod è un metodo HTTP valido, viene modificato in HTTP. La parte numerica viene estratta dal campo query_type_name utilizzando un'espressione regolare e convertita in un numero intero oppure viene derivata dal campo querytype e mappata a un valore numerico in base al tipo di record DNS. Il valore viene derivato dal campo useragent o column10 utilizzando il filtro parseduseragent. Il valore viene estratto dall'ultima parte del campo column3 dopo la suddivisione in base alle virgole oppure è una stringa vuota se il campo non è presente. Il valore viene estratto dalla prima parte del campo column3 dopo la suddivisione in base alle virgole oppure dal campo column2 se column3 non è presente. Il valore viene estratto dal campo column2 o column3 utilizzando un'espressione regolare. Il valore viene estratto dal campo column2 o column3 utilizzando un'espressione regolare. Il valore viene estratto dal campo column2 o column3 utilizzando un'espressione regolare. Il valore viene estratto dal campo column2 o column3 utilizzando un'espressione regolare. Il valore viene derivato dal campo action, column6, column7 o verdict e convertito in maiuscolo (ALLOW o BLOCK). Il valore è impostato su NETWORK_MALICIOUS se _categories contiene Malware o su NETWORK_SUSPICIOUS se _categories contiene Potentially Harmful.

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.