AzureAD'de Uygulama Yöneticisi İzni Onayı Nasıl İzlenir?


Bu öğreticide, uygulama yöneticisinin Graph API izinlerine haftalık olarak e-posta yoluyla verdiği izinler hakkında güvenli bir raporlama yöntemi oluşturmak için Microsoft Graph PowerShell, Managed Identified ve Azure Otomasyonu kombinasyonunun nasıl kullanılacağını göstereceğim. Bu, herhangi bir bilgi güvenliği ekibinin, bir Yöneticinin Azure AD'deki bir uygulamaya gerekli izinlerden fazlasını verip vermediğini belirlemesine yardımcı olacaktır.

Yönetici izin onayı nedir?

Yönetici izni onayı, belirli izinler için Azure AD'deki bir uygulamaya verilen "kiracı çapında" bir onaydır. Bu, söz konusu uygulamanın yayıncısının ve bu uygulamada kimlik doğrulaması yapabilen herkesin kendisine erişim izni verilen verilere erişebileceği anlamına gelir. Bu doğası gereği yönetici izinleri oldukça ayrıcalıklıdır ve operasyonların izlenmesi gerekir.

Örneğin, Azure'da barındırılan özel bir uygulamayı ve Azure aboneliğindeki bazı ilgili kaynakları yönettiğim bir Azure Yöneticisiyim. Azure AD'de dizin nesnelerini yönetme erişimim yok ancak yönettiğim özel uygulamanın bazı Azure AD dizin nesnelerine erişmesi ve bunları değiştirmesi gerekiyor. Bu gereksinimi karşılamak için Azure AD yöneticisinden bir uygulamayı (veya hizmet sorumlusunu) Azure AD'ye kaydetmesini ve bunun için user.readwrite.all iznini kabul etmesini istiyorum, böylece uygulamamın Azure AD'deki kullanıcı nesnelerini değiştirmesine izin veriyorum. Yanlışlıkla, özel uygulama üzerinde tam kontrole sahip olduğum için, yetkisiz bir kullanıcının (benim), yetkili olmadığım kaynakları potansiyel olarak değiştirebileceği bir saldırı yolu oluşturuldu.

Biz yöneticiler için şanslıyız ki, bir uygulamaya bir yönetici izni verildiğinde, eylemi araştırmak ve geçerliliği konusunda bilinçli bir karar vermek için ihtiyaç duyduğumuz tüm bilgileri içeren bir günlük, Kurumsal Uygulamalar Denetim Günlüğü'nde saklanır.

Azure AD'de kimler yönetici izinleri verebilir?

Azure AD'de uygulamalar için yönetici izni izni verme olanağı sağlayan 2 rol vardır; bunlar:

  • Genel Yönetici
  • Ayrıcalıklı rol yöneticisi

Pratik anlamda hiçbir rol diğerinden daha az ayrıcalıklı değildir. Görünüşte Genel Yönetici rolü daha fazla hakka sahip olsa da, Ayrıcalıklı rol yöneticisi kendisi kadar açık izne sahip olmasa da ayrıcalıkları gerektiği gibi yükseltebilir.

Komut dosyası izinleri

Bu yönetici izni izin günlüklerini izlemek için yazdığım komut dosyası, betiği çalıştıran Azure Otomasyonu'nun kimliğini doğrulamak için kullanılan Yönetilen kimliğe atanması gereken 3 izin kullanır, bunlar:

  • denetimlog.read.all
  • uygulama.oku.tümünü
  • posta.gönder

Yönetilen Kimlik oluşturmak ve yukarıdaki izinleri atamak için Yönetilen Kimlikleri Microsoft Graph PowerShell ile kullanmaya ilişkin eğitimime göz atın:

Microsoft Graph PowerShell ile Yönetilen Kimlikler nasıl kullanılır?

Yönetici izinleri izin raporu komut dosyası

Aşağıda Kurumsal Uygulamalar günlüğünü izin onayı için filtreleyecek, bunları bir raporda toplayacak ve hedefe e-postayla gönderecek komut dosyasını bulabilirsiniz. Aşağıdaki alanları değiştirdiğinizden emin olun:

  • Yönetilen_Identity_ID
  • ALICI ADRESİ
  • GÖNDEREN ADRESİ
<#
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

Raporu Azure Otomasyonu ile otomatikleştirme

Azure Otomasyonu, rapor betiğini düzenli olarak çalışacak şekilde planlamanıza olanak tanır. Buradaki fikir, hangi uygulamalara hangi izinlerle izin verildiğini değerlendirmek için her hafta raporu çalıştırmaktır. Bunu yapmak için, bu betiğin çalışmasını sağlamak üzere gerekli Yönetilen Kimlik için ilk izin onaylarını yönetmek üzere bir Azure aboneliğinin yanı sıra genel bir yöneticiye veya ayrıcalıklı rol yöneticisi hesabına ihtiyacınız olacaktır.

Bu adım için başka bir eğitimde daha ayrıntılı olarak ele aldığım için, bunun için aşağıdaki yazımı görmelisiniz:

Microsoft Graph PowerShell Komut Dosyalarını Azure Otomasyonuyla Çalıştırma

İlgili makaleler