Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här självstudien får du lära dig hur du skapar anpassade rapporter i Azure Data Explorer med hjälp av data från Microsoft Entra ID och Microsoft Entra ID Governance Services.
Den här handledningen kompletterar rapporteringsalternativ som arkivering och rapportering med Azure Monitor och behörighetshantering, som fokuserar på att exportera granskningsloggen till Azure Monitor för att spara och analysera. Som jämförelse ger export av Microsoft Entra-ID och Microsoft Entra ID-styrningsdata till Azure Data Explorer flexibilitet för att skapa anpassade rapporter om Microsoft Entra-objekt, inklusive historiska och borttagna objekt.
Här är en video som ger en snabb översikt över rapportering om Microsoft Entra ID-styrningsdata med hjälp av Azure Data Explorer.
Användning av Azure Data Explorer möjliggör även dataaggregering från ytterligare källor, med massiv skalbarhet, flexibla scheman och kvarhållningsprinciper. Azure Data Explorer är särskilt användbart när du behöver behålla användaråtkomstdata i flera år, utföra ad hoc-undersökningar eller köra anpassade frågor om åtkomstdata.
Den här självstudien visar hur du visar konfigurations-, användar- och åtkomsträttigheter som exporteras från Microsoft Entra tillsammans med data som exporteras från andra källor, till exempel program med åtkomsträttigheter i sina egna SQL-databaser. Du kan sedan använda KQL (Kusto Query Language) i Azure Data Explorer för att skapa anpassade rapporter baserat på organisationens krav.
I den här handledningen kommer du att:
- Konfigurera Azure Data Explorer i en Azure-prenumeration eller skapa ett kostnadsfritt kluster.
- Extrahera data från Microsoft Entra-ID med hjälp av PowerShell-skript och Microsoft Graph.
- Skapa tabeller och importera data från Microsoft Entra-ID till Azure Data Explorer.
- Extrahera data från Microsoft Entra ID Governance.
- Skapa tabeller och importera data från Microsoft Entra ID-styrning till Azure Data Explorer.
- Skapa en anpassad fråga med hjälp av KQL.
- Fråga efter data i Azure Monitor.
I slutet av den här självstudien kommer du att kunna utveckla anpassade vyer av användarnas åtkomsträttigheter och behörigheter. Dessa vyer omfattar flera applikationer med Microsoft-stödda verktyg. Du kan också ta in data från databaser eller program som inte kommer från Microsoft för att rapportera om dessa åtkomsträttigheter och behörigheter.
Förutsättningar
Om du är ny på Azure Data Explorer och vill lära dig de scenarier som visas i den här handledningen kan du skaffa ett kostnadsfritt Azure Data Explorer-kluster. För produktion som stöds med ett serviceavtal för Azure Data Explorer behöver du en Azure-prenumeration som värd för ett fullständigt Azure Data Explorer-kluster.
Ta reda på vilka data du vill inkludera i dina rapporter. Skripten i den här självstudien innehåller exempel med specifika data från användare, grupper och program från Microsoft Entra. De här exemplen illustrerar de typer av rapporter som du kan generera med den här metoden, men dina specifika rapporteringsbehov kan variera och kräva olika eller ytterligare data. Du kan börja med dessa objekt och ta in fler typer av Microsoft Entra-objekt över tid.
Den här handledningen illustrerar hur du hämtar data från Microsoft Entra som inloggad användare. Det gör du genom att se till att du har de rolltilldelningar som krävs. Du behöver rollerna med rätt behörighet för att exportera den typ av Microsoft Entra-data som du vill arbeta med:
- Användardata: Global administratör, privilegierad rolladministratör, användaradministratör
- Gruppdata: Global administratör, Privilegierad rolladministratör, Gruppadministratör
- Program- och approlltilldelningar: Global administratör, privilegierad rolladministratör, programadministratör, molnprogramadministratör
Microsoft Graph PowerShell behöver medgivande för att hämta Microsoft Entra-objekt via Microsoft Graph. Exemplen i den här självstudien kräver de delegerade behörigheterna
User.Read.All
,Group.Read.All
,Application.Read.All
ochDirectory.Read.All
. Om du planerar att hämta data med hjälp av automatisering utan en inloggad användare godkänner du i stället motsvarande programbehörigheter. Mer information finns i Behörighetsreferens för Microsoft Graph.Om du inte redan har gett Microsoft Graph PowerShell medgivande till dessa behörigheter måste du vara global administratör för att utföra den här medgivandeåtgärden.
Den här handledningen visar inte anpassade säkerhetsattribut. Globala administratörsroller och andra administratörsroller innehåller som standard inte behörighet att läsa anpassade säkerhetsattribut från Microsoft Entra-användare. Om du planerar att hämta anpassade säkerhetsattribut kan du behöva fler roller och behörigheter.
På datorn där Microsoft Graph PowerShell är installerat kontrollerar du att du har skrivåtkomst till filsystemkatalogen. I den här katalogen installerar du nödvändiga Microsoft Graph PowerShell-moduler och där exporterade Microsoft Entra-data sparas.
Se till att du har behörighet att hämta data från andra datakällor utöver Microsoft Entra, om du också vill införliva dessa data i Azure Data Explorer.
Konfigurera Azure Data Explorer
Om du inte tidigare har använt Azure Data Explorer måste du konfigurera det först. Du kan skapa ett kostnadsfritt kluster utan en Azure-prenumeration eller ett kreditkort. Eller så kan du skapa ett fullständigt kluster som kräver en Azure-prenumeration. Kom igång genom att läsa Snabbstart: Skapa ett Azure Data Explorer-kluster och en databas.
Extrahera Microsoft Entra-ID-data med hjälp av PowerShell
I det här avsnittet du installera Microsoft Graph PowerShell-moduler. I PowerShell du ansluta till Microsoft Graph för att extrahera Microsoft Entra-ID-data.
Första gången som din organisation använder dessa moduler för det här scenariot måste du ha en global administratörsroll som gör att Microsoft Graph PowerShell kan bevilja medgivande för användning i din klientorganisation. Efterföljande interaktioner kan använda en lägre privilegierad roll.
Öppna PowerShell.
Om du inte har alla Microsoft Graph PowerShell-moduler redan installerade installerar du nödvändiga Microsoft Graph-moduler. Följande moduler krävs för det här avsnittet i självstudien:
Microsoft.Graph.Authentication
,Microsoft.Graph.Users
,Microsoft.Graph.Groups
,Microsoft.Graph.Applications
ochMicrosoft.Graph.DirectoryObjects
. Om du redan har installerat de här modulerna hoppar du över det här steget.$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 }
Importera modulerna till den aktuella PowerShell-sessionen:
$modules = @('Microsoft.Graph.Users', 'Microsoft.Graph.Groups', 'Microsoft.Graph.Applications', 'Microsoft.Graph.DirectoryObjects') foreach ($module in $modules) { Import-Module -Name $module }
Anslut till Microsoft Graph. Det här avsnittet i självstudien illustrerar hur du läser in användare, grupper och program, så det kräver behörighetsomfången
User.Read.All
,Group.Read.All
,Application.Read.All
ochDirectory.Read.All
. Mer information om behörigheter finns i Microsoft Graph-behörighetsreferens.Connect-MgGraph -Scopes "User.Read.All", "Group.Read.All", "Application.Read.All", "Directory.Read.All" -ContextScope Process -NoWelcome
Med det här kommandot uppmanas du att logga in med dina Microsoft Entra-autentiseringsuppgifter. När du har loggat in kan du behöva godkänna de behörigheter som krävs om det är första gången du ansluter eller om nya behörigheter krävs.
PowerShell-frågor för att extrahera Microsoft Entra-ID-data för anpassade rapporter
Följande frågor extraherar Microsoft Entra-ID-data från Microsoft Graph med hjälp av PowerShell och exporterar data till JSON-filer. Du importerar dessa filer till Azure Data Explorer i ett senare avsnitt i den här självstudien.
Scenarier för att generera rapporter med den här typen av data är:
- En revisor vill se en rapport som listar gruppmedlemmarna för 10 grupper, ordnade av medlemsavdelningen.
- En granskare vill se en rapport över alla användare som hade åtkomst till ett program mellan två datum.
Du kan också hämta data till Azure Data Explorer från källor utanför Microsoft Entra. Ett scenario för den här funktionen kan vara:
- En administratör vill visa alla användare som lagts till i ett program från Microsoft Entra-ID och deras åtkomsträttigheter på programmets egen lagringsplats, till exempel en SQL-databas.
De här typerna av rapporter är inte inbyggda i Microsoft Entra-ID. Du kan dock skapa dessa rapporter själv genom att extrahera data från Microsoft Entra-ID och kombinera data med hjälp av anpassade frågor i Azure Data Explorer. I artikeln Hämta data från andra källor behandlas den här processen senare i den här handledningen.
I den här självstudien extraherar du Microsoft Entra-ID-data från följande områden:
- Användarinformation som visningsnamn, UPN och jobbinformation
- Gruppinformation, inklusive deras medlemskap
- Applikationer och tilldelningar till applikationsroller
Med den här datamängden kan du utföra en bred uppsättning frågor kring vem som fick åtkomst till ett program, med deras programrollinformation och tillhörande tidsram. Kom ihåg att det här är exempelfrågor och att dina data och specifika krav kan variera från vad som visas här.
Anteckning
Större klienter kan uppleva strypning och 429-fel som hanteras av Microsoft Graph-modulen. Azure Data Explorer kan också begränsa filuppladdningsstorlekar.
I dessa PowerShell-skript exporterar du markerade egenskaper från Microsoft Entra-objekt till JSON-filer. Data från dessa exporterade egenskaper används för att generera anpassade rapporter i Azure Data Explorer.
De specifika egenskaper som följer ingår i de här exemplen eftersom vi använder dessa data för att illustrera de typer av rapporter som du kan skapa i Azure Data Explorer. Eftersom dina specifika rapporteringsbehov sannolikt varierar från vad den här självstudien visar bör du inkludera de specifika egenskaperna i dessa skript som du är intresserad av att visa i dina rapporter. Du kan dock följa samma mönster som visas för att skapa skripten.
Välj ett ögonblicksbildsdatum
Ett hårdkodat ögonblicksbildsdatum identifierar data i JSON-filen med ett visst datum. Du kan använda den för att hålla reda på liknande datauppsättningar över tid i Azure Data Explorer. Ögonblicksbildsdatumet är också användbart för att jämföra ändringar i data mellan två ögonblicksbildsdatum.
$SnapshotDate = Get-Date -AsUTC -Format "yyyy-MM-dd"
Hämta Microsoft Entra-användardata
Det här skriptet exporterar markerade egenskaper från Microsoft Entra-användarobjektet till en JSON-fil. Du importerar den här filen och ytterligare data från andra JSON-filer till Azure Data Explorer i ett senare avsnitt i den här självstudien.
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
Hämta gruppdata
Generera en JSON-fil med gruppnamn och ID:t som används för att skapa anpassade vyer i Azure Data Explorer. Exemplet innehåller alla grupper, men du kan inkludera ytterligare filtrering om det behövs. Om du filtrerar för att endast inkludera vissa grupper kanske du vill inkludera logik i skriptet för att söka efter kapslade grupper.
# 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"
Hämta gruppmedlemskapsdata
Generera en JSON-fil med gruppmedlemskap, som används för att skapa anpassade vyer i Azure Data Explorer. Exemplet innehåller alla grupper, men du kan inkludera ytterligare filtrering om det behövs.
# 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"
Hämta program- och tjänsthuvudnamnsdata
Generera en JSON-fil med alla program och motsvarande tjänsthuvudnamn i klientorganisationen. Du kommer att importera dessa data till Azure Data Explorer i ett senare avsnitt i den här självstudien, så att du kan generera anpassade rapporter som är relaterade till program baserat på dessa data.
# 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"
Hämta approlldata
Generera en JSON-fil med alla approller för företagsappar i Microsoft Entra. När du har importerat dessa data till Azure Data Explorer använder du dem för att generera rapporter som omfattar approlltilldelningar för användare.
# 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'
Hämta data om aprolltilldelningar
Generera en JSON-fil med alla approlltilldelningar för användare i klientorganisationen:
$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"
Skapa tabeller och importera JSON-filer med data från Microsoft Entra-ID till Azure Data Explorer
I det här avsnittet importerar du de nyligen skapade JSON-filerna för Microsoft Entra ID-tjänsterna som tabeller i Azure Data Explorer för ytterligare analys. Vid den första importen via Azure Data Explorer-webbgränssnittet skapar du tabellerna baserat på scheman som webbgränssnittet föreslår från varje JSON-fil.
Logga in på Azure Data Explorer-webbgränssnittet.
Gå till den databas som du konfigurerade i ditt Azure Data Explorer-kluster eller det kostnadsfria klustret tidigare i den här självstudien.
På den vänstra menyn väljer du Query.
Följ dessa steg för varje exporterad JSON-fil för att hämta dina exporterade data till den Azure Data Explorer-databasen som en ny tabell:
Högerklicka på namnet på databasen där du vill mata in data. Välj sedan Hämta data.
Välj datakällan i den tillgängliga listan. I den här självstudien matar du in data från en lokal fil, så välj Lokal fil.
Välj + Ny tabell och ange ett tabellnamn baserat på namnet på JSON-filen som du importerar. Om du till exempel importerar EntraUsers.jsonger du tabellen namnet EntraUsers. Efter den första importen finns tabellen redan och du kan välja den som måltabell för en efterföljande import.
Välj Bläddra efter filer, välj JSON-filen och välj sedan Nästa.
Azure Data Explorer identifierar schemat automatiskt och tillhandahåller en förhandsversion på fliken Granska. Välj Slutför om du vill skapa tabellen och importera data från filen. När data har matats in väljer du Stäng.
Upprepa föregående steg för var och en av de JSON-filer som du genererade i föregående avsnitt.
I slutet av dessa steg har du tabellerna EntraUsers
, EntraGroups
, EntraGroupMemberships
, Applications
, AppRoles
och AppRoleAssignments
i databasen.
Extrahera Styrningsdata för Microsoft Entra-ID med hjälp av PowerShell
I det här avsnittet använder du PowerShell för att extrahera data från Microsoft Entra ID Governance Services. Om du inte har Microsoft Entra ID Governance, Microsoft Entra ID P2 eller Microsoft Entra Suite fortsätter du i avsnittet Använda Azure Data Explorer för att skapa anpassade rapporter.
För följande steg kan du behöva installera Microsoft Graph PowerShell-moduler för att extrahera Microsoft Entra ID-styrningsdata. Första gången som din organisation använder dessa moduler för det här scenariot måste du ha en global administratörsroll som gör att Microsoft Graph PowerShell kan bevilja medgivande för användning i din klientorganisation. Efterföljande interaktioner kan använda en lägre privilegierad roll.
Öppna PowerShell.
Om du inte har alla Microsoft Graph PowerShell-moduler redan installerade installerar du nödvändiga Microsoft Graph-moduler. Följande modul krävs för det här avsnittet i självstudien:
Microsoft.Graph.Identity.Governance
. Om du redan har installerat modulerna går du vidare till nästa steg.$modules = @('Microsoft.Graph.Identity.Governance') foreach ($module in $modules) { Install-Module -Name $module -Scope CurrentUser -AllowClobber -Force }
Importera modulerna till den aktuella PowerShell-sessionen:
$modules = @('Microsoft.Graph.Identity.Governance') foreach ($module in $modules) { Import-Module -Name $module }
Anslut till Microsoft Graph. Det här avsnittet i självstudien visar hur du hämtar data från behörighetshantering och åtkomstgranskningar, så det kräver behörighetsintervall
AccessReview.Read.All
ochEntitlementManagement.Read.All
. För andra rapporteringsanvändningsfall, till exempel för PRIVILEGED Identity Management (PIM) eller livscykelarbetsflöden, uppdaterar du parameternScopes
med nödvändiga behörigheter. Mer information om behörigheter finns i Microsoft Graph-behörighetsreferens.Connect-MgGraph -Scopes "AccessReview.Read.All, EntitlementManagement.Read.All" -ContextScope Process -NoWelcome
Med det här kommandot uppmanas du att logga in med dina Microsoft Entra-autentiseringsuppgifter. När du har loggat in kan du behöva godkänna de behörigheter som krävs om det är första gången du ansluter eller om nya behörigheter krävs.
PowerShell-frågor för att extrahera Styrningsdata för Microsoft Entra-ID för anpassade rapporter
Följande frågor extraherar Microsoft Entra ID-styrningsdata från Microsoft Graph med hjälp av PowerShell och exporterar data till JSON-filer. Du importerar dessa filer till Azure Data Explorer i ett senare avsnitt i den här självstudien.
Scenarier för att generera rapporter med den här typen av data är:
- Rapportering om historiska åtkomstgranskningar.
- Rapportering om tilldelningar via berättigandehantering.
Hämta definitionsdata för åtkomstgranskningsschema
Generera en JSON-fil med definitionsnamn och ID:er för åtkomstgranskning som används för att skapa anpassade vyer i Azure Data Explorer. Exemplet innehåller alla åtkomstgranskningar, men du kan inkludera ytterligare filtrering om det behövs. Mer information finns i Använd filterfrågeparametern.
$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"
Hämta instansdata för åtkomstgranskningar
Om du vill exportera alla åtkomstgranskningsdefinitioner, instanser och beslut till ett strukturerat mappformat med hjälp av PowerShell kan du använda Microsoft Graph API. Den här metoden säkerställer att dina data ordnas hierarkiskt och överensstämmer med den angivna mappstrukturen.
Innan du börjar bör du vara medveten om följande punkter:
- Se till att du har de behörigheter som krävs för att få åtkomst till granskningsdata i Microsoft Graph.
- Beroende på mängden data kan skriptets körningstid variera. Övervaka processen och justera parametrarna efter behov.
Så här hämtar du instansdata:
Ladda ned Export_Access_Reviews.ps1 skriptet och spara det lokalt.
I Utforskaren avblockera du skriptet så att du kan köra det i PowerShell.
Kör följande kommando. Utdata placerar alla data i tre undermappar:
ReviewInstances
,ReviewInstanceDecisionItems
ochReviewInstanceContactedReviewers
..\ExportAccessReviews.ps1 -InstanceStartDate "11/15/2024" -InstanceEndDate "12/15/2024" -ExportFolder "C:\AccessReviewsExport\11_15_to_12_15"
Hämta åtkomstpaketdata för berättigandehantering
Generera en JSON-fil med åtkomstpaketnamn och ID:t som används för att skapa anpassade vyer i Azure Data Explorer. Exemplet innehåller alla åtkomstpaket, men du kan inkludera ytterligare filtrering om det behövs.
$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"
Hämta data för tilldelning av åtkomstpaket för berättigandehantering
Generera en JSON-fil med tilldelningar för att komma åt paket som används för att skapa anpassade vyer i Azure Data Explorer. Exemplet innehåller alla tilldelningar som levereras, men du kan inkludera ytterligare filtrering om det behövs.
$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"
Skapa tabeller och importera JSON-filer med data från Microsoft Entra ID-styrning till Azure Data Explorer
I det här avsnittet importerar du de nyligen skapade JSON-filerna för Microsoft Entra ID Governance Services till Azure Data Explorer för ytterligare analys. Dessa filer ansluter till de data som du redan har importerat för Microsoft Entra-ID-tjänsterna. Vid den första importen via Azure Data Explorer-webbgränssnittet skapar du tabeller baserat på scheman som webbgränssnittet föreslår från varje JSON-fil.
Logga in på Azure Data Explorer-webbgränssnittet.
I ditt Azure Data Explorer-kluster eller kostnadsfria kluster går du till databasen som innehåller dina Microsoft Entra-ID-data.
På den vänstra menyn väljer du Query.
Följ dessa steg för varje exporterad JSON-fil för att hämta dina exporterade data till den Azure Data Explorer-databasen som en ny tabell:
Högerklicka på databasnamnet för den databas där du vill mata in data. Välj sedan Hämta data.
Välj datakällan i den tillgängliga listan. I den här självstudien matar du in data från en lokal fil, så välj Lokal fil.
Välj + Ny tabell och ange ett tabellnamn baserat på namnet på JSON-filen som du importerar. Efter den första importen finns tabellen redan och du kan välja den som måltabell för en efterföljande import.
Välj Bläddra efter filer, välj JSON-filen och välj sedan Nästa.
Azure Data Explorer identifierar schemat automatiskt och tillhandahåller en förhandsversion på fliken Granska. Välj Slutför om du vill skapa tabellen och importera data från filen. När data har matats in väljer du Stäng.
Upprepa föregående steg för var och en av de JSON-filer som du genererade i föregående avsnitt för var och en av mapparna.
Om det finns många filer i en mapp kan du använda
lightingest
för att importera resten när tabellen har skapats.
I slutet av dessa steg har du tabellerna EntraAccessReviewDefinitions
, EntraAccessPackages
, EntraAccessPackageAssignments
, ReviewInstances
, ReviewInstanceDecisionItems
och ReviewInstanceContactedReviewers
i databasen, utöver de tabeller som du skapade tidigare.
Använda Azure Data Explorer för att skapa anpassade rapporter
Med de data som nu är tillgängliga i Azure Data Explorer är du redo att börja skapa anpassade rapporter baserat på dina affärskrav:
Logga in på Azure Data Explorer-webbgränssnittet.
På den vänstra menyn väljer du Query.
Följande frågor innehåller exempel på vanliga rapporter, men du kan anpassa rapporterna så att de passar dina behov och skapa ytterligare rapporter.
Du kan också visa dina rapporter i Excelgenom att välja fliken Exportera och sedan välja Öppna i Excel.
Exempel: Generera approlltilldelningar för direkta och gruppbaserade tilldelningar för ett specifikt datum eller tidpunkt.
Den här rapporten ger en översikt över vem som hade vilken åtkomst och när till den aktuella appen. Du kan använda den för säkerhetsgranskningar, efterlevnadsverifiering och förståelse av åtkomstmönster i organisationen.
Följande fråga riktar sig mot ett specifikt program i Microsoft Entra-ID och analyserar rolltilldelningarna från och med ett visst datum. Frågan hämtar både direkta och gruppbaserade rolltilldelningar. Den sammanfogar dessa data med användarinformation från EntraUsers
-tabellen och rollinformationen från AppRoles
-tabellen. I frågan anger du targetSnapshotDate
till det snapshotDate
värde som du använde när du läste in data.
/// 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
Exempel: Skapa en grundläggande granskningsrapport med Microsoft Entra-data som visar vem som hade åtkomst till en app mellan två datum
Den här rapporten ger en översikt över vem som hade åtkomst till målappen mellan två datum. Du kan använda den för säkerhetsgranskningar, efterlevnadsverifiering och förståelse av åtkomstmönster i organisationen.
Följande fråga riktar sig mot ett specifikt program i Microsoft Entra-ID och analyserar rolltilldelningarna mellan två datum. Frågan hämtar direkta rolltilldelningar från tabellen AppRoleAssignments
och sammanfogar dessa data med användarinformation från EntraUsers
-tabellen och rollinformationen från tabellen 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()
Exempel: Visa användare som lagts till i en app mellan två datum för ögonblicksbild av data
De här rapporterna ger en översikt över vilka användare som har fått en approlltilldelning för målapplikationen mellan två datum. Du kan använda dessa rapporter för att spåra ändringar i appåtkomst över tid.
Den här frågan riktar sig till ett specifikt program i Microsoft Entra-ID och ändringar i rolltilldelningarna mellan start- och slutdatum:
// 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"
Exempel: Olika frågor som använder åtkomstgranskningar
Visa information om slutförande av åtkomstgranskning och tidslinje
När data har laddats upp använder du följande Kusto-frågor för att granska dem:
När slutfördes den senaste åtkomstgranskningscykeln? Hur lång tid tog det?
ReviewInstances | summarize LastCompletedDate = max(ReviewInstanceEndDateTime), ReviewDuration = datetime_diff('minute', max(ReviewInstanceEndDateTime), min(ReviewInstanceStartDateTime))
Genomförs åtkomstgranskningsprocessen i tid (till exempel kvartalsvis)?
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
Visa deltagande i och engagemang för åtkomstgranskning
Vilka var de tilldelade granskarna?
ReviewInstanceContactedReviewers | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName = DisplayName, ReviewerUserPrincipalName = UserPrincipalName, CreatedDateTime
Vilka granskare deltog aktivt och gav svar?
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
Vilken procentandel av granskarna svarade på begäran om åtkomstgranskning?
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
När slutförde varje granskare sina uppgifter?
ReviewInstanceDecisionItems | where Decision in ("Approve", "Deny") | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName = ReviewedBy_DisplayName, ReviewerUserPrincipalName = ReviewedBy_UserPrincipalName, ReviewedDateTime
Vilka granskare fattade inga beslut?
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
Vilken procentandel av granskarna interagerade inte?
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
Utlöstes påminnelser för granskare som inte svarar eller väntar på beslut?
// 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
Visa användare och åtkomständringar som är resultatet av åtkomstgranskningar
Vem förlorade åtkomsten till specifika resurser under åtkomstgranskningen?
ReviewInstanceDecisionItems | where Decision == "Deny" | project User = Principal_DisplayName, Resource = Resource_DisplayName, Decision, Justification
Flaggades användare på grund av inaktivitet?
ReviewInstanceDecisionItems | where Insights contains "inactive" | project User = Principal_DisplayName, Resource = Resource_DisplayName, Insights, Decision
Vad var datumet för borttagning av åtkomst och orsaken till att åtkomsten förlorades?
ReviewInstanceDecisionItems | where Decision == "Deny" | project User = Principal_DisplayName, Resource=Resource_DisplayName, AccessRemovalDate = AppliedDateTime, Reason = Justification
Vilka användare fattade inga beslut?
ReviewInstanceDecisionItems | where Decision == "NotReviewed" | project User = Principal_DisplayName, Resource=Resource_DisplayName
Vilka recensioner hade inga granskare?
ReviewInstances | join kind=leftanti ( ReviewInstanceContactedReviewers | summarize by AccessReviewInstanceId ) on $left.ReviewInstanceId == $right.AccessReviewInstanceId
Vilka recensioner hade inga användare?
ReviewInstances | join kind=leftanti ( ReviewInstanceDecisionItems | summarize by AccessReviewInstanceId ) on $left.ReviewInstanceId == $right.AccessReviewInstanceId
Sammanfatta beslut om åtkomstgranskning
Vilka beslut fattade användarna: godkända, nekade eller oförändrade?
ReviewInstanceDecisionItems | summarize count() by Decision
Vilket antal användare har godkänts eller nekats åtkomst?
ReviewInstanceDecisionItems | summarize ApprovedCount = countif(Decision == "Approve"), DeniedCount = countif(Decision == "Deny")
Har godkännandeskäl dokumenterats?
ReviewInstanceDecisionItems | where Decision == "Approve" and isnotempty(Justification) | summarize count() by ReviewedBy_DisplayName
Bekräfta åtkomstgranskningens kvalitet och kontrollera om den är fullständig
Övervägdes åtkomstrevokeringar för inaktiva användare?
ReviewInstanceDecisionItems | where Insights contains "inactive" and Decision == "Deny" | project User = Principal_DisplayName, Decision
Har någon åtkomst inte tagits bort korrekt?
ReviewInstanceDecisionItems | where ApplyResult != "New" and ApplyResult != "AppliedSuccessfully"
Dokumenterade granskare sina beslut?
ReviewInstanceDecisionItems | where isnotempty(Justification) | summarize count() by ReviewedBy_DisplayName
Har kommentarer samlats in för varje användare?
ReviewInstanceDecisionItems | where isnotempty(Justification) | project User = Principal_DisplayName, Resource = Resource_DisplayName, Comments = Justification
Konfigurera pågående importer
Den här självstudien illustrerar en engångsprocess för dataextrahering, transformering och inläsning (ETL) för att fylla i Azure Data Explorer med en enda ögonblicksbild i rapporteringssyfte. För löpande rapportering eller för att jämföra ändringar över tid kan du automatisera processen med att fylla i Azure Data Explorer från Microsoft Entra, så att databasen fortsätter att ha aktuella data.
Du kan använda Azure Automation, en Azure-molntjänst, som värd för de PowerShell-skript som du behöver för att extrahera data från Microsoft Entra ID och Microsoft Entra ID Governance. Mer information finns i Automatisera Microsoft Entra ID-styrningsuppgifter via Azure Automation och Microsoft Graph.
Du kan också använda Azure-funktioner eller kommandoradsverktyg som lightingest
för att hämta data och fylla i en befintlig tabell. Mer information finns i Använda LightIngest för att mata in data i Azure Data Explorer.
Om du till exempel vill läsa in EntraAccessPackages.json
-filen i den aktuella katalogen i tabellen EntraAccessPackages
som den inloggade användaren använder du följande kommando:
az login
LightIngest.exe "https://ingest-CLUSTERHOSTNAME;Fed=True" -database:"DATABASE" -table:EntraAccessPackages -sourcepath:"." -pattern:"EntraAccessPackages.json" -format:multijson -azcli:true
Rapportering av data från fler källor
Du kan också hämta data till Azure Data Explorer från källor utanför Microsoft Entra. Scenario för den här funktionen är:
- En administratör vill visa händelser i granskningsloggen med ytterligare information om användare, åtkomstpaket eller andra objekt som inte ingår i själva granskningsposten.
- En administratör vill visa alla användare som lagts till i ett program från Microsoft Entra-ID och deras åtkomsträttigheter på programmets egen lagringsplats, till exempel en SQL-databas.
Mer information finns i Skapa anpassade rapporter i Azure Data Explorer med data från andra källor.