Raccogliere i log DNS di Cisco Umbrella
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
- Accedi alla dashboard di Cisco Umbrella.
- Vai ad Amministrazione > Gestione log.
- Seleziona l'opzione Utilizza un bucket Amazon S3 gestito da Cisco.
- 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.
- Fai clic su Salva.
- 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. - Copia i valori di Chiave di accesso e Chiave segreta. Se perdi queste chiavi, devi rigenerarle.
- Fai clic su Ok > Continua.
- 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
- Accedi alla console di gestione AWS.
- Crea un utente seguendo questa guida utente: Creazione di un utente IAM.
- Seleziona l'utente creato.
- Seleziona la scheda Credenziali di sicurezza.
- Fai clic su Crea chiave di accesso nella sezione Chiavi di accesso.
- Seleziona Servizio di terze parti come Caso d'uso.
- Fai clic su Avanti.
- (Facoltativo) Aggiungi un tag di descrizione.
- Fai clic su Crea chiave di accesso.
- Fai clic su Scarica file CSV per salvare la chiave di accesso e la chiave di accesso segreta per un utilizzo successivo.
- Fai clic su Fine.
- Seleziona la scheda Autorizzazioni.
- Fai clic su Aggiungi autorizzazioni nella sezione Criteri per le autorizzazioni.
- Seleziona Aggiungi autorizzazioni.
- Seleziona Allega direttamente i criteri.
- Cerca e seleziona il criterio AmazonS3FullAccess.
- Fai clic su Avanti.
- Fai clic su Aggiungi autorizzazioni.
(Facoltativo) Configura un bucket Amazon S3 autogestito
Accedi alla console di gestione AWS.
Vai a S3.
Fai clic su Crea bucket.
Fornisci i seguenti dettagli di configurazione:
- Nome bucket: fornisci un nome per il bucket Amazon S3.
- Regione: seleziona una regione.
Fai clic su Crea.
(Facoltativo) Configura un criterio del bucket per il bucket AWS S3 autogestito
- Fai clic sul bucket appena creato per aprirlo.
- Seleziona Proprietà > Autorizzazioni.
- Nell'elenco Autorizzazioni, fai clic su Aggiungi policy del bucket.
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.
- Sostituisci
Fai clic su Salva.
(Facoltativo) Verifica obbligatoria per il bucket Amazon S3 autogestito
- Nella dashboard Cisco Umbrella, seleziona Amministrazione > Gestione log > Amazon S3.
- Nel campo Nome bucket, specifica il nome esatto del bucket Amazon S3, quindi fai clic su Verifica.
- 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. - Scarica il file
README_FROM_UMBRELLA.txt
e aprilo utilizzando un editor di testo. - Copia e salva il token univoco Cisco Umbrella dal file.
- Vai alla dashboard Cisco Umbrella.
- Nel campo Numero token, specifica il token e fai clic su Salva.
- 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
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo.
- Nel campo Nome feed, inserisci un nome per il feed, ad esempio Cisco Umbrella DNS Logs.
- Seleziona Amazon S3 V2 come Tipo di origine.
- Seleziona Cisco Umbrella DNS come Tipo di log.
- Fai clic su Avanti.
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.
- Sostituisci
- Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.
- URI S3: l'URI del bucket.
Fai clic su Avanti.
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.