Raccogliere i log del contesto utente di Duo
Questo documento spiega come importare i log del contesto utente di Duo in Google Security Operations utilizzando un'API. Il parser elabora i dati JSON, mappando le informazioni utente (inclusi gli alias dei nomi utente per indirizzi email, gruppi, numeri di telefono e dettagli del dispositivo) all'UDM e acquisendo lo stato dell'account utente. Gestisce anche le strutture di dati nidificate ed esegue diverse trasformazioni e unioni dei dati per creare l'evento UDM finale.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Istanza Google SecOps
- Accesso privilegiato al pannello amministratore di Duo
Configura l'applicazione API Admin e ottieni le chiavi
- Accedi al pannello amministratore di Duo come amministratore.
- Nella barra laterale a sinistra, fai clic su Applicazioni > Gestisci applicazioni.
- Premi il pulsante Aggiungi applicazione.
- Nel campo di ricerca, digita API Admin e fai clic su Aggiungi accanto a API Duo Admin.
- Nella schermata successiva vengono visualizzate le seguenti informazioni:
- Chiave di integrazione: (una stringa come
DIYYYYYYYYYYYYYY
). - Chiave segreta: una stringa di 40 caratteri.
- Nome host API: ad esempio,
api-abcd1234.duosecurity.com
.
- Chiave di integrazione: (una stringa come
- Copia e salva la chiave di integrazione, la chiave segreta e il nome host API in una posizione sicura.
- Scorri fino a Impostazioni e imposta Autorizzazioni su Concedi risorsa di lettura.
- Fai clic su Salva modifiche.
Configurare i feed
- Vai a Impostazioni SIEM > Feed.
- Fai clic su + Aggiungi nuovo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
Duo Users Logs
). - Seleziona API di terze parti come Tipo di origine.
- Seleziona il tipo di log Contesto utente Duo.
- Fai clic su Avanti.
- Specifica i valori per i seguenti parametri di input:
- Nome utente: inserisci la chiave di integrazione copiata in precedenza.
- Secret (Segreto): inserisci la chiave segreta copiata in precedenza.
- Nome host API: fornisci l'URL del server API Duo (ad esempio,
api-abcd1234.duosecurity.com
). - Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
- Etichette di importazione: l'etichetta applicata agli eventi di questo feed.
- Fai clic su Avanti.
- Rivedi la configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logic |
---|---|---|
access_device.browser |
event.idm.entity.entity.resource.attribute.labels.value |
Il valore viene estratto direttamente dal campo access_device.browser o da surfaced_auth.access_device.browser se il primo è vuoto. La chiave è impostata su "access_device browser". |
access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
Il valore viene estratto direttamente dal campo access_device.browser_version o da surfaced_auth.access_device.browser_version se il primo è vuoto. La chiave è impostata su "access_device browser_version". |
access_device.ip.address |
event.idm.entity.entity.ip |
Il valore viene estratto direttamente dal campo access_device.ip.address o da surfaced_auth.access_device.ip se il primo è vuoto. |
access_device.location.city |
event.idm.entity.entity.location.city |
Il valore viene estratto direttamente dal campo access_device.location.city o da surfaced_auth.access_device.location.city se il primo è vuoto. |
access_device.location.country |
event.idm.entity.entity.location.country_or_region |
Il valore viene estratto direttamente dal campo access_device.location.country o da surfaced_auth.access_device.location.country se il primo è vuoto. |
access_device.location.state |
event.idm.entity.entity.location.state |
Il valore viene estratto direttamente dal campo access_device.location.state o da surfaced_auth.access_device.location.state se il primo è vuoto. |
access_device.os |
event.idm.entity.entity.asset.platform_software.platform |
Il valore deriva dal campo access_device.os o da surfaced_auth.access_device.os se il primo è vuoto. Se il valore corrisponde (senza distinzione tra maiuscole e minuscole) a "ios" o "mac", il campo UDM viene impostato su "MAC". Se corrisponde a "windows", il campo UDM è impostato su "WINDOWS". Se corrisponde a "linux", il campo UDM è impostato su "LINUX". |
access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
Il valore viene estratto direttamente dal campo access_device.os_version o da surfaced_auth.access_device.os_version se il primo è vuoto. |
action.details |
event.idm.entity.sec_result.action_details |
Il valore viene preso da questo campo se action è vuoto. |
action.name |
event.idm.entity.sec_result.detection_fields.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "action_name". |
activity_id |
event.idm.entity.sec_result.detection_fields.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "activity_id". |
actor.details.created |
event.idm.entity.entity.user.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "creata". |
actor.details.email |
event.idm.entity.entity.user.email_addresses |
Il valore viene estratto direttamente dal campo. |
actor.details.groups.key |
event.idm.entity.entity.user.group_identifiers |
Il valore viene estratto direttamente dal campo. |
actor.details.groups.name |
event.idm.entity.entity.user.group_identifiers |
Il valore viene estratto direttamente dal campo. |
actor.details.last_login |
event.idm.entity.entity.user.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "last_login". |
actor.details.status |
event.idm.entity.entity.user.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "stato". |
actor.key |
event.idm.entity.entity.resource.product_object_id |
Il valore viene estratto direttamente dal campo. |
actor.name |
event.idm.entity.entity.user.user_display_name |
Il valore viene preso direttamente dal campo o da surfaced_auth.user.name se il primo è vuoto. |
actor.type |
event.idm.entity.entity.user.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "actor type". |
akey |
event.idm.entity.metadata.product_entity_id |
Il valore viene preso direttamente dal campo oppure sekey se akey è vuoto. |
application |
event.idm.entity.entity.application |
Il valore viene estratto direttamente dal campo. |
collection_time.seconds , create_time.seconds |
event.idm.entity.metadata.collected_timestamp.seconds , event.timestamp.seconds |
Il valore maggiore tra collection_time.seconds e create_time.seconds viene utilizzato sia per collected_timestamp.seconds sia per timestamp.seconds di primo livello. |
collection_time.nanos , create_time.nanos |
event.idm.entity.metadata.collected_timestamp.nanos , event.timestamp.nanos |
Il valore in nanosecondi corrispondente al maggiore tra collection_time.seconds e create_time.seconds viene utilizzato sia per collected_timestamp.nanos sia per timestamp.nanos di primo livello. |
email |
event.idm.entity.entity.user.email_addresses |
Il valore viene estratto direttamente dal campo. |
explanations |
event.idm.entity.entity.resource.attribute.labels |
Le coppie chiave-valore all'interno di ogni oggetto dell'array explanations vengono convertite in etichette. La chiave di ogni etichetta è preceduta da "explanation ". |
firstname |
event.idm.entity.entity.user.first_name |
Il valore viene estratto direttamente dal campo. |
from_common_netblock |
event.idm.entity.entity.resource.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "from_common_netblock". |
from_new_user |
event.idm.entity.entity.resource.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "from_new_user". |
groups.N.name (N=0..10) |
event.idm.entity.entity.user.group_identifiers |
Il valore viene estratto direttamente dal campo. |
lastname |
event.idm.entity.entity.user.last_name |
Il valore viene estratto direttamente dal campo. |
low_risk_ip |
event.idm.entity.entity.resource.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "low_risk_ip". |
phones.0.model |
event.idm.entity.relations.entity.asset.hardware.model |
Il valore viene estratto direttamente dal campo. |
phones.0.number |
event.idm.entity.entity.user.phone_numbers |
Il valore viene estratto direttamente dal campo. |
phones.0.phone_id |
event.idm.entity.relations.entity.asset.product_object_id |
Il valore viene estratto direttamente dal campo. |
phones.0.platform |
event.idm.entity.relations.entity.asset.hardware.manufacturer |
Il valore viene estratto direttamente dal campo. |
priority_event |
event.idm.entity.entity.resource.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "priority_event". |
realname |
event.idm.entity.entity.user.user_display_name |
Il valore viene estratto direttamente dal campo. |
sekey |
event.idm.entity.metadata.product_entity_id |
Se akey è vuoto, il valore viene preso direttamente dal campo. |
state |
event.idm.entity.entity.resource.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "state". |
status |
event.idm.entity.entity.user.attribute.labels.value , event.idm.entity.entity.user.user_authentication_status |
Il valore viene estratto direttamente dal campo. La chiave per l'etichetta è impostata su "status". Il valore viene utilizzato anche per determinare user_authentication_status . "active" e "bypass" vengono mappati a "ACTIVE", "disabled" e "pending deletion" vengono mappati a "SUSPENDED" e "locked out" viene mappato a "NO_ACTIVE_CREDENTIALS". |
surfaced_auth.access_device.browser |
event.idm.entity.entity.resource.attribute.labels.value |
Il valore viene preso da questo campo se access_device.browser è vuoto. La chiave è impostata su "surfaced_auth access_device browser". |
surfaced_auth.access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
Il valore viene preso da questo campo se access_device.browser_version è vuoto. La chiave è impostata su "surfaced_auth access_device browser_version". |
surfaced_auth.access_device.ip |
event.idm.entity.entity.ip |
Il valore viene preso da questo campo se access_device.ip.address è vuoto. |
surfaced_auth.access_device.location.city |
event.idm.entity.entity.location.city |
Il valore viene preso da questo campo se access_device.location.city è vuoto. |
surfaced_auth.access_device.location.country |
event.idm.entity.entity.location.country_or_region |
Il valore viene preso da questo campo se access_device.location.country è vuoto. |
surfaced_auth.access_device.location.state |
event.idm.entity.entity.location.state |
Il valore viene preso da questo campo se access_device.location.state è vuoto. |
surfaced_auth.access_device.os |
event.idm.entity.entity.asset.platform_software.platform |
Il valore viene preso da questo campo se access_device.os è vuoto. La logica per la mappatura al campo UDM è la stessa di access_device.os . |
surfaced_auth.access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
Il valore viene preso da questo campo se access_device.os_version è vuoto. |
surfaced_auth.user.key |
event.idm.entity.entity.user.userid |
Il valore viene preso da questo campo se username è vuoto. |
surfaced_auth.user.name |
event.idm.entity.entity.user.user_display_name |
Il valore viene preso da questo campo se actor.name è vuoto. |
target.details.biometrics_status |
event.idm.entity.entity.asset.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "biometrics_status". |
target.details.country_code |
event.idm.entity.entity.asset.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "country_code". |
target.details.extension |
event.idm.entity.entity.asset.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "extension". |
target.details.manufacturer |
event.idm.entity.entity.asset.hardware.manufacturer |
Il valore viene estratto direttamente dal campo. |
target.details.model |
event.idm.entity.entity.asset.hardware.model |
Il valore viene estratto direttamente dal campo. |
target.details.number |
event.idm.entity.entity.user.phone_numbers |
Il valore viene estratto direttamente dal campo. |
target.details.os |
event.idm.entity.entity.asset.software.name |
Il valore viene estratto direttamente dal campo. |
target.details.os_version |
event.idm.entity.entity.asset.software.version |
Il valore viene estratto direttamente dal campo. |
target.details.passcode_status |
event.idm.entity.entity.asset.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "passcode_status". |
target.details.tampered_status |
event.idm.entity.entity.asset.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "tampered_status". |
target.key |
event.idm.entity.entity.asset.asset_id |
Il valore viene estratto direttamente dal campo. |
target.name |
event.idm.entity.entity.asset.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "name". |
target.type |
event.idm.entity.entity.asset.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "type". |
triage_event_uri |
event.idm.entity.entity.url |
Il valore viene estratto direttamente dal campo. |
triaged_as_interesting |
event.idm.entity.entity.resource.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "triaged_as_interesting". |
ts |
event.timestamp.seconds , event.idm.entity.metadata.collected_timestamp.seconds |
Se presente, il timestamp viene analizzato da questo campo utilizzando il formato ISO8601 o RFC 3339. I secondi e i nanosecondi estratti vengono utilizzati sia per timestamp di primo livello sia per collected_timestamp . |
type |
event.idm.entity.entity.resource.attribute.labels.value |
Il valore viene estratto direttamente dal campo. La chiave è impostata su "type". |
user_id |
event.idm.entity.metadata.product_entity_id |
Il valore viene estratto direttamente dal campo. |
username |
event.idm.entity.entity.user.userid |
Il valore viene preso direttamente dal campo oppure surfaced_auth.user.key se username è vuoto. |
(Parser Logic) | event.idm.entity.metadata.vendor_name |
Codificato su "Duo". |
(Parser Logic) | event.idm.entity.metadata.product_name |
Codificato come "Contesto utente Duo". |
(Parser Logic) | event.idm.entity.metadata.entity_type |
Determinato in base alla presenza di altri campi. Se user_present è true, è impostato su "USER". Se asset_mid_present è true, è impostato su "ASSET". Se ip_present è true, è impostato su "IP_ADDRESS". Se resource_present è true, è impostato su "RESOURCE". In caso contrario, è impostato su "UNKNOWN_ENTITYTYPE". |
(Parser Logic) | event.idm.entity.relations.entity_type |
Imposta il valore su "ASSET" se phones[0] non è vuoto. |
(Parser Logic) | event.idm.entity.relations.relationship |
Imposta il valore su "OWNS" se phones[0] non è vuoto. |
(Parser Logic) | event.idm.entity.relations.entity.asset.type |
Imposta il valore su "MOBILE" se phones[0] non è vuoto. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.