이 자습서에서는 Microsoft Entra ID 및 Microsoft Entra ID 거버넌스 서비스의 데이터를 사용하여 Azure Data Explorer 사용자 지정된 보고서를 만드는 방법에 대해 알아봅니다.
이 자습서는 감사 로그를 보존 및 분석을 위해 Azure Monitor로 내보내는 데 중점을 둔 보관 및 보고, Azure Monitor 보고 옵션 및 권한 관리을 보완합니다. 이에 비해 Microsoft Entra ID 및 Microsoft Entra ID 거버넌스 데이터를 Azure Data Explorer로 내보내면 기록 및 삭제된 개체를 포함하여 Microsoft Entra 개체에 대한 사용자 지정 보고서를 유연하게 만들 수 있습니다.
Azure Data Explorer를 사용하여 Microsoft Entra ID 거버넌스 데이터에 대한 보고에 대한 간략한 개요를 제공하는 비디오는 다음과 같습니다.
또한 Azure Data Explorer를 사용하면 대규모 확장성, 유연한 스키마 및 보존 정책을 사용하여 추가 원본에서 데이터 집계를 수행할 수 있습니다. Azure Data Explorer는 수년 동안 사용자 액세스 데이터를 유지하거나, 임시 조사를 수행하거나, 액세스 데이터에 대한 사용자 지정 쿼리를 실행해야 하는 경우에 특히 유용합니다.
이 자습서에서는 Microsoft Entra에서 내보낸 구성, 사용자 및 액세스 권한을 자체 SQL 데이터베이스의 액세스 권한이 있는 애플리케이션과 같은 다른 원본에서 내보낸 데이터와 함께 표시하는 방법을 보여 줍니다. 그런 다음, Azure Data Explorer에서 KQL(Kusto Query Language)을 사용하여 조직의 요구 사항에 따라 사용자 지정 보고서를 작성할 수 있습니다.
이 자습서에서는 다음을 수행합니다.
- Azure 구독에서 Azure Data Explorer를 설정하거나 무료 클러스터를 만듭니다.
- PowerShell 스크립트 및 Microsoft Graph를 사용하여 Microsoft Entra ID에서 데이터를 추출합니다.
- 테이블을 만들고 Microsoft Entra ID에서 Azure Data Explorer로 데이터를 가져옵니다.
- Microsoft Entra ID 거버넌스에서 데이터를 추출합니다.
- 테이블을 만들고 Microsoft Entra ID 거버넌스에서 Azure Data Explorer로 데이터를 가져옵니다.
- KQL을 사용하여 사용자 지정 쿼리를 빌드합니다.
- Azure Monitor에서 데이터를 쿼리합니다.
이 자습서를 마치면 사용자의 액세스 권한 및 권한에 대한 사용자 지정 보기를 개발할 수 있습니다. 이러한 보기는 Microsoft 지원 도구를 통해 여러 애플리케이션에 걸쳐 있습니다. Microsoft가 아닌 데이터베이스 또는 애플리케이션의 데이터를 가져와 해당 액세스 권한 및 사용 권한을 보고할 수도 있습니다.
필수 조건
Azure Data Explorer를 익숙하지 않은 경우 이 자습서에서 보여 주는 시나리오를 알아보려면 무료 Azure Data Explorer 클러스터얻을 수 있습니다. Azure Data Explorer에 대한 서비스 수준 계약에서 프로덕션 지원 사용을 위해 전체 Azure Data Explorer 클러스터를 호스트하려면 Azure 구독이 필요합니다.
보고서에 포함할 데이터를 결정합니다. 이 자습서의 스크립트는 Microsoft Entra의 사용자, 그룹 및 애플리케이션의 특정 데이터를 샘플에 제공합니다. 이러한 샘플에서는 이 방법을 사용하여 생성할 수 있는 보고서 유형을 보여 주지만 특정 보고 요구 사항은 다양하고 다른 데이터 또는 추가 데이터가 필요할 수 있습니다. 이러한 개체로 시작하고 시간이 지남에 따라 더 많은 종류의 Microsoft Entra 개체를 가져올 수 있습니다.
이 자습서에서는 로그인한 사용자로 Microsoft Entra에서 데이터를 검색하는 방법을 보여 줍니다. 이렇게 하려면 필요한 역할 할당이 있는지 확인합니다. 작업하려는 Microsoft Entra 데이터 형식을 내보내려면 적절한 권한이 있는 역할이 필요합니다.
- 사용자 데이터: 전역 관리자, 권한 있는 역할 관리자, 사용자 관리자
- 그룹 데이터: 전역 관리자, 권한 있는 역할 관리자, 그룹 관리자
- 애플리케이션 및 앱 역할 할당: 전역 관리자, 권한 있는 역할 관리자, 애플리케이션 관리자, 클라우드 애플리케이션 관리자
Microsoft Graph PowerShell은 Microsoft Graph를 통해 Microsoft Entra 개체를 검색하는 데 동의해야 합니다. 이 자습서의 예제에는 위임된
User.Read.All
,Group.Read.All
,Application.Read.All
및Directory.Read.All
권한이 필요합니다. 로그인한 사용자 없이 자동화를 사용하여 데이터를 검색하려는 경우 대신 해당 애플리케이션 권한에 동의하세요. 자세한 내용은 Microsoft Graph 사용 권한 참조를 참조하세요.해당 권한에 대한 Microsoft Graph PowerShell 동의를 아직 부여하지 않은 경우 이 동의 작업을 수행하려면 전역 관리자여야 합니다.
이 자습서에서는 사용자 지정 보안 특성을 보여 주지 않습니다. 기본적으로 전역 관리자 및 기타 관리자 역할에는 Microsoft Entra 사용자로부터 사용자 지정 보안 특성을 읽을 수 있는 권한이 포함되지 않습니다. 사용자 지정 보안 특성을 검색하려는 경우 더 많은 역할과 권한이 필요할 수 있습니다.
Microsoft Graph PowerShell이 설치된 컴퓨터에서 파일 시스템 디렉터리에 대한 쓰기 권한이 있는지 확인합니다. 이 디렉터리에서는 필요한 Microsoft Graph PowerShell 모듈을 설치하고 내보낸 Microsoft Entra 데이터가 저장되는 위치입니다.
해당 데이터를 Azure Data Explorer에 통합하려는 경우 Microsoft Entra 이외의 다른 데이터 원본에서 데이터를 검색할 수 있는 권한이 있는지 확인합니다.
Azure Data Explorer 설정
이전에 Azure Data Explorer를 사용하지 않은 경우 먼저 설정해야 합니다. Azure 구독 또는 신용 카드 없이무료 클러스터를 만들 수 있습니다. 또는 Azure 구독이 필요한 전체 클러스터를 만들 수 있습니다. 시작하려면 빠른 시작을 참조하세요. Azure Data Explorer 클러스터 및 데이터베이스만듭니다.
PowerShell을 사용하여 Microsoft Entra ID 데이터 추출
이 섹션에서는 Microsoft Graph PowerShell 모듈을 설치할있습니다. PowerShell에서는 Microsoft Graph 연결하여 Microsoft Entra ID 데이터를 추출할 있습니다.
조직에서 이 시나리오에 대해 이러한 모듈을 처음 사용하는 경우 Microsoft Graph PowerShell이 테넌트에서 사용하기 위한 동의를 부여할 수 있도록 전역 관리자 역할이 있어야 합니다. 후속 상호 작용은 더 낮은 권한의 역할을 사용할 수 있습니다.
PowerShell을 엽니다.
모든 Microsoft Graph PowerShell 모듈이 아직 설치되지 않은 경우에 필요한 Microsoft Graph 모듈을 설치하세요. 자습서의 이 섹션에는
Microsoft.Graph.Authentication
,Microsoft.Graph.Users
,Microsoft.Graph.Groups
,Microsoft.Graph.Applications
및Microsoft.Graph.DirectoryObjects
모듈이 필요합니다. 이러한 모듈이 이미 설치되어 있는 경우 이 단계를 건너뜁니다.$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 }
모듈을 현재 PowerShell 세션으로 가져옵니다.
$modules = @('Microsoft.Graph.Users', 'Microsoft.Graph.Groups', 'Microsoft.Graph.Applications', 'Microsoft.Graph.DirectoryObjects') foreach ($module in $modules) { Import-Module -Name $module }
Microsoft Graph에 연결합니다. 자습서의 이 섹션에서는 사용자, 그룹 및 애플리케이션을 읽는 방법을 보여 주므로
User.Read.All
,Group.Read.All
,Application.Read.All
및Directory.Read.All
권한 범위가 필요합니다. 사용 권한에 대한 자세한 내용은 Microsoft Graph 사용 권한 참조참조하세요.Connect-MgGraph -Scopes "User.Read.All", "Group.Read.All", "Application.Read.All", "Directory.Read.All" -ContextScope Process -NoWelcome
이 명령은 Microsoft Entra 자격 증명으로 로그인하라는 메시지를 표시합니다. 로그인한 후 처음 연결하는 경우 또는 새 권한이 필요한 경우 필요한 권한에 동의해야 할 수 있습니다.
사용자 지정 보고서에 대한 Microsoft Entra ID 데이터를 추출하는 PowerShell 쿼리
다음 쿼리는 PowerShell을 사용하여 Microsoft Graph에서 Microsoft Entra ID 데이터를 추출하고 데이터를 JSON 파일로 내보냅니다. 이 자습서 이후 섹션에서 해당 파일을 Azure Data Explorer로 가져옵니다.
이러한 유형의 데이터를 사용하여 보고서를 생성하는 시나리오는 다음과 같습니다.
- 감사자가 구성원 부서별로 구성된 10개 그룹의 그룹 구성원을 나열하는 보고서를 보고 싶어 합니다.
- 감사자는 두 날짜 사이에 애플리케이션에 액세스한 모든 사용자의 보고서를 보고 싶어 합니다.
Microsoft Entra 이외의 원본에서 Azure Data Explorer로 데이터를 가져올 수도 있습니다. 이 기능에 대한 시나리오는 다음과 같습니다.
- 관리자는 Microsoft Entra ID에서 애플리케이션에 추가된 모든 사용자와 SQL 데이터베이스와 같은 애플리케이션 자체 리포지토리의 액세스 권한을 보려고 합니다.
이러한 유형의 보고서는 Microsoft Entra ID에 기본 제공되지 않습니다. 그러나 Microsoft Entra ID에서 데이터를 추출하고 Azure Data Explorer에서 사용자 지정 쿼리를 사용하여 데이터를 결합하여 이러한 보고서를 직접 만들 수 있습니다. 이 자습서에서는 나중에 다른 원본의 데이터 가져오기 문서에서 이 프로세스를 다룹니다.
이 자습서에서는 다음 영역에서 Microsoft Entra ID 데이터를 추출합니다.
- 표시 이름, UPN 및 작업 세부 정보와 같은 사용자 정보
- 구성원 자격을 포함한 그룹 정보
- 응용 프로그램 및 응용 프로그램 역할의 할당
이 데이터 집합을 사용하면 애플리케이션 역할 정보 및 관련 기간과 함께 애플리케이션에 대한 액세스를 받은 사용자에 대한 광범위한 쿼리 집합을 수행할 수 있습니다. 이러한 쿼리는 샘플 쿼리이며 데이터 및 특정 요구 사항은 여기에 표시된 것과 다를 수 있습니다.
참고
규모가 큰 테넌트는 Microsoft Graph 모듈에서 처리하는 제한 및 429 오류를 경험할 수 있습니다. Azure Data Explorer는 파일 업로드 크기를 제한할 수도 있습니다.
이러한 PowerShell 스크립트에서는 선택한 속성을 Microsoft Entra 개체에서 JSON 파일로 내보냅니다. 이러한 내보낸 속성의 데이터는 Azure Data Explorer에서 사용자 지정 보고서를 생성하는 데 사용됩니다.
다음의 특정 속성은 이 데이터를 사용하여 Azure Data Explorer에서 만들 수 있는 보고서 유형을 설명하기 때문에 이러한 예제에 포함됩니다. 특정 보고 요구 사항은 이 자습서에서 보여 주는 것과 다를 수 있으므로 보고서에서 보고자 하는 특정 속성을 이러한 스크립트에 포함해야 합니다. 그러나 스크립트를 빌드하는 데 도움이 되도록 표시된 것과 동일한 패턴을 따를 수 있습니다.
스냅샷 날짜 선택
하드 코딩된 스냅샷 날짜 JSON 파일의 데이터를 특정 날짜로 식별합니다. Azure Data Explorer에서 시간이 지남에 따라 유사한 데이터 집합을 추적하는 데 사용할 수 있습니다. 스냅샷 날짜는 두 스냅샷 날짜 간의 데이터 변경 내용을 비교하는 데에도 유용합니다.
$SnapshotDate = Get-Date -AsUTC -Format "yyyy-MM-dd"
Microsoft Entra 사용자 데이터 가져오기
이 스크립트는 선택한 속성을 Microsoft Entra 사용자 개체에서 JSON 파일로 내보냅니다. 이 자습서 이후 섹션에서 이 파일과 다른 JSON 파일의 추가 데이터를 Azure Data Explorer로 가져옵니다.
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
그룹 데이터 가져오기
Azure Data Explorer에서 사용자 지정 보기를 만드는 데 사용되는 그룹 이름 및 ID를 사용하여 JSON 파일을 생성합니다. 샘플에는 모든 그룹이 포함되지만 필요한 경우 추가 필터링을 포함할 수 있습니다. 특정 그룹만 포함하도록 필터링하는 경우 중첩된 그룹을 확인하는 논리를 스크립트에 포함할 수 있습니다.
# 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"
그룹 멤버 자격 데이터 가져오기
Azure Data Explorer에서 사용자 지정 보기를 만드는 데 사용되는 그룹 멤버 자격을 사용하여 JSON 파일을 생성합니다. 샘플에는 모든 그룹이 포함되지만 필요한 경우 추가 필터링을 포함할 수 있습니다.
# 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 "EntraGroupMembership.json"
애플리케이션 및 서비스 주체 데이터 가져오기
테넌트에서 모든 애플리케이션 및 해당 서비스 주체를 사용하여 JSON 파일을 생성합니다. 이 데이터를 기반으로 애플리케이션과 관련된 사용자 지정 보고서를 생성할 수 있도록 이 자습서 이후 섹션에서 이 데이터를 Azure Data Explorer로 가져옵니다.
# 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)'"
[pscustomobject]@{
Name = $app.DisplayName
ApplicationId = $app.AppId
ServicePrincipalId = $sp.Id
SnapshotDate = $SnapshotDate
}
} | ConvertTo-Json -Depth 10 | Set-Content "Applications.json"
앱 역할 데이터 가져오기
Microsoft Entra에서 엔터프라이즈 앱에 대한 모든 앱 역할의 JSON 파일을 생성합니다. 이 데이터를 Azure Data Explorer로 가져온 후에는 이 데이터를 사용하여 사용자에 대한 앱 역할 할당이 포함된 보고서를 생성합니다.
# 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'
앱 역할 할당 데이터 가져오기
테넌트에서 사용자의 모든 앱 역할 할당에 대한 JSON 파일을 생성합니다.
$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]@{
AppRoleId = $_.AppRoleId
CreatedDateTime = $createdDateTime
PrincipalDisplayName = $_.PrincipalDisplayName
PrincipalId = $_.PrincipalId
ResourceDisplayName = $_.ResourceDisplayName
ResourceId = $_.ResourceId
SnapshotDate = $SnapshotDate
}
}
}
$result | ConvertTo-Json -Depth 10 | Out-File "AppRoleAssignments.json"
Microsoft Entra ID에서 Azure Data Explorer로 데이터를 사용하여 테이블 만들기 및 JSON 파일 가져오기
이 섹션에서는 추가 분석을 위해 Microsoft Entra ID 서비스에 대해 새로 만든 JSON 파일을 Azure Data Explorer의 테이블로 가져옵니다. Azure Data Explorer 웹 UI를 통한 첫 번째 가져오기에서는 웹 UI가 각 JSON 파일에서 제안하는 스키마를 기반으로 테이블을 만듭니다.
Azure Data Explorer 웹 UI에 로그인합니다.
이 자습서의 앞부분에서 Azure Data Explorer 클러스터 또는 무료 클러스터에서 설정한 데이터베이스로 이동합니다.
왼쪽 메뉴에서 쿼리을 선택합니다.
내보낸 각 JSON 파일에 대해 다음 단계를 수행하여 내보낸 데이터를 해당 Azure Data Explorer 데이터베이스로 새 테이블로 가져옵니다.
데이터를 수집할 데이터베이스의 이름을 마우스 오른쪽 단추로 클릭합니다. 그런 다음 데이터 가져오기를 선택합니다.
사용 가능한 목록에서 데이터 원본을 선택합니다. 이 자습서에서는 로컬 파일에서 데이터를 수집하므로 로컬 파일 선택합니다.
+ 새 테이블 선택하고 가져오고 있는 JSON 파일의 이름에 따라 테이블 이름을 입력합니다. 예를 들어 EntraUsers.json가져오는 경우 EntraUsers 테이블의 이름을 지정합니다. 첫 번째 가져오기 후에는 테이블이 이미 있으며 후속 가져오기를 위한 대상 테이블로 선택할 수 있습니다.
파일 찾아보기를 선택하고 JSON 파일을 선택한 다음 다음선택합니다.
Azure Data Explorer는 스키마를 자동으로 검색하고 검사 탭에서 미리 보기를 제공합니다. 마침 선택하여 테이블을 만들고 해당 파일에서 데이터를 가져옵니다. 데이터를 수집한 후 닫기을 선택합니다.
이전 섹션에서 생성한 각 JSON 파일에 대해 이전 단계를 반복합니다.
이러한 단계가 끝나면 데이터베이스에 테이블 EntraUsers
, EntraGroups
, EntraGroupMembership
, Applications
, AppRoles
및 AppRoleAssignments
있습니다.
PowerShell을 사용하여 Microsoft Entra ID 거버넌스 데이터 추출
이 섹션에서는 PowerShell을 사용하여 Microsoft Entra ID 거버넌스 서비스에서 데이터를 추출합니다. Microsoft Entra ID 거버넌스, Microsoft Entra ID P2 또는 Microsoft Entra Suite가 없는 경우 Azure Data Explorer를 사용하여 사용자 지정 보고서 빌드하기섹션에서 계속 진행합니다.
다음 단계에서는 Microsoft Graph PowerShell 모듈 설치하여 Microsoft Entra ID 거버넌스 데이터를 추출해야 할 수 있습니다. 조직에서 이 시나리오에 대해 이러한 모듈을 처음 사용하는 경우 Microsoft Graph PowerShell이 테넌트에서 사용하기 위한 동의를 부여할 수 있도록 전역 관리자 역할이 있어야 합니다. 후속 상호 작용은 더 낮은 권한의 역할을 사용할 수 있습니다.
PowerShell을 엽니다.
모든 Microsoft Graph PowerShell 모듈이 아직 설치되지 않은 경우에 필요한 Microsoft Graph 모듈을 설치하세요. 자습서의 이 섹션에는 다음 모듈이 필요합니다.
Microsoft.Graph.Identity.Governance
. 모듈이 이미 설치되어 있는 경우 다음 단계로 건너뜁니다.$modules = @('Microsoft.Graph.Identity.Governance') foreach ($module in $modules) { Install-Module -Name $module -Scope CurrentUser -AllowClobber -Force }
모듈을 현재 PowerShell 세션으로 가져옵니다.
$modules = @('Microsoft.Graph.Identity.Governance') foreach ($module in $modules) { Import-Module -Name $module }
Microsoft Graph에 연결합니다. 자습서의 이 섹션에서는 권한 관리 및 액세스 검토에서 데이터를 검색하는 방법을 보여 주므로
AccessReview.Read.All
및EntitlementManagement.Read.All
권한 범위가 필요합니다. PIM(Privileged Identity Management) 또는 수명 주기 워크플로와 같은 다른 보고 사용 사례의 경우 필요한 권한으로Scopes
매개 변수를 업데이트합니다. 사용 권한에 대한 자세한 내용은 Microsoft Graph 사용 권한 참조참조하세요.Connect-MgGraph -Scopes "AccessReview.Read.All, EntitlementManagement.Read.All" -ContextScope Process -NoWelcome
이 명령은 Microsoft Entra 자격 증명으로 로그인하라는 메시지를 표시합니다. 로그인한 후 처음 연결하는 경우 또는 새 권한이 필요한 경우 필요한 권한에 동의해야 할 수 있습니다.
사용자 지정 보고서에 대한 Microsoft Entra ID 거버넌스 데이터를 추출하는 PowerShell 쿼리
다음 쿼리는 PowerShell을 사용하여 Microsoft Graph에서 Microsoft Entra ID 거버넌스 데이터를 추출하고 데이터를 JSON 파일로 내보냅니다. 이 자습서 이후 섹션에서 해당 파일을 Azure Data Explorer로 가져옵니다.
이러한 유형의 데이터를 사용하여 보고서를 생성하는 시나리오는 다음과 같습니다.
- 과거 액세스 검토에 대한 보고입니다.
- 권한 관리를 통한 할당 보고.
액세스 검토 일정 정의 데이터 가져오기
Azure Data Explorer에서 사용자 지정 보기를 만드는 데 사용되는 액세스 검토 정의 이름 및 ID를 사용하여 JSON 파일을 생성합니다. 샘플에는 모든 액세스 검토가 포함되지만 필요한 경우 추가 필터링을 포함할 수 있습니다. 자세한 내용은 필터 쿼리 매개 변수사용합니다.
$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"
액세스 검토를 위한 인스턴스 데이터 가져오기
PowerShell을 사용하여 모든 액세스 검토 정의, 인스턴스 및 결정을 구조화된 폴더 형식으로 내보내려면 Microsoft Graph API를 사용할 수 있습니다. 이 방법을 사용하면 데이터가 계층적으로 구성되고 지정된 폴더 구조와 정렬됩니다.
시작하기 전에 다음 사항에 유의하세요.
- Microsoft Graph에서 검토 데이터에 액세스하는 데 필요한 권한이 있는지 확인합니다.
- 데이터 볼륨에 따라 스크립트의 실행 시간이 달라질 수 있습니다. 프로세스를 모니터링하고 필요에 따라 매개 변수를 조정합니다.
인스턴스 데이터를 얻으려면 다음을 수행합니다.
Export_Access_Reviews.ps1 스크립트를 다운로드하고 로컬로 저장합니다.
파일 탐색기에서 PowerShell에서 실행할 수 있도록 스크립트의 차단을 해제합니다.
다음 명령을 실행합니다. 출력은 모든 데이터를
ReviewInstances
,ReviewInstanceDecisionItems
및ReviewInstanceContactedReviewers
세 개의 하위 폴더에 배치합니다..\ExportAccessReviews.ps1 -InstanceStartDate "11/15/2024" -InstanceEndDate "12/15/2024" -ExportFolder "C:\AccessReviewsExport\11_15_to_12_15"
권한 관리를 위한 액세스 패키지 데이터 가져오기
Azure Data Explorer에서 사용자 지정 보기를 만드는 데 사용되는 액세스 패키지 이름 및 ID를 사용하여 JSON 파일을 생성합니다. 샘플에는 모든 액세스 패키지가 포함되어 있지만 필요한 경우 추가 필터링을 포함할 수 있습니다.
$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"
권한 관리를 위한 액세스 패키지 할당 데이터 가져오기
Azure Data Explorer에서 사용자 지정 보기를 만드는 데 사용되는 패키지에 액세스하기 위한 할당이 있는 JSON 파일을 생성합니다. 샘플에는 전달되는 모든 할당이 포함되지만 필요한 경우 추가 필터링을 포함할 수 있습니다.
$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"
Microsoft Entra ID 거버넌스의 데이터를 사용하여 테이블을 만들고 JSON 파일을 Azure Data Explorer로 가져오기
이 섹션에서는 추가 분석을 위해 Microsoft Entra ID 거버넌스 서비스에 대해 새로 만든 JSON 파일을 Azure Data Explorer로 가져옵니다. 이러한 파일은 Microsoft Entra ID 서비스에 대해 이미 가져온 데이터를 조인합니다. Azure Data Explorer 웹 UI를 통한 첫 번째 가져오기에서는 웹 UI가 각 JSON 파일에서 제안하는 스키마를 기반으로 테이블을 만듭니다.
Azure Data Explorer 웹 UI에 로그인합니다.
Azure Data Explorer 클러스터 또는 무료 클러스터에서 Microsoft Entra ID 데이터를 포함하는 데이터베이스로 이동합니다.
왼쪽 메뉴에서 쿼리을 선택합니다.
내보낸 각 JSON 파일에 대해 다음 단계를 수행하여 내보낸 데이터를 해당 Azure Data Explorer 데이터베이스로 새 테이블로 가져옵니다.
데이터를 수집하려는 데이터베이스의 데이터베이스 이름을 마우스 오른쪽 단추로 클릭합니다. 그런 다음 데이터 가져오기를 선택합니다.
사용 가능한 목록에서 데이터 원본을 선택합니다. 이 자습서에서는 로컬 파일에서 데이터를 수집하므로 로컬 파일 선택합니다.
+ 새 테이블 선택하고 가져오고 있는 JSON 파일의 이름에 따라 테이블 이름을 입력합니다. 첫 번째 가져오기 후에는 테이블이 이미 있으며 후속 가져오기를 위한 대상 테이블로 선택할 수 있습니다.
파일 찾아보기를 선택하고 JSON 파일을 선택한 다음 다음선택합니다.
Azure Data Explorer는 스키마를 자동으로 검색하고 검사 탭에서 미리 보기를 제공합니다. 마침 선택하여 테이블을 만들고 해당 파일에서 데이터를 가져옵니다. 데이터를 수집한 후 닫기을 선택합니다.
이전 섹션에서 생성한 각 JSON 파일에 대해 각 폴더에 대해 이전 단계를 반복합니다.
폴더에 파일이 많은 경우
lightingest
사용하여 테이블을 만든 후 나머지 파일을 가져올 수 있습니다.
이러한 단계의 끝에는 이전에 만든 테이블 외에도 데이터베이스에 EntraAccessReviewDefinitions
, EntraAccessPackages
, EntraAccessPackageAssignments
, ReviewInstances
, ReviewInstanceDecisionItems
및 ReviewInstanceContactedReviewers
테이블이 있습니다.
Azure Data Explorer를 사용하여 사용자 지정 보고서 빌드
이제 Azure Data Explorer에서 데이터를 사용할 수 있으므로 비즈니스 요구 사항에 따라 사용자 지정된 보고서 만들기를 시작할 준비가 되었습니다.
Azure Data Explorer 웹 UI에 로그인합니다.
왼쪽 메뉴에서 쿼리을 선택합니다.
다음 쿼리는 일반적인 보고서의 예를 제공하지만 필요에 맞게 이러한 보고서를 사용자 지정하고 추가 보고서를 만들 수 있습니다.
Excel에서 보고서를 보려면내보내기 탭을 선택한 다음 Excel에서 열기를 선택하십시오.
예: 특정 스냅샷 날짜에 대한 직접 및 그룹 할당에 대한 앱 역할 할당 생성
이 보고서는 대상 앱에 대한 액세스 권한이 있는 사용자와 시기 보기를 제공합니다. 보안 감사, 규정 준수 확인 및 조직 내의 액세스 패턴 이해에 사용할 수 있습니다.
다음 쿼리는 Microsoft Entra ID 내의 특정 애플리케이션을 대상으로 하며 특정 날짜를 기준으로 역할 할당을 분석합니다. 쿼리는 직접 및 그룹 기반 역할 할당을 모두 검색합니다. 이 데이터를 EntraUsers
테이블의 사용자 세부 정보 및 AppRoles
테이블의 역할 정보와 병합합니다. 쿼리에서 targetSnapshotDate
데이터를 로드할 때 사용한 snapshotDate
값으로 설정합니다.
/// 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 EntraGroupMembership 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
예: 두 날짜 사이에 앱에 액세스할 수 있는 사용자를 보여 주는 Microsoft Entra 데이터를 사용하여 기본 감사자 보고서 작성
이 보고서는 두 날짜 사이에 대상 앱에 대한 액세스 권한이 있는 사용자를 봅니다. 보안 감사, 규정 준수 확인 및 조직 내의 액세스 패턴 이해에 사용할 수 있습니다.
다음 쿼리는 Microsoft Entra ID 내의 특정 애플리케이션을 대상으로 하며 두 날짜 사이의 역할 할당을 분석합니다. 쿼리는 AppRoleAssignments
테이블에서 직접 역할 할당을 검색하고 이 데이터를 EntraUsers
테이블의 사용자 세부 정보 및 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()
예: 두 데이터 스냅샷 날짜 사이에 앱에 추가된 사용자 보기
이러한 보고서는 두 날짜 사이에 대상 애플리케이션에 대한 앱 역할 할당을 받은 사용자의 보기를 제공합니다. 이러한 보고서를 사용하여 시간이 지남에 따라 앱 액세스의 변경 내용을 추적할 수 있습니다.
이 쿼리는 Microsoft Entra ID 내의 특정 애플리케이션을 대상으로 하며 시작 날짜와 종료 날짜 사이에 역할 할당을 변경합니다.
// 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"
예: 액세스 검토를 사용하는 다양한 쿼리
액세스 검토 완료 및 타임라인 정보 보기
데이터를 업로드한 후 다음 Kusto 쿼리를 사용하여 검토합니다.
마지막 액세스 검토 주기는 언제 완료되었나요? 얼마나 걸렸습니까?
ReviewInstances | summarize LastCompletedDate = max(ReviewInstanceEndDateTime), ReviewDuration = datetime_diff('minute', max(ReviewInstanceEndDateTime), min(ReviewInstanceStartDateTime))
액세스 검토 프로세스가 정시에 수행되었나요(예: 분기별)?
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
액세스 검토 참여 및 활동 보기
할당된 검토자는 누구였습니까?
ReviewInstanceContactedReviewers | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName = DisplayName, ReviewerUserPrincipalName = UserPrincipalName, CreatedDateTime
어떤 검토자가 적극적으로 참여하고 응답을 제공합니까?
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
액세스 검토 요청에 응답한 검토자의 비율은 무엇인가요?
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
각 검토자는 언제 작업을 완료했나요?
ReviewInstanceDecisionItems | where Decision in ("Approve", "Deny") | project AccessReviewDefinitionId, AccessReviewInstanceId, ReviewerName = ReviewedBy_DisplayName, ReviewerUserPrincipalName = ReviewedBy_UserPrincipalName, ReviewedDateTime
어떤 검토자가 결정을 내리지 않았습니까?
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
상호 작용하지 않은 검토자의 비율은 무엇인가요?
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
응답하지 않는 검토자 또는 보류 중인 결정에 대해 미리 알림이 트리거되었나요?
// 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
액세스 검토로 사용자와 액세스 변경 사항 보기
액세스 검토 중에 특정 리소스에 대한 액세스 권한을 상실한 사람은 누구인가요?
ReviewInstanceDecisionItems | where Decision == "Deny" | project User = Principal_DisplayName, Resource = Resource_DisplayName, Decision, Justification
사용자가 비활성으로 인해 플래그가 지정되었나요?
ReviewInstanceDecisionItems | where Insights contains "inactive" | project User = Principal_DisplayName, Resource = Resource_DisplayName, Insights, Decision
액세스 제거 날짜와 액세스 손실의 이유는 무엇인가요?
ReviewInstanceDecisionItems | where Decision == "Deny" | project User = Principal_DisplayName, Resource=Resource_DisplayName, AccessRemovalDate = AppliedDateTime, Reason = Justification
어떤 사용자가 결정을 내리지 않은가?
ReviewInstanceDecisionItems | where Decision == "NotReviewed" | project User = Principal_DisplayName, Resource=Resource_DisplayName
검토자가 없는 리뷰는 무엇입니까?
ReviewInstances | join kind=leftanti ( ReviewInstanceContactedReviewers | summarize by AccessReviewInstanceId ) on $left.ReviewInstanceId == $right.AccessReviewInstanceId
사용자가 없는 리뷰는 무엇입니까?
ReviewInstances | join kind=leftanti ( ReviewInstanceDecisionItems | summarize by AccessReviewInstanceId ) on $left.ReviewInstanceId == $right.AccessReviewInstanceId
액세스 검토 결정 요약
사용자가 어떤 결정을 내렸는가: 승인됨, 거부됨 또는 변경되지 않음
ReviewInstanceDecisionItems | summarize count() by Decision
액세스가 승인되거나 거부된 사용자 수는 몇 명입니까?
ReviewInstanceDecisionItems | summarize ApprovedCount = countif(Decision == "Approve"), DeniedCount = countif(Decision == "Deny")
승인 이유가 문서화되었습니까?
ReviewInstanceDecisionItems | where Decision == "Approve" and isnotempty(Justification) | summarize count() by ReviewedBy_DisplayName
액세스 검토 품질 확인 및 완전성 확인
휴면 사용자에 대해 액세스 해지를 고려되었나요?
ReviewInstanceDecisionItems | where Insights contains "inactive" and Decision == "Deny" | project User = Principal_DisplayName, Decision
제대로 제거되지 않은 액세스가 있나요?
ReviewInstanceDecisionItems | where ApplyResult != "New" and ApplyResult != "AppliedSuccessfully"
검토자가 자신의 결정을 문서화했습니까?
ReviewInstanceDecisionItems | where isnotempty(Justification) | summarize count() by ReviewedBy_DisplayName
각 사용자에 대해 댓글이 캡처되었나요?
ReviewInstanceDecisionItems | where isnotempty(Justification) | project User = Principal_DisplayName, Resource = Resource_DisplayName, Comments = Justification
진행 중인 가져오기를 설정하다
이 자습서에서는 보고 목적으로 Azure Data Explorer를 단일 스냅샷으로 채우는 일회성 데이터 추출, 변환 및 로드(ETL) 프로세스를 보여 줍니다. 지속적인 보고를 위해 또는 시간에 따른 변경 내용을 비교하려면 Microsoft Entra에서 Azure Data Explorer를 채우는 프로세스를 자동화하여 데이터베이스에 현재 데이터가 계속 있도록 할 수 있습니다.
Azure 클라우드 서비스인 Azure Automation 사용하여 Microsoft Entra ID 및 Microsoft Entra ID 거버넌스에서 데이터를 추출하는 데 필요한 PowerShell 스크립트를 호스트할 수 있습니다. 자세한 내용은 Azure Automation 및 Microsoft Graph통해 Microsoft Entra ID 거버넌스 작업 자동화를 참조하세요.
Azure 기능 또는 lightingest
같은 명령줄 도구를 사용하여 데이터를 가져오고 기존 테이블을 채울 수도 있습니다. 자세한 내용은 LightIngest를 사용하여 Azure Data Explorer에 데이터를 수집하는 방법을 참조하십시오.
예를 들어 현재 디렉터리의 EntraAccessPackages.json
파일을 현재 로그인한 사용자로 EntraAccessPackages
테이블에 로드하려면 다음 명령을 사용합니다.
az login
LightIngest.exe "https://ingest-CLUSTERHOSTNAME;Fed=True" -database:"DATABASE" -table:EntraAccessPackages -sourcepath:"." -pattern:"EntraAccessPackages.json" -format:multijson -azcli:true
더 많은 출처에 대한 데이터 보고
Microsoft Entra 이외의 원본에서 Azure Data Explorer로 데이터를 가져올 수도 있습니다. 이 기능에 대한 시나리오는 다음과 같습니다.
- 관리자는 감사 레코드 자체에 속하지 않는 사용자, 액세스 패키지 또는 기타 개체에 대한 추가 세부 정보가 포함된 감사 로그의 이벤트를 보려고 합니다.
- 관리자는 Microsoft Entra ID에서 애플리케이션에 추가된 모든 사용자와 SQL 데이터베이스와 같은 애플리케이션 자체 리포지토리의 액세스 권한을 보려고 합니다.
자세한 내용은 다른 원본의 데이터를 사용하여 Azure Data Explorer에서 사용자 지정된 보고서 만들기를 참조하세요.