Návod: Přizpůsobené reporty v Azure Data Exploreru pomocí dat z Microsoft Entra
V tomto kurzu se naučíte vytvářet přizpůsobené sestavy v Azure Data Explorer (ADX) pomocí dat ze služeb Microsoft Entra ID a Microsoft Entra ID Governance. Tento kurz doplňuje další možnosti vytváření sestav, jako je Archiv & sestavy se službou Azure Monitor apro správu nároků, které se zaměřují na export protokolu auditu do služby Azure Monitor pro účely uchovávání a analýzy. Ve srovnání s tím export dat Microsoft Entra ID do Azure Data Exploreru umožňuje flexibilitu při vytváření vlastních sestav o objektech Microsoft Entra, včetně historických a odstraněných objektů. Použití Azure Data Exploreru navíc umožňuje agregaci dat z dalších zdrojů s masivní škálovatelností, flexibilním schématem a zásadami uchovávání informací. Azure Data Explorer je zvlášť užitečný v případě, že potřebujete uchovávat přístupová data po dobu let, provádět ad hoc šetření nebo potřebujete spouštět vlastní dotazy na data přístupu uživatelů.
Tento článek ukazuje, jak zobrazit konfigurační, uživatele a přístupová práva exportovaná z Microsoft Entra spolu s daty exportovanými z jiných zdrojů, jako jsou aplikace s přístupovými právy ve svých vlastních databázích SQL. Potom můžete pomocí dotazovacího jazyka Kusto (KQL) v Azure Data Exploreru vytvářet vlastní sestavy na základě požadavků vaší organizace.
Použijte následující kroky k vytvoření těchto sestav:
- Nastavte službu Azure Data Explorer v předplatném Azure nebo vytvořte bezplatný cluster.
- Extrahovat data z Microsoft Entra ID pomocí skriptů PowerShell a Microsoft Graph.
- Vytvoření tabulek a import dat z ID Microsoft Entra do Azure Data Exploreru.
- Extrahujte data ze správy Microsoft Entra ID.
- Vytvoření tabulek a import těchto dat z Microsoft Entra ID Governance do Azure Data Explorer.
- Vytvořte vlastní dotaz pomocí dotazovací jazyk Kusto.
Na konci tohoto kurzu budete moct vyvíjet přizpůsobená zobrazení přístupových práv a oprávnění uživatelů. Tato zobrazení zahrnují různé aplikace pomocí podporovaných nástrojů Microsoftu. Můžete také přenést data z databází nebo aplikací třetích stran, abyste je mohli také ohlásit.
Požadavky
Pokud s Azure Data Explorerem začínáte a chcete zjistit scénáře uvedené v tomto článku, můžete získat bezplatný cluster Azure Data Exploreru. V případě podpory produkčního prostředí se smlouvou o úrovni služeb pro Azure Data Explorer potřebujete předplatné Azure k hostování celého clusteru Azure Data Exploreru.
Určete, jaká data chcete zahrnout do sestav. Skripty v tomto článku poskytují ukázky s konkrétními daty od uživatelů, skupin a aplikací z Microsoft Entra. Tyto ukázky mají ilustrovat typy sestav, které můžete pomocí tohoto přístupu vygenerovat, ale vaše konkrétní potřeby vytváření sestav se mohou lišit a vyžadovat různá nebo další data. Můžete začít s těmito objekty a v průběhu času přenést další druhy objektů Microsoft Entra.
- Tento článek demonstruje načítání dat z Microsoft Entra jako přihlášeného uživatele. Abyste to mohli udělat, ujistěte se, že máte požadovaná přiřazení rolí k načtení dat z Microsoft Entra. K exportu typu dat Microsoft Entra, se kterými chcete pracovat, potřebujete role se správnými oprávněními.
- Uživatelská data: globální správce, správce privilegovaných rolí, správce uživatelů
- Data skupin: globální správce, správce privilegovaných rolí, správce skupin
- Aplikace /Přiřazení rolí aplikací: globální správce, správce privilegovaných rolí, správce aplikací, správce cloudových aplikací
- Microsoft Graph PowerShell musí být odsouhlasený, aby bylo možné načíst objekty Microsoft Entra prostřednictvím Microsoft Graphu. Příklady v tomto kurzu vyžadují delegovaná oprávnění User.Read.All, Group.Read.All, Application.Read.All a Directory.Read.All. Pokud plánujete načítat data pomocí automatizace bez přihlášeného uživatele, odsouhlaste místo toho odpovídající oprávnění aplikace. Další informace najdete v referenčních informacích k oprávněním Microsoft Graphu. Pokud jste již neodsouhlasili rutiny Microsoft Graph PowerShell k těmto oprávněním, musíte být globálním správcem, abyste mohli provést tuto operaci s odsouhlasením.
- Tento návod neuvádí vlastní atributy zabezpečení. Globální správce a další role správců ve výchozím nastavení nezahrnují oprávnění ke čtení vlastních atributů zabezpečení od uživatelů Microsoft Entra. Pokud plánujete načíst vlastní atributy zabezpečení, pak může být zapotřebí více rolí a oprávnění.
- Na počítači, na kterém je nainstalovaný Microsoft Graph PowerShell, se ujistěte, že máte přístup k zápisu do adresáře systému souborů. Tady nainstalujete požadované moduly Microsoft Graph PowerShellu a uložíte exportovaná data Microsoft Entra.
- Pokud chcete tato data začlenit do Azure Data Exploreru, ujistěte se, že máte oprávnění načítat data z jiných zdrojů dat než Microsoft Entra.
1: Nastavení Azure Data Exploreru
Pokud jste azure Data Explorer ještě nepoužívali, musíte ho nejdřív nastavit. Můžete vytvořit bezplatný cluster bez předplatného Azure nebo platební karty, nebo můžete vytvořit plný cluster, který vyžaduje předplatné Azure. Viz Rychlý start: Vytvoření clusteru a databáze Azure Data Exploreru, abyste mohli začít.
2: Extrahování dat MICROSOFT Entra ID pomocí PowerShellu
V této části nainstalovat moduly Microsoft Graph PowerShellu a v PowerShellu se připojit k Microsoft Graphu k extrakci dat Microsoft Entra ID.
Při prvním použití těchto modulů v tomto scénáři musíte být v roli globálního správce, abyste microsoft Graph PowerShellu povolili udělení souhlasu pro použití ve vašem tenantovi. Následné interakce můžou používat méně privilegovanou roli.
- Otevřete PowerShell.
- Pokud ještě nemáte nainstalované všechny moduly Microsoft Graph PowerShellu , nainstalujte požadované moduly Microsoft Graphu. Pro tuto část kurzu jsou vyžadovány následující moduly:
Microsoft.Graph.Authentication
,Microsoft.Graph.Users
,Microsoft.Graph.Groups
,Microsoft.Graph.Applications
,Microsoft.Graph.DirectoryObjects
. Pokud už máte tyto moduly nainstalované, pokračujte dalším krokem.
$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
}
- Importujte moduly do aktuální relace PowerShellu.
$modules = @('Microsoft.Graph.Users', 'Microsoft.Graph.Groups', 'Microsoft.Graph.Applications', 'Microsoft.Graph.DirectoryObjects')
foreach ($module in $modules) {
Import-Module -Name $module
}
- Připojte se k Microsoft Graphu. Tato část kurzu ukazuje čtení uživatelů, skupin a aplikací, takže vyžaduje rozsahy oprávnění
User.Read.All
,Group.Read.All
,Application.Read.All
aDirectory.Read.All
. Další informace o oprávněních najdete v tématu referenční informace k oprávněním Microsoft Graphu.
Connect-MgGraph -Scopes "User.Read.All", "Group.Read.All", "Application.Read.All", "Directory.Read.All" -ContextScope Process -NoWelcome
Tento příkaz vás vyzve k přihlášení pomocí přihlašovacích údajů Microsoft Entra. Po přihlášení možná budete muset udělit souhlas s požadovanými oprávněními, pokud se jedná o první připojení nebo pokud jsou vyžadována nová oprávnění.
Dotazy PowerShellu pro extrahování dat Microsoft Entra ID potřebných k vytváření vlastních sestav v Azure Data Exploreru
Následující dotazy extrahují data Microsoft Entra ID z Microsoft Graphu pomocí PowerShellu a exportují data do souborů JSON importovaných do Azure Data Exploreru v následující části 3. Pro generování sestav s tímto typem dat může existovat několik scénářů, mezi které patří:
- Auditor by chtěl zobrazit sestavu se seznamem členů skupiny pro 10 skupin uspořádaných oddělením členů.
- Auditor by chtěl zobrazit sestavu všech uživatelů, kteří měli přístup k aplikaci mezi dvěma daty.
Data můžete také přenést do Azure Data Exploreru z jiných zdrojů mimo Microsoft Entra. To umožňuje scénáře, jako jsou:
- Správce chce zobrazit všechny uživatele přidané do aplikace z Microsoft Entra ID a jejich přístupových práv ve vlastním úložišti aplikace, jako jsou databáze SQL.
Tyto typy sestav nejsou integrované do Microsoft Entra ID. Tyto sestavy ale můžete vytvořit sami tak, že extrahujete data z Entra a zkombinujete je pomocí vlastních dotazů v Azure Data Exploreru. Tento problém bude vyřešen později v návodu v oddílu přenesení dat z jiných zdrojů.
Pro účely tohoto kurzu extrahujeme data MICROSOFT Entra ID z několika oblastí:
- Informace o uživateli, jako jsou zobrazované jméno, hlavní název uživatele (UPN) a podrobnosti o úloze
- Informace o skupině včetně jejich členství
- Přiřazení aplikací a aplikačních rolí
Tato datová sada nám umožňuje provádět širokou škálu dotazů, pokud jde o to, kdo získal přístup k aplikaci, s informacemi o roli aplikace a přidruženým časovým rámcem. Všimněte si, že se jedná o ukázkové dotazy a vaše data a konkrétní požadavky se můžou lišit od toho, co vidíte tady.
Poznámka:
U větších tenantů může docházet k omezování výkonu nebo chybám 429, které zpracovává modul Microsoft Graph. Azure Data Explorer může také omezit velikosti nahrávání souborů.
V těchto skriptech PowerShellu exportujeme vybrané vlastnosti z objektů Microsoft Entra do souborů JSON. Údaje z těchto exportovaných vlastností se používají pro generování vlastních sestav v Azure Data Explorer. Do těchto příkladů jsme zahrnuli konkrétní vlastnosti, protože tato data používáme k ilustraci typů sestav, které můžete vytvořit v Azure Data Exploreru. Vzhledem k tomu, že se vaše konkrétní potřeby vytváření reportů pravděpodobně liší od zobrazených, měli byste do těchto skriptů zahrnout specifické vlastnosti, které chcete vidět ve svých reportech. Můžete ale postupovat podle stejného vzoru, který vám pomůže sestavovat skripty.
Výběr data snímku
Zahrnuli jsme pevně zakódované datum snímku, které identifikuje data v souboru JSON s konkrétním datem a umožňuje nám sledovat podobné datové sady v průběhu času v Azure Data Exploreru. Datum snímku je také užitečné při porovnávání změn dat mezi dvěma daty snímků.
$SnapshotDate = Get-Date -AsUTC -Format "yyyy-MM-dd"
Získání uživatelských dat Entra
Tento skript exportuje vybrané vlastnosti z objektu uživatele Entra do souboru JSON. Tato a další data z jiných souborů JSON naimportujeme do Azure Data Exploreru v následující části tohoto kurzu.
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
Získání dat skupiny
Vygenerujte soubor JSON s názvy skupin a ID, které se používají k vytváření vlastních zobrazení v Azure Data Exploreru. Ukázka zahrnuje všechny skupiny, ale v případě potřeby je možné zahrnout další filtrování. Pokud filtrujete tak, aby zahrnovaly jenom určité skupiny, můžete do skriptu zahrnout logiku, která kontroluje vnořené skupiny.
# Get all groups and select Id and DisplayName
$groups = Get-MgGroup -All | Select-Object Id,DisplayName
# Export the groups to a JSON file
$groups | ConvertTo-Json | Set-Content ".\EntraGroups.json"
Získání dat členství ve skupině
Vygenerujte soubor JSON s členstvím ve skupině, který se používá k vytváření vlastních zobrazení v Azure Data Exploreru. Ukázka zahrnuje všechny skupiny, ale v případě potřeby je možné zahrnout další filtrování.
# Retrieve all groups from Microsoft Entra (Azure AD)
$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 "EntraGroupMembership.json"
Získání dat aplikace a instančního objektu
Vygeneruje soubor JSON se všemi aplikacemi a odpovídajícími instančními objekty v tenantovi. Tato data naimportujeme do Azure Data Exploreru v následující části tohoto kurzu, která nám umožňuje generovat vlastní sestavy související s aplikacemi na základě těchto dat.
# Fetch applications and their corresponding service principals, then export to JSON
Get-MgApplication -All | ForEach-Object {
$app = $_
$sp = Get-MgServicePrincipal -Filter "appId eq '$($app.AppId)'"
[pscustomobject]@{
Name = $app.DisplayName
ApplicationId = $app.AppId
ServicePrincipalId = $sp.Id
SnapshotDate = $SnapshotDate
}
} | ConvertTo-Json -Depth 10 | Set-Content "Applications.json"
Získání dat AppRole
Vygenerujte soubor JSON všech AppRole pro podnikové aplikace v Microsoft Entra. Po importu do Azure Data Exploreru použijeme tato data k vygenerování sestav zahrnujících přiřazení rolí aplikací pro uživatele.
# Get a list of all applications, 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 using its appId
$spFilter = "appId eq '$($app.AppId)'"
$sp = Get-MgServicePrincipal -Filter $spFilter | Select-Object -First 1
# Process AppRoles, 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'
Získání dat přiřazení AppRole
Vygenerujte soubor JSON pro všechna přiřazení rolí aplikací uživatelů v tenantovi.
$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 needed
$result += [PSCustomObject]@{
AppRoleId = $_.AppRoleId
CreatedDateTime = $createdDateTime
PrincipalDisplayName = $_.PrincipalDisplayName
PrincipalId = $_.PrincipalId
ResourceDisplayName = $_.ResourceDisplayName
ResourceId = $_.ResourceId
SnapshotDate = $SnapshotDate
}
}
}
$result | ConvertTo-Json -Depth 10 | Out-File "AppRoleAssignments.json"
3: Vytváření tabulek a import souborů JSON s daty z ID Microsoft Entra do Azure Data Exploreru
V této části naimportujeme nově vytvořené soubory JSON pro služby Microsoft Entra ID jako tabulky v Azure Data Exploreru pro další analýzu. Při prvním importu pomocí webového uživatelského rozhraní Azure Data Exploreru vytvoříte tabulky na základě schématu, které webové uživatelské rozhraní navrhuje z každého souboru JSON.
Jakmile nastavíte databázi v clusteru Azure Data Exploreru nebo v bezplatném clusteru, jak je popsáno v první části tohoto článku, přejděte do této databáze.
- Přihlaste se k webovému uživatelskému rozhraní azure Data Exploreru .
- V nabídce vlevo vyberte dotaz.
Dále postupujte podle těchto kroků pro každý exportovaný soubor JSON a získejte exportovaná data do databáze Azure Data Exploreru jako novou tabulku.
Pravým tlačítkem myši vyberte název databáze, do které chcete data ingestovat. Vyberte Načíst data.
Vyberte zdroj dat z dostupného seznamu. V tomto kurzu importujete data z místního souboru .
Vyberte + Nová tabulka a zadejte název tabulky na základě názvu souboru JSON, který importujete, například pokud importujete EntraUsers.json, pojmenujte tabulku EntraUsers. Po prvním importu už tabulka existuje a můžete ji vybrat jako cílovou tabulku pro následný import.
Vyberte Vyhledat soubory, vyberte soubor JSON a vyberte Další.
Azure Data Explorer automaticky detekuje schéma a zobrazí náhled v záložce Zkontrolovat. Klikněte na Dokončit pro vytvoření tabulky a import dat z daného souboru. Po ingestování dat klikněte na Zavřít.
Opakujte každý z předchozích kroků pro každý ze souborů JSON, které jste vygenerovali v předchozí části.
Na konci těchto kroků budete mít tabulky EntraUsers
, EntraGroups
, EntraGroupMembership
, Applications
, AppRoles
a AppRoleAssignments
v databázi.
4: Extrahování dat zásad správného řízení ID Microsoft Entra pomocí PowerShellu
V této části použijete PowerShell k extrakci dat ze služeb zásad správného řízení Microsoft Entra ID. Pokud nemáte Microsoft Entra ID Governance, Microsoft Entra ID P2 nebo Microsoft Entra Suite, pokračujte v části a pomocí Azure Data Explorer sestavovat vlastní sestavy.
K tomu možná budete muset nainstalovat moduly Microsoft Graph PowerShell k extrahování dat správy Microsoft Entra ID. Při prvním použití těchto modulů v tomto scénáři musíte být v roli globálního správce, abyste microsoft Graph PowerShellu povolili udělení souhlasu pro použití ve vašem tenantovi. Následné interakce můžou používat méně privilegovanou roli.
- Otevřete PowerShell.
- Pokud ještě nemáte nainstalované všechny moduly Microsoft Graph PowerShellu , nainstalujte požadované moduly Microsoft Graphu. Pro tuto část kurzu jsou vyžadovány následující moduly:
Microsoft.Graph.Identity.Governance
. Pokud už máte tyto moduly nainstalované, pokračujte dalším krokem.
$modules = @('Microsoft.Graph.Identity.Governance')
foreach ($module in $modules) {
Install-Module -Name $module -Scope CurrentUser -AllowClobber -Force
}
- Importujte moduly do aktuální relace PowerShellu.
$modules = @('Microsoft.Graph.Identity.Governance')
foreach ($module in $modules) {
Import-Module -Name $module
}
- Připojte se k Microsoft Graphu. Tato část kurzu ukazuje načtení dat ze správy nároků a kontrol přístupu, takže vyžaduje
AccessReview.Read.All
aEntitlementManagement.Read.All
rozsahy oprávnění. V případě jiných případů použití sestav, jako jsou pracovní postupy PIM nebo životního cyklu, aktualizujte parametrScopes
potřebnými oprávněními. Další informace o oprávněních najdete v tématu referenční informace k oprávněním Microsoft Graphu.
Connect-MgGraph -Scopes "AccessReview.Read.All, EntitlementManagement.Read.All" -ContextScope Process -NoWelcome
Tento příkaz vás vyzve k přihlášení pomocí přihlašovacích údajů Microsoft Entra. Po přihlášení možná budete muset udělit souhlas s požadovanými oprávněními, pokud se jedná o první připojení nebo pokud jsou vyžadována nová oprávnění.
Dotazy PowerShellu k extrahování dat zásad správného řízení ID Microsoft Entra potřebné k vytváření vlastních sestav v Azure Data Exploreru
Pomocí dotazů můžete extrahovat data zásad správného řízení ID Microsoft Entra z Microsoft Graphu pomocí PowerShellu a exportovat data do souborů JSON, které se naimportují do Azure Data Exploreru v následující části. Pro generování sestav s tímto typem dat může existovat několik scénářů, mezi které patří:
- vytváření sestav o historických přezkumech přístupu
- generování sestav o přiřazeních prostřednictvím správy oprávnění
Získání dat definice plánu kontroly Accessu
Vygenerujte soubor JSON s názvy definic a ID kontroly přístupu, které se používají k vytváření vlastních zobrazení v Azure Data Exploreru. Ukázka obsahuje všechny kontroly přístupu, ale v případě potřeby je možné zahrnout další filtrování. Další informace najdete v tématu použití parametru dotazu filtru.
$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"
Získání dat instance kontroly Accessu
Pokud chcete exportovat všechny definice, instance a rozhodnutí v rámci Access Review do strukturovaného formátu složek pomocí PowerShell, můžete využít rozhraní Microsoft Graph API. Tento přístup zajišťuje, že data jsou uspořádaná hierarchicky, a to v souladu se zadanou strukturou složek.
Než začnete, buďte si vědomi následujícího:
- Ujistěte se, že máte potřebná oprávnění pro přístup k datům kontroly přístupu v Microsoft Graphu.
- V závislosti na objemu dat se může doba provádění skriptu lišit. Podle potřeby sledujte proces a upravte parametry.
- Stáhněte si Export_Access_Reviews.ps1 skript a uložte ho místně.
- V Průzkumníku souborů odblokujte skript, aby ho bylo možné spustit v PowerShellu.
- Spusťte následující příkaz, který vypíše všechna data do tří podsložek
ReviewInstances
,ReviewInstanceDecisionItems
aReviewInstanceContactedReviewers
.
.\ExportAccessReviews.ps1 -InstanceStartDate "11/15/2024" -InstanceEndDate "12/15/2024" -ExportFolder "C:\AccessReviewsExport\11_15_to_12_15"
Získání dat balíčku pro řízení přístupových práv
Vygenerujte soubor JSON s názvy a ID přístupových balíčků, které se používají k vytváření vlastních zobrazení v Azure Data Exploreru. Ukázka obsahuje všechny přístupové balíčky, ale v případě potřeby je možné zahrnout další filtrování.
$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"
Získat data o přiřazení přístupového balíčku pro správu oprávnění.
Vygenerujte soubor JSON s přiřazeními pro přístup k balíčkům, které se používají k vytváření vlastních zobrazení v Azure Data Exploreru. Vzorek obsahuje všechny úlohy, které byly odevzdány, ale v případě potřeby lze zahrnout další filtrování.
$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"
5: Vytváření tabulek a import souborů JSON s daty z zásad správného řízení ID Microsoft Entra do Azure Data Exploreru
V této části naimportujeme nově vytvořené soubory JSON pro služby zásad správného řízení Microsoft Entra ID do Azure Data Exploreru společně s daty, která jsou už importovaná pro služby Microsoft Entra ID, pro další analýzu. Při prvním importu pomocí webového uživatelského rozhraní Azure Data Exploreru vytvoříte tabulky založené na schématu, které webové uživatelské rozhraní navrhuje z každého souboru JSON.
V clusteru Azure Data Exploreru nebo bezplatném clusteru přejděte do databáze, ve které jsou uložená data VAŠEHO ID Microsoft Entra.
- Přihlaste se k webovému uživatelskému rozhraní azure Data Exploreru .
- V nabídce vlevo vyberte dotaz.
Dále postupujte podle těchto kroků pro každý exportovaný soubor JSON z předchozí části a získejte exportovaná data do databáze Azure Data Exploreru jako novou tabulku.
Pravým tlačítkem myši vyberte název databáze, do které chcete data ingestovat. Vyberte Načíst data.
Vyberte zdroj dat z dostupného seznamu. V tomto kurzu importujete data z místního souboru .
Vyberte + Nová tabulka a zadejte název tabulky na základě názvu souboru JSON, který importujete, po prvním importu už tabulka existuje a můžete ji vybrat jako cílovou tabulku pro následný import.
Vyberte Vyhledat soubory, vyberte soubor JSON a vyberte Další.
Azure Data Explorer automaticky detekuje schéma a zobrazí náhled v záložce Zkontrolovat. Klikněte na Dokončit pro vytvoření tabulky a import dat z daného souboru. Po ingestování dat klikněte na Zavřít.
Opakujte každý z předchozích kroků pro každý ze souborů JSON, které jste vygenerovali v předchozí části, pro každou ze složek.
Pokud je ve složce mnoho souborů, můžete po vytvoření tabulky použít
lightingest
k importu ostatních souborů.
Na konci těchto kroků budete mít tabulky EntraAccessReviewDefinitions
, EntraAccessPackages
a EntraAccessPackageAssignments
, ReviewInstances
, ReviewInstanceDecisionItems
, ReviewInstanceContactedReviewers
v databázi, kromě tabulek vytvořených v oddílu 3.
6: Vytváření vlastních sestav pomocí Azure Data Exploreru
S daty, která jsou teď dostupná v Azure Data Exploreru, jste připraveni začít vytvářet přizpůsobené sestavy na základě vašich obchodních požadavků.
Azure Data Explorer je výkonný nástroj pro analýzu dat, který je vysoce škálovatelný a flexibilní a poskytuje ideální prostředí pro generování přizpůsobených sestav přístupu uživatelů. Azure Data Explorer používá dotazovací jazyk Kusto (KQL).
- Přihlaste se k webovému uživatelskému rozhraní azure Data Exploreru .
- V nabídce vlevo vyberte dotaz.
Následující dotazy poskytují příklady běžných sestav, ale tyto sestavy můžete přizpůsobit tak, aby vyhovovaly vašim potřebám, a vytvářet další sestavy.
Můžete také zobrazit sestavy v Excelu, když vyberete kartu Export a poté zvolíte možnost Otevřít v Excelu.
Příklad 1: Generování přiřazení rolí aplikace pro přímá přiřazení a přiřazení skupin pro konkrétní datum snímku
Tato sestava poskytuje přehled o tom, kdo měl k cílové aplikaci přístup a kdy a kdy se dá použít pro audity zabezpečení, ověření dodržování předpisů a pochopení vzorů přístupu v organizaci.
Tento dotaz cílí na konkrétní aplikaci v rámci Microsoft Entra AD a analyzuje přiřazení rolí k určitému datu. Dotaz načte přímé i skupinové přiřazení rolí a slučuje tato data s podrobnostmi o uživateli z tabulky EntraUsers
a informací o rolích z tabulky AppRoles
. V následujícím dotazu nastavte targetSnapshotDate
na hodnotu snapshotDate
, která byla použita při načítání dat.
/// 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 string for easier comparison
// Prepare user data from EntraUsers table
let users = EntraUsers
| project ObjectID, UserPrincipalName, DisplayName, ObjectIDStr = tostring(ObjectID); // Include ObjectID as string for joining
// Prepare role data from 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 EntraGroupMembership on $left.PrincipalId == $right.GroupId // Join with Group Membership
| mvexpand Members // Expand group members
| extend MembersStr = tostring(Members) // Convert member ID to 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
Příklad 2: Sestavení základní sestavy auditora s daty Entra zobrazující, kdo měl přístup k aplikaci mezi těmito dvěma daty
Tato sestava poskytuje přehled o tom, kdo měl přístup k cílové aplikaci mezi dvěma daty a který je možné použít pro audity zabezpečení, ověření dodržování předpisů a pochopení vzorů přístupu v organizaci.
Tento dotaz cílí na konkrétní aplikaci v rámci ID Microsoft Entra a analyzuje přiřazení rolí mezi dvěma daty. Dotaz načte přímé přiřazení rolí z tabulky AppRoleAssignments
a sloučí tato data s podrobnostmi o uživateli z tabulky EntraUsers
a informací o rolích z tabulky 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()
Příklad 3: Přidání uživatelů do aplikace mezi dvěma daty snímků dat
Tyto sestavy poskytují zobrazení, kterým uživatelům bylo přiřazeno přiřazení role aplikace cílové aplikaci mezi dvěma daty. Tyto sestavy se dají použít ke sledování změn v přístupu k aplikacím v průběhu času.
Tento dotaz cílí na konkrétní aplikaci v rámci ID Microsoft Entra a změní přiřazení rolí mezi počátečním a koncovým datem.
// 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"
Příklad 4: Kontroly přístupu
Kontrola informací o dokončení & časové ose
Jakmile se data nahrají, zkontrolujte je pomocí následujících dotazů Kusto.
- Kdy byl dokončen poslední cyklus kontroly přístupu? Jak dlouho to trvalo?
ReviewInstances
| summarize LastCompletedDate = max(ReviewInstanceEndDateTime),
ReviewDuration = datetime_diff('minute', max(ReviewInstanceEndDateTime), min(ReviewInstanceStartDateTime))
- Provádí se proces kontroly přístupu včas (např. čtvrtletně, ročně)?
ReviewInstances
| extend ExpectedFrequency = "Quarterly" // Replace with 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
Kontrola zapojení & angažovanosti
- Kdo byli přiřazeni jako recenzenti?
ReviewInstanceContactedReviewers
| project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName = DisplayName, ReviewerUserPrincipalName = UserPrincipalName, CreatedDateTime
- Kteří recenzenti se aktivně účastnili a poskytli odpovědi?
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
- Procento revidujících, kteří odpověděli na žádost o kontrolu přístupu
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 non-responders
| 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
- Kdy každý kontrolor dokončil své úkoly?
ReviewInstanceDecisionItems
| where Decision in ("Approve", "Deny")
| project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName = ReviewedBy_DisplayName, ReviewerUserPrincipalName = ReviewedBy_UserPrincipalName, ReviewedDateTime
- Kteří recenzenti neudělali žádná rozhodnutí?
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
- Procento revidujících, kteří neinteragovali.
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 non-responders
| 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
- Byla zaslána připomenutí nereagujícím recenzentům? Čekající rozhodnutí?
// 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 have 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 non-responsive 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
Změny přístupu pro uživatele &
- Kdo během kontroly přístupu ztratil přístup ke konkrétním prostředkům?
ReviewInstanceDecisionItems
| where Decision == "Deny"
| project User = Principal_DisplayName, Resource = Resource_DisplayName, Decision, Justification
- Byli uživatelé označeni kvůli nečinnosti?
ReviewInstanceDecisionItems
| where Insights contains "inactive"
| project User = Principal_DisplayName, Resource = Resource_DisplayName, Insights, Decision
- Datum odebrání přístupu a odůvodnění ztráty přístupu
ReviewInstanceDecisionItems
| where Decision == "Deny"
| project User = Principal_DisplayName, Resource=Resource_DisplayName, AccessRemovalDate = AppliedDateTime, Reason = Justification
- Uživatelé bez rozhodnutí.
ReviewInstanceDecisionItems
| where Decision == "NotReviewed"
| project User = Principal_DisplayName, Resource=Resource_DisplayName
- Recenze bez revidujících
ReviewInstances
| join kind=leftanti (
ReviewInstanceContactedReviewers
| summarize by AccessReviewInstanceId
) on $left.ReviewInstanceId == $right.AccessReviewInstanceId
- Recenze bez uživatelů
ReviewInstances
| join kind=leftanti (
ReviewInstanceDecisionItems
| summarize by AccessReviewInstanceId
) on $left.ReviewInstanceId == $right.AccessReviewInstanceId
Kontrola rozhodovacích dat
- Rozhodnutí: Schváleno, Zamítnuto nebo Beze změny.
ReviewInstanceDecisionItems
| summarize count() by Decision
- Počet schválených nebo odepřených uživatelů.
ReviewInstanceDecisionItems
| summarize ApprovedCount = countif(Decision == "Approve"), DeniedCount = countif(Decision == "Deny")
- Byly zdokumentované důvody schválení?
ReviewInstanceDecisionItems
| where Decision == "Approve" and isnotempty(Justification)
| summarize count() by ReviewedBy_DisplayName
Kontrola kvality přístupu a kontroly dodržování předpisů
- Zvažovaly se odvolání přístupu pro neaktivní uživatele?
ReviewInstanceDecisionItems
| where Insights contains "inactive" and Decision == "Deny"
| project User = Principal_DisplayName, Decision
- Byl nějaký přístup, který nebyl správně odstraněn?
ReviewInstanceDecisionItems
| where ApplyResult != "New" and ApplyResult != "AppliedSuccessfully"
- Zdokumentovali kontroloři svá rozhodnutí?
ReviewInstanceDecisionItems
| where isnotempty(Justification)
| summarize count() by ReviewedBy_DisplayName
- Byly komentáře zachyceny pro každého uživatele?
ReviewInstanceDecisionItems
| where isnotempty(Justification)
| project User = Principal_DisplayName, Resource = Resource_DisplayName, Comments = Justification
Nastavení průběžných importů
Tento návod ukazuje jednorázový proces extrakce, transformace a načítání dat (ETL) pro naplnění Azure Data Exploreru jedním snímkem dat pro účely generování sestav. Pokud chcete průběžně hlásit nebo porovnat změny v průběhu času, můžete automatizovat proces naplnění Azure Data Exploreru z Microsoft Entra, aby vaše databáze nadále měla aktuální data.
K hostování skriptů PowerShellu potřebných k extrahování dat z ID Microsoft Entra a zásad správného řízení ID Microsoft Entra můžete použít Azure Automation, cloudovou službu Azure. Další informace najdete v Automatizace úkolů správy Microsoft Entra ID pomocí služby Azure Automation.
K přenesení dat a naplnění již existující tabulky můžete použít také funkce Azure nebo nástroje příkazového řádku, jako jsou lightingest
. Další informace najdete v tématu použití funkce LightIngest k ingestování dat do Azure Data Exploreru.
Pokud například chcete načíst soubor EntraAccessPackages.json
v aktuálním adresáři do tabulky EntraAccessPackages
jako aktuálně přihlášený uživatel:
az login
LightIngest.exe "https://ingest-CLUSTERHOSTNAME;Fed=True" -database:"DATABASE" -table:EntraAccessPackages -sourcepath:"." -pattern:"EntraAccessPackages.json" -format:multijson -azcli:true
Dotazování dat ve službě Azure Monitor
Pokud do služby Azure Monitor odesíláte protokoly auditu, přihlášení nebo jiné protokoly Microsoft Entra, můžete tyto protokoly začlenit do dotazů z pracovního prostoru služby Azure Monitor Log Analytics. Další informace o vztahu služby Azure Monitor a Azure Data Exploreru najdete v tématu Dotazování dat ve službě Azure Monitor pomocí Azure Data Exploreru.
Přihlaste se do Centra pro správu Microsoft Entra.
Vyberte nastavení diagnostiky.
Vyberte pracoviště Log Analytics, kam odesíláte protokoly.
V přehledu pracovního prostoru služby Log Analytics si poznamenejte ID předplatného, název skupiny prostředků a název pracovního prostoru.
Přihlaste se k webu Azure Portal.
Přejděte na webové uživatelské rozhraní Azure Data Explorer .
Ujistěte se, že je uvedený cluster Azure Data Exploreru.
Vyberte , poté Přidat, a pak Připojení.
V okně Přidat připojení zadejte adresu URL pracovního prostoru služby Log Analytics, který se vytvoří z názvu hostitele specifického pro cloud, ID předplatného, názvu skupiny prostředků a názvu pracovního prostoru služby Azure Monitor Log Analytics, jak je popsáno v tématu Přidání pracovního prostoru služby Log Analytics.
Po navázání připojení se váš pracovní prostor služby Log Analytics zobrazí v levém podokně s nativním clusterem Azure Data Exploreru.
V nabídce vlevo vyberte Dotaza vyberte cluster Azure Data Exploreru.
V podokně dotazu pak můžete odkazovat na tabulky služby Azure Monitor obsahující protokoly Microsoft Entra v dotazech Azure Data Exploreru. Například:
let CL1 = 'https://ade.loganalytics.io/subscriptions/*subscriptionid*/resourcegroups/*resourcegroupname*/providers/microsoft.operationalinsights/workspaces/*workspacename*'; cluster(CL1).database('*workspacename*').AuditLogs | where Category == "EntitlementManagement" and OperationName == "Fulfill access package assignment request" | mv-expand TargetResources | where TargetResources.type == 'AccessPackage' | project ActivityDateTime,APID = toguid(TargetResources.id) | join EntraAccessPackage on $left.APID == $right.Id | limit 100
Přenesení dat z jiných zdrojů
Můžete také vytvořit další tabulky v Azure Data Exploreru pro příjem dat z jiných zdrojů. Pokud jsou data v souboru JSON, podobně jako v uvedených příkladech výše, nebo v souboru CSV, můžete tabulku vytvořit v okamžiku, kdy poprvé získáte data ze souboru. Jedna z tabulek je vytvořená, můžete také použít LightIngest k ingestování dat do Azure Data Exploreru ze souboru JSON nebo CSV.
Další informace o příjmu dat najdete v tématu přehledu příjmu dat v Azure Data Exploreru.
Příklad 5: Kombinujte přiřazení aplikací z Entra a z druhého zdroje, abyste vytvořili sestavu všech uživatelů, kteří měli přístup k aplikaci mezi dvěma daty.
Tato zpráva předvádí, jak lze kombinovat data ze dvou samostatných systémů k vytvoření vlastních sestav v Azure Data Exploreru. Agreguje data o uživatelích, jejich rolích a dalších atributech ze dvou systémů do sjednoceného formátu pro analýzu nebo vytváření sestav.
V tomto příkladu se předpokládá, že existuje tabulka s názvem salesforceAssignments
se sloupci UserName
, Name
, EmployeeId
, Department
, JobTitle
, AppName
, Role
a CreatedDateTime
naplněnými přenesením dat z jiné aplikace.
// Define the date range and service principal ID for the query
let startDate = datetime("2023-06-01");
let endDate = datetime("2024-03-13");
let servicePrincipalId = "<your service principal-id>";
// Pre-process AppRoleAssignments with specific filters and projections
let processedAppRoleAssignments = AppRoleAssignments
| where ResourceId == servicePrincipalId and todatetime(CreatedDateTime) between (startDate .. endDate)
| extend AppRoleId = tostring(AppRoleId)
| project PrincipalId, AppRoleId, CreatedDateTime, ResourceDisplayName; // Exclude DeletedDateTime and keep ResourceDisplayName
// Pre-process AppRoles to get RoleDisplayName for each role
let processedAppRoles = AppRoles
| mvexpand AppRoles
| project AppRoleId = tostring(AppRoles.Id), RoleDisplayName = tostring(AppRoles.DisplayName);
// Main query: Process EntraUsers by joining with processed role assignments and roles
EntraUsers
| join kind=inner processedAppRoleAssignments on $left.ObjectID == $right.PrincipalId // Join with role assignments
| join kind=inner processedAppRoles on $left.AppRoleId == $right.AppRoleId // Join with roles to get display names
// Summarize to get the latest record for each unique combination of user and role attributes
| summarize arg_max(AccountEnabled, *) by UserPrincipalName, DisplayName, tostring(EmployeeId), Department, JobTitle, ResourceDisplayName, RoleDisplayName, CreatedDateTime
// Final projection of relevant fields including source indicator and report date
| project UserPrincipalName, DisplayName, EmployeeId=tostring(EmployeeId), Department, JobTitle, AccountEnabled=tostring(AccountEnabled), ResourceDisplayName, RoleDisplayName, CreatedDateTime, Source="EntraUsers", ReportDate = now()
// Union with processed salesforceAssignments to create a combined report
| union (
salesforceAssignments
// Project fields from salesforceAssignments to align with the EntraUsers data structure
| project UserPrincipalName = UserName, DisplayName = Name, EmployeeId = tostring(EmployeeId), Department, JobTitle, AccountEnabled = "N/A", ResourceDisplayName = AppName, RoleDisplayName = Role, CreatedDateTime, Source = "salesforceAssignments", ReportDate = now()
)