Partage via


Tutoriel : Créer des rapports personnalisés dans Azure Data Explorer à l’aide de données de Microsoft Entra

Dans ce tutoriel, vous allez apprendre à créer des rapports personnalisés dans Azure Data Explorer à l’aide de données provenant des services Microsoft Entra ID et Microsoft Entra ID Governance.

Ce tutoriel complète les options de création de rapports telles que l’archivage et la création de rapports avec La gestion des droits d’utilisation et d’Azure Monitor, qui se concentrent sur l’exportation du journal d’audit dans Azure Monitor pour la rétention et l’analyse. Par comparaison, l’exportation des données Microsoft Entra ID et Microsoft Entra ID Governance vers Azure Data Explorer offre une flexibilité pour créer des rapports personnalisés sur des objets Microsoft Entra, y compris des objets historiques et supprimés.

Voici une vidéo qui fournit une vue d’ensemble rapide des rapports sur les données de gouvernance d’ID Microsoft Entra à l’aide d’Azure Data Explorer.

L’utilisation d’Azure Data Explorer permet également l’agrégation de données à partir de sources supplémentaires, avec une extensibilité massive, des schémas flexibles et des stratégies de rétention. Azure Data Explorer est particulièrement utile lorsque vous devez conserver les données d’accès utilisateur pendant des années, effectuer des enquêtes ad hoc ou exécuter des requêtes personnalisées sur les données d’accès.

Dessin conceptuel montrant l’extraction et les requêtes de données.

Ce tutoriel montre comment afficher la configuration, les utilisateurs et les droits d’accès exportés à partir de Microsoft Entra, ainsi que les données exportées à partir d’autres sources, telles que les applications disposant de droits d’accès dans leurs propres bases de données SQL. Vous pouvez ensuite utiliser le langage de requête Kusto (KQL) dans Azure Data Explorer pour créer des rapports personnalisés en fonction des exigences de votre organisation.

Dans ce tutoriel, vous allez :

  • Configurez Azure Data Explorer dans un abonnement Azure ou créez un cluster gratuit.
  • Extrayez des données de Microsoft Entra ID à l’aide de scripts PowerShell et de Microsoft Graph.
  • Créez des tables et importez des données à partir de Microsoft Entra ID dans Azure Data Explorer.
  • Extrayez les données de Microsoft Entra ID Governance.
  • Créez des tables et importez des données à partir de Microsoft Entra ID Governance dans Azure Data Explorer.
  • Générez une requête personnalisée à l’aide de KQL.
  • Interroger des données dans Azure Monitor.

À la fin de ce tutoriel, vous pourrez développer des vues personnalisées des droits d’accès et des autorisations des utilisateurs. Ces vues s’étendent sur plusieurs applications via les outils pris en charge par Microsoft. Vous pouvez également importer des données provenant de bases de données ou d’applications non-Microsoft pour signaler ces droits et autorisations d’accès.

Prérequis

Si vous débutez avec Azure Data Explorer et que vous souhaitez découvrir les scénarios que ce didacticiel présente, vous pouvez obtenir un cluster Azure Data Explorer gratuit. Pour une utilisation prise en charge en production avec un contrat de niveau de service pour Azure Data Explorer, vous avez besoin d’un abonnement Azure pour héberger un cluster Azure Data Explorer complet.

Déterminez les données que vous souhaitez inclure dans vos rapports. Les scripts de ce didacticiel fournissent des exemples avec des données spécifiques provenant d’utilisateurs, de groupes et d’applications de Microsoft Entra. Ces exemples illustrent les types de rapports que vous pouvez générer avec cette approche, mais vos besoins de création de rapports spécifiques peuvent varier et nécessiter des données différentes ou supplémentaires. Vous pouvez commencer par ces objets et apporter plus de types d’objets Microsoft Entra au fil du temps.

  • Ce tutoriel illustre la récupération des données de Microsoft Entra en tant qu’utilisateur connecté. Pour ce faire, vérifiez que vous disposez des attributions de rôles requises. Vous avez besoin des rôles disposant des autorisations appropriées pour exporter le type de données Microsoft Entra que vous souhaitez utiliser :

    • Données utilisateur : Administrateur général, Administrateur de rôle privilégié, Administrateur d’utilisateur
    • Données de groupe : Administrateur général, Administrateur de rôle privilégié, Administrateur de groupe
    • Attributions de rôles d’application et d’applications : Administrateur général, Administrateur de rôle privilégié, Administrateur d’application, Administrateur d’application cloud
  • Microsoft Graph PowerShell a besoin du consentement pour récupérer des objets Microsoft Entra via Microsoft Graph. Les exemples de ce didacticiel nécessitent les autorisations déléguées User.Read.All, Group.Read.All, Application.Read.All, et Directory.Read.All. Si vous envisagez de récupérer des données à l’aide de l’automatisation sans utilisateur connecté, consentez plutôt aux autorisations d’application correspondantes. Pour plus d’informations, reportez-vous à l’article relatif aux Autorisations Microsoft Graph.

    Si vous n’avez pas encore donné le consentement de Microsoft Graph PowerShell à ces autorisations, vous devez être administrateur général pour effectuer cette opération de consentement.

  • Ce didacticiel n’illustre pas les attributs de sécurité personnalisés. Par défaut, l’administrateur général et d’autres rôles d’administrateur n’incluent pas d’autorisations pour lire les attributs de sécurité personnalisés des utilisateurs de Microsoft Entra. Si vous envisagez de récupérer des attributs de sécurité personnalisés, vous aurez peut-être besoin de rôles et d’autorisations supplémentaires.

  • Sur l’ordinateur sur lequel Microsoft Graph PowerShell est installé, vérifiez que vous disposez d’un accès en écriture au répertoire du système de fichiers. Ce répertoire est l’emplacement où vous installez les modules PowerShell Microsoft Graph requis et où les données Microsoft Entra exportées sont enregistrées.

  • Vérifiez que vous disposez des autorisations nécessaires pour récupérer des données à partir d’autres sources de données au-delà de Microsoft Entra, si vous souhaitez également incorporer ces données dans Azure Data Explorer.

Configurer Azure Data Explorer

Si vous n’avez pas déjà utilisé Azure Data Explorer, vous devez d’abord le configurer. Vous pouvez créer un cluster gratuit sans abonnement Azure ou carte de crédit. Vous pouvez également créer un cluster complet, qui nécessite un abonnement Azure. Pour commencer, consultez Démarrage rapide : Créer un cluster et une base de données Azure Data Explorer.

Extraire des données d’ID Microsoft Entra à l’aide de PowerShell

Dans cette section, vous allez installer des modules PowerShell Microsoft Graph. Dans PowerShell, vous vous connectez à Microsoft Graph pour extraire les données d’ID Microsoft Entra.

La première fois que votre organisation utilise ces modules pour ce scénario, vous devez avoir un rôle d’administrateur général pour permettre à Microsoft Graph PowerShell d’accorder le consentement pour une utilisation dans votre locataire. Les interactions suivantes peuvent utiliser un rôle avec des privilèges inférieurs.

  1. Ouvrez PowerShell.

  2. Si vous n’avez pas tous les modules Microsoft Graph PowerShell déjà installés, installez les modules Microsoft Graph requis. Les modules suivants sont requis pour cette section du didacticiel : Microsoft.Graph.Authentication, , Microsoft.Graph.Users, Microsoft.Graph.Groups, Microsoft.Graph.Applicationset Microsoft.Graph.DirectoryObjects. Si vous avez déjà installé ces modules, ignorez cette étape.

       $modules = @('Microsoft.Graph.Users', 'Microsoft.Graph.Groups', 'Microsoft.Graph.Applications', 'Microsoft.Graph.DirectoryObjects') 
       foreach ($module in $modules) { 
       Install-Module -Name $module -Scope CurrentUser -AllowClobber -Force
       } 
    
  3. Importez les modules dans la session PowerShell actuelle :

      $modules = @('Microsoft.Graph.Users', 'Microsoft.Graph.Groups', 'Microsoft.Graph.Applications', 'Microsoft.Graph.DirectoryObjects') 
      foreach ($module in $modules) { 
      Import-Module -Name $module 
      } 
    
  4. Se connecter à Microsoft Graph. Cette section du didacticiel illustre la lecture d’utilisateurs, de groupes et d’applications, de sorte qu’elle nécessite les étendues d’autorisation User.Read.All, Group.Read.All, Application.Read.All, et Directory.Read.All. Pour plus d’informations sur les autorisations, consultez Référence d’autorisations Microsoft Graph.

      Connect-MgGraph -Scopes "User.Read.All", "Group.Read.All", "Application.Read.All", "Directory.Read.All" -ContextScope Process -NoWelcome
    

    Cette commande vous invite à vous connecter avec vos informations d’identification Microsoft Entra. Une fois connecté, vous devrez peut-être donner votre consentement aux autorisations requises s’il s’agit de votre première connexion ou si de nouvelles autorisations sont requises.

Requêtes PowerShell pour extraire les données d’ID Microsoft Entra pour les rapports personnalisés

Les requêtes suivantes extraient les données d’ID Microsoft Entra de Microsoft Graph à l’aide de PowerShell et exportent les données dans des fichiers JSON. Vous importez ces fichiers dans Azure Data Explorer dans une section ultérieure de ce didacticiel.

Les scénarios de génération de rapports avec ce type de données sont les suivants :

  • Un auditeur souhaite voir un rapport qui répertorie les membres du groupe pour 10 groupes, organisés par le service des membres.
  • Un auditeur souhaite voir un rapport de tous les utilisateurs ayant accès à une application entre deux dates.

Vous pouvez également importer des données dans Azure Data Explorer à partir de sources au-delà de Microsoft Entra. Un scénario pour cette fonctionnalité peut être :

  • Un administrateur souhaite afficher tous les utilisateurs ajoutés à une application à partir de l’ID Microsoft Entra et de leurs droits d’accès dans le propre référentiel de l’application, comme une base de données SQL.

Ces types de rapports ne sont pas intégrés à l’ID Microsoft Entra. Toutefois, vous pouvez créer ces rapports vous-même en extrayant des données de Microsoft Entra ID et en combinant des données à l’aide de requêtes personnalisées dans Azure Data Explorer. Ce tutoriel traite de ce processus ultérieurement, dans l’article Apporter des données à partir d’autres sources .

Pour ce tutoriel, vous extrayez les données d’ID Microsoft Entra à partir de ces domaines :

  • Les informations utilisateur telles que le nom d’affichage, l’UPN et les détails du travail
  • Informations de groupe, y compris leurs appartenances
  • Applications et affectations aux rôles d’application

Ce jeu de données vous permet d’effectuer un large ensemble de requêtes autour des personnes ayant reçu l’accès à une application, avec leurs informations de rôle d’application et la période associée. N’oubliez pas qu’il s’agit d’exemples de requêtes, et que vos données et exigences spécifiques peuvent varier selon ce qui est illustré ici.

Remarque

Les locataires plus grands peuvent rencontrer des limitations et des erreurs 429 que le module Microsoft Graph gère. Azure Data Explorer peut également limiter les tailles de chargement de fichiers.

Dans ces scripts PowerShell, vous exportez les propriétés sélectionnées des objets Microsoft Entra vers des fichiers JSON. Les données de ces propriétés exportées sont utilisées pour générer des rapports personnalisés dans Azure Data Explorer.

Les propriétés spécifiques suivantes sont incluses dans ces exemples, car nous utilisons ces données pour illustrer les types de rapports que vous pouvez créer dans Azure Data Explorer. Étant donné que vos besoins de création de rapports spécifiques varient probablement selon ce que ce tutoriel montre, vous devez inclure les propriétés spécifiques dans ces scripts qui vous intéressent pour l’affichage de vos rapports. Toutefois, vous pouvez suivre le même modèle que celui indiqué pour vous aider à générer vos scripts.

Sélectionner une date de capture instantanée

Une date d’instantané codée en dur identifie les données du fichier JSON avec une date spécifique. Vous pouvez l’utiliser pour effectuer le suivi des jeux de données similaires au fil du temps dans Azure Data Explorer. La date d’instantané est également utile pour comparer les modifications apportées aux données entre deux dates d’instantané.

$SnapshotDate = Get-Date -AsUTC -Format "yyyy-MM-dd"

Obtenir des données utilisateur Microsoft Entra

Ce script exporte les propriétés sélectionnées de l’objet utilisateur Microsoft Entra vers un fichier JSON. Vous allez importer ce fichier et d’autres données d’autres fichiers JSON dans Azure Data Explorer dans une section ultérieure de ce didacticiel.

  function Export-EntraUsersToJson { 

  # Define a hash table for property mappings 
   $propertyMappings = @{ 
    "Id" = "ObjectID" 
    "DisplayName" = "DisplayName" 
    "UserPrincipalName" = "UserPrincipalName" 
    "EmployeeId" = "EmployeeId" 
    "UserType" = "UserType" 
    "CreatedDateTime" = "CreatedDateTime" 
    "JobTitle" = "JobTitle" 
    "Department" = "Department" 
    "AccountEnabled" = "AccountEnabled" 

   # Add custom properties as needed 
    "custom_extension" = "CustomExtension" 
   } 
  # Retrieve users with specified properties and create custom objects directly 
   $users = Get-MgUser -Select ($propertyMappings.Keys) -All | ForEach-Object { 
      $userObject = @{} 
      foreach ($key in $propertyMappings.Keys) { 
        if ($key -eq "CreatedDateTime") { 
          # Convert date string directly to DateTime and format it 
          $date = [datetime]::Parse($_.$key) 
          $userObject[$propertyMappings[$key]] = $date.ToString("yyyy-MM-dd") 
        } else { 
          $userObject[$propertyMappings[$key]] = $_.$key 
        } 
      } 
      # Additional properties or transformations 
      $userObject["SnapshotDate"] = $SnapshotDate
      [pscustomobject]$userObject 
    } 
    # Convert the user data to JSON and save it to a file 
    $users | ConvertTo-Json -Depth 2 | Set-Content ".\EntraUsers.json" 
  } 
  # Execute the function 
  Export-EntraUsersToJson 

Obtenir des données de groupe

Générez un fichier JSON avec des noms de groupe et des ID utilisés pour créer des vues personnalisées dans Azure Data Explorer. L’exemple inclut tous les groupes, mais vous pouvez inclure un filtrage supplémentaire si nécessaire. Si vous filtrez pour inclure uniquement certains groupes, vous pouvez inclure la logique dans votre script pour rechercher des groupes imbriqués.

    # Get all groups and select Id and DisplayName 
    $groups = Get-MgGroup -All | Foreach-Object {
       $groupObject = @{} 
       $groupObject["Id"] = $_.Id
       $groupObject["DisplayName"] = $_.DisplayName
       $groupObject["SecurityEnabled"] = $_.SecurityEnabled
       $groupObject["MailEnabled"] = $_.MailEnabled
       $groupObject["MailNickname"] = $_.MailNickname
       $groupObject["SecurityIdentifier"] = $_.SecurityIdentifier
       $date = [datetime]::Parse($_.CreatedDateTime) 
       $groupObject["CreatedDateTime"] = $date.ToString("yyyy-MM-dd") 
       $groupObject["SnapshotDate"] = $SnapshotDate
      [pscustomobject]$groupObject 
    }
    # Export the groups to a JSON file 
    $groups | ConvertTo-Json | Set-Content ".\EntraGroups.json" 

Obtenir des données d’appartenance à un groupe

Générez un fichier JSON avec l’appartenance au groupe, qui est utilisé pour créer des vues personnalisées dans Azure Data Explorer. L’exemple inclut tous les groupes, mais vous pouvez inclure un filtrage supplémentaire si nécessaire.

    # Retrieve all groups from Microsoft Entra ID 
    $groups = Get-MgGroup -All 
    # Initialize an array to store results 
    $results = @() 
    # Iterate over each group 
    foreach ($group in $groups) { 
      # Extract the group ID 
      $groupId = $group.Id 
      # Get members of the current group and select their IDs 
      $members = Get-MgGroupMember -GroupId $groupId | Select-Object -ExpandProperty Id 
      # Add a custom object with group ID and member IDs to the results array 
      $results += [PSCustomObject]@{ 
        GroupId = $groupId 
        Members = $members 
        SnapshotDate = $SnapshotDate
      } 
      # Pause for a short time to avoid rate limits 
      Start-Sleep -Milliseconds 200 
    } 
    # Convert the results array to JSON format and save it to a file 
    $results | ConvertTo-Json | Set-Content "EntraGroupMemberships.json" 

Obtenir des données d’application et de principal de service

Générez un fichier JSON contenant toutes les applications et les principaux de service correspondants dans le client. Vous allez importer ces données dans Azure Data Explorer dans une section ultérieure de ce tutoriel afin de pouvoir générer des rapports personnalisés liés aux applications en fonction de ces données.

    # Fetch applications and their corresponding service principals, and then export to JSON 
    Get-MgApplication -All | ForEach-Object { 
      $app = $_ 
      $sp = Get-MgServicePrincipal -Filter "appId eq '$($app.AppId)'" 
      $date = [datetime]::Parse($app.CreatedDateTime)
      [pscustomobject]@{ 
        DisplayName     = $app.DisplayName
        ApplicationId   = $app.AppId 
        ServicePrincipalId = $sp.Id 
        SnapshotDate = $SnapshotDate
        CreatedDateTime = $date.ToString("yyyy-MM-dd")
      } 
    } | ConvertTo-Json -Depth 10 | Set-Content "Applications.json" 

Obtenir des données de rôle d’application

Générez un fichier JSON de tous les rôles d’application pour les applications d’entreprise dans Microsoft Entra. Après avoir importé ces données dans Azure Data Explorer, vous l’utiliserez pour générer des rapports qui impliquent des attributions de rôles d’application pour les utilisateurs.

    # Get a list of all applications, and handle pagination manually if necessary 
    $apps = Get-MgApplication -All 
    # Loop through each application to gather the desired information 
    $results = foreach ($app in $apps) { 
      # Get the service principal for the application by using its app ID 
      $spFilter = "appId eq '$($app.AppId)'" 
      $sp = Get-MgServicePrincipal -Filter $spFilter | Select-Object -First 1 
      # Process app roles, if any, for the application 
      $appRoles = if ($app.AppRoles) { 
        $app.AppRoles | Where-Object { $_.AllowedMemberTypes -contains "User" } | 
        Select-Object Id, Value, DisplayName 
      } 
      # Construct a custom object with application and service principal details 
      [PSCustomObject]@{ 
        ApplicationId    = $app.AppId 
        DisplayName     = $app.DisplayName 
        ServicePrincipalId = $sp.Id 
        AppRoles      = $appRoles 
        SnapshotDate = $SnapshotDate
      } 
    } 
    # Export the results to a JSON file 
    $results | ConvertTo-Json -Depth 4 | Out-File 'AppRoles.json' 

Obtenir les données d’attribution de rôle d’application

Générez un fichier JSON de tous les rôles d'application attribués aux utilisateurs dans le client :

    $users = Get-MgUser -All 
    $result = @() 
    foreach ($user in $users) { 
      Get-MgUserAppRoleAssignment -UserId $user.Id | ForEach-Object { 
        # Use the same date formatting approach 
        $createdDateTime = $_.CreatedDateTime -replace "\\/Date\((\d+)\)\\/", '$1' 
        # Convert the milliseconds timestamp to a readable date format if necessary 
        $result += [PSCustomObject]@{ 
          Id = $_.Id
          AppRoleId      = $_.AppRoleId
          CreatedDateTime   = $createdDateTime
          PrincipalDisplayName = $user.DisplayName
          PrincipalId     = $user.Id
          AssignmentPrincipalType = $_.PrincipalType
          AssignmentPrincipalDisplayName = $_.PrincipalDisplayName
          AssignmentPrincipalId     = $_.PrincipalId
          ResourceDisplayName = $_.ResourceDisplayName
          ResourceId      = $_.ResourceId
          SnapshotDate     = $SnapshotDate
        } 
      } 
    } 
    $result | ConvertTo-Json -Depth 10 | Out-File "AppRoleAssignments.json" 

Créer des tables et importer des fichiers JSON avec des données de Microsoft Entra ID dans Azure Data Explorer

Dans cette section, vous importez les fichiers JSON nouvellement créés pour les services d’ID Microsoft Entra en tant que tables dans Azure Data Explorer pour une analyse plus approfondie. Lors de la première importation via l’interface utilisateur web Azure Data Explorer, vous créez les tables basées sur les schémas que l’interface utilisateur web suggère à partir de chaque fichier JSON.

  1. Se connecter à l’interface utilisateur web d’Azure Data Explorer.

  2. Accédez à la base de données que vous avez configurée dans votre cluster Azure Data Explorer ou un cluster gratuit précédemment dans ce tutoriel.

  3. Dans le menu de gauche, sélectionnez Requête.

  4. Procédez comme suit pour chaque fichier JSON exporté pour obtenir vos données exportées dans cette base de données Azure Data Explorer en tant que nouvelle table :

    1. Cliquez avec le bouton droit sur le nom de la base de données dans laquelle vous souhaitez ingérer les données. Sélectionnez Ensuite Obtenir des données.

      Capture d’écran d’un onglet requête, avec un menu contextuel pour une base de données et la commande permettant d’obtenir des données mises en surbrillance.

    2. Sélectionnez la source de données dans la liste disponible. Dans ce tutoriel, vous ingérerez des données à partir d’un fichier local, puis sélectionnez Fichier local.

    3. Sélectionnez + Nouvelle table et entrez un nom de table, en fonction du nom du fichier JSON que vous importez. Par exemple, si vous importez EntraUsers.json, nommez la table EntraUsers. Une fois la première importation terminée, la table existe déjà et vous pouvez la sélectionner comme table cible pour une importation ultérieure.

    4. Sélectionnez Rechercher des fichiers, sélectionnez le fichier JSON, puis sélectionnez Suivant.

    5. Azure Data Explorer détecte automatiquement le schéma et fournit un aperçu sous l’onglet Inspecter . Sélectionnez Terminer pour créer la table et importer les données à partir de ce fichier. Une fois les données ingérées, sélectionnez Fermer.

    6. Répétez les étapes précédentes pour chacun des fichiers JSON que vous avez générés dans la section précédente.

À la fin de ces étapes, vous avez les tables EntraUsers, , EntraGroupsEntraGroupMemberships, Applications, AppRoleset AppRoleAssignments dans la base de données.

Extraire les données de gouvernance des ID Microsoft Entra à l’aide de PowerShell

Dans cette section, vous utilisez PowerShell pour extraire des données des services microsoft Entra ID Governance. Si vous n’avez pas la gouvernance des ID Microsoft Entra, l’ID Microsoft Entra P2 ou Microsoft Entra Suite, continuez dans la section Utiliser Azure Data Explorer pour générer des rapports personnalisés.

Pour les étapes suivantes, vous devrez peut-être installer des modules Microsoft Graph PowerShell pour extraire les données de gouvernance des ID Microsoft Entra. La première fois que votre organisation utilise ces modules pour ce scénario, vous devez avoir un rôle d’administrateur général pour permettre à Microsoft Graph PowerShell d’accorder le consentement pour une utilisation dans votre locataire. Les interactions suivantes peuvent utiliser un rôle avec des privilèges inférieurs.

  1. Ouvrez PowerShell.

  2. Si vous n’avez pas tous les modules Microsoft Graph PowerShell déjà installés, installez les modules Microsoft Graph requis. Le module suivant est requis pour cette section du didacticiel : Microsoft.Graph.Identity.Governance. Si les modules sont déjà installés, passez à l’étape suivante.

       $modules = @('Microsoft.Graph.Identity.Governance')
       foreach ($module in $modules) {
       Install-Module -Name $module -Scope CurrentUser -AllowClobber -Force
       }
    
  3. Importez les modules dans la session PowerShell actuelle :

      $modules = @('Microsoft.Graph.Identity.Governance')
      foreach ($module in $modules) {
      Import-Module -Name $module
      } 
    
  4. Se connecter à Microsoft Graph. Cette section du didacticiel illustre la récupération des données à partir de la gestion des droits et des révisions d’accès, ce qui nécessite les étendues d’autorisation AccessReview.Read.All et EntitlementManagement.Read.All. Pour d'autres cas d'usage d'établissement de rapports, comme pour la Gestion des Identités Privilégiées (PIM) ou les workflows de cycle de vie, mettez à jour le paramètre Scopes avec les autorisations nécessaires. Pour plus d’informations sur les autorisations, consultez Référence d’autorisations Microsoft Graph.

      Connect-MgGraph -Scopes "AccessReview.Read.All, EntitlementManagement.Read.All" -ContextScope Process -NoWelcome
    

    Cette commande vous invite à vous connecter avec vos informations d’identification Microsoft Entra. Une fois connecté, vous devrez peut-être donner votre consentement aux autorisations requises s’il s’agit de votre première connexion ou si de nouvelles autorisations sont requises.

Requêtes PowerShell pour extraire les données de gouvernance d’ID Microsoft Entra pour les rapports personnalisés

Les requêtes suivantes extraient les données microsoft Entra ID Governance à partir de Microsoft Graph à l’aide de PowerShell et exportent les données dans des fichiers JSON. Vous importez ces fichiers dans Azure Data Explorer dans une section ultérieure de ce didacticiel.

Les scénarios de génération de rapports avec ce type de données sont les suivants :

  • Création de rapports sur les audits d'accès historiques.
  • Création de rapports sur les affectations via la gestion des droits.

Accéder aux données de définition du calendrier de révision des accès

Générez un fichier JSON avec des noms de définition de révision d’accès et des ID utilisés pour créer des vues personnalisées dans Azure Data Explorer. L’exemple inclut toutes les révisions d’accès, mais vous pouvez inclure un filtrage supplémentaire si nécessaire. Pour plus d’informations, consultez Utiliser le paramètre de requête de filtre.

   $allsched = Get-MgIdentityGovernanceAccessReviewDefinition -All
   $definitions = @()
   # Iterate over each definition
   foreach ($definition in $allsched) {
      $definitions += [PSCustomObject]@{
         Id = $definition.Id
         DisplayName = $definition.DisplayName
         SnapshotDate = $SnapshotDate
      }
   }
   $definitions | ConvertTo-Json -Depth 10 | Set-Content "EntraAccessReviewDefinitions.json"

Obtenir des données d’instance pour les révisions d’accès

Pour exporter toutes les définitions, instances et décisions de révision d’accès dans un format de dossier structuré à l’aide de PowerShell, vous pouvez utiliser l’API Microsoft Graph. Cette approche garantit que vos données sont organisées hiérarchiquement et s’alignent sur la structure de dossiers spécifiée.

Avant de commencer, tenez compte des points suivants :

  • Vérifiez que vous disposez des autorisations nécessaires pour accéder aux données de révision dans Microsoft Graph.
  • Selon le volume de données, le temps d’exécution du script peut varier. Surveillez le processus et ajustez les paramètres en fonction des besoins.

Pour obtenir les données d’instance :

  1. Téléchargez le script Export_Access_Reviews.ps1 et enregistrez-le localement.

  2. Dans l’Explorateur de fichiers, débloquez le script pour pouvoir l’exécuter dans PowerShell.

  3. Exécutez la commande suivante. La sortie place toutes les données en trois sous-dossiers : ReviewInstances, ReviewInstanceDecisionItemset ReviewInstanceContactedReviewers.

     .\ExportAccessReviews.ps1 -InstanceStartDate "11/15/2024" -InstanceEndDate "12/15/2024" -ExportFolder "C:\AccessReviewsExport\11_15_to_12_15" 
    

Obtenir des données d'ensemble d'accès pour la gestion des habilitations

Générez un fichier JSON avec des noms de package d’accès et des ID utilisés pour créer des vues personnalisées dans Azure Data Explorer. L’exemple inclut tous les packages d’accès, mais vous pouvez inclure un filtrage supplémentaire si nécessaire.

   $accesspackages1 = Get-MgEntitlementManagementAccessPackage -All
   $accesspackages2 = @()
   # Iterate over each access package
   foreach ($accesspackage in $accesspackages1) {
      $accesspackages2 += [PSCustomObject]@{
         Id = $accesspackage.Id
         DisplayName = $accesspackage.DisplayName
         SnapshotDate = $SnapshotDate
      }
   }
   $accesspackages2 | ConvertTo-Json -Depth 10 | Set-Content "EntraAccessPackages.json"

Obtenir les données d’attribution de package d’accès pour la gestion des droits d’utilisation

Générez un fichier JSON avec des affectations pour accéder aux packages utilisés pour créer des vues personnalisées dans Azure Data Explorer. L’échantillon comprend toutes les tâches remises, mais vous pouvez inclure un filtrage supplémentaire si nécessaire.

   $apassignments1 = Get-MgEntitlementManagementAssignment -ExpandProperty target,accessPackage -filter "state eq 'Delivered'" -all
   $apassignments2 = @()
   # Iterate over each access package assignment
   foreach ($assignment in $apassignments1) {
      $apassignments2 += [PSCustomObject]@{
         Id = $assignment.Id
         ScheduleStartDateTime = $assignment.Schedule.StartDateTime -replace "\\/Date\((\d+)\)\\/", '$1' 
         AccessPackageId = $assignment.AccessPackage.Id
         AccessPackageDisplayName = $assignment.AccessPackage.DisplayName
         TargetId = $assignment.Target.Id
         TargetDisplayName = $assignment.Target.DisplayName
         TargetEmail = $assignment.Target.Email
         TargetObjectId = $assignment.Target.ObjectId
         TargetPrincipalName = $assignment.Target.PrincipalName
         TargetSubjectType = $assignment.Target.SubjectType
         SnapshotDate = $SnapshotDate
      }
   }
   $apassignments2 | ConvertTo-Json -Depth 10 | Set-Content "EntraAccessPackageAssignments.json"

Créer des tables et importer des fichiers JSON avec des données de Microsoft Entra ID Governance dans Azure Data Explorer

Dans cette section, vous importez les fichiers JSON nouvellement créés pour les services microsoft Entra ID Governance dans Azure Data Explorer pour une analyse plus approfondie. Ces fichiers rejoignent les données que vous avez déjà importées pour les services d’ID Microsoft Entra. Lors de la première importation via l’interface utilisateur web Azure Data Explorer, vous créez des tables basées sur des schémas que l’interface utilisateur web suggère à partir de chaque fichier JSON.

  1. Se connecter à l’interface utilisateur web d’Azure Data Explorer.

  2. Dans votre cluster Azure Data Explorer ou cluster gratuit, accédez à la base de données contenant vos données d’ID Microsoft Entra.

  3. Dans le menu de gauche, sélectionnez Requête.

  4. Procédez comme suit pour chaque fichier JSON exporté pour obtenir vos données exportées dans cette base de données Azure Data Explorer en tant que nouvelle table :

    1. Cliquez avec le bouton droit sur le nom de la base de données dans laquelle vous souhaitez ingérer les données. Sélectionnez Ensuite Obtenir des données.

      Capture d’écran d’un onglet requête, avec un menu contextuel pour une base de données et la commande permettant d’obtenir des données mises en surbrillance.

    2. Sélectionnez la source de données dans la liste disponible. Dans ce tutoriel, vous ingérerez des données à partir d’un fichier local, puis sélectionnez Fichier local.

    3. Sélectionnez + Nouvelle table et entrez un nom de table, en fonction du nom du fichier JSON que vous importez. Une fois la première importation terminée, la table existe déjà et vous pouvez la sélectionner comme table cible pour une importation ultérieure.

    4. Sélectionnez Rechercher des fichiers, sélectionnez le fichier JSON, puis sélectionnez Suivant.

    5. Azure Data Explorer détecte automatiquement le schéma et fournit un aperçu sous l’onglet Inspecter . Sélectionnez Terminer pour créer la table et importer les données à partir de ce fichier. Une fois les données ingérées, sélectionnez Fermer.

    6. Répétez les étapes précédentes pour chacun des fichiers JSON que vous avez générés dans la section précédente, pour chacun des dossiers.

    7. S’il existe de nombreux fichiers dans un dossier, vous pouvez l’utiliser lightingest pour importer le reste une fois la table créée.

À la fin de ces étapes, vous avez les tables EntraAccessReviewDefinitions, , EntraAccessPackagesEntraAccessPackageAssignments, ReviewInstances, ReviewInstanceDecisionItemset ReviewInstanceContactedReviewers dans la base de données, en plus des tables que vous avez créées précédemment.

Utiliser Azure Data Explorer pour créer des rapports personnalisés

Avec les données désormais disponibles dans Azure Data Explorer, vous êtes prêt à commencer à créer des rapports personnalisés en fonction des besoins de votre entreprise :

  1. Se connecter à l’interface utilisateur web d’Azure Data Explorer.

  2. Dans le menu de gauche, sélectionnez Requête.

Les requêtes suivantes fournissent des exemples de rapports courants, mais vous pouvez personnaliser ces rapports en fonction de vos besoins et créer des rapports supplémentaires.

Vous pouvez également afficher vos rapports dans Excel, en sélectionnant l’onglet Exporter , puis en sélectionnant Ouvrir dans Excel.

Exemple : Générer des attributions de rôles d'application pour des assignations directes et de groupe à une date de snapshot précise.

Ce rapport fournit une vue des personnes ayant accès à l’application cible et quand. Vous pouvez l’utiliser pour les audits de sécurité, la vérification de conformité et la compréhension des modèles d’accès au sein de l’organisation.

La requête suivante cible une application spécifique dans l’ID Microsoft Entra et analyse les attributions de rôles à partir d’une certaine date. La requête récupère les attributions de rôles directes et par groupes. Il fusionne ces données avec les détails de l’utilisateur à partir de la EntraUsers table et des informations de rôle de la AppRoles table. Dans la requête, définissez targetSnapshotDate sur la valeur snapshotDate que vous avez utilisée lors du chargement des données.

/// Define constants 
let targetServicePrincipalId = "<your service principal-id>"; // Target service principal ID 
let targetSnapshotDate = datetime("2024-01-13"); // Target snapshot date for the data 

// Extract role assignments for the target service principal and snapshot date 
let roleAssignments = AppRoleAssignments 
    | where ResourceId == targetServicePrincipalId and startofday(SnapshotDate) == targetSnapshotDate 
    | extend AppRoleIdStr = tostring(AppRoleId); // Convert AppRoleId to a string for easier comparison 

// Prepare user data from the EntraUsers table 
let users = EntraUsers 
    | project ObjectID, UserPrincipalName, DisplayName, ObjectIDStr = tostring(ObjectID); // Include ObjectID as string for joining 

// Prepare role data from the AppRoles table 
let roles = AppRoles 
    | mvexpand AppRoles // Expand AppRoles to handle multiple roles 
    | extend RoleName = AppRoles.DisplayName, RoleId = tostring(AppRoles.Id) // Extract role name and ID 
    | project RoleId, RoleName; 
// Process direct assignments 
let directAssignments = roleAssignments 
    | join kind=inner users on $left.PrincipalId == $right.ObjectID // Join with EntraUsers on PrincipalId 
    | join kind=inner roles on $left.AppRoleIdStr == $right.RoleId // Join with roles to get role names 
    | project UserPrincipalName, DisplayName, CreatedDateTime, RoleName, AssignmentType = "Direct", SnapshotDate; 

// Process group-based assignments 

let groupAssignments = roleAssignments 
    | join kind=inner EntraGroupMemberships on $left.PrincipalId == $right.GroupId // Join with group membership 
    | mvexpand Members // Expand group members 
    | extend MembersStr = tostring(Members) // Convert the member ID to a string 
    | distinct MembersStr, CreatedDateTime, AppRoleIdStr, SnapshotDate // Get distinct values 
    | join kind=inner users on $left.MembersStr == $right.ObjectIDStr // Join with EntraUsers for user details 
    | join kind=inner roles on $left.AppRoleIdStr == $right.RoleId // Join with roles for role names 
    | project UserPrincipalName, DisplayName, CreatedDateTime, RoleName, AssignmentType = "Group", SnapshotDate; 

// Combine results from direct and group-based assignments 
directAssignments 
| union groupAssignments 

Exemple : Créer un rapport d’auditeur de base avec des données Microsoft Entra qui indique qui avait accès à une application entre deux dates

Ce rapport fournit une vue des personnes ayant accès à l’application cible entre deux dates. Vous pouvez l’utiliser pour les audits de sécurité, la vérification de conformité et la compréhension des modèles d’accès au sein de l’organisation.

La requête suivante cible une application spécifique dans l’ID Microsoft Entra et analyse les attributions de rôles entre deux dates. La requête récupère les attributions de rôles directes à partir de la table AppRoleAssignments et fusionne ces données avec les détails de l’utilisateur à partir de la table EntraUsers et des informations de rôle de la table AppRoles.

// Set the date range and service principal ID for the query 
let startDate = datetime('2024-01-01'); 
let endDate = datetime('2024-03-14'); 
let servicePrincipalId = "<your service principal-id>"; 

// Query AppRoleAssignments for the specified service principal within the date range 
AppRoleAssignments 
| where ResourceId == servicePrincipalId and 
    todatetime(CreatedDateTime) between (startDate .. endDate) 

// Extend AppRoleId to a string for joining 
| extend AppRoleIdStr = tostring(AppRoleId) 

// Project the necessary fields for the join with EntraUsers and AppRoles 
| project PrincipalId, AppRoleIdStr, CreatedDateTime 

// Join with EntraUsers to get user details 
| join kind=inner (EntraUsers | project UserPrincipalName, DisplayName, ObjectID) on $left.PrincipalId == $right.ObjectID 

// Join with AppRoles to get the role display names 
| join kind=inner ( 
  AppRoles | mvexpand AppRoles | project RoleIdStr = tostring(AppRoles.Id), RoleDisplayName = tostring(AppRoles.DisplayName) 
) on $left.AppRoleIdStr == $right.RoleIdStr 

// Final projection of the report with the current date and time 
| project UserPrincipalName, DisplayName, RoleDisplayName, CreatedDateTime, ReportDate = now() 

Exemple : afficher les utilisateurs ajoutés à une application entre deux dates de prise d’instantanés de données

Ces rapports fournissent une vue sur laquelle les utilisateurs ont reçu une attribution de rôle d’application à l’application cible entre deux dates. Vous pouvez utiliser ces rapports pour suivre les modifications apportées à l’accès aux applications au fil du temps.

Cette requête cible une application spécifique dans l’ID Microsoft Entra et les modifications apportées aux attributions de rôles entre les dates de début et de fin :

// Define the date range and service principal ID for the query 

let startDate = datetime("2024-03-01"); 
let endDate = datetime("2024-03-14"); 
let servicePrincipalId = "<your service principal-id>"; 
let earlierDate = startDate; // Update this to your specific earlier date 

AppRoleAssignments 
| where SnapshotDate < endDate and ResourceId == servicePrincipalId
| project PrincipalId, AppRoleId2 = tostring(AppRoleId), CreatedDateTime 
| join kind=anti ( 
    AppRoleAssignments 
    | where SnapshotDate < earlierDate and ResourceId == servicePrincipalId 
    | project PrincipalId, AppRoleId1 = tostring(AppRoleId) 
) on PrincipalId 
| join kind=inner (EntraUsers) on $left.PrincipalId == $right.ObjectID 
| join kind=inner (AppRoles 
                   | mvexpand AppRoles 
                   | project AppRoleId=tostring(AppRoles.Id), RoleDisplayName=tostring(AppRoles.DisplayName) 
                  ) on $left.AppRoleId2 == $right.AppRoleId 
| project UserPrincipalName, DisplayName, RoleDisplayName, CreatedDateTime, PrincipalId, Change = "Added" 

Exemple : Différentes requêtes qui utilisent des révisions d’accès

Afficher l’achèvement de la révision d’accès et les informations de chronologie

Une fois les données chargées, utilisez les requêtes Kusto suivantes pour les examiner :

  • Quand le dernier cycle de révision d’accès a-t-il été terminé ? Combien de temps a-t-il fallu ?

    ReviewInstances
    | summarize LastCompletedDate = max(ReviewInstanceEndDateTime),  
                ReviewDuration = datetime_diff('minute', max(ReviewInstanceEndDateTime), min(ReviewInstanceStartDateTime))  
    
  • Le processus de révision d’accès est-il effectué à temps (par exemple, trimestriel) ?

    ReviewInstances 
    | extend ExpectedFrequency = "Quarterly" // Replace with the organization's frequency
    | summarize ReviewsCompleted = count(), LastReviewEndDate = max(ReviewInstanceEndDateTime)
    | extend CurrentDate = now(),  
             TimeSinceLastReview = datetime_diff('day', now(), LastReviewEndDate)
    | extend IsOnSchedule = iff(TimeSinceLastReview <= 90, "Yes", "No") // Assuming quarterly = 90 days
    

Afficher la participation et l’engagement dans la revue d’accès

  • Qui ont été les réviseurs affectés ?

    ReviewInstanceContactedReviewers
    | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName = DisplayName, ReviewerUserPrincipalName = UserPrincipalName, CreatedDateTime
    
  • Quels réviseurs ont activement participé et fourni des réponses ?

    ReviewInstanceDecisionItems
    | where ReviewedBy_DisplayName != "AAD Access Reviews"
    | where Decision in ("Approve", "Deny")
    | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName = ReviewedBy_DisplayName,
    ReviewerUserPrincipalName = ReviewedBy_UserPrincipalName, Decision, ReviewedDateTime
    | distinct AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName, ReviewerUserPrincipalName, Decision
    
  • Quel pourcentage de réviseurs a-t-il répondu à la demande de révision d’accès ?

    let TotalReviewers = ReviewInstanceContactedReviewers 
        | summarize Total = dcount(Id) by AccessReviewDefinitionId, AccessReviewInstanceId;  
    
    let RespondedReviewers = ReviewInstanceDecisionItems 
        | where ReviewedBy_DisplayName != "AAD Access Reviews"
        | where ReviewedBy_Id != "00000000-0000-0000-0000-000000000000"
        | where Decision in ("Approve", "Deny")
        | summarize Responded = dcount(ReviewedBy_Id) by AccessReviewDefinitionId, AccessReviewInstanceId;  
    
    TotalReviewers
    | join kind=leftouter RespondedReviewers on AccessReviewDefinitionId, AccessReviewInstanceId
    | extend Responded = coalesce(Responded, 0)  // Replace null with 0 for Responded
    | extend NotResponded = Total - Responded   // Calculate the number of nonresponders
    | extend ResponsePercentage = (Responded * 100.0) / Total  // Percentage of those who responded
    | extend NonResponsePercentage = (NotResponded * 100.0) / Total  // Percentage of those who didn't respond
    | project AccessReviewDefinitionId, AccessReviewInstanceId, Total, Responded, ResponsePercentage, NotResponded, NonResponsePercentage  
    
  • Quand chaque réviseur a-t-il effectué ses tâches ?

    ReviewInstanceDecisionItems 
    | where Decision in ("Approve", "Deny") 
    | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName = ReviewedBy_DisplayName, ReviewerUserPrincipalName = ReviewedBy_UserPrincipalName, ReviewedDateTime  
    
  • Quels réviseurs n’ont pas fait de décisions ?

    let AllReviewers = ReviewInstanceContactedReviewers 
        | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerId = Id, ReviewerUserPrincipalName = UserPrincipalName, ReviewerName = DisplayName;
    
    let ActiveReviewers = ReviewInstanceDecisionItems
        | where Decision in ("Approve", "Deny")
        | where ReviewedBy_DisplayName != "AAD Access Reviews"
        | where ReviewedBy_Id != "00000000-0000-0000-0000-000000000000"
        | summarize ActiveReviewers = make_set(ReviewedBy_Id) by AccessReviewDefinitionId, AccessReviewInstanceId;
    
    AllReviewers
    | extend ReviewerId = tostring(ReviewerId)  // Ensure ReviewerId is a string
    | join kind=leftanti (
        ActiveReviewers
        | mv-expand ActiveReviewers
        | extend ActiveReviewers = tostring(ActiveReviewers)  // Cast ActiveReviewers to a string
    ) on $left.ReviewerId == $right.ActiveReviewers
    | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerUserPrincipalName, ReviewerName
    
  • Quel pourcentage de commentateurs n'ont pas interagi ?

    let TotalReviewers = ReviewInstanceContactedReviewers 
        | summarize Total = dcount(Id) by AccessReviewDefinitionId, AccessReviewInstanceId;
    
    let RespondedReviewers = ReviewInstanceDecisionItems
        | where ReviewedBy_DisplayName != "AAD Access Reviews"
        | where ReviewedBy_Id != "00000000-0000-0000-0000-000000000000"
        | where Decision in ("Approve", "Deny")
        | summarize Responded = dcount(ReviewedBy_Id) by AccessReviewDefinitionId, AccessReviewInstanceId;
    
    TotalReviewers
    | join kind=leftouter RespondedReviewers on AccessReviewDefinitionId, AccessReviewInstanceId
    | extend Responded = coalesce(Responded, 0)  // Replace null with 0 for Responded
    | extend NotResponded = Total - Responded   // Calculate the number of nonresponders
    | extend ResponsePercentage = (Responded * 100.0) / Total  // Percentage of those who responded
    | extend NonResponsePercentage = (NotResponded * 100.0) / Total  // Percentage of those who didn't respond
    | project AccessReviewDefinitionId, AccessReviewInstanceId, Total, Responded, ResponsePercentage, NotResponded, NonResponsePercentage  
    
  • Les rappels ont-ils été déclenchés pour les réviseurs non répondants ou les décisions en attente ?

    // Step 1: Get the list of all reviewers
    let TotalReviewers = ReviewInstanceContactedReviewers 
        | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerId = Id, ReviewerUserPrincipalName = UserPrincipalName, ReviewerName = DisplayName;
    
    // Step 2: Get the list of reviewers who responded 
    let RespondedReviewers = ReviewInstanceDecisionItems
        | where ReviewedBy_DisplayName != "AAD Access Reviews"
        | where ReviewedBy_Id != "00000000-0000-0000-0000-000000000000"
        | where Decision in ("Approve", "Deny")
        | project AccessReviewDefinitionId, AccessReviewInstanceId, RespondedReviewerId = ReviewedBy_Id;
    
    // Step 3: Get the list of review instances
    let ReviewInstancesWithDetails = ReviewInstances
        | project AccessReviewDefinitionId = ReviewDefinitionId,  
                  AccessReviewInstanceId = ReviewInstanceId,  
                  RemindersSent = ReviewDefinitionSettings_ReminderNotificationsEnabled,  
                  StartDate = todatetime(ReviewInstanceStartDateTime),  
                  EndDate = todatetime(ReviewInstanceEndDateTime)
        | extend
                  ReminderSentDate = iif(RemindersSent, StartDate + (EndDate - StartDate) / 2, datetime(null));
    
    // Step 4: Identify nonresponsive reviewers and join with review instance details
    TotalReviewers
    | join kind=leftouter (ReviewInstancesWithDetails) on AccessReviewDefinitionId, AccessReviewInstanceId
    | join kind=leftanti RespondedReviewers on $left.ReviewerId == $right.RespondedReviewerId
    | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerUserPrincipalName, ReviewerName, RemindersSent, ReminderSentDate
    

Afficher les utilisateurs et les modifications d’accès résultant des révisions d’accès

  • Qui a perdu l’accès à des ressources spécifiques pendant la révision d’accès ?

    ReviewInstanceDecisionItems 
    | where Decision == "Deny" 
    | project User = Principal_DisplayName, Resource = Resource_DisplayName, Decision, Justification 
    
  • Les utilisateurs ont-ils été marqués en raison de l’inactivité ?

    ReviewInstanceDecisionItems
    | where Insights contains "inactive"
    | project User = Principal_DisplayName, Resource = Resource_DisplayName, Insights, Decision
    
  • Quelle est la date de suppression de l’accès et la raison de perdre l’accès ?

    ReviewInstanceDecisionItems
    | where Decision == "Deny"
    | project User = Principal_DisplayName, Resource=Resource_DisplayName, AccessRemovalDate = AppliedDateTime, Reason = Justification  
    
  • Quels utilisateurs n’ont pris aucune décision ?

    ReviewInstanceDecisionItems
    | where Decision == "NotReviewed"
    | project User = Principal_DisplayName, Resource=Resource_DisplayName
    
  • Quelles révisions n’avaient aucun réviseur ?

    ReviewInstances
    | join kind=leftanti (
        ReviewInstanceContactedReviewers
        | summarize by AccessReviewInstanceId
    ) on $left.ReviewInstanceId == $right.AccessReviewInstanceId  
    
  • Quelles révisions n’avaient aucun utilisateur ?

    ReviewInstances 
    | join kind=leftanti (
        ReviewInstanceDecisionItems
        | summarize by AccessReviewInstanceId
    ) on $left.ReviewInstanceId == $right.AccessReviewInstanceId
    

Résumer les décisions de révision d’accès

  • Quelles décisions les utilisateurs ont-ils prises : approuvées, refusées ou inchangées ?

    ReviewInstanceDecisionItems
    | summarize count() by Decision
    
  • Quel nombre d’utilisateurs ont été approuvés ou refusés l’accès ?

    ReviewInstanceDecisionItems
    | summarize ApprovedCount = countif(Decision == "Approve"), DeniedCount = countif(Decision == "Deny")
    
  • Des raisons d’approbation ont-elles été documentées ?

    ReviewInstanceDecisionItems
    | where Decision == "Approve" and isnotempty(Justification)
    | summarize count() by ReviewedBy_DisplayName
    

Confirmer la qualité de la révision d’accès et vérifier l’exhaustivité

  • Les révocations d’accès ont-elles été prises en compte pour les utilisateurs dormants ?

    ReviewInstanceDecisionItems
    | where Insights contains "inactive" and Decision == "Deny"
    | project User = Principal_DisplayName, Decision
    
  • Un accès n’a-t-il pas été correctement supprimé ?

    ReviewInstanceDecisionItems
    | where ApplyResult != "New" and ApplyResult != "AppliedSuccessfully"
    
  • Les réviseurs ont-ils documenté leurs décisions ?

    ReviewInstanceDecisionItems
    | where isnotempty(Justification)
    | summarize count() by ReviewedBy_DisplayName
    
  • Les commentaires ont-ils été capturés pour chaque utilisateur ?

    ReviewInstanceDecisionItems
    | where isnotempty(Justification)
    | project User = Principal_DisplayName, Resource = Resource_DisplayName, Comments = Justification
    

Configurer des importations en cours

Ce tutoriel illustre un processus unique d'extraction, de transformation et de chargement (ETL) pour importer un instantané unique dans Azure Data Explorer à des fins de création de rapports. Pour la création de rapports en cours ou pour comparer les modifications au fil du temps, vous pouvez automatiser le processus de remplissage d’Azure Data Explorer à partir de Microsoft Entra, afin que votre base de données continue d’avoir des données actuelles.

Vous pouvez utiliser Azure Automation, un service cloud Azure, pour héberger les scripts PowerShell dont vous avez besoin pour extraire des données à partir de l’ID Microsoft Entra et de la gouvernance des ID Microsoft Entra. Pour plus d’informations, consultez Automatiser les tâches de gouvernance des ID Microsoft Entra via Azure Automation et Microsoft Graph.

Vous pouvez également utiliser des fonctionnalités Azure ou des outils en ligne de commande tels que lightingest l’introduction de données et remplir une table existante. Pour plus d’informations, consultez Utiliser LightIngest pour ingérer des données dans Azure Data Explorer.

Par exemple, pour charger le fichier EntraAccessPackages.json dans le répertoire courant dans la table EntraAccessPackages en tant qu'utilisateur connecté, utilisez cette commande :

az login
LightIngest.exe "https://ingest-CLUSTERHOSTNAME;Fed=True" -database:"DATABASE" -table:EntraAccessPackages -sourcepath:"." -pattern:"EntraAccessPackages.json" -format:multijson -azcli:true

Création de rapports sur des données provenant d’autres sources

Vous pouvez également importer des données dans Azure Data Explorer à partir de sources au-delà de Microsoft Entra. Les scénarios de cette fonctionnalité sont les suivants :

  • Un administrateur souhaite afficher les événements dans le journal d’audit avec des détails supplémentaires sur les utilisateurs, les packages d’accès ou d’autres objets qui ne font pas partie de l’enregistrement d’audit lui-même.
  • Un administrateur souhaite afficher tous les utilisateurs ajoutés à une application à partir de l’ID Microsoft Entra et de leurs droits d’accès dans le propre référentiel de l’application, comme une base de données SQL.

Pour plus d’informations, consultez Créer des rapports personnalisés dans Azure Data Explorer à l’aide de données provenant d’autres sources.