Freigeben über


Lernprogramm: Erstellen von benutzerdefinierten Berichten im Azure-Daten-Explorer mithilfe von Daten aus Microsoft Entra

In diesem Lernprogramm erfahren Sie, wie Sie benutzerdefinierte Berichte im Azure-Daten-Explorer mithilfe von Daten von Microsoft Entra ID und Microsoft Entra ID Governance-Diensten erstellen.

Dieses Lernprogramm ergänzt Berichterstellungsoptionen wie Archivierung und Berichterstellung mit Azure Monitor und Berechtigungsverwaltung, die sich auf das Exportieren des Überwachungsprotokolls in Azure Monitor zur Aufbewahrung und Analyse konzentriert. Im Vergleich dazu bietet das Exportieren von Microsoft Entra ID- und Microsoft Entra ID Governance-Daten nach Azure Data Explorer Flexibilität beim Erstellen benutzerdefinierter Berichte zu Microsoft Entra-Objekten, einschließlich historischer und gelöschter Objekte.

Hier ist ein Video, das einen schnellen Überblick über Berichte zu den Daten der Microsoft Entra ID Governance mithilfe von Azure Data Explorer bietet.

Die Verwendung von Azure Data Explorer ermöglicht auch die Datenaggregation aus zusätzlichen Quellen mit massiver Skalierbarkeit, flexiblen Schemas und Aufbewahrungsrichtlinien. Azure Data Explorer ist besonders hilfreich, wenn Sie Benutzerzugriffsdaten für Jahre aufbewahren, Ad-hoc-Untersuchungen durchführen oder benutzerdefinierte Abfragen für Zugriffsdaten ausführen müssen.

Konzeptionelle Zeichnung mit Datenextraktion und Abfragen.

In diesem Lernprogramm wird veranschaulicht, wie Sie Konfiguration, Benutzer und Zugriffsrechte anzeigen, die aus Microsoft Entra exportiert werden, zusammen mit Daten, die aus anderen Quellen exportiert wurden, z. B. Anwendungen mit Zugriffsrechten in ihren eigenen SQL-Datenbanken. Anschließend können Sie in Azure Data Explorer die Kusto-Abfragesprache (KQL) verwenden, um benutzerdefinierte Berichte basierend auf den Anforderungen Ihrer Organisation zu erstellen.

In diesem Tutorial erfahren Sie:

  • Richten Sie azure Data Explorer in einem Azure-Abonnement ein, oder erstellen Sie einen kostenlosen Cluster.
  • Extrahieren Sie Daten aus der Microsoft Entra-ID mithilfe von PowerShell-Skripts und Microsoft Graph.
  • Erstellen Sie Tabellen, und importieren Sie Daten aus der Microsoft Entra-ID in Azure Data Explorer.
  • Extrahieren Sie Daten aus der Microsoft Entra ID Governance.
  • Erstellen Sie Tabellen, und importieren Sie Daten aus microsoft Entra ID Governance in Azure Data Explorer.
  • Erstellen Sie eine benutzerdefinierte Abfrage mithilfe von KQL.
  • Abfragedaten in Azure Monitor.

Am Ende dieses Tutorials können Sie angepasste Sichten der Zugriffsrechte und Benutzerberechtigungen entwickeln. Diese Ansichten umfassen mehrere Anwendungen über von Microsoft unterstützte Tools. Sie können auch Daten aus Nicht-Microsoft-Datenbanken oder -Anwendungen einbinden, um diese Zugriffsrechte und Berechtigungen zu melden.

Voraussetzungen

Wenn Sie mit Azure Data Explorer noch nicht fertig sind und die Szenarien kennen lernen möchten, die in diesem Lernprogramm gezeigt werden, können Sie einen kostenlosen Azure Data Explorer-Cluster abrufen. Für die produktionsgestützte Verwendung mit einer Vereinbarung auf Dienstebene für Azure Data Explorer benötigen Sie ein Azure-Abonnement, um einen vollständigen Azure Data Explorer-Cluster zu hosten.

Bestimmen Sie, welche Daten in Ihre Berichte aufgenommen werden sollen. Die Skripts in diesem Lernprogramm enthalten Beispiele für bestimmte Daten von Benutzern, Gruppen und Anwendungen von Microsoft Entra. Diese Beispiele veranschaulichen die Typen von Berichten, die Sie mit diesem Ansatz generieren können, aber Ihre spezifischen Berichtsanforderungen können variieren und unterschiedliche oder zusätzliche Daten erfordern. Sie können mit diesen Objekten beginnen und mit der Zeit weitere Arten von Microsoft Entra-Objekten hinzufügen.

  • In diesem Lernprogramm wird das Abrufen von Daten von Microsoft Entra als angemeldeter Benutzer veranschaulicht. Stellen Sie dazu sicher, dass Sie über die erforderlichen Rollenzuweisungen verfügen. Sie benötigen die Rollen mit den richtigen Berechtigungen zum Exportieren der Art von Microsoft Entra-Daten, mit denen Sie arbeiten möchten:

    • Benutzerdaten: globaler Administrator, Administrator für privilegierte Rolle, Benutzeradministrator
    • Gruppendaten: Globaler Administrator, Administrator privilegierter Rollen, Gruppenadministrator
    • Anwendungs- und App-Rollenzuweisungen: globaler Administrator, Administrator privilegierter Rollen, Anwendungsadministrator, Cloudanwendungsadministrator
  • Microsoft Graph PowerShell benötigt die Zustimmung zum Abrufen von Microsoft Entra-Objekten über Microsoft Graph. Die Beispiele in diesem Lernprogramm erfordern die delegierten User.Read.All, , Group.Read.All, Application.Read.Allund Directory.Read.All Berechtigungen. Wenn Sie planen, Daten mithilfe der Automatisierung ohne einen angemeldeten Benutzer abzurufen, stimmen Sie stattdessen den entsprechenden Anwendungsberechtigungen zu. Weitere Informationen finden Sie in der Microsoft Graph-Referenz zu Berechtigungen.

    Wenn Sie Microsoft Graph PowerShell noch nicht zu diesen Berechtigungen zugestimmt haben, müssen Sie ein Globaler Administrator sein, um diesen Zustimmungsvorgang auszuführen.

  • In diesem Lernprogramm werden keine benutzerdefinierten Sicherheitsattribute veranschaulicht. Standardmäßig enthalten globale Administratorrollen und weitere Administratorrollen keine Berechtigungen zum Lesen benutzerdefinierter Sicherheitsattribute von Microsoft Entra-Benutzern. Wenn Sie planen, benutzerdefinierte Sicherheitsattribute abzurufen, benötigen Sie möglicherweise mehr Rollen und Berechtigungen.

  • Stellen Sie auf dem Computer, auf dem Microsoft Graph PowerShell installiert ist, sicher, dass Sie Schreibzugriff auf das Dateisystemverzeichnis haben. In diesem Verzeichnis installieren Sie die erforderlichen Microsoft Graph PowerShell-Module und dort, wo die exportierten Microsoft Entra-Daten gespeichert werden.

  • Stellen Sie sicher, dass Sie über Berechtigungen zum Abrufen von Daten aus anderen Datenquellen verfügen, die über Microsoft Entra hinausgehen, wenn Sie diese Daten auch in Azure Data Explorer integrieren möchten.

Einrichten des Azure-Daten-Explorers

Wenn Sie azure Data Explorer noch nicht verwendet haben, müssen Sie ihn zuerst einrichten. Sie können einen kostenlosen Cluster ohne Azure-Abonnement oder Kreditkarte erstellen. Oder Sie können einen vollständigen Cluster erstellen, der ein Azure-Abonnement erfordert. Erste Schritte finden Sie in der Schnellstartanleitung: Erstellen eines Azure Data Explorer-Clusters und einer Datenbank.

Extrahieren von Microsoft Entra-ID-Daten mithilfe von PowerShell

In diesem Abschnitt installieren Sie Microsoft Graph PowerShell-Module. In PowerShell stellen Sie eine Verbindung mit Microsoft Graph her , um Microsoft Entra-ID-Daten zu extrahieren.

Wenn Ihre Organisation diese Module zum ersten Mal für dieses Szenario verwendet, müssen Sie über eine globale Administratorrolle verfügen, damit Microsoft Graph PowerShell die Zustimmung zur Verwendung in Ihrem Mandanten erteilen kann. Für nachfolgende Interaktionen können Rollen mit geringerem Berechtigungsumfang verwendet werden.

  1. Öffnen Sie PowerShell.

  2. Wenn Sie nicht bereits alle Microsoft Graph PowerShell-Module installiert haben, installieren Sie die erforderlichen Microsoft Graph-Module. Für diesen Abschnitt des Lernprogramms sind die folgenden Module erforderlich: Microsoft.Graph.Authentication, Microsoft.Graph.Users, , Microsoft.Graph.Groups, Microsoft.Graph.Applicationsund Microsoft.Graph.DirectoryObjects. Wenn Sie diese Module bereits installiert haben, überspringen Sie diesen Schritt.

       $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. Importieren Sie die Module in die aktuelle PowerShell-Sitzung:

      $modules = @('Microsoft.Graph.Users', 'Microsoft.Graph.Groups', 'Microsoft.Graph.Applications', 'Microsoft.Graph.DirectoryObjects') 
      foreach ($module in $modules) { 
      Import-Module -Name $module 
      } 
    
  4. Stellen Sie eine Verbindung mit Microsoft Graph her. In diesem Abschnitt des Tutorials wird das Lesen von Benutzern, Gruppen und Anwendungen veranschaulicht. Daher sind die Berechtigungsspektren User.Read.All, Group.Read.All, Application.Read.All und Directory.Read.All erforderlich. Weitere Informationen zu Berechtigungen finden Sie in der Microsoft Graph-Berechtigungsübersicht.

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

    Dieser Befehl fordert Sie dazu auf, sich mit Ihren Microsoft Entra-Anmeldeinformationen anzumelden. Nachdem Sie sich angemeldet haben, müssen Sie möglicherweise den erforderlichen Berechtigungen zustimmen, wenn sie zum ersten Mal eine Verbindung herstellen oder neue Berechtigungen erforderlich sind.

PowerShell-Abfragen zum Extrahieren von Microsoft Entra-ID-Daten für benutzerdefinierte Berichte

Die folgenden Abfragen extrahieren Microsoft Entra-ID-Daten aus Microsoft Graph mithilfe von PowerShell und exportieren die Daten in JSON-Dateien. Sie importieren diese Dateien in Azure Data Explorer in einem späteren Abschnitt dieses Lernprogramms.

Szenarien zum Generieren von Berichten mit dieser Art von Daten umfassen:

  • Ein Auditor möchte einen Bericht anzeigen, in dem die Gruppenmitglieder für 10 Gruppen aufgelistet sind, die von der Abteilung der Mitglieder organisiert sind.
  • Ein Auditor möchte einen Bericht aller Benutzer anzeigen, die Zugriff auf eine Anwendung zwischen zwei Datumsangaben hatten.

Sie können auch Daten aus Quellen, die über Microsoft Entra hinausgehen, in Azure-Daten-Explorer übertragen. Ein Szenario für diese Funktion kann sein:

  • Ein Administrator möchte alle Benutzer anzeigen, die aus Microsoft Entra ID zu einer Anwendung hinzugefügt wurden, sowie deren Zugriffsrechte im Repository der Anwendung, wie z. B. einer SQL-Datenbank.

Diese Arten von Berichten sind nicht in die Microsoft Entra-ID integriert. Sie können diese Berichte jedoch selbst erstellen, indem Sie Daten aus der Microsoft Entra-ID extrahieren und Daten mithilfe benutzerdefinierter Abfragen im Azure-Daten-Explorer kombinieren. In diesem Lernprogramm wird dieser Vorgang später im Artikel "Einbinden von Daten aus anderen Quellen " behandelt.

In diesem Lernprogramm extrahieren Sie Microsoft Entra ID-Daten aus diesen Bereichen:

  • Benutzerinformationen wie Anzeigename, UPN und Auftragsdetails
  • Gruppeninformationen, einschließlich ihrer Mitgliedschaften
  • Anwendungen und Zuweisungen zu Anwendungsrollen

Mit diesem Datensatz können Sie eine umfassende Reihe von Abfragen darüber durchführen, wer zu einem bestimmten Zeitpunkt Zugriff auf eine Anwendung erhalten hat, einschließlich ihrer Anwendungsrolleninformationen und des zugehörigen Zeitrahmens. Denken Sie daran, dass es sich hierbei um Beispielabfragen handelt, und Ihre Daten und spezifischen Anforderungen können von den hier gezeigten Angaben abweichen.

Hinweis

Größere Mandanten könnten auf Drosselung und 429-Fehler stoßen, die vom Microsoft Graph-Modul behandelt werden. Der Azure-Daten-Explorer schränkt möglicherweise auch die Dateigrößen des Dateiuploads ein.

In diesen PowerShell-Skripts exportieren Sie ausgewählte Eigenschaften aus den Microsoft Entra-Objekten in JSON-Dateien. Die Daten aus diesen exportierten Eigenschaften werden verwendet, um in Azure Data Explorer benutzerdefinierte Berichte zu generieren.

Die folgenden spezifischen Eigenschaften sind in diesen Beispielen enthalten, da wir diese Daten verwenden, um die Typen von Berichten zu veranschaulichen, die Sie im Azure-Daten-Explorer erstellen können. Da ihre spezifischen Berichterstellungsanforderungen wahrscheinlich von der Darstellung dieses Lernprogramms abweichen, sollten Sie die spezifischen Eigenschaften in diese Skripts einschließen, die Sie für die Anzeige in Ihren Berichten interessieren. Sie können jedoch demselben Muster folgen, das angezeigt wird, um ihre Skripts zu erstellen.

Auswählen des Datums der Momentaufnahme

Ein hartcodiertes Momentaufnahmedatum identifiziert die Daten in der JSON-Datei mit einem bestimmten Datum. Sie können es verwenden, um ähnliche Datasets im Laufe der Zeit im Azure-Daten-Explorer nachzuverfolgen. Mithilfe des Momentaufnahmedatums können auch Änderungen der Daten zwischen zwei Momentaufnahmen mit jeweils unterschiedlichem Datum verglichen werden.

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

Abrufen von Microsoft Entra-Benutzerdaten

Dieses Skript exportiert ausgewählte Eigenschaften aus dem Microsoft Entra-Benutzerobjekt in eine JSON-Datei. Sie importieren diese Datei und zusätzliche Daten aus anderen JSON-Dateien in Azure Data Explorer in einem späteren Abschnitt dieses Lernprogramms.

  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 

Abrufen von Gruppendaten

Generieren Sie eine JSON-Datei mit Gruppennamen und IDs, die in Azure Data Explorer zum Erstellen benutzerdefinierter Sichten verwendet werden. Das Beispiel enthält alle Gruppen, Sie können aber bei Bedarf zusätzliche Filterung einschließen. Wenn Sie filtern, um nur bestimmte Gruppen einzuschließen, sollten Sie logik in Ihr Skript einschließen, um nach geschachtelten Gruppen zu suchen.

    # 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" 

Abrufen von Gruppenmitgliedschaftsdaten

Generieren Sie eine JSON-Datei mit Gruppenmitgliedschaft, die zum Erstellen benutzerdefinierter Ansichten im Azure-Daten-Explorer verwendet wird. Das Beispiel enthält alle Gruppen, Sie können aber bei Bedarf zusätzliche Filterung einschließen.

    # 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" 

Abrufen von Anwendungs- und Dienstprinzipaldaten

Generieren Sie eine JSON-Datei mit allen Anwendungen und den entsprechenden Dienstprinzipalen im Mandanten. Sie importieren diese Daten in Azure Data Explorer in einen späteren Abschnitt dieses Lernprogramms, sodass Sie benutzerdefinierte Berichte für Anwendungen basierend auf diesen Daten generieren können.

    # 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" 

App-Rollendaten abrufen

Generieren Sie eine JSON-Datei aller App-Rollen für Unternehmens-Apps in Microsoft Entra. Nachdem Sie diese Daten in Azure Data Explorer importiert haben, verwenden Sie sie, um Berichte zu generieren, die App-Rollenzuweisungen für Benutzer umfassen.

    # 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' 

Abrufen von App-Rollenzuweisungsdaten

Generieren Sie eine JSON-Datei aller App-Rollenzuweisungen von Benutzern im Mandanten:

    $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" 

Erstellen von Tabellen und Importieren von JSON-Dateien mit Daten aus der Microsoft Entra-ID in Azure Data Explorer

In diesem Abschnitt importieren Sie die neu erstellten JSON-Dateien für die Microsoft Entra ID-Dienste als Tabellen im Azure-Daten-Explorer zur weiteren Analyse. Beim ersten Import über die Azure Data Explorer-Web-UI erstellen Sie die Tabellen basierend auf Schemas, die die Web-UI aus jeder JSON-Datei vorschlägt.

  1. Melden Sie sich bei der Azure Data Explorer-Webbenutzeroberfläche an.

  2. Wechseln Sie zu der Datenbank, die Sie in Ihrem Azure Data Explorer-Cluster oder einem kostenlosen Cluster zuvor in diesem Lernprogramm eingerichtet haben.

  3. Wählen Sie im linken Menü "Abfrage" aus.

  4. Führen Sie die folgenden Schritte für jede exportierte JSON-Datei aus, um Ihre exportierten Daten als neue Tabelle in diese Azure Data Explorer-Datenbank zu integrieren:

    1. Klicken Sie mit der rechten Maustaste auf den Namen der Datenbank, in der Sie die Daten aufnehmen möchten. Wählen Sie dann " Daten abrufen" aus.

      Screenshot einer Abfrageregisterkarte mit einem Kontextmenü für eine Datenbank und dem Befehl zum Hervorheben von Daten.

    2. Wählen Sie die Datenquelle aus der verfügbaren Liste aus. In diesem Lernprogramm nehmen Sie Daten aus einer lokalen Datei ein, und wählen Sie daher "Lokale Datei" aus.

    3. Wählen Sie +Neue Tabelle aus, und geben Sie einen Tabellennamen ein, basierend auf dem Namen der JSON-Datei, die Sie importieren. Wenn Sie z. B. EntraUsers.jsonimportieren, nennen Sie die Tabelle EntraUsers. Nach dem ersten Import ist die Tabelle bereits vorhanden, und Sie können diese als Zieltabelle für einen nachfolgenden Import auswählen.

    4. Wählen Sie "Nach Dateien suchen", wählen Sie die JSON-Datei und dann "Weiter" aus.

    5. Der Azure-Daten-Explorer erkennt das Schema automatisch und bietet eine Vorschau auf der Registerkarte "Prüfen ". Wählen Sie "Fertig stellen" aus, um die Tabelle zu erstellen und die Daten aus dieser Datei zu importieren. Nachdem die Daten aufgenommen wurden, wählen Sie "Schließen" aus.

    6. Wiederholen Sie die vorherigen Schritte für jede der JSON-Dateien, die Sie im vorherigen Abschnitt generiert haben.

Am Ende dieser Schritte haben Sie die Tabellen EntraUsers, EntraGroups, , EntraGroupMemberships, Applications, und AppRolesAppRoleAssignments in der Datenbank.

Extrahieren von Microsoft Entra ID Governance-Daten mithilfe von PowerShell

In diesem Abschnitt verwenden Sie PowerShell, um Daten aus Microsoft Entra ID Governance-Diensten zu extrahieren. Wenn Sie nicht über Microsoft Entra ID Governance, Microsoft Entra ID P2 oder Microsoft Entra Suite verfügen, fahren Sie im Abschnitt Verwenden des Azure-Daten-Explorers zum Erstellen benutzerdefinierter Berichte fort.

Für die folgenden Schritte müssen Sie möglicherweise Microsoft Graph PowerShell-Module installieren , um Microsoft Entra ID Governance-Daten zu extrahieren. Wenn Ihre Organisation diese Module zum ersten Mal für dieses Szenario verwendet, müssen Sie über eine globale Administratorrolle verfügen, damit Microsoft Graph PowerShell die Zustimmung zur Verwendung in Ihrem Mandanten erteilen kann. Für nachfolgende Interaktionen können Rollen mit geringerem Berechtigungsumfang verwendet werden.

  1. Öffnen Sie PowerShell.

  2. Wenn Sie nicht bereits alle Microsoft Graph PowerShell-Module installiert haben, installieren Sie die erforderlichen Microsoft Graph-Module. Das folgende Modul ist für diesen Abschnitt des Lernprogramms erforderlich: Microsoft.Graph.Identity.Governance. Wenn Sie die Module bereits installiert haben, fahren Sie mit dem nächsten Schritt fort.

       $modules = @('Microsoft.Graph.Identity.Governance')
       foreach ($module in $modules) {
       Install-Module -Name $module -Scope CurrentUser -AllowClobber -Force
       }
    
  3. Importieren Sie die Module in die aktuelle PowerShell-Sitzung:

      $modules = @('Microsoft.Graph.Identity.Governance')
      foreach ($module in $modules) {
      Import-Module -Name $module
      } 
    
  4. Stellen Sie eine Verbindung mit Microsoft Graph her. In diesem Abschnitt des Lernprogramms wird das Abrufen von Daten aus der Berechtigungsverwaltung und Zugriffsprüfungen veranschaulicht. Daher sind die Berechtigungsbereiche AccessReview.Read.All und EntitlementManagement.Read.All erforderlich. Aktualisieren Sie für andere Berichtsanwendungsfälle, z. B. für Privileged Identity Management (PIM) oder Lebenszyklusworkflows, den Scopes Parameter mit den erforderlichen Berechtigungen. Weitere Informationen zu Berechtigungen finden Sie in der Microsoft Graph-Berechtigungsübersicht.

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

    Dieser Befehl fordert Sie dazu auf, sich mit Ihren Microsoft Entra-Anmeldeinformationen anzumelden. Nachdem Sie sich angemeldet haben, müssen Sie möglicherweise den erforderlichen Berechtigungen zustimmen, wenn sie zum ersten Mal eine Verbindung herstellen oder neue Berechtigungen erforderlich sind.

PowerShell-Abfragen zum Extrahieren von Microsoft Entra ID Governance-Daten für benutzerdefinierte Berichte

Die folgenden Abfragen extrahieren Microsoft Entra ID Governance-Daten aus Microsoft Graph mithilfe von PowerShell und exportieren die Daten in JSON-Dateien. Sie importieren diese Dateien in Azure Data Explorer in einem späteren Abschnitt dieses Lernprogramms.

Szenarien zum Generieren von Berichten mit dieser Art von Daten umfassen:

  • Berichterstellung über historische Zugriffsüberprüfungen.
  • Berichterstellung zu Zuweisungen durch die Berechtigungsverwaltung.

Abrufen von Zeitplandefinitionsdaten für Zugriffsüberprüfungen

Generieren Sie eine JSON-Datei mit Zugriffsüberprüfungsdefinitionsnamen und IDs, die zum Erstellen benutzerdefinierter Ansichten in Azure Data Explorer verwendet werden. Das Beispiel enthält alle Zugriffsüberprüfungen, sie können aber bei Bedarf zusätzliche Filterung einschließen. Weitere Informationen finden Sie unter Verwenden des Filterabfrageparameters.

   $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"

Abrufen von Instanzdaten für Zugriffsüberprüfungen

Um alle Zugriffsüberprüfungsdefinitionen, Instanzen und Entscheidungen mithilfe von PowerShell in ein strukturiertes Ordnerformat zu exportieren, können Sie die Microsoft Graph-API verwenden. Mit diesem Ansatz wird sichergestellt, dass Ihre Daten hierarchisch organisiert und an der angegebenen Ordnerstruktur ausgerichtet sind.

Bevor Sie beginnen, beachten Sie die folgenden Punkte:

  • Stellen Sie sicher, dass Sie über die erforderlichen Berechtigungen für den Zugriff auf Überprüfungsdaten in Microsoft Graph verfügen.
  • Je nach Datenvolumen kann die Ausführungszeit des Skripts variieren. Überwachen Sie den Prozess, und passen Sie die Parameter nach Bedarf an.

So rufen Sie die Instanzdaten ab:

  1. Laden Sie das Export_Access_Reviews.ps1 Skript herunter, und speichern Sie es lokal.

  2. Heben Sie im Datei-Explorer die Blockierung des Skripts auf, damit Sie es in PowerShell ausführen können.

  3. Führen Sie den folgenden Befehl aus. Die Ausgabe platziert alle Daten in drei Unterordner: ReviewInstances, , ReviewInstanceDecisionItemsund ReviewInstanceContactedReviewers.

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

Abrufen von Zugriffspaketdaten für die Berechtigungsverwaltung

Generieren Sie eine JSON-Datei mit Zugriffspaketnamen und IDs, die in Azure Data Explorer zum Erstellen benutzerdefinierter Sichten verwendet werden. Das Beispiel enthält alle Zugriffspakete, sie können aber bei Bedarf zusätzliche Filterung einschließen.

   $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"

Zugriffspaket-Zuweisungsdaten für die Berechtigungsverwaltung abrufen

Generieren Sie eine JSON-Datei mit Zuweisungen für Zugriffspakete, die in Azure Data Explorer zum Erstellen benutzerdefinierter Sichten verwendet werden. Die Stichprobe umfasst alle übermittelten Zuweisungen, Sie können jedoch bei Bedarf zusätzliche Filter anwenden.

   $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"

Erstellen von Tabellen und Importieren von JSON-Dateien mit Daten aus microsoft Entra ID Governance in Azure Data Explorer

In diesem Abschnitt importieren Sie die neu erstellten JSON-Dateien für die Microsoft Entra ID Governance-Dienste in Azure Data Explorer zur weiteren Analyse. Diese Dateien verknüpfen die Daten, die Sie bereits für die Microsoft Entra ID-Dienste importiert haben. Beim ersten Import über die Azure Data Explorer-Web-UI erstellen Sie Tabellen basierend auf Schemas, die die Web-UI aus jeder JSON-Datei vorschlägt.

  1. Melden Sie sich bei der Azure Data Explorer-Webbenutzeroberfläche an.

  2. Wechseln Sie in Ihrem Azure Data Explorer-Cluster oder einem kostenlosen Cluster zu der Datenbank, die Ihre Microsoft Entra-ID-Daten enthält.

  3. Wählen Sie im linken Menü "Abfrage" aus.

  4. Führen Sie die folgenden Schritte für jede exportierte JSON-Datei aus, um Ihre exportierten Daten als neue Tabelle in diese Azure Data Explorer-Datenbank zu integrieren:

    1. Klicken Sie mit der rechten Maustaste auf den Datenbanknamen der Datenbank, in der Sie die Daten aufnehmen möchten. Wählen Sie dann " Daten abrufen" aus.

      Screenshot einer Abfrageregisterkarte mit einem Kontextmenü für eine Datenbank und dem Befehl zum Hervorheben von Daten.

    2. Wählen Sie die Datenquelle aus der verfügbaren Liste aus. In diesem Lernprogramm nehmen Sie Daten aus einer lokalen Datei ein, und wählen Sie daher "Lokale Datei" aus.

    3. Wählen Sie +Neue Tabelle aus, und geben Sie einen Tabellennamen ein, basierend auf dem Namen der JSON-Datei, die Sie importieren. Nach dem ersten Import ist die Tabelle bereits vorhanden, und Sie können diese als Zieltabelle für einen nachfolgenden Import auswählen.

    4. Wählen Sie "Nach Dateien suchen", wählen Sie die JSON-Datei und dann "Weiter" aus.

    5. Der Azure-Daten-Explorer erkennt das Schema automatisch und bietet eine Vorschau auf der Registerkarte "Prüfen ". Wählen Sie "Fertig stellen" aus, um die Tabelle zu erstellen und die Daten aus dieser Datei zu importieren. Nachdem die Daten aufgenommen wurden, wählen Sie "Schließen" aus.

    6. Wiederholen Sie die vorstehenden Schritte für jede der JSON-Dateien, die Sie im vorherigen Abschnitt generiert haben, für jeden ordner.

    7. Wenn es viele Dateien in einem Ordner gibt, können Sie lightingest den Rest importieren, nachdem die Tabelle erstellt wurde.

Am Ende dieser Schritte verfügen Sie über die Tabellen EntraAccessReviewDefinitions, , , EntraAccessPackages, EntraAccessPackageAssignments, und ReviewInstancesReviewInstanceDecisionItems in der Datenbank zusätzlich zu den Tabellen, die Sie zuvor erstellt ReviewInstanceContactedReviewershaben.

Verwenden des Azure-Daten-Explorers zum Erstellen benutzerdefinierter Berichte

Nachdem die Daten jetzt im Azure-Daten-Explorer verfügbar sind, können Sie mit dem Erstellen benutzerdefinierter Berichte basierend auf Ihren Geschäftsanforderungen beginnen:

  1. Melden Sie sich bei der Azure Data Explorer-Webbenutzeroberfläche an.

  2. Wählen Sie im linken Menü "Abfrage" aus.

Die folgenden Abfragen enthalten Beispiele für allgemeine Berichte. Sie können diese Berichte aber an Ihre Anforderungen anpassen und zusätzliche Berichte erstellen.

Sie können Ihre Berichte auch in Excel anzeigen, indem Sie die Registerkarte Exportieren und dann In Excelöffnen auswählen.

Beispiel: Generieren von App-Rollenzuweisungen für direkte und Gruppenzuweisungen für ein bestimmtes Momentaufnahmedatum

Dieser Bericht bietet eine Übersicht darüber, wer wann welchen Zugriff auf die Ziel-App hatte. Sie können es für Sicherheitsprüfungen, Complianceüberprüfungen und das Verständnis von Zugriffsmustern innerhalb der Organisation verwenden.

Die folgende Abfrage zielt auf eine bestimmte Anwendung innerhalb der Microsoft Entra-ID ab und analysiert die Rollenzuweisungen ab einem bestimmten Datum. Die Abfrage ruft sowohl direkte als auch gruppenbasierte Rollenzuweisungen ab. Sie führt diese Daten mit Benutzerdetails aus der EntraUsers Tabelle und Rolleninformationen aus der AppRoles Tabelle zusammen. Setzen Sie im Abfragebefehl targetSnapshotDate auf den Wert snapshotDate, den Sie beim Laden der Daten verwendet haben.

/// 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 

Beispiel: Erstellen eines grundlegenden Prüfberichts mit Microsoft Entra-Daten, der anzeigt, wer Zugriff auf eine App zwischen zwei Datumsangaben hatte

Dieser Bericht zeigt auf, wer über welchen Zugriff auf die Ziel-App zwischen zwei Zeitpunkten verfügt. Sie können es für Sicherheitsprüfungen, Complianceüberprüfungen und das Verständnis von Zugriffsmustern innerhalb der Organisation verwenden.

Die folgende Abfrage zielt auf eine bestimmte Anwendung innerhalb der Microsoft Entra-ID ab und analysiert die Rollenzuweisungen zwischen zwei Datumsangaben. Die Abfrage ruft direkte Rollenzuweisungen aus der Tabelle AppRoleAssignments ab und führt diese Daten mit Benutzerdetails aus der Tabelle EntraUsers und Rolleninformationen aus der Tabelle AppRoles zusammen.

// 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() 

Beispiel: Benutzer anzeigen, die einer App zwischen zwei Stichtagen hinzugefügt wurden

Diese Berichte bieten einen Einblick, welche Benutzer innerhalb eines bestimmten Zeitraums eine Rollenverteilung in der App für die Zielanwendung erhalten haben. Sie können diese Berichte verwenden, um Änderungen im App-Zugriff im Laufe der Zeit nachzuverfolgen.

Diese Abfrage zielt auf eine bestimmte Anwendung innerhalb von Microsoft Entra ID ab und nimmt Änderungen an den Rollenzuweisungen zwischen Start- und Enddatum vor.

// 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" 

Beispiel: Verschiedene Abfragen, die Zugriffsüberprüfungen verwenden

Anzeigen von Abschluss- und Zeitplaninformationen der Zugriffsüberprüfung.

Nachdem die Daten hochgeladen wurden, verwenden Sie die folgenden Kusto-Abfragen, um sie zu überprüfen:

  • Wann wurde der letzte Zugriffsüberprüfungszyklus abgeschlossen? Wie lange dauerte es?

    ReviewInstances
    | summarize LastCompletedDate = max(ReviewInstanceEndDateTime),  
                ReviewDuration = datetime_diff('minute', max(ReviewInstanceEndDateTime), min(ReviewInstanceStartDateTime))  
    
  • Wird der Zugriffsprüfungsprozess rechtzeitig durchgeführt (z. B. vierteljährlich)?

    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
    

Teilnahme und Engagement bei der Zugriffsüberprüfung anzeigen

  • Wer waren die zugewiesenen Prüfer?

    ReviewInstanceContactedReviewers
    | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName = DisplayName, ReviewerUserPrincipalName = UserPrincipalName, CreatedDateTime
    
  • Welche Prüfer nahmen aktiv teil und lieferten Antworten?

    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
    
  • Welcher Prozentsatz der Prüfer hat auf die Zugriffsüberprüfungsanforderung geantwortet?

    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  
    
  • Wann hat jeder Prüfer seine Aufgaben abgeschlossen?

    ReviewInstanceDecisionItems 
    | where Decision in ("Approve", "Deny") 
    | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName = ReviewedBy_DisplayName, ReviewerUserPrincipalName = ReviewedBy_UserPrincipalName, ReviewedDateTime  
    
  • Welche Prüfer haben keine Entscheidungen getroffen?

    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
    
  • Welcher Prozentsatz der Prüfer interagiert nicht?

    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  
    
  • Wurden Erinnerungen für nicht reagierende Prüfer oder ausstehende Entscheidungen ausgelöst?

    // 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
    

Anzeigen von Benutzern und Zugriffsänderungen, die aus Zugriffsüberprüfungen resultieren

  • Wer hat während der Zugriffsüberprüfung zugriff auf bestimmte Ressourcen verloren?

    ReviewInstanceDecisionItems 
    | where Decision == "Deny" 
    | project User = Principal_DisplayName, Resource = Resource_DisplayName, Decision, Justification 
    
  • Wurden Benutzer aufgrund von Inaktivität gekennzeichnet?

    ReviewInstanceDecisionItems
    | where Insights contains "inactive"
    | project User = Principal_DisplayName, Resource = Resource_DisplayName, Insights, Decision
    
  • Was war das Datum der Zugriffsentfernung und der Grund für den Verlust des Zugriffs?

    ReviewInstanceDecisionItems
    | where Decision == "Deny"
    | project User = Principal_DisplayName, Resource=Resource_DisplayName, AccessRemovalDate = AppliedDateTime, Reason = Justification  
    
  • Welche Benutzer haben keine Entscheidungen getroffen?

    ReviewInstanceDecisionItems
    | where Decision == "NotReviewed"
    | project User = Principal_DisplayName, Resource=Resource_DisplayName
    
  • Welche Rezensionen hatten keine Rezensenten?

    ReviewInstances
    | join kind=leftanti (
        ReviewInstanceContactedReviewers
        | summarize by AccessReviewInstanceId
    ) on $left.ReviewInstanceId == $right.AccessReviewInstanceId  
    
  • Welche Rezensionen hatten keine Benutzer?

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

Zusammenfassen von Zugriffsüberprüfungsentscheidungen

  • Welche Entscheidungen hat der Benutzer getroffen: genehmigt, verweigert oder unverändert?

    ReviewInstanceDecisionItems
    | summarize count() by Decision
    
  • Welche Anzahl von Benutzern wurde genehmigt oder verweigert?

    ReviewInstanceDecisionItems
    | summarize ApprovedCount = countif(Decision == "Approve"), DeniedCount = countif(Decision == "Deny")
    
  • Wurden Genehmigungsgründe dokumentiert?

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

Bestätigen Sie die Qualität der Zugriffsüberprüfung und stellen Sie die Vollständigkeit sicher.

  • Wurden Zugriffssperren für ruhende Benutzer in Betracht gezogen?

    ReviewInstanceDecisionItems
    | where Insights contains "inactive" and Decision == "Deny"
    | project User = Principal_DisplayName, Decision
    
  • Wurde irgendein Zugriff nicht ordnungsgemäß entfernt?

    ReviewInstanceDecisionItems
    | where ApplyResult != "New" and ApplyResult != "AppliedSuccessfully"
    
  • Haben Prüfer ihre Entscheidungen dokumentiert?

    ReviewInstanceDecisionItems
    | where isnotempty(Justification)
    | summarize count() by ReviewedBy_DisplayName
    
  • Wurden Kommentare für jeden Benutzer erfasst?

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

Einrichten laufender Importe

In diesem Tutorial wird ein einmaliger Prozess zur Datenextraktion, -transformation und -ladung (ETL) veranschaulicht, um Azure Data Explorer mit einer einzelnen Momentaufnahme für Berichtszwecke zu befüllen. Für laufende Berichte oder Vergleiche der Änderungen im Laufe der Zeit können Sie den Prozess der Auffüllung von Azure Data Explorer aus Microsoft Entra automatisieren, damit Ihre Datenbank weiterhin aktuelle Daten enthält.

Sie können Azure Automation, einen Azure-Clouddienst, verwenden, um die PowerShell-Skripts zu hosten, die Sie zum Extrahieren von Daten aus Microsoft Entra ID und Microsoft Entra ID Governance benötigen. Weitere Informationen finden Sie unter Automatisieren von Microsoft Entra ID Governance-Aufgaben über Azure Automation und Microsoft Graph.

Sie können auch Azure-Features oder Befehlszeilentools wie lightingest verwenden, um Daten einzubinden und eine vorhandene Tabelle aufzufüllen. Weitere Informationen finden Sie unter Verwenden von LightIngest zum Erfassen von Daten in Azure Data Explorer.

Wenn Sie beispielsweise die EntraAccessPackages.json Datei im aktuellen Verzeichnis als aktuell angemeldeten Benutzer in die EntraAccessPackages Tabelle laden möchten, verwenden Sie diesen Befehl:

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

Berichterstellung zu Daten aus weiteren Quellen

Sie können auch Daten aus Quellen, die über Microsoft Entra hinausgehen, in Azure-Daten-Explorer übertragen. Das Szenario für diese Funktion umfasst:

  • Ein Administrator möchte Ereignisse im Überwachungsprotokoll mit zusätzlichen Details zu Benutzern, Zugriffspaketen oder anderen Objekten anzeigen, die nicht Teil des Überwachungsdatensatzes selbst sind.
  • Ein Administrator möchte alle Benutzer anzeigen, die aus Microsoft Entra ID zu einer Anwendung hinzugefügt wurden, sowie deren Zugriffsrechte im Repository der Anwendung, wie z. B. einer SQL-Datenbank.

Weitere Informationen finden Sie unter Erstellen von benutzerdefinierten Berichten im Azure-Daten-Explorer mithilfe von Daten aus anderen Quellen.