Collecter les journaux de contexte utilisateur Duo
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 :
- Instance Google SecOps
- Accès privilégié au panneau d'administration Duo
Configurer l'application API Admin et obtenir les clés
- Connectez-vous au panneau d'administration Duo en tant qu'administrateur.
- Dans la barre latérale de gauche, cliquez sur Applications > Gérer les applications.
- Appuyez sur le bouton Add Application (Ajouter une application).
- Dans le champ de recherche, saisissez API Admin, puis cliquez sur Ajouter à côté de API Duo Admin.
- 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
.
- Clé d'intégration : chaîne telle que
- 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é.
- Faites défiler la page jusqu'à Paramètres, puis définissez Autorisations sur Accorder l'accès en lecture aux ressources.
- Cliquez sur Enregistrer les modifications.
Configurer des flux
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur + Ajouter un flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
Duo Users Logs
). - Sélectionnez API tierce comme Type de source.
- Sélectionnez le type de journal Contexte utilisateur Duo.
- Cliquez sur Suivant.
- 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.
- Cliquez sur Suivant.
- 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.