วิธีตรวจสอบความยินยอมของผู้ดูแลระบบแอปพลิเคชันใน AzureAD
ในบทช่วยสอนนี้ ฉันจะแสดงให้คุณเห็นถึงวิธีการใช้ Microsoft Graph PowerShell, Managed Identified และ Azure Automation ร่วมกันเพื่อสร้างวิธีการรายงานที่ปลอดภัยเกี่ยวกับผู้ดูแลระบบแอปพลิเคชันที่ให้คำยินยอมต่อสิทธิ์ Graph API ทุกสัปดาห์ทางอีเมล สิ่งนี้จะช่วยให้ทีมรักษาความปลอดภัยข้อมูลระบุได้ว่าผู้ดูแลระบบให้สิทธิ์มากกว่าที่จำเป็นแก่แอปพลิเคชันใน Azure AD หรือไม่
ความยินยอมของผู้ดูแลระบบคืออะไร?
ความยินยอมในการอนุญาตของผู้ดูแลระบบคือความยินยอม 'ทั่วทั้งผู้เช่า' ที่มอบให้กับแอปพลิเคชันใน Azure AD สำหรับสิทธิ์เฉพาะ ซึ่งหมายความว่าผู้เผยแพร่แอปพลิเคชันนั้นจะสามารถเข้าถึงข้อมูลที่ได้รับอนุญาตให้เข้าถึงได้ รวมถึงใครก็ตามที่สามารถตรวจสอบสิทธิ์แอปพลิเคชันนั้นได้ ด้วยเหตุนี้ การให้สิทธิ์ผู้ดูแลระบบจึงมีสิทธิพิเศษสูงและควรตรวจสอบการดำเนินการ
ตัวอย่างเช่น ฉันเป็นผู้ดูแลระบบ Azure โดยที่ฉันจัดการแอปพลิเคชันแบบกำหนดเองที่โฮสต์ใน Azure และทรัพยากรที่เกี่ยวข้องบางส่วนในการสมัครใช้งาน Azure ฉันไม่มีสิทธิ์เข้าถึงเพื่อจัดการวัตถุไดเรกทอรีใน Azure AD แต่แอปพลิเคชันแบบกำหนดเองที่ฉันจัดการจำเป็นต้องเข้าถึงและแก้ไขวัตถุไดเรกทอรี Azure AD บางส่วน เพื่อให้เป็นไปตามข้อกำหนดนี้ ฉันขอให้ผู้ดูแลระบบ Azure AD ลงทะเบียนแอปพลิเคชัน (หรือบริการหลัก) ใน Azure AD และยินยอมให้ user.readwrite.all อนุญาต ดังนั้นจึงอนุญาตให้แอปพลิเคชันของฉันแก้ไขวัตถุผู้ใช้ใน Azure AD ขณะนี้เส้นทางการโจมตีได้ถูกสร้างขึ้นโดยไม่ได้ตั้งใจ ซึ่งผู้ใช้ที่ไม่ได้รับอนุญาต (ฉัน) อาจเปลี่ยนแปลงทรัพยากรที่ฉันไม่ได้รับอนุญาตให้ดำเนินการได้ เนื่องจากฉันสามารถควบคุมแอปพลิเคชันที่กำหนดเองได้อย่างสมบูรณ์
โชคดีสำหรับผู้ดูแลระบบของเรา ทุกครั้งที่ได้รับความยินยอมจากผู้ดูแลระบบในการอนุญาตแอปพลิเคชัน บันทึกจะถูกจัดเก็บไว้ในบันทึกการตรวจสอบแอปพลิเคชันระดับองค์กร พร้อมด้วยข้อมูลทั้งหมดที่เราต้องการเพื่อตรวจสอบการดำเนินการ และทำการตัดสินใจโดยอาศัยข้อมูลรอบด้านเกี่ยวกับความถูกต้อง
ใครสามารถให้สิทธิ์ผู้ดูแลระบบใน Azure AD ได้บ้าง
Azure AD มี 2 บทบาทที่ให้ความสามารถในการให้ความยินยอมของผู้ดูแลระบบสำหรับแอปพลิเคชัน ได้แก่:
- ผู้ดูแลระบบระดับโลก
- ผู้ดูแลระบบบทบาทที่ได้รับสิทธิพิเศษ
ในทางปฏิบัติ ไม่มีบทบาทใดที่ได้รับสิทธิพิเศษน้อยกว่าบทบาทอื่น แม้ว่าตามมูลค่าแล้ว บทบาทผู้ดูแลระบบส่วนกลางจะมีสิทธิ์มากกว่า ผู้ดูแลระบบที่มีบทบาทพิเศษสามารถยกระดับสิทธิ์ได้ตามต้องการ โดยไม่ถือสิทธิ์อนุญาตที่ชัดเจนมากนัก
สิทธิ์สคริปต์
สคริปต์ที่ฉันเขียนเพื่อตรวจสอบบันทึกการยินยอมของผู้ดูแลระบบเหล่านี้ใช้สิทธิ์ 3 ประการซึ่งจำเป็นต้องกำหนดให้กับข้อมูลประจำตัวที่ได้รับการจัดการซึ่งใช้ในการตรวจสอบสิทธิ์ Azure Automation ที่เรียกใช้สคริปต์ ได้แก่:
- auditlog.read.all
- แอพลิเคชัน อ่าน ทั้งหมด
- เมลส่ง
หากต้องการสร้าง Managed Identity และกำหนดสิทธิ์ข้างต้น โปรดดูบทช่วยสอนของฉันเกี่ยวกับการใช้ Managed Identity กับ Microsoft Graph PowerShell:
วิธีใช้ข้อมูลประจำตัวที่มีการจัดการกับ Microsoft Graph PowerShell
สคริปต์รายงานความยินยอมของผู้ดูแลระบบ
ด้านล่างนี้คุณจะพบสคริปต์ที่จะกรองบันทึกแอปพลิเคชันระดับองค์กรเพื่อดูความยินยอมในการอนุญาต จัดเรียงลงในรายงานและส่งอีเมลไปยังปลายทาง อย่าลืมแก้ไขฟิลด์ต่อไปนี้:
- จัดการ_Identity_ID
- ที่อยู่ผู้รับ
- SENDER_ADDRESS
<#
AUTHOR: Daniel Bradley
LINKEDIN: https://www.linkedin.com/in/danielbradley2/
TWITTER: https://twitter.com/DanielatOCN
WEBSITE: https://ourcloudnetwork.com/
Info: This script was written by Daniel Bradley for the ourcloudnetwork.com blog
#>
# Declare variables
$ManagedIdentityId = "!"
$RecipientAddress = "!"
$SenderAddress = "!"
#Connect to Microsoft Graph
Connect-MgGraph -Identity -ClientId "$ManagedIdentityId"
# Get date minus 7 days
$a = $(get-date).AddDays(-7).ToString("yyyy-MM-dd")
# Get application consent logs
$uri = "https://graph.microsoft.com/beta/auditLogs/directoryAudits?`$filter=ActivityDateTime ge $a and ActivityDisplayName eq 'Consent to application'"
$logs = Invoke-MgGraphRequest -uri $uri -Method Get -OutputType PSObject | select -expand value
# Create Report object
$Report = [System.Collections.Generic.List[Object]]::new()
# Loop through each log
ForEach ($log in $logs) {
# null temporary variable
$id = $null
$app = $null
# Get current app id
$id = ($log.additionalDetails) | Where-Object {$_.Key -eq 'AppID'}
# Get Application Name
if ($log.targetResources.type -eq "ServicePrincipal"){
$App = Get-MgServicePrincipal -Filter "AppId eq '$($id.value)'"
} else {
$app = Get-MgApplication -Filter "AppId eq '$($id.value)'"
}
# Extract consented permissions
$perms = (($log.targetResources.modifiedproperties) | Where-Object {$_.DisplayName -eq 'ConsentAction.Permissions'}).newvalue
$perms -match "(?<=Scope:)(.*?)(?=, CreatedDateTime:)" | out-null
$permissions = $matches[1]
# build report object
$obj = [PSCustomObject][ordered]@{
"date" = $log.activityDateTime
"App Name" = $app.DisplayName
"Admin Consent" = (($log.targetResources.modifiedProperties) | Where-Object {$_.DisplayName -eq 'ConsentContext.IsAdminConsent'}).NewValue
"Permissions" = $permissions
"Consented by" = $log.initiatedBy.user.userPrincipalName
}
$report.Add($obj)
}
# Convert report to HTML
$report = $report | ConvertTo-Html
$Report = $report -replace '<table>', '<table border="1">'
# Prepare report as attachment
$encodedBytes = [System.Text.Encoding]::UTF8.GetBytes($report)
$encodedText = [System.Convert]::ToBase64String($encodedBytes)
# Build message params
$params = @{
message = @{
subject = "Automated - Application Permissions Consents"
body = @{
contentType = "Text"
content = "Please see the attached. Do no reply to this email."
}
toRecipients = @(
@{
emailAddress = @{
address = "$RecipientAddress"
}
}
)
attachments = @(
@{
"@odata.type" = "#microsoft.graph.fileAttachment"
name = "report.html"
contentType = "text/plain"
contentBytes = $encodedText
}
)
}
saveToSentItems = "false"
}
# Send message
Send-MgUserMail -UserId $SenderAddress -BodyParameter $paramsการทำรายงานอัตโนมัติด้วย Azure Automation
Azure Automation ช่วยให้คุณสามารถกำหนดเวลาให้สคริปต์รายงานทำงานเป็นประจำได้ แนวคิดคือการเรียกใช้รายงานในแต่ละสัปดาห์เพื่อประเมินว่าแอปพลิเคชันใดได้รับความยินยอมด้วยสิทธิ์ใดบ้าง ในการดำเนินการนี้ คุณจะต้องสมัครสมาชิก Azure รวมถึงผู้ดูแลระบบส่วนกลางหรือบัญชีผู้ดูแลระบบที่มีบทบาทพิเศษเพื่อจัดการความยินยอมเบื้องต้นสำหรับ Managed Identity ที่จำเป็นในการเปิดใช้งานสคริปต์นี้ในการทำงาน
ตามที่ฉันได้อธิบายรายละเอียดเพิ่มเติมในบทช่วยสอนอื่นสำหรับขั้นตอนนี้แล้ว คุณควรเห็นโพสต์ต่อไปนี้ของฉัน:
วิธีเรียกใช้สคริปต์ Microsoft Graph PowerShell ด้วย Azure Automation

