Collecter les journaux de contexte utilisateur Duo
Version de l'analyseur : 1.0
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 l'aliasing des noms d'utilisateur aux adresses e-mail, aux groupes, aux numéros de téléphone et aux détails de l'appareil) à 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 de l'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 Ajouter une application.
- Dans le champ de recherche, saisissez Admin API, puis cliquez sur Add (Ajouter) à côté de Duo Admin API.
- Sur l'écran suivant, les informations suivantes s'affichent :
- 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 et définissez Autorisations sur Accorder l'accès en lecture à la ressource.
- Cliquez sur Enregistrer les modifications.
Configurer des flux
- Accédez à Paramètres > Gestion des données > Flux. Si vous utilisez une plate-forme SIEM uniquement, accédez à Paramètres > 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 Duo User Context.
- Cliquez sur Suivant.
- Spécifiez les valeurs des paramètres d'entrée suivants :
- Nom d'utilisateur : saisissez la clé d'intégration que vous avez copiée précédemment.
- Secret : saisissez la clé secrète copiée précédemment.
- Nom d'hôte de l'API : indiquez l'URL du serveur d'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 du 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 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 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 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 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 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 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 surfaced_auth.access_device.os si le premier est vide. Si la valeur correspond à "ios" ou "mac" (non sensible à la casse), 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 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 "created". |
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 de surfaced_auth.user.name si le premier 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 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 à la fois pour collected_timestamp.seconds et pour l'élément 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 des valeurs collection_time.seconds et create_time.seconds est utilisée 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 étiquettes. La clé de chaque étiquette 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é de l'étiquette est définie sur "status". Cette valeur est également utilisée pour déterminer la valeur 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 |
Le code temporel est analysé à partir de ce champ s'il est présent, au format ISO8601 ou RFC 3339. Les secondes et 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 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 "Duo User Context". |
| (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, il est défini sur "UNKNOWN_ENTITYTYPE". |
| (Logique de l'analyseur) | event.idm.entity.relations.entity_type |
Définie sur "ASSET" si phones[0] n'est pas vide. |
| (Logique de l'analyseur) | event.idm.entity.relations.relationship |
Définie sur "OWNS" si phones[0] n'est pas vide. |
| (Logique de l'analyseur) | event.idm.entity.relations.entity.asset.type |
Définie sur "MOBILE" si phones[0] n'est pas vide. |
Journal des modifications
Afficher le journal des modifications de cet analyseur
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.