Samouczek: dostosowywanie raportów w usłudze Azure Data Explorer przy użyciu danych z firmy Microsoft Entra
Z tego samouczka dowiesz się, jak tworzyć dostosowane raporty w usłudze Azure Data Explorer (ADX) przy użyciu danych z usług Microsoft Entra ID i Microsoft Entra ID Governance. Ten samouczek uzupełnia inne opcje raportowania, takie jak Archive & report with Azure Monitor and entitlement management, który koncentruje się na eksportowaniu dziennika inspekcji do usługi Azure Monitor na potrzeby przechowywania i analizy. Dla porównania eksportowanie danych identyfikatora Entra firmy Microsoft do usługi Azure Data Explorer zapewnia elastyczność tworzenia niestandardowych raportów na obiektach Entra firmy Microsoft, w tym obiektów historycznych i usuniętych. Ponadto korzystanie z usługi Azure Data Explorer umożliwia agregację danych z dodatkowych źródeł z dużą skalowalnością, elastycznym schematem i zasadami przechowywania. Usługa Azure Data Explorer jest szczególnie przydatna, gdy musisz przechowywać dane dostępu przez lata, wykonywać badania ad hoc lub uruchamiać zapytania niestandardowe dotyczące danych dostępu użytkowników.
W tym artykule pokazano, jak pokazać konfigurację, użytkowników i prawa dostępu wyeksportowane z firmy Microsoft Entra wraz z danymi wyeksportowanymi z innych źródeł, takimi jak aplikacje z prawami dostępu do własnych baz danych SQL. Następnie możesz użyć języka Kusto Query Language (KQL) w usłudze Azure Data Explorer do tworzenia niestandardowych raportów na podstawie wymagań organizacji.
Aby utworzyć te raporty, wykonaj następujące czynności:
- Skonfiguruj usługę Azure Data Explorer w subskrypcji platformy Azure lub utwórz bezpłatny klaster.
- Wyodrębnij dane z Microsoft Entra ID przy użyciu skryptów PowerShell i Microsoft Graph.
- Utwórz tabele i zaimportuj te dane z identyfikatora Entra firmy Microsoft do usługi Azure Data Explorer.
- Wyodrębnij dane z Microsoft Entra ID Governance.
- Utwórz tabele i zaimportuj te dane z usługi Microsoft Entra ID Governance do usługi Azure Data Explorer.
- Skompiluj zapytanie niestandardowe przy użyciu język zapytań Kusto.
Po ukończeniu tego samouczka będziesz mieć możliwość tworzenia dostosowanych widoków praw dostępu i uprawnień użytkowników. Te widoki obejmują różne aplikacje przy użyciu narzędzi obsługiwanych przez firmę Microsoft. Możesz również wprowadzać dane z baz danych lub aplikacji innych firm w celu raportowania tych danych.
Wymagania wstępne
Jeśli dopiero zaczynasz korzystać z usługi Azure Data Explorer i chcesz poznać scenariusze przedstawione w tym artykule, możesz uzyskać bezpłatny klaster usługi Azure Data Explorer. W przypadku użycia w środowisku produkcyjnym z umową dotyczącą poziomu usług dla usługi Azure Data Explorer potrzebna jest subskrypcja platformy Azure do hostowania pełnego klastra usługi Azure Data Explorer.
Określ, jakie dane mają zostać uwzględnione w raportach. Skrypty w tym artykule zawierają przykłady z określonymi danymi od użytkowników, grup i aplikacji firmy Microsoft Entra. Te przykłady mają na celu zilustrowanie typów raportów, które można wygenerować przy użyciu tego podejścia, ale konkretne potrzeby raportowania mogą się różnić i wymagać różnych lub dodatkowych danych. Możesz zacząć od tych obiektów i wprowadzać więcej rodzajów obiektów Microsoft Entra w czasie.
- W tym artykule przedstawiono pobieranie danych z firmy Microsoft Entra jako zalogowanego użytkownika. W tym celu upewnij się, że masz wymagane przypisania ról do pobierania danych z firmy Microsoft Entra. Potrzebujesz ról z odpowiednimi uprawnieniami, aby wyeksportować typ danych firmy Microsoft Entra, z którym chcesz pracować.
- Dane użytkownika: administrator globalny, administrator ról uprzywilejowanych, administrator użytkowników
- Dane grup: administrator globalny, administrator ról uprzywilejowanych, administrator grupy
- Przypisania ról aplikacji: administrator globalny, administrator ról uprzywilejowanych, administrator aplikacji, administrator aplikacji, administrator aplikacji w chmurze
- Program Microsoft Graph PowerShell musi wyrazić zgodę na umożliwienie pobierania obiektów Microsoft Entra za pośrednictwem programu Microsoft Graph. Przykłady w tym samouczku wymagają delegowanych uprawnień User.Read.All, Group.Read.All, Application.Read.All i Directory.Read.All. Jeśli planujesz pobieranie danych przy użyciu automatyzacji bez zalogowanego użytkownika, zamiast tego wyrażasz zgodę na odpowiednie uprawnienia aplikacji. Aby uzyskać dodatkowe informacje, zobacz Dokumentacja uprawnień programu Microsoft Graph. Jeśli program Microsoft Graph PowerShell nie wyraził jeszcze zgody na te uprawnienia, musisz być administratorem globalnym, aby wykonać tę operację zgody.
- Ten samouczek nie ilustruje niestandardowych atrybutów zabezpieczeń. Domyślnie administrator globalny i inne role administratora nie zawierają uprawnień do odczytywania niestandardowych atrybutów zabezpieczeń od użytkowników firmy Microsoft Entra. Jeśli planujesz pobieranie niestandardowych atrybutów zabezpieczeń, może być wymagana większa liczbę ról i uprawnień.
- Na komputerze, na którym zainstalowano Microsoft Graph PowerShell, upewnij się, że masz uprawnienia do zapisu w katalogu systemu plików. W tym miejscu instalujesz wymagane moduły programu Microsoft Graph PowerShell i miejsce zapisywania wyeksportowanych danych firmy Microsoft Entra.
- Upewnij się, że masz uprawnienia do pobierania danych z innych źródeł danych poza firmą Microsoft Entra, jeśli chcesz również dołączyć te dane do usługi Azure Data Explorer.
1: Konfigurowanie usługi Azure Data Explorer
Jeśli wcześniej nie użyto usługi Azure Data Explorer, musisz najpierw skonfigurować tę funkcję. Możesz utworzyć bezpłatny klaster bez subskrypcji platformy Azure lub karty kredytowej lub pełnego klastra, który wymaga subskrypcji platformy Azure. Zobacz Szybki start: tworzenie klastra i bazy danych usługi Azure Data Explorer, aby rozpocząć pracę.
2. Wyodrębnianie danych Microsoft Entra ID za pomocą programu PowerShell
W tej sekcji zainstalujesz moduły Microsoft Graph PowerShell i w PowerShell nawiążesz połączenie z Microsoft Graph w celu wyodrębnienia danych Microsoft Entra ID.
Jeśli Twoja organizacja używa tych modułów w tym scenariuszu po raz pierwszy, musisz pełnić rolę administratora globalnego, aby umożliwić programowi Microsoft Graph PowerShell udzielenie zgody do używania w dzierżawie. Kolejne interakcje mogą używać roli z niższymi uprawnieniami.
- Otwórz program PowerShell.
- Jeśli nie masz już zainstalowanych wszystkich modułów programu Microsoft Graph PowerShell , zainstaluj wymagane moduły programu Microsoft Graph. Następujące moduły są wymagane w tej sekcji samouczka:
Microsoft.Graph.Authentication
,Microsoft.Graph.Users
,Microsoft.Graph.Groups
,Microsoft.Graph.Applications
,Microsoft.Graph.DirectoryObjects
. Jeśli masz już zainstalowane te moduły, przejdź do następnego kroku.
$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
}
- Zaimportuj moduły do bieżącej sesji programu PowerShell.
$modules = @('Microsoft.Graph.Users', 'Microsoft.Graph.Groups', 'Microsoft.Graph.Applications', 'Microsoft.Graph.DirectoryObjects')
foreach ($module in $modules) {
Import-Module -Name $module
}
- Nawiązywanie połączenia z programem Microsoft Graph. W tej sekcji samouczka przedstawiono odczytywanie zakresów uprawnień użytkowników, grup i aplikacji, dlatego wymagane są zakresy uprawnień
User.Read.All
,Group.Read.All
,Application.Read.All
iDirectory.Read.All
. Aby uzyskać więcej informacji na temat uprawnień, zobacz Dokumentacja uprawnień programu Microsoft Graph.
Connect-MgGraph -Scopes "User.Read.All", "Group.Read.All", "Application.Read.All", "Directory.Read.All" -ContextScope Process -NoWelcome
To polecenie wyświetla monit o zalogowanie się przy użyciu poświadczeń Microsoft Entra. Po zalogowaniu może być konieczne wyrażenie zgody na wymagane uprawnienia, jeśli jest to pierwsze połączenie lub jeśli są wymagane nowe uprawnienia.
Zapytania programu PowerShell do wyodrębniania danych z identyfikatora Microsoft Entra ID potrzebnych do tworzenia niestandardowych raportów w Azure Data Explorer.
Następujące zapytania wyodrębniają dane microsoft Entra ID z programu Microsoft Graph przy użyciu programu PowerShell i eksportują dane do plików JSON importowanych do usługi Azure Data Explorer w kolejnej sekcji 3. Może istnieć wiele scenariuszy generowania raportów z tego typu danymi, w tym:
- Audytor chce zobaczyć raport zawierający listę członków grupy dla 10 grup zorganizowanych przez dział członków.
- Audytor chce zobaczyć raport wszystkich użytkowników, którzy mieli dostęp do aplikacji między dwoma datami.
Możesz również przenieść dane do usługi Azure Data Explorer z innych źródeł poza firmą Microsoft Entra. Umożliwia to wykonywanie takich scenariuszy jak:
- Administrator chce wyświetlić wszystkich użytkowników dodanych do aplikacji z identyfikatora Microsoft Entra ID i ich praw dostępu do własnego repozytorium aplikacji, takich jak bazy danych SQL.
Te typy raportów nie są wbudowane w Microsoft Entra ID. Możesz jednak samodzielnie tworzyć te raporty, wyodrębniając dane z usługi Entra i łącząc je przy użyciu zapytań niestandardowych w usłudze Azure Data Explorer. Zostanie to omówione w dalszej części samouczka, w sekcji wprowadzenie danych z innych źródeł.
Na potrzeby tego samouczka wyodrębniamy dane identyfikatora Entra firmy Microsoft z kilku obszarów:
- Informacje o użytkowniku, takie jak nazwa wyświetlana, nazwa UPN i szczegóły zadania
- Informacje o grupach, w tym ich członkostwa
- Przypisania aplikacji i ról aplikacji
Ten zestaw danych umożliwia wykonywanie szerokiego zestawu zapytań dotyczących osób, które miały dostęp do aplikacji, wraz z informacjami o roli aplikacji i skojarzonym przedziałem czasu. Należy pamiętać, że są to przykładowe zapytania, a dane i określone wymagania mogą się różnić od przedstawionych tutaj.
Uwaga
Więksi najemcy mogą napotkać błędy ograniczania przepustowości / 429, które są obsługiwane przez moduł Microsoft Graph. Usługa Azure Data Explorer może również ograniczyć rozmiary przekazywania plików.
W tych skryptach programu PowerShell eksportujemy wybrane właściwości z obiektów Microsoft Entra do plików JSON. Dane z tych wyeksportowanych właściwości są używane do generowania niestandardowych raportów w usłudze Azure Data Explorer. Poniższe właściwości zostały uwzględnione w tych przykładach, ponieważ używamy tych danych do zilustrowania typów raportów, które można utworzyć w usłudze Azure Data Explorer. Ponieważ konkretne potrzeby raportowania mogą różnić się od przedstawionych, należy uwzględnić w tych skryptach określone właściwości, które chcesz zobaczyć w raportach. Można jednak postępować zgodnie z tym samym wzorcem, aby ułatwić tworzenie skryptów.
Wybierz datę migawki
Dołączyliśmy zakodowany datę migawki, która identyfikuje dane w pliku JSON z określoną datą i umożliwia śledzenie podobnych zestawów danych w czasie w usłudze Azure Data Explorer. Data migawki jest również przydatna do porównywania zmian danych między dwiema datami migawki.
$SnapshotDate = Get-Date -AsUTC -Format "yyyy-MM-dd"
Pobieranie danych użytkownika entra
Ten skrypt eksportuje wybrane właściwości z obiektu użytkownika Entra do pliku JSON. Zaimportujemy te i dodatkowe dane z innych plików JSON do usługi Azure Data Explorer w kolejnej sekcji tego samouczka.
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
Pobieranie danych grupy
Wygeneruj plik JSON z nazwami grup i identyfikatorami używanymi do tworzenia widoków niestandardowych w usłudze Azure Data Explorer. Przykład zawiera wszystkie grupy, ale w razie potrzeby można uwzględnić dodatkowe filtrowanie. Jeśli filtrujesz w celu uwzględnienia tylko niektórych grup, możesz uwzględnić logikę w skry skrycie, aby sprawdzić grupy zagnieżdżone.
# 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"
Pobieranie danych członkostwa w grupie
Wygeneruj plik JSON z członkostwem w grupie, który służy do tworzenia widoków niestandardowych w usłudze Azure Data Explorer. Przykład zawiera wszystkie grupy, ale w razie potrzeby można uwzględnić dodatkowe filtrowanie.
# 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"
Pobieranie danych aplikacji i jednostki usługi
Generuje plik JSON ze wszystkimi aplikacjami i odpowiednimi jednostkami usługi w dzierżawie. Zaimportujemy te dane do usługi Azure Data Explorer w kolejnej sekcji tego samouczka, która umożliwia generowanie niestandardowych raportów powiązanych z aplikacjami na podstawie tych danych.
# 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"
Pobieranie danych approle
Wygeneruj plik JSON wszystkich aplikacji appRoles dla przedsiębiorstw w usłudze Microsoft Entra. Po zaimportowaniu do usługi Azure Data Explorer użyjemy tych danych do generowania raportów dotyczących przypisań ról aplikacji dla użytkowników.
# 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'
Pobieranie danych przypisania approle
Wygeneruj plik JSON z wszystkimi przypisaniami ról aplikacji użytkowników w dzierżawie.
$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. Tworzenie tabel i importowanie plików JSON z danymi z identyfikatora Entra firmy Microsoft do usługi Azure Data Explorer
W tej sekcji zaimportujemy nowo utworzone pliki JSON dla usług Microsoft Entra ID jako tabele w usłudze Azure Data Explorer w celu dalszej analizy. Podczas pierwszego importowania przy użyciu internetowego interfejsu użytkownika usługi Azure Data Explorer utworzysz tabele na podstawie schematu sugerowanego przez internetowy interfejs użytkownika z każdego pliku JSON.
Po skonfigurowaniu bazy danych w klastrze usługi Azure Data Explorer lub w bezpłatnym klastrze, zgodnie z opisem w pierwszej sekcji tego artykułu, przejdź do tej bazy danych.
- Zaloguj się do internetowego interfejsu WWW usługi Azure Data Explorer .
- W menu po lewej stronie wybierz pozycję Zapytanie.
Następnie wykonaj następujące kroki dla każdego wyeksportowanego pliku JSON, aby pobrać wyeksportowane dane do tej bazy danych usługi Azure Data Explorer jako nową tabelę.
Wybierz prawym przyciskiem myszy nazwę bazy danych, w której chcesz pozyskać dane. Wybierz Pobierz dane.
Wybierz źródło danych z listy dostępnych. W tym samouczku dane są pozyskiwane z pliku lokalnego.
Wybierz pozycję + Nowa tabela i wprowadź nazwę tabeli na podstawie nazwy importowanych plików JSON, na przykład jeśli importujesz EntraUsers.json, nadaj tabeli nazwę EntraUsers. Po pierwszym zaimportowaniu tabela już istnieje i możesz wybrać ją jako tabelę docelową na potrzeby kolejnego importu.
Wybierz Przeglądaj pliki, wybierz plik JSON, a następnie wybierz Dalej.
Usługa Azure Data Explorer automatycznie wykrywa schemat i udostępnia podgląd na karcie Inspekcja. Wybierz opcję Zakończ, aby utworzyć tabelę i zaimportować dane z tego pliku. Po pozyskaniu danych kliknij Zamknij.
Powtórz każde z poprzednich kroków dla każdego z plików JSON wygenerowanych w poprzedniej sekcji.
Na końcu tych kroków będziesz mieć tabele EntraUsers
, EntraGroups
, EntraGroupMembership
, Applications
, AppRoles
i AppRoleAssignments
w bazie danych.
4. Wyodrębnianie danych Microsoft Entra ID Governance za pomocą PowerShell
W tej sekcji użyjesz programu PowerShell, aby wyodrębnić dane z usług Microsoft Entra ID Governance. Jeśli nie masz Microsoft Entra ID Governance, Microsoft Entra ID P2 lub Microsoft Entra Suite, następnie przejdź do sekcji i użyj usługi Azure Data Explorer, aby tworzyć niestandardowe raporty.
W tym celu może być konieczne zainstalowanie modułów programu Microsoft Graph PowerShell, aby wyodrębnić dane zarządzania Microsoft Entra ID. Jeśli Twoja organizacja używa tych modułów w tym scenariuszu po raz pierwszy, musisz pełnić rolę administratora globalnego, aby umożliwić programowi Microsoft Graph PowerShell udzielenie zgody do używania w dzierżawie. Kolejne interakcje mogą używać roli z niższymi uprawnieniami.
- Otwórz program PowerShell.
- Jeśli nie masz już zainstalowanych wszystkich modułów programu Microsoft Graph PowerShell , zainstaluj wymagane moduły programu Microsoft Graph. Następujące moduły są wymagane w tej sekcji samouczka:
Microsoft.Graph.Identity.Governance
. Jeśli masz już zainstalowane te moduły, przejdź do następnego kroku.
$modules = @('Microsoft.Graph.Identity.Governance')
foreach ($module in $modules) {
Install-Module -Name $module -Scope CurrentUser -AllowClobber -Force
}
- Zaimportuj moduły do bieżącej sesji programu PowerShell.
$modules = @('Microsoft.Graph.Identity.Governance')
foreach ($module in $modules) {
Import-Module -Name $module
}
- Nawiązywanie połączenia z programem Microsoft Graph. W tej sekcji samouczka przedstawiono pobieranie danych z zarządzania upoważnieniami i przeglądów dostępu, dlatego wymaga zakresów uprawnień
AccessReview.Read.All
iEntitlementManagement.Read.All
. W przypadku innych przypadków użycia raportowania, takich jak przepływy pracy PIM lub przepływy cyklu życia, zaktualizuj parametrScopes
z niezbędnymi uprawnieniami. Aby uzyskać więcej informacji na temat uprawnień, zobacz Dokumentacja uprawnień programu Microsoft Graph.
Connect-MgGraph -Scopes "AccessReview.Read.All, EntitlementManagement.Read.All" -ContextScope Process -NoWelcome
To polecenie wyświetla monit o zalogowanie się przy użyciu poświadczeń Microsoft Entra. Po zalogowaniu może być konieczne wyrażenie zgody na wymagane uprawnienia, jeśli jest to pierwsze połączenie lub jeśli są wymagane nowe uprawnienia.
Zapytania programu PowerShell służące do eksportowania danych Microsoft Entra ID Governance potrzebnych do tworzenia niestandardowych raportów w usłudze Azure Data Explorer.
Możesz użyć zapytań do wyodrębniania danych z Microsoft Entra ID Governance za pomocą Microsoft Graph przy użyciu PowerShell, a następnie eksportować dane do plików JSON, które w kolejnej części są importowane do usługi Azure Data Explorer. Może istnieć wiele scenariuszy generowania raportów z tego typu danymi, w tym:
- raportowanie historycznych przeglądów dostępu
- raportowanie zadań poprzez zarządzanie uprawnieniami
Uzyskaj dostęp do danych definicji harmonogramu przeglądu
Wygeneruj plik JSON z nazwami definicji przeglądu dostępu i identyfikatorami używanymi do tworzenia widoków niestandardowych w usłudze Azure Data Explorer. Przykład zawiera wszystkie przeglądy dostępu, ale w razie potrzeby można uwzględnić dodatkowe filtrowanie. Aby uzyskać więcej informacji, zobacz użyć parametru zapytania 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"
Pobieranie danych pakietu dostępu do zarządzania upoważnieniami
Wygeneruj plik JSON z nazwami pakietów dostępu i identyfikatorami używanymi do tworzenia widoków niestandardowych w usłudze Azure Data Explorer. Przykład zawiera wszystkie pakiety dostępu, ale w razie potrzeby można uwzględnić dodatkowe filtrowanie.
$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"
Pobieranie danych przypisania pakietu dostępu do zarządzania upoważnieniami
Wygeneruj plik JSON z przypisaniami, aby uzyskać dostęp do pakietów używanych do tworzenia widoków niestandardowych w usłudze Azure Data Explorer. Przykład zawiera wszystkie dostarczone zadania, ale w razie potrzeby można uwzględnić dodatkowe filtrowanie.
$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. Tworzenie tabel i importowanie plików JSON z danymi z usługi Microsoft Entra ID Governance do usługi Azure Data Explorer
W tej sekcji zaimportujemy nowo utworzone pliki JSON dla usług zarządzania identyfikatorami entra firmy Microsoft do usługi Azure Data Explorer wraz z danymi już zaimportowanymi dla usług Microsoft Entra ID w celu dalszej analizy. Podczas pierwszego importowania przy użyciu internetowego interfejsu użytkownika usługi Azure Data Explorer utworzysz tabele na podstawie schematu sugerowanego przez internetowy interfejs użytkownika z każdego pliku JSON.
W klastrze usługi Azure Data Explorer lub w bezpłatnym klastrze przejdź do bazy danych zawierającej dane identyfikatora Entra firmy Microsoft.
- Zaloguj się do internetowego interfejsu WWW usługi Azure Data Explorer .
- W menu po lewej stronie wybierz pozycję Zapytanie.
Następnie wykonaj następujące kroki dla każdego wyeksportowanego pliku JSON z poprzedniej sekcji, aby pobrać wyeksportowane dane do tej bazy danych usługi Azure Data Explorer jako nową tabelę.
Wybierz prawym przyciskiem myszy nazwę bazy danych, w której chcesz pozyskać dane. Wybierz Pobierz dane.
Wybierz źródło danych z listy dostępnych. W tym samouczku dane są pozyskiwane z pliku lokalnego.
Wybierz + Nowa tabela i wprowadź nazwę tabeli na podstawie nazwy importowanych plików JSON, po pierwszym zaimportowaniu tabela już istnieje i możesz wybrać ją jako tabelę docelową na potrzeby kolejnego importu.
Wybierz Przeglądaj pliki, wybierz plik JSON, a następnie wybierz Dalej.
Usługa Azure Data Explorer automatycznie wykrywa schemat i udostępnia podgląd na karcie Inspekcja. Wybierz opcję Zakończ, aby utworzyć tabelę i zaimportować dane z tego pliku. Po pozyskaniu danych kliknij Zamknij.
Powtórz każde z poprzednich kroków dla każdego z plików JSON wygenerowanych w poprzedniej sekcji.
Na końcu tych kroków będziesz mieć tabele EntraAccessReviewDefinitions
, EntraAccessPackages
i EntraAccessPackageAssignments
w bazie danych, oprócz tabel utworzonych w sekcji 3.
6. Tworzenie niestandardowych raportów przy użyciu usługi Azure Data Explorer
Gdy dane są teraz dostępne w usłudze Azure Data Explorer, możesz rozpocząć tworzenie dostosowanych raportów na podstawie wymagań biznesowych.
Azure Data Explorer to zaawansowane narzędzie do analizy danych, które jest wysoce skalowalne i elastyczne, zapewniając idealne środowisko do generowania dostosowanych raportów dostępu użytkowników. Usługa Azure Data Explorer używa języka zapytań Kusto (KQL).
- Zaloguj się do internetowego interfejsu WWW usługi Azure Data Explorer .
- W menu po lewej stronie wybierz pozycję Zapytanie.
Poniższe zapytania zawierają przykłady typowych raportów, ale można dostosować te raporty do własnych potrzeb i tworzyć dodatkowe raporty.
Możesz również wyświetlić raporty w programie Excel, wybierając kartę Eksportuj, a następnie wybierając Otwórz w programie Excel.
Przykład 1. Generowanie przypisań ról aplikacji dla przypisań bezpośrednich i grup dla określonej daty migawki
Ten raport zawiera informacje o tym, kto miał dostęp i kiedy ma dostęp do aplikacji docelowej oraz może służyć do inspekcji zabezpieczeń, weryfikacji zgodności i zrozumienia wzorców dostępu w organizacji.
To zapytanie dotyczy określonej aplikacji w usłudze Microsoft Entra AD i analizuje przypisania ról od określonej daty. Zapytanie pobiera przypisania ról zarówno bezpośrednich, jak i opartych na grupach, łącząc te dane z danymi użytkownika z tabeli EntraUsers
oraz informacjami o rolach z tabeli AppRoles
. W poniższym zapytaniu ustaw wartość targetSnapshotDate
na snapshotDate
, która była użyta podczas ładowania danych.
/// 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
Przykład 2. Tworzenie podstawowego raportu audytora przy użyciu danych Entra pokazujących, kto miał dostęp do aplikacji między tymi dwoma datami
Ten raport zawiera informacje o tym, kto miał dostęp do aplikacji docelowej między dwiema datami i może być używany do inspekcji zabezpieczeń, weryfikacji zgodności i zrozumienia wzorców dostępu w organizacji.
To zapytanie dotyczy określonej aplikacji w ramach identyfikatora Entra firmy Microsoft i analizuje przypisania ról między dwiema datami. Zapytanie pobiera bezpośrednie przypisania ról z tabeli AppRoleAssignments
i scala te dane ze szczegółami użytkownika z tabeli EntraUsers
i informacji o roli z tabeli 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()
Przykład 3. Pobieranie użytkowników do aplikacji między dwiema datami migawki danych
Te raporty zapewniają widok, dla których użytkownicy otrzymali przypisanie roli aplikacji do aplikacji docelowej między dwiema datami. Te raporty mogą służyć do śledzenia zmian dostępu do aplikacji w czasie.
To zapytanie dotyczy określonej aplikacji w ramach identyfikatora Entra firmy Microsoft i zmienia przypisanie ról między datą początkową a końcową.
// 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"
Konfigurowanie bieżących importów
W tym samouczku przedstawiono jednorazowy proces wyodrębniania, przekształcania i ładowania danych (ETL) w celu wypełnienia Azure Data Explorer jedną migawką na potrzeby raportowania. W przypadku ciągłego raportowania lub porównywania zmian w czasie możesz zautomatyzować proces wypełniania usługi Azure Data Explorer z witryny Microsoft Entra, aby baza danych nadal miała bieżące dane.
Do hostowania skryptów programu PowerShell potrzebnych do wyodrębnienia danych z usługi Microsoft Entra ID i Zarządzania Microsoft Entra ID można użyć usługi Azure Automation, usługi w chmurze Azure. Aby uzyskać więcej informacji, zobacz Automatyzacja zadań zarządzania tożsamościami Microsoft Entra ID za pomocą Azure Automation.
Możesz również użyć funkcji platformy Azure lub narzędzi wiersza polecenia, takich jak lightingest
, aby wprowadzić dane i wypełnić już istniejącą tabelę. Aby uzyskać więcej informacji, zobacz użyć narzędzia LightIngest do pozyskiwania danych do usługi Azure Data Explorer.
Aby na przykład załadować plik EntraAccessPackages.json
w bieżącym katalogu do tabeli EntraAccessPackages
jako aktualnie zalogowany użytkownik:
az login
LightIngest.exe "https://ingest-CLUSTERHOSTNAME;Fed=True" -database:"DATABASE" -table:EntraAccessPackages -sourcepath:"." -pattern:"EntraAccessPackages.json" -format:multijson -azcli:true
Wykonywanie zapytań dotyczących danych w usłudze Azure Monitor
Jeśli wysyłasz dzienniki inspekcji, logowania lub innych dzienników usługi Microsoft Entra do usługi Azure Monitor, możesz dołączyć te dzienniki z tego obszaru roboczego usługi Log Analytics usługi Azure Monitor w zapytaniach. Aby uzyskać więcej informacji na temat relacji usług Azure Monitor i Azure Data Explorer, zobacz
Zaloguj się do centrum administracyjnego firmy Microsoft Entra.
Wybierz ustawienia diagnostyczne.
Wybierz miejsce pracy usługi Log Analytics, w którym są wysyłane dzienniki.
W przeglądzie obszaru roboczego usługi Log Analytics zapisz identyfikator subskrypcji, nazwę grupy zasobów i nazwę obszaru roboczego.
Zaloguj się do witryny Azure Portal.
Przejdź do internetowego interfejsu użytkownika usługi Azure Data Explorer.
Upewnij się, że klaster usługi Azure Data Explorer znajduje się na liście.
Wybierz + Dodaj, a następnie Połączenie.
W oknie Dodaj połączenie wpisz adres URL do obszaru roboczego usługi Log Analytics utworzony na podstawie nazwy hosta specyficznego dla chmury, identyfikatora subskrypcji, nazwy grupy zasobów i nazwy obszaru roboczego obszaru roboczego usługi Log Analytics usługi Azure Monitor, zgodnie z opisem w Dodaj obszar roboczy usługi Log Analytics.
Po nawiązaniu połączenia obszar roboczy usługi Log Analytics pojawi się w okienku po lewej stronie z natywnym klastrem usługi Azure Data Explorer.
W menu po lewej stronie wybierz pozycję Zapytaniei wybierz klaster usługi Azure Data Explorer.
W okienku zapytania można następnie odwołać się do tabel usługi Azure Monitor zawierających dzienniki Microsoft Entra w zapytaniach do usługi Azure Data Explorer. Na przykład:
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
Wprowadzanie danych z innych źródeł
Możesz również utworzyć dodatkowe tabele w usłudze Azure Data Explorer w celu pozyskiwania danych z innych źródeł. Jeśli dane są w pliku JSON, podobnie jak w powyższych przykładach lub w pliku CSV, możesz utworzyć tabelę podczas pierwszej pobrać dane z pliku. Gdy tabela zostanie utworzona, można również użyć narzędzia LightIngest do wczytywania danych do usługi Azure Data Explorer z pliku JSON lub CSV.
Aby uzyskać więcej informacji na temat pozyskiwania danych, zobacz Omówienie pozyskiwania danych w usłudze Azure Data Explorer.
Przykład 4: Połącz przypisania aplikacji z Entra i drugiego źródła, aby stworzyć raport wszystkich użytkowników, którzy mieli dostęp do aplikacji między dwiema datami.
Ten raport ilustruje sposób łączenia danych z dwóch oddzielnych systemów w celu tworzenia niestandardowych raportów w usłudze Azure Data Explorer. Agreguje dane dotyczące użytkowników, ich ról i innych atrybutów z dwóch systemów w ujednolicony format analizy lub raportowania.
W tym przykładzie założono, że istnieje tabela o nazwie salesforceAssignments
z kolumnami UserName
, Name
, EmployeeId
, Department
, JobTitle
, AppName
, Role
i CreatedDateTime
, które zostały wypełnione przez wprowadzenie danych z innej aplikacji.
// 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()
)