ค้นหาเว็บไซต์

วิธีตรวจสอบความยินยอมของผู้ดูแลระบบแอปพลิเคชันใน 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

บทความที่เกี่ยวข้อง