Azure Otomasyonu Yönetilen Kimliklerle Uygulamalar için RBAC'ı Kullanma


Uygulamalar için RBAC'ı Yönetilen Kimliklere Genişletme

Uygulamalar için RBAC, Azure AD uygulamalarının Exchange Online posta kutularına erişimini denetlemeye yönelik bir önizleme mekanizmasıdır. Exchange Online yönetim PowerShell modülünün V3.0'ı, Azure Otomasyonu tarafından yönetilen kimlikler kullanılarak kimlik doğrulamayı destekler. Zamanlanmış Exchange Online betiklerini çalıştırmak için yönetilen kimlikleri kullanmayı seviyorum ve yönetilen kimlikler için kullanılan Azure AD uygulamalarının posta kutularına erişim için uygun şekilde yetkilendirilmesini sağlamak amacıyla Uygulamalar için RBAC'ı kullanmak doğal görünüyor.

Betikleri çalıştırmak için yönetilen kimlik kullanan bir Azure AD uygulamasını denetlemek amacıyla Uygulamalar için RBAC kullanmanın bir örneği olarak, oda posta kutusu kullanım raporu betiğini uyarlamaya karar verdim. Komut dosyası, takvim bilgilerini ayıklamak için Calendars.Read Grafik iznini kullanır. Bu, Uygulamalar için RBAC tarafından desteklenen izinlerden biridir, dolayısıyla müdürü göstermek iyi ve pratik bir seçim gibi göründü. Azure Otomasyonu için etkileşimli olarak çalışan bir betiği uyarlamak zor değildir ancak biraz dikkat gerektirir (bazı ipuçlarını burada bulabilirsiniz).

Azure ile kimlik doğrulama önemli bir farktır. Uyarlanan kodun, yönetilen kimlik için bir erişim belirtecini nasıl elde ettiği ve bunu Exchange Online'a bağlanmak için nasıl kullandığı aşağıda açıklanmıştır:

# Connect to Microsoft Graph in Azure Automation
Connect-AzAccount -Identity
$AccessToken = Get-AzAccessToken -ResourceUrl "https://graph.microsoft.com"

Connect-ExchangeOnline -ManagedIdentity -Organization office365itpros.onmicrosoft.com

Otomasyona Hazırlık

Yönetilen kimlikler bir Azure Otomasyon hesabı bağlamında çalışır. Mevcut tüm Azure Otomasyon hesaplarımda, farklı işlemleri gerçekleştirmek için gereken Grafik izinleri atanmış durumda. Uygulamalar için RBAC ile ilgili önemli nokta, Exchange Online'ın bir uygulamanın bir filtreye (yönetim kapsamı) dayalı olarak posta kutularına erişim izni alması gerekip gerekmediğini değerlendirmesidir. Diğer hesaplara atanan izinlerle ilgili herhangi bir sorunu önlemek için boş bir sayfayla başlamaya karar verdim ve RBACforApps adında yeni bir Azure Otomasyonu hesabı oluşturdum.

Çoğu durumda, Exchange Online ile etkileşime giren komut dosyaları, Exchange Online yönetim modülündeki cmdlet'leri kullanır. Burada durum böyle değil çünkü kullanmayı seçtiğim komut dosyası, verileri standart PowerShell cmdlet'leri ve Graph API isteklerinin bir karışımıyla işlemektedir. Ancak, bazı Exchange Online cmdlet'lerini çalıştırmayan Exchange verilerini içeren bir komut dosyası nadir görülen bir durumdur, bu nedenle Azure Otomasyon hesabının Exchange Online cmdlet'lerini çalıştırabilmesi için nasıl yapılandırılacağına ilişkin ayrıntıları buraya ekliyorum.

Öncelikle Exchange Online yönetim PowerShell modülünü otomasyon hesabına aktarmanız gerekir. Modülü içe aktarmazsanız hesap herhangi bir Exchange Online cmdlet'ini çalıştıramaz. Hesabı diğer modüllerdeki cmdlet'leri çalıştırmak için kullanmayı planlıyorsanız bu modülleri de içe aktarmanız gerekir.

Daha sonra, otomasyon hesabının Exchange Online cmdlet'lerini çalıştırması gerekiyorsa, Exchange'i yönetici olarak yönetme iznini otomasyon hesabına atamanız gerekir. Aslında, etkileşimli bir PowerShell oturumunda bir yönetici oturum açmış gibi hesabın cmdlet'leri çalıştırmasına izin vermiş olursunuz. Exchange'i Uygulama Olarak Yönet rolünü Azure Otomasyon hesabına atamak için Microsoft Graph PowerShell SDK'sındaki cmdlet'leri kullanan bu PowerShell kodunu çalıştırın:

Connect-MgGraph -Scopes Directory.ReadWrite.All

$ManagedIdentityApp = Get-MgServicePrincipal -Filter "displayName eq 'RBACforApps'"
$ExoApp = Get-MgServicePrincipal -Filter "AppId eq '00000002-0000-0ff1-ce00-000000000000'"
$AppPermission = $ExoApp.AppRoles | Where-Object {$_.DisplayName -eq "Manage Exchange As Application"}
$AppRoleAssignment = @{
"PrincipalId" = $ManagedIdentityApp.Id
"ResourceId" = $ExoApp.Id
"AppRoleId" = $AppPermission.Id
}
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $ManagedIdentityApp.Id -BodyParameter $AppRoleAssignment

Son olarak, bir Azure Otomasyonu hesabının Exchange Online cmdlet'lerini çalıştırabilmesi için önce Azure Otomasyonu hesabı tarafından kullanılan uygulamaya Exchange yönetici rolünü atamanız gerekir. Bir uygulamanın Exchange Online cmdlet'lerini çalıştırabildiğinden emin olmak için izlenmesi gereken öğelerin kontrol listesi için bu makaleye bakın.

Temel Test Çalıştırın

Azure Otomasyonu hesabının yönetilen bir kimlikle Exchange Online'da oturum açabildiğini belirlemek için Exchange Online cmdlet'ini çalıştıran bir test runbook'u oluşturun. Bazı posta kutularının ayrıntılarını raporlamak için basit bir Get-EXOMailbox komutu, her şeyin çalıştığını doğrulamak için yeterlidir.

Uygulamalar için RBAC'ı denklemin içine dahil etmeden önce, normal Grafik izinlerini kullanarak bir temel test yapmalıyız. Bunu yapmak için, komut dosyasında yayınlanan API isteklerinin gerektirdiği Grafik izinlerini (Place.Read.All ve Calendars.Read) RBACforApps uygulamasına atarız. Daha sonra oda posta kutusu kullanım komut dosyasındaki kodu ekleyin ve normal şekilde çalıştığından emin olun.

Uygulama Kısıtlamaları için RBAC'ı Uygulamaya Hazırlanma

Get-EXOMailbox cmdlet'ini çalıştırıp RecipientTypeDetails parametresine RoomMailbox değerini ileterek oda posta kutularını bulmak kolaydır. Örneğin:

Get-ExoMailbox -RecipientTypeDetails RoomMailbox | Set-Mailbox -CustomAttribute1 'PublicRoom'

Gerekirse daha sonra CustomAttribute1'i başka bir değer depolayacak şekilde güncelleyerek posta kutusuna erişimi kaldırabiliriz. Komut dosyasının testi, çalışan bir kodumuz olduğunu kanıtladı. Şimdi RBACforApps uygulamasından Calendars.Read iznini kaldırıyoruz. Bu, yönetilen kimliğin yalnızca Uygulamalar için RBAC gereksinimlerini karşılaması durumunda oda posta kutularına erişebilmesini sağlar.

[Array]$SPPermissions = Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $ManagedIdentityApp.Id
$GraphApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0000-c000-000000000000'" # Microsoft Graph
$Role = $GraphApp.AppRoles | Where-Object {$_.Value -eq "Calendars.Read"}
$Assignment = $SpPermissions | Where-Object {$_.AppRoleId -eq $Role.Id}
Remove-MgServicePrincipalAppRoleAssignment -AppRoleAssignmentId $Assignment.Id -ServicePrincipalId $ManagedIdentityApp.Id

Artık oda posta kutusu takvimlerine erişim üzerinde Uygulamalar için RBAC kontrolünün temelini oluşturuyoruz. Bu, aşağıdakileri oluşturarak yapılır:

  • Exchange Online'da, yönetilen kimlik tarafından kullanılan kurumsal uygulamanın hizmet sorumlusuna işaret eden bir hizmet sorumlusu nesnesi.
  • Oda posta kutularını bulan bir yönetim kapsamı.
  • Exchange Online hizmet sorumlusu nesnesini, yönetim kapsamını ve Application Calendars.Read iznini bağlamak için bir yönetim rolü ataması.

Sonuç olarak, Exchange Online, yönetilen kimlik tarafından kullanılan uygulamanın belirli posta kutularındaki takvimlere erişme girişimini gördüğünde, takvimlerin yönetim kapsamında tanımlanan posta kutularına ait olup olmadığını kontrol eder. Bu doğruysa Exchange Online erişime izin verir. İşte kullandığım komutlar:

# Grab the Application and Service Principal Identifiers for the app used by the
# managed identity
$SP = Get-MgServicePrincipal -All
$ServicePrincipalId = $SP | Where-Object {$_.displayName -eq "RBACforApps"} | Select-Object -ExpandProperty Id
$AppId = $SP | Where-Object {$_.displayName -eq "RBACforApps"} | Select-Object -ExpandProperty AppId

# Define the service principal object in Exchange Online
New-ServicePrincipal -AppId $AppId -ServiceId $ServicePrincipalId -DisplayName 'RBACforApps'

DisplayName                              ServiceId                                 AppId
-----------                              ---------                                 -----
RBACforApps                              2a492904-9d96-4ece-97e4-c55798a873f5      415e4ba8-635f-4689-b069-22dea1fcfdb3

# Define the management scope for room mailboxes
New-ManagementScope -Name "Room Mailboxes" -RecipientRestrictionFilter "CustomAttribute1 -eq 'PublicRoom'"

Name           ScopeRestrictionType Exclusive RecipientRoot RecipientFilter                   ServerFilter
----           -------------------- --------- ------------- ---------------                   ------------
Room Mailboxes RecipientScope       False                   CustomAttribute1 -eq 'PublicRoom'

# Create the management role assignment to link everything together
New-ManagementRoleAssignment -App $AppId -Role "Application Calendars.Read" -CustomResourceScope "Room Mailboxes"

Seçici Erişimi Test Etme

Uygulamasından Calendars.Read iznini kaldırdığımız için Azure Otomasyonu runbook'u, oda posta kutusu takvimlerine erişim kazanmak için artık Uygulamalar için RBAC'a bağımlıdır. Azure yönetim merkezindeki test bölmesi aracılığıyla runbook'u yürüterek her şeyin hala çalışıp çalışmadığını kontrol edin. Şekil 1 sonuçları göstermektedir. Her şey yolunda ve Yönetim Kurulu Konferans Odasının en yoğun kullanılan oda olduğunu görüyoruz.

Bir sonraki adım seçici erişimi test eder. Özel özniteliği güncelleyerek uygulamanın Yönetim Kurulu Konferans Odası posta kutusuna erişimini kaldırın.

Set-Mailbox -Identity "Board Conference Room" -CustomAttribute1 $Null

Runbook'u yeniden yürütmeye devam edin. Bu kez Uygulamalar için RBAC, Yönetim Kurulu Konferans Odası posta kutusuna erişim izni vermeyecektir çünkü bu posta kutusu, rol ataması için tanımlanan yönetim kapsamına girmemektedir ve dolayısıyla oda kullanım istatistiklerinde yer almamaktadır. Exchange Online'ın daha iyi performans için yönetim kapsamlarını önbelleğe aldığını unutmayın; bu nedenle güncellenmiş kapsamı test etmeden önce 30 dakika bekleyin. Şekil 2 sonucu gösteriyor; beklendiği gibi, Yönetim Kurulu konferans odasından eser yok!

Kullandığım runbook kodunu GitHub'dan indirebilirsiniz.

Kontrol Önemlidir

Uygulamalar için RBAC, Azure AD uygulamalarının Exchange Online posta kutularına seçmeli erişimini sağlar. Büyük miktarlarda posta kutularını işleyen birçok komut dosyası, arka planda veya zamanlanmış işler olarak çalışır. Uygulamalar için RBAC'ın, Azure Otomasyonu tarafından yönetilen kimliklerle yürütülen komut dosyalarıyla çalışması harika bir şey. Kullanıcı verileri üzerinde kontrol uygulama yeteneği her zaman takdir edilmektedir. Uygulamalar için RBAC'ın SharePoint Online, Teams ve gizli verileri tutan diğer potansiyel depoları kapsaması güzel olurdu.

İlgili makaleler