Collecter les journaux de connexion Microsoft Entra ID
Ce document explique comment collecter les journaux de connexion Microsoft Entra ID (anciennement Azure Active Directory) en configurant un flux Google Security Operations. Vous pouvez configurer l'ingestion de deux manières : avec Azure Event Hub (recommandé) ou avec l'API tierce.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
- Une instance Google SecOps
- Accès privilégié au portail Microsoft Azure
- Rôle Administrateur de la sécurité ou Administrateur général dans Microsoft Entra ID (requis pour les paramètres de diagnostic)
- Pour la méthode d'API tierce, l'un des rôles suivants pour accorder le consentement de l'administrateur :
- Administrateur général : peut accorder le consentement pour n'importe quelle autorisation et n'importe quelle API.
- Administrateur de rôle privilégié : peut accorder l'autorisation pour n'importe quelle autorisation, pour n'importe quelle API
- Administrateur d'applications cloud : peut accorder l'autorisation pour n'importe quelle autorisation pour n'importe quelle API, à l'exception des rôles d'application Microsoft Graph (autorisations d'application)
Méthode 1 : Azure Event Hub (recommandée)
Cette méthode diffuse les journaux de connexion Entra ID via Azure Event Hub avec la capture activée, ce qui écrit les données dans Azure Blob Storage. Google SecOps ingère ensuite les journaux depuis Blob Storage à l'aide du type de flux Azure Blob Storage V2.
Configurer un compte de stockage Azure
Créer un compte de stockage
- Dans le portail Azure, recherchez Comptes de stockage.
- Cliquez sur + Créer.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Abonnement Sélectionnez votre abonnement Azure. Groupe de ressources Sélectionner une base de données existante ou en créer une Nom du compte de stockage Saisissez un nom unique (par exemple, secopsaadsignin).Région Sélectionnez la région la plus proche de votre espace de noms Event Hubs. Performances Standard (recommandé) Redondance LRS (stockage local redondant) ou GRS (stockage géoredondant) Cliquez sur Examiner et créer.
Consultez l'aperçu, puis cliquez sur Créer.
Attendez la fin du déploiement.
Obtenir les identifiants du compte de stockage
- Accédez au compte de stockage que vous avez créé.
- Dans le volet de navigation de gauche, sélectionnez Clés d'accès sous Sécurité et mise en réseau.
- Cliquez sur Afficher les clés.
- Copiez et enregistrez les éléments suivants :
- Nom du compte de stockage
- Touche 1 ou Touche 2 : clé d'accès partagée.
Créer un espace de noms Event Hub et un hub d'événements
Créer un espace de noms Event Hubs
- Dans le portail Azure, recherchez Event Hubs.
- Cliquez sur + Créer.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Abonnement Sélectionnez votre abonnement Azure. Groupe de ressources Sélectionnez le même groupe de ressources que votre compte de stockage. Nom de l'espace de noms Saisissez un nom unique (par exemple, secops-entraid-signin).Emplacement Sélectionnez la même région que votre compte de stockage. Niveau de tarification Standard (obligatoire pour la capture Event Hub) Cliquez sur Examiner et créer, puis sur Créer.
Attendez la fin du déploiement.
Créer un hub d'événements
- Accédez à l'espace de noms Event Hub que vous avez créé.
- En haut de l'écran, cliquez sur + Event Hub.
- Fournissez les informations de configuration suivantes :
- Name (Nom) : saisissez un nom (par exemple,
entraid-signin-logs). - Nombre de partitions : 2 (par défaut, augmentez-le pour un débit plus élevé).
- Règle de nettoyage : supprimer.
- Durée de conservation (heures) : 24 (minimum, augmentez-la si nécessaire pour la résilience).
- Name (Nom) : saisissez un nom (par exemple,
- Cliquez sur Examiner et créer, puis sur Créer.
Activer la capture Event Hub
- Accédez à l'Event Hub que vous avez créé (dans l'espace de noms).
- Dans le panneau de navigation de gauche, sélectionnez Capture.
- Définissez Capture sur Activé.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Créneau horaire (en minutes) 5 (ou moins pour le quasi-temps réel) Taille de la fenêtre (Mo) 300 Fournisseur de capture Azure Blob Storage Abonnement Azure Sélectionnez votre abonnement Compte de stockage Sélectionnez le compte de stockage que vous avez créé. Conteneur de blobs Créez ou sélectionnez un conteneur (par exemple, entraid-signin-capture).Cliquez sur Enregistrer.
Configurer les paramètres de diagnostic Entra ID
- Dans le portail Azure, recherchez Microsoft Entra ID.
- Dans le panneau de navigation de gauche, accédez à Surveillance et état > Paramètres de diagnostic.
- Cliquez sur Ajouter un paramètre de diagnostic.
- Fournissez les informations de configuration suivantes :
- Nom du paramètre de diagnostic : saisissez un nom descriptif (par exemple,
signin-logs-to-eventhub). - Dans la section Journaux, sélectionnez les catégories de journaux de connexion que vous souhaitez exporter :
- SignInLogs : connexions utilisateur interactives.
- NonInteractiveUserSignInLogs : connexions des utilisateurs non interactifs (facultatif, recommandé).
- ServicePrincipalSignInLogs : connexions du compte de service (facultatif).
- ManagedIdentitySignInLogs : connexions des identités gérées (facultatif).
- Dans la section Détails de la destination, sélectionnez Diffuser vers un hub d'événements.
- Abonnement : sélectionnez l'abonnement contenant votre espace de noms Event Hub.
- Espace de noms Event Hubs : sélectionnez l'espace de noms que vous avez créé (par exemple,
secops-entraid-signin). - Nom du hub d'événements : sélectionnez le hub d'événements que vous avez créé (par exemple,
entraid-signin-logs). - Nom de la règle du hub d'événements : sélectionnez RootManageSharedAccessKey.
- Nom du paramètre de diagnostic : saisissez un nom descriptif (par exemple,
Cliquez sur Enregistrer.
Configurer des flux
Il existe deux points d'entrée différents pour configurer les flux dans la plate-forme Google SecOps :
- Paramètres SIEM> Flux > Ajouter un flux
- Plate-forme de contenu> Packs de contenu> Premiers pas
Configurer un flux dans Google SecOps pour ingérer les journaux de connexion Entra ID
- Cliquez sur le pack Plate-forme Azure.
- Recherchez le type de journal Azure AD.
Indiquez les valeurs des champs suivants :
- Type de source : Microsoft Azure Blob Storage V2
URI Azure : saisissez l'URL du point de terminaison du service Blob avec le chemin d'accès au conteneur de capture :
https://<storage-account>.blob.core.windows.net/entraid-signin-capture/Remplacez
<storage-account>par le nom de votre compte de stockage Azure.Option de suppression de la source : sélectionnez l'option de suppression de votre choix :
- Jamais : ne supprime jamais aucun fichier après les transferts.
- Supprimer les fichiers transférés : supprime les fichiers après un transfert réussi.
- Supprimer les fichiers transférés et les répertoires vides : supprime les fichiers et les répertoires vides après un transfert réussi.
Âge maximal des fichiers : incluez les fichiers modifiés au cours des derniers jours. La valeur par défaut est de 180 jours.
Clé partagée : saisissez la valeur de la clé d'accès partagé du compte de stockage.
Espace de noms de l'élément : espace de noms de l'élément.
Libellés d'ingestion : libellé à appliquer aux événements de ce flux.
Cliquez sur Créer un flux.
Une fois le flux créé, il peut s'écouler entre 5 et 10 minutes avant que les journaux ne commencent à s'afficher dans Google SecOps.
Pour en savoir plus sur la configuration de plusieurs flux pour différents types de journaux dans cette famille de produits, consultez Configurer des flux par produit.
Pour en savoir plus sur les flux Google Security Operations, consultez la documentation sur les flux Google Security Operations. Pour en savoir plus sur les exigences de chaque type de flux, consultez Configuration des flux par type.
Configurer le pare-feu Azure Storage (le cas échéant)
Si votre compte de stockage Azure utilise un pare-feu, vous devez ajouter les plages d'adresses IP Google SecOps.
- Dans le portail Azure, accédez à votre compte de stockage.
- Sélectionnez Mise en réseau sous Sécurité et mise en réseau.
- Sous Pare-feu et réseaux virtuels, sélectionnez Activé à partir des réseaux virtuels et adresses IP sélectionnés.
- Dans la section Pare-feu, sous Plage d'adresses, cliquez sur + Ajouter une plage d'adresses IP.
- Ajoutez chaque plage d'adresses IP Google SecOps au format CIDR.
- Consultez la documentation sur la liste d'adresses IP autorisées.
- Vous pouvez également les récupérer par programmation à l'aide de l'API Feed Management.
- Cliquez sur Enregistrer.
Méthode 2 : API tierce
Cette méthode utilise l'API Microsoft Graph pour récupérer les journaux de connexion Entra ID directement depuis votre locataire Microsoft.
Configurer la liste d'autorisation d'adresses IP
Avant de créer le flux, vous devez ajouter les plages d'adresses IP Google SecOps à la liste d'autorisation dans les paramètres de votre réseau Microsoft Azure ou dans vos règles d'accès conditionnel.
Obtenir les plages d'adresses IP Google SecOps
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Notez les plages d'adresses IP affichées dans l'interface de création de flux.
- Vous pouvez également récupérer les plages d'adresses IP de manière programmatique à l'aide de l'API Feed Management.
Configurer l'accès conditionnel pour les identités de charge de travail (si nécessaire)
Si votre organisation utilise des règles d'accès conditionnel qui limitent l'accès par emplacement :
- Dans le centre d'administration Microsoft Entra, accédez à Protection > Accès conditionnel > Lieux nommés.
- Cliquez sur + Nouveau lieu.
- Fournissez les informations de configuration suivantes :
- Nom : saisissez
Google SecOps IP Ranges. - Marquer comme emplacement approuvé : facultatif, en fonction de votre règle de sécurité.
- Plages d'adresses IP : ajoutez chaque plage d'adresses IP Google SecOps au format CIDR.
- Nom : saisissez
- Cliquez sur Créer.
- Accédez à Accès conditionnel > Stratégies.
- Pour toutes les règles qui s'appliquent aux identités de charge de travail, configurez une exclusion pour l'emplacement nommé
Google SecOps IP Rangesou le principal de service spécifique.
Configurer l'accès à l'API Microsoft Azure AD
Créer un enregistrement d'application
- Connectez-vous au centre d'administration Microsoft Entra ou au portail Azure.
- Accédez à Identité > Applications > Inscriptions d'applications.
- Cliquez sur Nouvelle inscription.
Fournissez les informations de configuration suivantes :
- Nom : saisissez un nom descriptif (par exemple,
Google SecOps Sign-In Logs Integration). - Supported account types (Types de comptes pris en charge) : sélectionnez Accounts in this organizational directory only (Single tenant) [(Comptes dans cet annuaire organisationnel uniquement (Locataire unique)].
- URI de redirection : laissez ce champ vide (il n'est pas obligatoire pour l'authentification du compte principal de service).
- Nom : saisissez un nom descriptif (par exemple,
Cliquez sur S'inscrire.
Après l'enregistrement, copiez et enregistrez les valeurs suivantes :
- ID d'application (client)
- ID de l'annuaire (locataire)
Configurer les autorisations de l'API
L'intégration nécessite les autorisations d'application Microsoft Graph suivantes :
- Dans l'enregistrement de l'application, accédez à Autorisations des API.
- Cliquez sur Ajouter une autorisation.
- Sélectionnez Microsoft Graph> Autorisations de l'application.
- Sélectionnez les autorisations suivantes :
- AuditLog.Read.All : requis pour lire les journaux de connexion.
- Directory.Read.All : requise par l'API Microsoft Graph pour accéder aux journaux de connexion (problème connu).
- SecurityEvents.Read.All : requis par Google Security Operations.
- Cliquez sur Ajouter des autorisations.
- Cliquez sur Accorder le consentement administrateur pour [Votre organisation].
- Vérifiez que la colonne État indique Accordé pour [Votre organisation] pour les trois autorisations.
| Autorisation | Type | Description |
|---|---|---|
| AuditLog.Read.All | Application | Lire toutes les données de connexion et de journaux d'audit |
| Directory.Read.All | Application | Lire les données du répertoire (obligatoire pour l'accès à l'API) |
| SecurityEvents.Read.All | Application | Lire les événements de sécurité |
Créer code secret du client
- Accédez à Certificats et codes secrets.
- Cliquez sur Nouvelle clé secrète client.
Fournissez les informations de configuration suivantes :
- Description : saisissez un nom descriptif (par exemple,
Google SecOps Feed). - Expiration : sélectionnez une période d'expiration.
- Description : saisissez un nom descriptif (par exemple,
Cliquez sur Ajouter.
Important : Copiez immédiatement la valeur du code secret du client. Cette valeur ne s'affiche qu'une seule fois et ne peut pas être récupérée plus tard.
Vérifier l'accès à l'API avant de créer un flux
Avant de créer le flux Google SecOps, vérifiez que le principal de service peut s'authentifier et accéder à l'API Microsoft Graph.
Tester l'authentification à l'aide de PowerShell
# Replace with your actual values $tenantId = "your-tenant-id" $clientId = "your-client-id" $clientSecret = "your-client-secret" # Token request parameters (must be lowercase) $tokenBody = @{ grant_type = "client_credentials" client_id = $clientId client_secret = $clientSecret scope = "https://graph.microsoft.com/.default" } # Request access token $tokenEndpoint = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" $tokenResponse = Invoke-RestMethod -Method Post -Uri $tokenEndpoint -Body $tokenBody -ContentType "application/x-www-form-urlencoded" if ($tokenResponse.access_token) { Write-Host "✓ Successfully obtained access token" -ForegroundColor Green # Test API call to sign-ins endpoint $apiUrl = "https://graph.microsoft.com/v1.0/auditLogs/signIns?`$top=1" $headers = @{ Authorization = "Bearer $($tokenResponse.access_token)" } try { $signInResponse = Invoke-RestMethod -Method Get -Uri $apiUrl -Headers $headers Write-Host "✓ Successfully accessed sign-ins API" -ForegroundColor Green Write-Host "Sample sign-in log retrieved successfully" -ForegroundColor Green } catch { Write-Host "✗ Failed to access sign-ins API" -ForegroundColor Red Write-Host "Error: $($_.Exception.Message)" -ForegroundColor Red } } else { Write-Host "✗ Failed to obtain access token" -ForegroundColor Red }Résultat attendu :
✓ Successfully obtained access token ✓ Successfully accessed sign-ins API Sample sign-in log retrieved successfullyTester l'authentification à l'aide de curl
# Replace with your actual values TENANT_ID="your-tenant-id" CLIENT_ID="your-client-id" CLIENT_SECRET="your-client-secret" # Request access token curl -X POST "https://login.microsoftonline.com/$TENANT_ID/oauth2/v2.0/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials" \ -d "client_id=$CLIENT_ID" \ -d "client_secret=$CLIENT_SECRET" \ -d "scope=https://graph.microsoft.com/.default" # Test API access curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ "https://graph.microsoft.com/v1.0/auditLogs/signIns?\$top=1"
Configurer des flux
Il existe deux points d'entrée différents pour configurer les flux dans la plate-forme Google SecOps :
- Paramètres SIEM> Flux > Ajouter un flux
- Plate-forme de contenu> Packs de contenu> Premiers pas
Configurer un flux dans Google SecOps pour ingérer les journaux de connexion Microsoft Azure AD
- Cliquez sur le pack Plate-forme Azure.
- Recherchez le type de journal Azure AD.
Indiquez les valeurs des champs suivants :
- Type de source : API tierce (recommandé)
- ID client OAuth : ID (client) de l'application issu de l'enregistrement de l'application.
- Code secret du client OAuth : valeur du code secret du client que vous avez copiée précédemment.
- ID de locataire : ID de votre locataire Microsoft provenant de l'enregistrement de l'application (format UUID, par exemple
0fc279f9-fe30-41be-97d3-abe1d7681418). Chemin d'accès complet de l'API : URL du point de terminaison de l'API REST Microsoft Graph :
graph.microsoft.com/v1.0/auditLogs/signInsPoint de terminaison d'authentification de l'API : point de terminaison d'authentification Microsoft Active Directory :
login.microsoftonline.com
Options avancées :
- Nom du flux : valeur préremplie qui identifie le flux.
- Espace de noms du composant : espace de noms du composant auquel le flux sera associé.
- Libellés d'ingestion : des libellés seront ajoutés à tous les événements de ce flux.
Cliquez sur Créer un flux.
Une fois le flux créé, les données de contexte sont récupérées régulièrement. Il peut s'écouler jusqu'à 24 heures avant que le premier instantané de l'annuaire ne s'affiche dans Google SecOps.
Pour en savoir plus sur la configuration de plusieurs flux pour différents types de journaux dans cette famille de produits, consultez Configurer des flux par produit.
Pour en savoir plus sur les flux Google Security Operations, consultez la documentation sur les flux Google Security Operations. Pour en savoir plus sur les exigences de chaque type de flux, consultez Configuration des flux par type. Si vous rencontrez des problèmes lors de la création de flux, contactez l'assistance Google Security Operations.
Points de terminaison régionaux
Pour les déploiements Microsoft Azure AD dans des clouds souverains, utilisez les points de terminaison régionaux appropriés :
| Environnement cloud | Chemin complet de l'API | Point de terminaison d'authentification de l'API |
|---|---|---|
| Monde | graph.microsoft.com/v1.0/auditLogs/signIns |
login.microsoftonline.com |
| L4 pour les organismes gouvernementaux américains | graph.microsoft.us/v1.0/auditLogs/signIns |
login.microsoftonline.us |
| Gouvernement américain L5 (DOD) | dod-graph.microsoft.us/v1.0/auditLogs/signIns |
login.microsoftonline.us |
| Chine (21Vianet) | microsoftgraph.chinacloudapi.cn/v1.0/auditLogs/signIns |
login.chinacloudapi.cn |
Table de mappage UDM
| Champ de journal | Mappage UDM | Logique |
|---|---|---|
activityDateTime |
principal.event_timestamp |
Analysé à partir du champ activityDateTime. Si le champ n'est pas au format "aaaa-MM-jjTHH:mm:ss.SSSZ" ou "ISO8601" attendu, l'analyseur syntaxique essaiera d'autres formats tels que "MM/jj/aaaa HH:mm:ss A" ou "MM/j/aaaa HH:mm:ss A". |
activityDisplayName |
security_result.summary |
Mappé directement à partir de activityDisplayName. |
additionalDetails.0.value |
network.http.user_agent |
Mappé directement à partir de additionalDetails.0.value. |
additionalDetails.1.key |
target.resource.attribute.labels.key |
Mappé directement à partir de additionalDetails.1.key. |
additionalDetails.1.value |
target.resource.attribute.labels.value |
Mappé directement à partir de additionalDetails.1.value. |
additionalInfo.[].Key |
network.http.user_agent, target.url |
Si Key est défini sur userAgent, mappez Value sur network.http.user_agent et network.http.parsed_user_agent. Si Key est alertUrl, mappez Value sur target.url. |
additionalInfo.[].Value |
network.http.user_agent, target.url |
Si Key est défini sur userAgent, mappez Value sur network.http.user_agent et network.http.parsed_user_agent. Si Key est alertUrl, mappez Value sur target.url. |
am_category |
metadata.description |
Mappé directement à partir de am_category. |
am_tenantId |
metadata.product_deployment_id |
Mappé directement à partir de am_tenantId. |
appId |
target.resource.attribute.labels.value |
Mappé directement à partir de appId avec la clé de libellé "ID d'application". |
appDisplayName |
target.application |
Mappé directement à partir de appDisplayName. |
appliedConditionalAccessPolicies.[].displayName |
security_result.[].rule_name, about.[].user.user_display_name |
Mappé directement à partir de appliedConditionalAccessPolicies.[].displayName. |
appliedConditionalAccessPolicies.[].enforcedGrantControls |
security_result.[].rule_labels.value |
Directement mappé à partir de appliedConditionalAccessPolicies.[].enforcedGrantControls avec la clé de libellé "applied_conditional_access_policies_enforced_grant_controls". |
appliedConditionalAccessPolicies.[].enforcedSessionControls |
security_result.[].rule_labels.value |
Directement mappé à partir de appliedConditionalAccessPolicies.[].enforcedSessionControls avec la clé de libellé "applied_conditional_access_policies_enforced_session_controls". |
appliedConditionalAccessPolicies.[].id |
security_result.[].rule_id, about.[].user.userid |
Mappé directement à partir de appliedConditionalAccessPolicies.[].id. |
appliedConditionalAccessPolicies.[].result |
security_result.[].detection_fields.value, about.[].labels.value |
Mappé directement à partir de appliedConditionalAccessPolicies.[].result avec la clé de libellé "Result". |
authenticationDetails.[].authenticationMethod |
security_result.[].detection_fields.value |
Mappé directement à partir de authenticationDetails.[].authenticationMethod avec la clé de libellé "authenticationMethod". |
authenticationDetails.[].authenticationMethodDetail |
security_result.[].detection_fields.value |
Mappé directement à partir de authenticationDetails.[].authenticationMethodDetail avec la clé de libellé "authenticationMethodDetail". |
authenticationDetails.[].authenticationStepDateTime |
security_result.[].detection_fields.value |
Directement mappé à partir de authenticationDetails.[].authenticationStepDateTime avec la clé de libellé "authenticationStepDateTime". |
authenticationDetails.[].authenticationStepRequirement |
security_result.[].detection_fields.value |
Mappé directement à partir de authenticationDetails.[].authenticationStepRequirement avec la clé de libellé "authenticationStepRequirement". |
authenticationDetails.[].authenticationStepResultDetail |
security_result.[].detection_fields.value |
Directement mappé à partir de authenticationDetails.[].authenticationStepResultDetail avec la clé de libellé "authenticationStepResultDetail". |
authenticationDetails.[].succeeded |
security_result.action |
Si la valeur est "true", alors ALLOW, sinon BLOCK. |
authenticationRequirement |
additional.fields.value.string_value |
Mappé directement à partir de authenticationRequirement avec la clé de libellé "AuthenticationRequirement". |
authenticationRequirementPolicies.[].detail |
security_result.detection_fields.value |
Mappé directement à partir de authenticationRequirementPolicies.[].detail avec la clé de libellé "detail". |
authenticationRequirementPolicies.[].requirementProvider |
security_result.detection_fields.value |
Mappé directement à partir de authenticationRequirementPolicies.[].requirementProvider avec la clé de libellé "requirementProvider". |
callerIpAddress |
principal.ip, principal.asset.ip |
Mappé directement à partir de callerIpAddress. |
category |
metadata.description |
Mappé directement à partir de category. |
clientAppUsed |
principal.application |
Mappé directement à partir de clientAppUsed. |
conditionalAccessStatus |
additional.fields.value.string_value |
Directement mappé à partir de conditionalAccessStatus avec la clé de libellé "conditionalAccessStatus". |
correlationId |
network.session_id, security_result.detection_fields.value |
Mappé directement à partir de correlationId. Également utilisé comme security_result.detection_fields.value avec la clé de libellé "CorrelationId". |
createdDateTime |
when |
Le champ when est dérivé du champ createdDateTime. La date et l'heure sont extraites du champ createdDateTime à l'aide de grok, puis combinées pour former le champ when. |
deviceDetail.browser |
network.http.user_agent |
Mappé directement à partir de deviceDetail.browser. |
deviceDetail.deviceId |
principal.asset.asset_id, principal.asset_id |
Mappé directement à partir de deviceDetail.deviceId et précédé de "ID de l'appareil :". |
deviceDetail.displayName |
principal.asset.hostname |
Mappé directement à partir de deviceDetail.displayName. |
deviceDetail.isCompliant |
principal.asset.attribute.labels.value |
Mappé directement à partir de deviceDetail.isCompliant avec la clé de libellé "isCompliant". |
deviceDetail.isManaged |
principal.asset.attribute.labels.value |
Mappé directement à partir de deviceDetail.isManaged avec la clé de libellé "isManaged". |
deviceDetail.operatingSystem |
principal.platform_version |
Mappé directement à partir de deviceDetail.operatingSystem. |
deviceDetail.trustType |
principal.asset.attribute.labels.value |
Mappé directement à partir de deviceDetail.trustType avec la clé de libellé "trustType". |
durationMs |
additional.fields.value.string_value |
Mappé directement à partir de durationMs avec la clé de libellé "durationMs". |
event.id |
- | Non mappé conformément aux instructions (point 3). |
id |
metadata.product_log_id |
Mappé directement à partir de id. |
identity |
target.user.user_display_name |
Directement mappé à partir de identity s'il est différent de userId et n'est pas une adresse e-mail. |
initiatedBy.user.displayName |
principal.user.user_display_name |
Mappé directement à partir de initiatedBy.user.displayName. |
initiatedBy.user.id |
principal.user.userid, principal.user.windows_sid |
Mappé directement à partir de initiatedBy.user.id. |
initiatedBy.user.ipAddress |
principal.ip, principal.asset.ip |
Mappé directement à partir de initiatedBy.user.ipAddress. |
initiatedBy.user.userPrincipalName |
principal.user.email_addresses, principal.user.userid |
Mappé directement à partir de initiatedBy.user.userPrincipalName. Si la valeur est une adresse e-mail, elle est mappée sur email_addresses. Sinon, elle est mappée sur userid. |
Level |
security_result.severity_details, level |
Mappé directement à partir de Level. |
level |
security_result.severity_details, security_result.severity |
Mappé directement à partir de level. Également mappé sur security_result.severity après conversion en majuscules. Gestion spéciale des valeurs "Information", "Informational", "0", "4", "Avertissement", "1", "3", "Erreur", "2" et "Critique". |
location.city |
principal.location.city |
Mappé directement à partir de location.city. |
location.countryOrRegion |
principal.location.country_or_region |
Mappé directement à partir de location.countryOrRegion. |
location.geoCoordinates.altitude |
additional.fields.value.string_value |
Mappé directement à partir de location.geoCoordinates.altitude avec la clé de libellé "location_geoCoordinates_altitude". |
location.geoCoordinates.latitude |
principal.location.region_latitude, principal.location.region_coordinates.latitude |
Mappé directement à partir de location.geoCoordinates.latitude. |
location.geoCoordinates.longitude |
principal.location.region_longitude, principal.location.region_coordinates.longitude |
Mappé directement à partir de location.geoCoordinates.longitude. |
location.state |
principal.location.state |
Mappé directement à partir de location.state. |
location |
principal.location.name |
Mappé directement à partir de location. |
log_type |
metadata.log_type |
Mappé directement à partir de log_type. |
networkLocationDetails.[].networkNames |
additional.fields.value.string_value |
Valeurs concaténées de networkLocationDetails.[].networkNames avec la clé de libellé "networkName {index}". |
networkLocationDetails.[].networkType |
security_result.detection_fields.value, additional.fields.value.string_value |
Mappé directement à partir de networkLocationDetails.[].networkType avec la clé de libellé "networkType". Également utilisé comme additional.fields.value.string_value avec la clé de libellé "networkType {index}". |
operationName |
event_type |
Si operationName est "Activité de connexion", alors USER_LOGIN. Si operationName est "Ajouter un membre au groupe", alors USER_CHANGE_PERMISSIONS. |
operationType |
security_result.action_details |
Mappé directement à partir de operationType. |
properties.activity |
security_result.summary |
Mappé directement à partir de properties.activity. |
properties.activityDateTime |
when |
Analysé à partir du champ properties.activityDateTime. Si le champ n'est pas au format "aaaa-MM-jjTHH:mm:ss.SSSZ" ou "ISO8601" attendu, l'analyseur syntaxique essaiera d'autres formats tels que "MM/jj/aaaa HH:mm:ss A" ou "MM/j/aaaa HH:mm:ss A". |
properties.activityDisplayName |
security_result.summary |
Mappé directement à partir de properties.activityDisplayName. |
properties.additionalInfo |
network.http.user_agent, target.url |
Analysé au format JSON. Si la clé est "userAgent", mappez la valeur sur network.http.user_agent et network.http.parsed_user_agent. Si la clé est "alertUrl", mappez la valeur sur target.url. |
properties.appliedConditionalAccessPolicies.[].displayName |
security_result.[].rule_name |
Mappé directement à partir de properties.appliedConditionalAccessPolicies.[].displayName. |
properties.appliedConditionalAccessPolicies.[].enforcedGrantControls |
security_result.[].rule_labels.value |
Directement mappé à partir de properties.appliedConditionalAccessPolicies.[].enforcedGrantControls avec la clé de libellé "applied_conditional_access_policies_enforced_grant_controls". |
properties.appliedConditionalAccessPolicies.[].enforcedSessionControls |
security_result.[].rule_labels.value |
Directement mappé à partir de properties.appliedConditionalAccessPolicies.[].enforcedSessionControls avec la clé de libellé "applied_conditional_access_policies_enforced_session_controls". |
properties.appliedConditionalAccessPolicies.[].id |
security_result.[].rule_id |
Mappé directement à partir de properties.appliedConditionalAccessPolicies.[].id. |
properties.appliedConditionalAccessPolicies.[].result |
security_result.[].detection_fields.value |
Mappé directement à partir de properties.appliedConditionalAccessPolicies.[].result avec la clé de libellé "Result". |
properties.appId |
appId |
Mappé directement à partir de properties.appId. |
properties.appDisplayName |
target.application |
Mappé directement à partir de properties.appDisplayName. |
properties.authenticationDetails.[].authenticationMethod |
security_result.detection_fields.value |
Mappé directement à partir de properties.authenticationDetails.[].authenticationMethod avec la clé de libellé "authenticationMethod". |
properties.authenticationDetails.[].authenticationMethodDetail |
security_result.detection_fields.value |
Mappé directement à partir de properties.authenticationDetails.[].authenticationMethodDetail avec la clé de libellé "authenticationMethodDetail". |
properties.authenticationDetails.[].authenticationStepDateTime |
security_result.detection_fields.value |
Directement mappé à partir de properties.authenticationDetails.[].authenticationStepDateTime avec la clé de libellé "authenticationStepDateTime". |
properties.authenticationDetails.[].authenticationStepRequirement |
security_result.detection_fields.value |
Mappé directement à partir de properties.authenticationDetails.[].authenticationStepRequirement avec la clé de libellé "authenticationStepRequirement". |
properties.authenticationDetails.[].authenticationStepResultDetail |
security_result.detection_fields.value |
Directement mappé à partir de properties.authenticationDetails.[].authenticationStepResultDetail avec la clé de libellé "authenticationStepResultDetail". |
properties.authenticationRequirement |
additional.fields.value.string_value |
Mappé directement à partir de properties.authenticationRequirement avec la clé de libellé "AuthenticationRequirement". |
properties.authenticationRequirementPolicies.[].detail |
security_result.detection_fields.value |
Mappé directement à partir de properties.authenticationRequirementPolicies.[].detail avec la clé de libellé "detail". |
properties.authenticationRequirementPolicies.[].requirementProvider |
security_result.detection_fields.value |
Mappé directement à partir de properties.authenticationRequirementPolicies.[].requirementProvider avec la clé de libellé "requirementProvider". |
properties.clientAppUsed |
principal.application |
Mappé directement à partir de properties.clientAppUsed. |
properties.conditionalAccessStatus |
additional.fields.value.string_value |
Directement mappé à partir de properties.conditionalAccessStatus avec la clé de libellé "conditionalAccessStatus". |
properties.crossTenantAccessType |
additional.fields.value.string_value |
Mappé directement à partir de properties.crossTenantAccessType avec la clé de libellé "crossTenantAccessType". |
properties.detectedDateTime |
additional.fields.value.string_value |
Mappé directement à partir de properties.detectedDateTime avec la clé de libellé "detectedDateTime". |
properties.detectionTimingType |
additional.fields.value.string_value |
Mappé directement à partir de properties.detectionTimingType avec la clé de libellé "detectionTimingType". |
properties.homeTenantId |
additional.fields.value.string_value |
Mappé directement à partir de properties.homeTenantId avec la clé de libellé "homeTenantId". |
properties.id |
metadata.product_log_id |
Mappé directement à partir de properties.id. |
properties.initiatedBy.user.displayName |
principal.user.user_display_name |
Mappé directement à partir de properties.initiatedBy.user.displayName. |
properties.initiatedBy.user.id |
principal.user.windows_sid |
Mappé directement à partir de properties.initiatedBy.user.id. |
properties.initiatedBy.user.ipAddress |
principal.ip, principal.asset.ip |
Mappé directement à partir de properties.initiatedBy.user.ipAddress. |
properties.initiatedBy.user.userPrincipalName |
principal.user.email_addresses, principal.user.userid |
Mappé directement à partir de properties.initiatedBy.user.userPrincipalName. Si la valeur est une adresse e-mail, elle est mappée sur email_addresses. Sinon, elle est mappée sur userid. |
properties.ipAddress |
principal.ip, principal.asset.ip |
Mappé directement à partir de properties.ipAddress. |
properties.isGuest |
additional.fields.value.string_value |
Mappé directement à partir de properties.isGuest avec la clé de libellé "isGuest". |
properties.isDeleted |
additional.fields.value.string_value |
Mappé directement à partir de properties.isDeleted avec la clé de libellé "isDeleted". |
properties.isProcessing |
additional.fields.value.string_value |
Directement mappé à partir de properties.isProcessing avec la clé de libellé "isProcessing". |
properties.lastUpdatedDateTime |
additional.fields.value.string_value |
Directement mappé à partir de properties.lastUpdatedDateTime avec la clé de libellé "lastUpdatedDateTime". |
properties.location.city |
principal.location.city |
Mappé directement à partir de properties.location.city. |
properties.location.countryOrRegion |
principal.location.country_or_region |
Mappé directement à partir de properties.location.countryOrRegion. |
properties.location.geoCoordinates.latitude |
principal.location.region_latitude, principal.location.region_coordinates.latitude |
Mappé directement à partir de properties.location.geoCoordinates.latitude. |
properties.location.geoCoordinates.longitude |
principal.location.region_longitude, principal.location.region_coordinates.longitude |
Mappé directement à partir de properties.location.geoCoordinates.longitude. |
properties.location.state |
principal.location.state |
Mappé directement à partir de properties.location.state. |
properties.networkLocationDetails.[].networkNames |
additional.fields.value.string_value |
Valeurs concaténées de properties.networkLocationDetails.[].networkNames avec la clé de libellé "properties networkName {index}". |
properties.networkLocationDetails.[].networkType |
additional.fields.value.string_value |
Mappé directement à partir de properties.networkLocationDetails.[].networkType avec la clé de libellé "properties networkType {index}". |
properties.riskEventType |
additional.fields.value.string_value |
Mappé directement à partir de properties.riskEventType avec la clé de libellé "riskEventType". |
properties.riskLastUpdatedDateTime |
additional.fields.value.string_value |
Directement mappé à partir de properties.riskLastUpdatedDateTime avec la clé de libellé "riskLastUpdatedDateTime". |
properties.riskLevel |
additional.fields.value.string_value |
Mappé directement à partir de properties.riskLevel avec la clé de libellé "riskLevel". |
properties.riskLevelDuringSignIn |
additional.fields.value.string_value |
Mappé directement à partir de properties.riskLevelDuringSignIn avec la clé de libellé "riskLevelDuringSignIn". |
properties.riskState |
additional.fields.value.string_value |
Mappé directement à partir de properties.riskState avec la clé de libellé "riskState". |
properties.riskDetail |
additional.fields.value.string_value |
Mappé directement à partir de properties.riskDetail avec la clé de libellé "riskDetail". |
properties.riskType |
additional.fields.value.string_value |
Mappé directement à partir de properties.riskType avec la clé de libellé "riskType". |
properties.source |
additional.fields.value.string_value |
Mappé directement à partir de properties.source avec la clé de libellé "source". |
properties.targetResources.0.id |
target.user.product_object_id |
Mappé directement à partir de properties.targetResources.0.id. |
properties.targetResources.modifiedProperties.0.newValue |
target.group.product_object_id |
Mappé directement à partir de properties.targetResources.modifiedProperties.0.newValue. |
properties.tokenIssuerType |
additional.fields.value.string_value |
Mappé directement à partir de properties.tokenIssuerType avec la clé de libellé "tokenIssuerType". |
properties.userAgent |
network.http.user_agent, network.http.parsed_user_agent |
Mappé directement à partir de properties.userAgent. |
properties.userDisplayName |
target.user.user_display_name |
Mappé directement à partir de properties.userDisplayName. |
properties.userId |
target.user.product_object_id |
Mappé directement à partir de properties.userId. |
properties.userPrincipalName |
target.user.userid, target.user.email_addresses |
Mappé directement à partir de properties.userPrincipalName. Si la valeur est une adresse e-mail, elle est mappée sur email_addresses. Sinon, elle est mappée sur userid. |
result |
security_result.action, security_result.action_details |
Si result est défini sur "success", alors ALLOW. |
resultDescription |
security_result.description |
Mappé directement à partir de resultDescription. |
resultSignature |
additional.fields.value.string_value |
Mappé directement à partir de resultSignature avec la clé de libellé "resultSignature". |
resultType |
security_result.rule_id, action, security_result.summary |
Si resultType est défini sur "0", ALLOW et "Connexion réussie". Sinon, BLOCK et "Échec de la connexion". |
resourceId |
target.resource.id, target.resource.product_object_id |
Mappé directement à partir de resourceId. |
resourceDisplayName |
target.resource.name, appDisplayName |
Mappé directement à partir de resourceDisplayName. |
riskDetail |
additional.fields.value.string_value |
Mappé directement à partir de riskDetail avec la clé de libellé "riskDetail". |
riskEventTypes.[]. |
additional.fields.value.string_value, additional.fields.value.list_value.values.string_value |
Les valeurs sont ajoutées à une liste avec la clé "riskEventTypes" dans additional.fields. De plus, chaque valeur est ajoutée en tant que champ distinct avec la clé "riskEventType" dans additional.fields. |
riskEventTypes_v2.[]. |
additional.fields.value.list_value.values.string_value |
Les valeurs sont ajoutées à une liste avec la clé "riskEventTypes_v2" dans additional.fields. |
riskLevelAggregated |
additional.fields.value.string_value |
Mappé directement à partir de riskLevelAggregated avec la clé de libellé "riskLevelAggregated". |
riskLevelDuringSignIn |
additional.fields.value.string_value |
Mappé directement à partir de riskLevelDuringSignIn avec la clé de libellé "riskLevelDuringSignIn". |
riskState |
additional.fields.value.string_value |
Mappé directement à partir de riskState avec la clé de libellé "riskState". |
status.additionalDetails |
security_result.description |
Mappé directement à partir de status.additionalDetails. |
status.errorCode |
security_result.rule_id, errorCode |
Mappé directement à partir de status.errorCode. |
target.displayName |
resourceDisplayName |
Mappé directement à partir de target.displayName. |
target.id |
resourceId |
Mappé directement à partir de target.id. |
target.modifiedProperties.[].displayName |
target.resource.attribute.labels.key |
Mappé directement à partir de target.modifiedProperties.[].displayName. |
target.modifiedProperties.[].newValue |
target.resource.attribute.labels.value, target.resource.product_object_id |
Mappé directement à partir de target.modifiedProperties.[].newValue. |
target.modifiedProperties.[].oldValue |
target.resource.attribute.labels.value |
Mappé directement à partir de target.modifiedProperties.[].oldValue. |
target.type |
target.resource.type |
Mappé directement à partir de target.type. |
tenantId |
metadata.product_deployment_id |
Mappé directement à partir de tenantId. |
time |
when |
Le champ when est dérivé du champ time. La date et l'heure sont extraites du champ time à l'aide de grok, puis combinées pour former le champ when. |
userAgent |
network.http.user_agent, network.http.parsed_user_agent |
Mappé directement à partir de userAgent. |
userDisplayName |
target.user.user_display_name |
Mappé directement à partir de userDisplayName. |
userId |
target.user.product_object_id |
Mappé directement à partir de userId. |
userPrincipalName |
target.user.userid, principal.administrative_domain, target.user.email_addresses |
Mappé directement à partir de userPrincipalName. S'il s'agit d'une adresse e-mail, elle est mappée sur email_addresses, et la partie du domaine est extraite et mappée sur principal.administrative_domain. Sinon, il est mappé sur userid. |
| (Logique de l'analyseur) | event.idm.is_alert, event.idm.is_significant |
Défini sur "true" si le niveau est "Critical". |
| (Logique de l'analyseur) | event.idm.read_only_udm.metadata.event_type |
Définissez-le sur "USER_LOGIN" si has_target_user est défini sur "true". Définissez la valeur sur "USER_UNCATEGORIZED" si has_principal_user est défini sur "true". Définissez sur "STATUS_UPDATE" si has_principal est défini sur "true". Sinon, définissez-le sur "GENERIC_EVENT". |
| (Logique de l'analyseur) | event.idm.read_only_udm.metadata.vendor_name |
Défini sur "Microsoft". |
| (Logique de l'analyseur) | event.idm.read_only_udm.metadata.product_name |
Défini sur "Azure AD". |
| (Logique de l'analyseur) | event.idm.read_only_udm.extensions.auth.type |
Définissez-le sur "SSO". |
| (Logique de l'analyseur) | event.idm.read_only_udm.extensions.auth.mechanism |
Définissez sur "INTERACTIVE" si isInteractive est défini sur "true". Sinon, définissez-le sur "MECHANISM_OTHER". |
| (Logique de l'analyseur) | security_result.action |
Défini sur ALLOW si le résultat est positif. |
| (Logique de l'analyseur) | security_result.action |
Définissez sur ALLOW si resultType est défini sur 0. |
| (Logique de l'analyseur) | security_result.action |
Définissez sur BLOCK si resultType n'est pas égal à 0 et n'est pas égal à "". |
| (Logique de l'analyseur) | security_result.category |
Définissez sur "AUTH_VIOLATION" si resultType n'est pas égal à 0 et n'est pas vide. |
| (Logique de l'analyseur) | security_result.description |
Définissez la valeur sur "Appartenance au groupe modifiée" si operationName est "Ajouter un membre au groupe" et que le résultat est "success". |
| (Logique de l'analyseur) | security_result.priority |
Définissez la valeur sur "MEDIUM_PRIORITY" si properties.riskLevelDuringSignIn est défini sur "medium". |
| (Logique de l'analyseur) | security_result.summary |
Définissez la valeur sur "Connexion réussie" si resultType est défini sur 0. |
| (Logique de l'analyseur) | security_result.summary |
Définissez la valeur sur "Échec de la connexion" si resultType n'est pas égal à 0 et n'est pas vide. |
| (Logique de l'analyseur) | security_result.summary |
Définissez sur "properties.activityDisplayName" si elle existe. |
| (Logique de l'analyseur) | security_result.severity |
Définissez sur INFORMATIONAL si le niveau est "Information", "Informational", "0" ou "4". Définissez la valeur sur "MEDIUM" si le niveau est "Warning", "1" ou "3". Définissez la valeur sur ERROR si le niveau est "Error" (Erreur) ou "2". Définissez sur CRITICAL si le niveau est "Critique". |
| (Logique de l'analyseur) | security_result.severity |
Définissez sur ERROR si resultType n'est pas égal à 0 et n'est pas vide. |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.