Collecter les journaux de contexte utilisateur Duo

Compatible avec :

Ce document explique comment ingérer des journaux de contexte utilisateur Duo dans Google Security Operations à l'aide d'une API. L'analyseur traite les données JSON, en mappant les informations utilisateur (y compris les alias de noms d'utilisateur aux adresses e-mail, aux groupes, aux numéros de téléphone et aux détails des appareils) à l'UDM et en capturant l'état du compte utilisateur. Il gère également les structures de données imbriquées et effectue plusieurs transformations et fusions de données pour créer l'événement UDM final.

Avant de commencer

Assurez-vous de remplir les conditions suivantes :

Configurer l'application API Admin et obtenir les clés

  1. Connectez-vous au panneau d'administration Duo en tant qu'administrateur.
  2. Dans la barre latérale de gauche, cliquez sur Applications > Gérer les applications.
  3. Appuyez sur le bouton Add Application (Ajouter une application).
  4. Dans le champ de recherche, saisissez API Admin, puis cliquez sur Ajouter à côté de API Duo Admin.
  5. L'écran suivant affiche les informations suivantes :
    • Clé d'intégration : chaîne telle que DIYYYYYYYYYYYYYY.
    • Clé secrète : chaîne de 40 caractères.
    • Nom d'hôte de l'API : par exemple, api-abcd1234.duosecurity.com.
  6. Copiez et enregistrez la clé d'intégration, la clé secrète et le nom d'hôte de l'API dans un emplacement sécurisé.
  7. Faites défiler la page jusqu'à Paramètres, puis définissez Autorisations sur Accorder l'accès en lecture aux ressources.
  8. Cliquez sur Enregistrer les modifications.

Configurer des flux

  1. Accédez à Paramètres SIEM> Flux.
  2. Cliquez sur + Ajouter un flux.
  3. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Duo Users Logs).
  4. Sélectionnez API tierce comme Type de source.
  5. Sélectionnez le type de journal Contexte utilisateur Duo.
  6. Cliquez sur Suivant.
  7. Spécifiez les valeurs des paramètres d'entrée suivants :
    • Nom d'utilisateur : saisissez la clé d'intégration copiée précédemment.
    • Secret : saisissez la clé secrète que vous avez copiée précédemment.
    • Nom d'hôte de l'API : indiquez l'URL du serveur de l'API Duo (par exemple, api-abcd1234.duosecurity.com).
    • Espace de noms de l'élément : espace de noms de l'élément.
    • Libellés d'ingestion : libellé appliqué aux événements de ce flux.
  8. Cliquez sur Suivant.
  9. Vérifiez la configuration du flux sur l'écran Finaliser, puis cliquez sur Envoyer.

Table de mappage UDM

Champ de journal Mappage UDM Logique
access_device.browser event.idm.entity.entity.resource.attribute.labels.value La valeur est extraite directement du champ access_device.browser ou de surfaced_auth.access_device.browser si le premier est vide. La clé est définie sur "access_device browser".
access_device.browser_version event.idm.entity.entity.resource.attribute.labels.value La valeur est extraite directement du champ access_device.browser_version ou de surfaced_auth.access_device.browser_version si le premier est vide. La clé est définie sur "access_device browser_version".
access_device.ip.address event.idm.entity.entity.ip La valeur est extraite directement du champ access_device.ip.address ou de surfaced_auth.access_device.ip si le premier est vide.
access_device.location.city event.idm.entity.entity.location.city La valeur est extraite directement du champ access_device.location.city ou de surfaced_auth.access_device.location.city si le premier est vide.
access_device.location.country event.idm.entity.entity.location.country_or_region La valeur est extraite directement du champ access_device.location.country ou de surfaced_auth.access_device.location.country si le premier est vide.
access_device.location.state event.idm.entity.entity.location.state La valeur est extraite directement du champ access_device.location.state ou de surfaced_auth.access_device.location.state si le premier est vide.
access_device.os event.idm.entity.entity.asset.platform_software.platform La valeur est dérivée du champ access_device.os ou de surfaced_auth.access_device.os si le premier est vide. Si la valeur correspond (sans tenir compte de la casse) à "ios" ou "mac", le champ UDM est défini sur "MAC". Si elle correspond à "windows", le champ UDM est défini sur "WINDOWS". Si elle correspond à "linux", le champ UDM est défini sur "LINUX".
access_device.os_version event.idm.entity.entity.asset.platform_software.platform_version La valeur est extraite directement du champ access_device.os_version ou de surfaced_auth.access_device.os_version si le premier est vide.
action.details event.idm.entity.sec_result.action_details La valeur est extraite de ce champ si action est vide.
action.name event.idm.entity.sec_result.detection_fields.value La valeur est extraite directement du champ. La clé est définie sur "action_name".
activity_id event.idm.entity.sec_result.detection_fields.value La valeur est extraite directement du champ. La clé est définie sur "activity_id".
actor.details.created event.idm.entity.entity.user.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "créée".
actor.details.email event.idm.entity.entity.user.email_addresses La valeur est extraite directement du champ.
actor.details.groups.key event.idm.entity.entity.user.group_identifiers La valeur est extraite directement du champ.
actor.details.groups.name event.idm.entity.entity.user.group_identifiers La valeur est extraite directement du champ.
actor.details.last_login event.idm.entity.entity.user.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "last_login".
actor.details.status event.idm.entity.entity.user.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "status".
actor.key event.idm.entity.entity.resource.product_object_id La valeur est extraite directement du champ.
actor.name event.idm.entity.entity.user.user_display_name La valeur est extraite directement du champ ou surfaced_auth.user.name si le champ est vide.
actor.type event.idm.entity.entity.user.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "actor type".
akey event.idm.entity.metadata.product_entity_id La valeur est extraite directement du champ ou définie sur sekey si akey est vide.
application event.idm.entity.entity.application La valeur est extraite directement du champ.
collection_time.seconds, create_time.seconds event.idm.entity.metadata.collected_timestamp.seconds, event.timestamp.seconds La valeur la plus élevée entre collection_time.seconds et create_time.seconds est utilisée pour collected_timestamp.seconds et pour timestamp.seconds de premier niveau.
collection_time.nanos, create_time.nanos event.idm.entity.metadata.collected_timestamp.nanos, event.timestamp.nanos La valeur en nanosecondes correspondant à la plus grande valeur entre collection_time.seconds et create_time.seconds est utilisée à la fois pour collected_timestamp.nanos et pour timestamp.nanos de premier niveau.
email event.idm.entity.entity.user.email_addresses La valeur est extraite directement du champ.
explanations event.idm.entity.entity.resource.attribute.labels Les paires clé-valeur de chaque objet du tableau explanations sont converties en libellés. La clé de chaque libellé est précédée de "explanation ".
firstname event.idm.entity.entity.user.first_name La valeur est extraite directement du champ.
from_common_netblock event.idm.entity.entity.resource.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "from_common_netblock".
from_new_user event.idm.entity.entity.resource.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "from_new_user".
groups.N.name (N=0..10) event.idm.entity.entity.user.group_identifiers La valeur est extraite directement du champ.
lastname event.idm.entity.entity.user.last_name La valeur est extraite directement du champ.
low_risk_ip event.idm.entity.entity.resource.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "low_risk_ip".
phones.0.model event.idm.entity.relations.entity.asset.hardware.model La valeur est extraite directement du champ.
phones.0.number event.idm.entity.entity.user.phone_numbers La valeur est extraite directement du champ.
phones.0.phone_id event.idm.entity.relations.entity.asset.product_object_id La valeur est extraite directement du champ.
phones.0.platform event.idm.entity.relations.entity.asset.hardware.manufacturer La valeur est extraite directement du champ.
priority_event event.idm.entity.entity.resource.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "priority_event".
realname event.idm.entity.entity.user.user_display_name La valeur est extraite directement du champ.
sekey event.idm.entity.metadata.product_entity_id La valeur est extraite directement du champ si akey est vide.
state event.idm.entity.entity.resource.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "state".
status event.idm.entity.entity.user.attribute.labels.value, event.idm.entity.entity.user.user_authentication_status La valeur est extraite directement du champ. La clé du libellé est définie sur "status". Cette valeur est également utilisée pour déterminer le user_authentication_status. "active" et "bypass" correspondent à "ACTIVE", "disabled" et "pending deletion" correspondent à "SUSPENDED", et "locked out" correspond à "NO_ACTIVE_CREDENTIALS".
surfaced_auth.access_device.browser event.idm.entity.entity.resource.attribute.labels.value La valeur est extraite de ce champ si access_device.browser est vide. La clé est définie sur "surfaced_auth access_device browser".
surfaced_auth.access_device.browser_version event.idm.entity.entity.resource.attribute.labels.value La valeur est extraite de ce champ si access_device.browser_version est vide. La clé est définie sur "surfaced_auth access_device browser_version".
surfaced_auth.access_device.ip event.idm.entity.entity.ip La valeur est extraite de ce champ si access_device.ip.address est vide.
surfaced_auth.access_device.location.city event.idm.entity.entity.location.city La valeur est extraite de ce champ si access_device.location.city est vide.
surfaced_auth.access_device.location.country event.idm.entity.entity.location.country_or_region La valeur est extraite de ce champ si access_device.location.country est vide.
surfaced_auth.access_device.location.state event.idm.entity.entity.location.state La valeur est extraite de ce champ si access_device.location.state est vide.
surfaced_auth.access_device.os event.idm.entity.entity.asset.platform_software.platform La valeur est extraite de ce champ si access_device.os est vide. La logique de mappage au champ UDM est la même que pour access_device.os.
surfaced_auth.access_device.os_version event.idm.entity.entity.asset.platform_software.platform_version La valeur est extraite de ce champ si access_device.os_version est vide.
surfaced_auth.user.key event.idm.entity.entity.user.userid La valeur est extraite de ce champ si username est vide.
surfaced_auth.user.name event.idm.entity.entity.user.user_display_name La valeur est extraite de ce champ si actor.name est vide.
target.details.biometrics_status event.idm.entity.entity.asset.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "biometrics_status".
target.details.country_code event.idm.entity.entity.asset.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "country_code".
target.details.extension event.idm.entity.entity.asset.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "extension".
target.details.manufacturer event.idm.entity.entity.asset.hardware.manufacturer La valeur est extraite directement du champ.
target.details.model event.idm.entity.entity.asset.hardware.model La valeur est extraite directement du champ.
target.details.number event.idm.entity.entity.user.phone_numbers La valeur est extraite directement du champ.
target.details.os event.idm.entity.entity.asset.software.name La valeur est extraite directement du champ.
target.details.os_version event.idm.entity.entity.asset.software.version La valeur est extraite directement du champ.
target.details.passcode_status event.idm.entity.entity.asset.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "passcode_status".
target.details.tampered_status event.idm.entity.entity.asset.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "tampered_status".
target.key event.idm.entity.entity.asset.asset_id La valeur est extraite directement du champ.
target.name event.idm.entity.entity.asset.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "name".
target.type event.idm.entity.entity.asset.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "type".
triage_event_uri event.idm.entity.entity.url La valeur est extraite directement du champ.
triaged_as_interesting event.idm.entity.entity.resource.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "triaged_as_interesting".
ts event.timestamp.seconds, event.idm.entity.metadata.collected_timestamp.seconds L'horodatage est analysé à partir de ce champ, s'il est présent, au format ISO8601 ou RFC 3339. Les secondes et les nanosecondes extraites sont utilisées à la fois pour le timestamp de premier niveau et pour le collected_timestamp.
type event.idm.entity.entity.resource.attribute.labels.value La valeur est extraite directement du champ. La clé est définie sur "type".
user_id event.idm.entity.metadata.product_entity_id La valeur est extraite directement du champ.
username event.idm.entity.entity.user.userid La valeur est extraite directement du champ ou définie sur surfaced_auth.user.key si username est vide.
(Logique de l'analyseur) event.idm.entity.metadata.vendor_name Codé en dur sur "Duo".
(Logique de l'analyseur) event.idm.entity.metadata.product_name Codé en dur sur "Contexte utilisateur Duo".
(Logique de l'analyseur) event.idm.entity.metadata.entity_type Déterminé en fonction de la présence d'autres champs. Si user_present est défini sur "true", il est défini sur "USER". Si asset_mid_present est défini sur "true", il est défini sur "ASSET". Si ip_present est défini sur "true", il est défini sur "IP_ADDRESS". Si resource_present est défini sur "true", il est défini sur "RESOURCE". Sinon, la valeur est définie sur "UNKNOWN_ENTITYTYPE".
(Logique de l'analyseur) event.idm.entity.relations.entity_type Définissez sur "ASSET" si phones[0] n'est pas vide.
(Logique de l'analyseur) event.idm.entity.relations.relationship Définissez sur "OWNS" si phones[0] n'est pas vide.
(Logique de l'analyseur) event.idm.entity.relations.entity.asset.type Définissez sur "MOBILE" si phones[0] n'est pas vide.

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.