PowerShell SDK'yı Kullanarak Microsoft Graph'a Bağlanma


Grafiğe Güvenli ve Güçlü Bir Şekilde Bağlanın

Güncelleme: 1 Ağustos 2023

Önceki bir makalede, 30 Haziran 2022'de kullanımdan kaldırılmadan önce Azure AD modülündeki lisans yönetimi cmdlet'lerini değiştirmek için PowerShell için Microsoft Graph SDK'sındaki cmdlet'leri kullanmayı tartıştım (güncelleme: Microsoft bu tarihi Mart ayına taşıdı) 2024). Görünen o ki, birkaç Azure AD cmdlet'ini Get-MgUser ve Set-MgUserLicense gibi cmdlet'lerle değiştirerek dönüştürmek özellikle zor değil (eğer öyleyse, ben bunu yapamazdı). Ancak üretim ortamlarında kullanılan PowerShell karışımına yeni bir modülün eklenmesi her zaman bazı soru ve endişelere yol açar; bunların en önemlisi güvenliktir.

Graph SDK cmdlet'lerini test ve üretim ortamlarında kullanmanın doğru ve yanlış yolu vardır. Özetle, cmdlet'leri etkileşimli olarak çalıştırmak basittir ancak aşırı izin verilen hizmet sorumlusu (uygulama) ile ilgili bir soruna yol açabilir. Her şey Graph SDK'nın bağlanma şekli ve kullandığı izinlerle ilgilidir. Nedenini inceleyelim.

Grafik SDK'sına bağlanma

Graph SDK'nın herhangi bir kullanımında ilk adım, Connect-MgGraph cmdlet'ini kullanarak Graph'a bağlanmaktır. Grafiğe bağlanmak için Connect-MgGraph'i çalıştırdığınızda, bağlanmak istediğiniz kiracının tanımlayıcısını belirtmeniz akıllıca olacaktır.

Connect-MgGraph -TenantId "828e1143-88e3-492b-bf82-24c4a47ada63"

Bir kiracı belirtmezseniz Connect-MgGraph, bir oturum sırasında oturum açtığınız son kiracıyı seçecektir (bu, bağlanmak istediğiniz kiracı olmayabilir). Graph'a bağlandığımda bunu keşfettim ve kullanılan verilerin geliştirme kiracıma ait olduğunu keşfettim. O zaman fark ettim ama birisinin bunu başka bir yerde gözden kaçırması mümkün, bu yüzden kiracı tanımlayıcıyla bağlantı kurmayı bir alışkanlık haline getirin.

Bir oturum siz Disconnect-MgGraph'i çalıştırana kadar sürer (aşağıya bakın) ve Connect-MgGraph çalıştırılarak günler boyunca birden çok kez yeniden başlatılabilir. Perde arkasında, Graph SDK şifrelenmiş bir belirteç önbelleği tutar ve Grafik komutlarıyla çalışmanıza olanak sağlamak için belirteci gerektiği şekilde yeniler.

İzinler

Başarılı bir bağlantı kurduktan sonra oturum, hesabınız olarak oturum açar. Bağlantının izin kapsamı, SDK için Azure AD'de kayıtlı hizmet sorumlusundan (kurumsal uygulama) gelir. Graph SDK ile daha önce hiç oturum açmadıysanız SDK, 14d82eec-204b-4c2f-b7e8-296a70dab67e Microsoft Graph Command Line Tools adlı kurumsal bir uygulama oluşturur.ve sınırlı sayıda izin ister (Şekil 1). Yöneticiyseniz kuruluş adına bu izinlere izin verebilirsiniz. Dikkatli yöneticilerin makul şüphelerini hafifletmek için, hizmet sorumlusunun doğrulanmış olarak ortaya çıkması iyi olurdu, ancak şu anda durum böyle değil.

Microsoft Graph PowerShell SDK'sı için izin verilen izinler, kurumsal uygulamanın hizmet sorumlusu tarafından tutulur.

Yeni İzinler Toplama

İnsanlar etkileşimli istemciyi kullanarak Graph SDK komutlarını yürütmeye başladıkça, komutları çalıştırmak için gereken izinler için onay almaları gerekecek. Örneğin, bir dizi Azure AD hesabını almak üzere Get-MgUser cmdlet'ini kullanmak için kullanıcının dizin bilgilerini okuma iznine ihtiyacı vardır; böylece Scope 'i kullanarak izin isteyebilir. bağlantıyı aşağıdaki gibi yaparken parametre:

$RequiredScopes = @("Directory.AccessAsUser.All", "Directory.ReadWrite.All")
Connect-MgGraph -Scopes $RequiredScopes

Kurumsal uygulama tarafından tutulmayan izinleri içeren bir kapsama bağlanmak, Azure AD'nin hizmet sorumlusundan devralınmayan izinler için izin istemesine neden olur (Şekil 2).

Grafik API'lerini kullanan diğer uygulamalar gibi, yönetici de kuruluş adına istenen izinlere izin verir. Bu, hizmet sorumlusu tarafından tutulan kümeye ekstra izinler ekler. Yönetici izin vermezse oturum için istenen izinler kullanılabilir (oturum açılmış hesap tarafından sahip olunan yönetim rollerine tabidir), ancak hizmet sorumlusunun sahip olduğu kümeye katılmaz.

Zamanla, SDK'nın hizmet sorumlusunun sahip olduğu izinler, ilk onay anında verilen izinlerin yanı sıra, kişiler etkileşimli istemciyle çalıştıkça daha sonra verilen diğer izinler olacaktır. Başka bir deyişle, hizmet sorumlusu zaman içinde toplu izinleri toplar. Bu nedenle, Graph SDK cmdlet'lerini etkileşimli olarak kullanmanız önerilmez; çünkü bunu yaparsanız, zamanla hizmet sorumlusuna çok fazla izin verilmesi ve dolayısıyla bir güvenlik riski haline gelmesi ihtimali belirgindir. Bu, Bulut Uygulama Güvenliği için Uygulama Yönetişimi (veya bu makalede açıklanan evde geliştirilen çözüm) tarafından vurgulanan türden bir sorundur. Ayrıca, yüksek öncelikli izinler atanan uygulamalara da dikkat etmelisiniz çünkü bunlar saldırganlar tarafından yerleştirilmiş veya istismar edilmiş olabilecek uygulamalardır.

Aşırı izin verilen hizmet sorumlusunun tek çözümü, onun kaldırılması ve yeniden oluşturulmasıdır; bu durumda yönetici, yeni hizmet sorumlusuna sınırlı izinler için onay verebilir. Graph SDK cmdlet'lerini (doğal olarak) kullanarak hizmet sorumlusunu nasıl kaldıracağınız aşağıda açıklanmıştır:

$Sp = Get-MgServicePrincipal -Filter "AppId eq '14d82eec-204b-4c2f-b7e8-296a70dab67e'"
Remove-MgServicePrincipal -ServicePrincipalId $Sp.Id

Beta Profiline Bağlanma

Bazı durumlarda belirli komutlara ve verilere erişim sağlamak için beta profilini kullanmanız gerekir. Bu, Graph API sorguları yayınlanırken beta uç noktasını belirtmeye eşdeğerdir. Beta profilini seçmek için Select-MgProfile cmdlet'ini çalıştırın:

Select-MgProfile beta

Güncelleme: Microsoft Graph PowerShell SDK'nın V2.0'ı, Select-MgProfile cmdlet'ine olan ihtiyacı ortadan kaldırır. Bunun yerine beta cmdlet'ler ayrı bir modüldedir.

Bağlantınızı Rapor Etme

Doğru profil ve izinlerle doğru kiracıya bağlanıp bağlanmadığınızı kontrol etmek için, Get-MgContext ile geçerli bağlantı olan Get-MgOrganization cmdlet'i ile kiracı hakkında bilgi alabiliriz. cmdlet'ini ve Get-MgProfile cmdlet'iyle kullanılan profili seçin ve bazı yararlı bilgileri görüntüleyin:

$Details = Get-MgContext
$Scopes = $Details | Select -ExpandProperty Scopes
$Scopes = $Scopes -Join ", "
$OrgName = (Get-MgOrganization).DisplayName
CLS
Write-Host "Microsoft Graph Connection Information"
Write-Host "--------------------------------------"
Write-Host " "
Write-Host ("Connected to Tenant {0} ({1}) as account {2}" -f $Details.TenantId, $OrgName, $Details.Account)
Write-Host "+-------------------------------------------------------------------------------------------------------------------+"
Write-Host ("Profile set as {0}. The following permission scope is defined: {1}" -f $ProfileName, $Scopes)
Write-Host ""

Microsoft Graph Connection Information
--------------------------------------

Connected to Tenant a662313f-14fc-43a2-9a7a-d2e27f4f3475 (Office 365 for IT Pros) as account Global.Administrator@office365itpros.com
+-------------------------------------------------------------------------------------------------+
The following scopes are defined: Directory.AccessAsUser.All, Directory.ReadWrite.All, openid, profile, User.Read, email, Group.Read.All, Group.ReadWrite.All 

Yukarıda listelenen izinler, hizmet sorumlusundan devralınan izinleri ve kullanıcı tarafından oturum için talep edilen diğer izinleri içerir.

İşiniz Bitince Bağlantıyı Kes

Grafikle etkileşimi bitirdiğinizde, oturumun Grafiğin oturumunu kapatmak için Disconnect-MgGraph komutunu çalıştırarak oturumu kapatmayı unutmayın. Oturumun bağlantısını kesmek şifrelenmiş verileri kaldırır. belirteç önbelleği ve bir oturumun yeniden başlatılmasını önler.

Disconnect-MgGraph

Üretim Kullanımı için Yalnızca Uygulama Erişimi

Yukarıdaki açıklama etkileşimli bir oturumu kapsamaktadır. Bu, operasyonel kullanıma hazırlanırken Graph SDK cmdlet'lerini tanımanın ve komut dosyalarında hata ayıklamanın iyi bir yoludur. Ancak SDK cmdlet'lerini etkileşimli olarak çalıştırdığınızda yetki verme izinleriyle sınırlı olursunuz. Başka bir deyişle, Microsoft 365 uygulamaları aracılığıyla etkileşimde bulunabileceğiniz öğelere erişebilirsiniz ancak diğer kullanıcıların sahip olduğu öğelere erişemezsiniz. Örneğin, posta kutunuzdaki öğeleri okuyabilirsiniz ancak başka bir posta kutusundaki öğeleri okuyamazsınız. SDK'yı uygulama izinleriyle çalıştırmak istiyorsanız bunu bir uygulamayla veya Azure Otomasyonu'nda (RunAs hesabı veya yönetilen kimlik kullanarak) yapabilirsiniz.

Onay ve hizmet sorumlusuyla ilgili sorunlar nedeniyle Microsoft, operasyonel komut dosyalarının, sertifika tabanlı kimlik doğrulaması (yalnızca uygulama erişimi) veya yönetilen kimlikle kayıtlı Azure AD uygulamalarını kullanmasını önerir. Etkileşimli istemciyi kullanarak komut dosyalarını kesinlikle yazabilir ve test edebilirsiniz, ancak kod tamamlandıktan sonra, onu, kapsamı sıkı bir şekilde belirlenmiş bir izin kümesiyle kendi uygulamasını kullanarak çalıştırmanın zamanı gelir. Bu yaklaşım, uygulamalara atanan izinleri yalnızca komut dosyası tarafından gerçekleştirilen işlemin gerektirdiği grupla sınırlayabileceğiniz ve uygulamayı kullanabilenleri seçilen hesap grubuyla sınırlandırabileceğiniz anlamına gelir. Kapsamlı izinlere sahip ayrı uygulamalar kullanmanın olumsuz tarafı, zamanla Azure AD'de yönetilmesi gereken birçok kayıtlı uygulamayı biriktirebilmenizdir.

Bunun alternatifi, SDK cmdlet'lerini kullanan betikleri çalıştırmak için Azure Otomasyonunu yönetilen kimliklerle kullanmaktır. Daha fazla bilgi için bu makaleye bakın.

Microsoft'un Çözmesi Gereken Bazı Sorunlar

İzinleri sürekli olarak özenle toplayan bir hizmet sorumlusuna sahip olmak iyi bir fikir gibi görünmüyor. Aslında bu berbat bir fikir. Microsoft'un, yöneticilerin Graph SDK cmdlet'lerini bir güvenlik sorunu yaratmadan etkileşimli olarak çalıştırmalarına izin vermenin daha iyi bir yolunu bulması gerekiyor. İzinleri sıfırlamanın bir yolu olarak Disconnect-MgGraph çalıştırıldığında güvenlik ilkesini silmek, ancak bu kötü bir çözümdür. İnsanların Grafiğe erişimi doğrulamak için kullanıcı adlarını ve şifrelerini sabit kodlamasına veya komut dosyalarındaki uygulama sırlarını kullanmasına izin vermek de mevcut tehdit ortamı göz önüne alındığında alınacak bir yön değildir.

İşin gerçeği kiracı yöneticilerinin hizmet sorumlularını kontrol etmedikleri sürece izin biriktirme konusunu unutacaklarıdır. Üzücü ama gerçek ve diğer işlerin talepleri nedeniyle. Disconnect-MicrosoftTeams ve Disconnect-ExchangeOnline gibi cmdlet'lerin göz ardı edilmesiyle aynı nedenden dolayı kişiler de Disconnect-MgGraph'i çalıştırmayacaktır.

Graph SDK mükemmel bir fikir çünkü PowerShell kullanıcılarını Graph API'lerinin kullanımıyla ilgili birçok karmaşıklıktan izole ediyor. Bu hâlâ devam eden bir çalışmadır ancak Microsoft, Graph SDK'yı kiracı yöneticileri için başvurulacak bir araç haline getirmek istiyorsa izin sorununu çözmesi gerekir. Ve yakında (kullanımdan kaldırma son tarihinden önce!)

İlgili makaleler