Azure PowerShell kullanarak sertifikayla bir hizmet sorumlusu oluşturma
Kaynaklara erişmesi gereken bir uygulamanız veya betiğiniz olduğunda, uygulama için bir kimlik ayarlayabilir ve uygulamanın kimliğini kendi kimlik bilgileriyle doğrulayabilirsiniz. Bu kimlik, hizmet sorumlusu olarak bilinir. Bu yaklaşım şunları yapmanızı sağlar:
- Uygulama kimliğine kendi izinlerinizden farklı izinler atayabilirsiniz. Normalde, bu izinler tam olarak uygulamaya gereken izinlerle sınırlı olur.
- Katılımsız bir betik yürütürken kimlik doğrulaması için sertifika kullanabilirsiniz.
Önemli
Hizmet sorumlusu oluşturmak yerine, uygulama kimliğiniz için Azure kaynakları için yönetilen kimlikleri kullanmayı göz önünde bulundurun. Kodunuz yönetilen kimlikleri destekleyen ve Microsoft Entra kimlik doğrulamasını destekleyen kaynaklara erişen bir hizmette çalışıyorsa, yönetilen kimlikler sizin için daha iyi bir seçenektir. Şu anda hangi hizmetlerin desteklediği de dahil olmak üzere Azure kaynakları için yönetilen kimlikler hakkında daha fazla bilgi edinmek için bkz . Azure kaynakları için yönetilen kimlikler nedir?.
Bu makalede, sertifikayla kimlik doğrulaması yapan bir hizmet sorumlusunun nasıl oluşturulduğu gösterilir. Parolası olan bir hizmet sorumlusu ayarlamak için bkz. Azure PowerShell ile Azure hizmet sorumlusu oluşturma.
Bu makale için PowerShell'in en son sürümünü kullanıyor olmalısınız.
Not
Azure ile etkileşim kurmak için Azure Az PowerShell modülünü kullanmanızı öneririz. Başlamak için bkz. Azure PowerShell'i yükleme. Az PowerShell modülüne nasıl geçeceğinizi öğrenmek için bkz. Azure PowerShell’i AzureRM’den Az’ye geçirme.
Gerekli izinler
Bu makaleyi tamamlamak için hem Microsoft Entra Id hem de Azure aboneliğinizde yeterli izinlere sahip olmanız gerekir. Özellikle, Microsoft Entra Id'de bir uygulama oluşturabilmeniz ve hizmet sorumlusunu bir role atayabilmeniz gerekir.
Hesabınızın yeterli izinlere sahip olup olmadığını denetlemenin en kolay yolu Microsoft Entra yönetim merkezini kullanmaktır.
Uygulamayı bir role atama
Aboneliğinizdeki kaynaklara erişmek için uygulamayı bir role atamanız gerekir. Hangi rolün uygulama için doğru izinleri sunduğuna karar verin. Kullanılabilir roller hakkında bilgi edinmek için bkz . Azure yerleşik rolleri.
Kapsamı abonelik, kaynak grubu veya kaynak düzeyinde ayarlayabilirsiniz. İzinler daha düşük kapsam düzeylerine devralınır. Örneğin, bir kaynak grubunun Okuyucu rolüne uygulama eklemek, kaynak grubunu ve içerdiği tüm kaynakları okuyabileceği anlamına gelir. Uygulamanın yeniden başlatma, başlatma ve durdurma örnekleri gibi eylemleri yürütmesine izin vermek için Katkıda Bulunan rolünü seçin.
Otomatik olarak imzalanan bir sertifikayla hizmet sorumlusu oluşturma
Aşağıdaki örnekte basit bir senaryo ele alınmıştır. Otomatik olarak imzalanan sertifikaya sahip bir hizmet sorumlusu oluşturmak için New-AzADServicePrincipal kullanır ve Hizmet sorumlusuna Okuyucu rolünü atamak için New-AzRoleAssignment kullanır. Rol atamasının kapsamı şu anda seçili olan Azure aboneliğinizdir. Farklı bir abonelik seçmek için Set-AzContext kullanın.
Not
New-SelfSignedCertificate cmdlet'i ve PKI modülü şu anda PowerShell Core'da desteklenmiyor.
$cert = New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" `
-Subject "CN=exampleappScriptCert" `
-KeySpec KeyExchange
$keyValue = [System.Convert]::ToBase64String($cert.GetRawCertData())
$sp = New-AzADServicePrincipal -DisplayName exampleapp `
-CertValue $keyValue `
-EndDate $cert.NotAfter `
-StartDate $cert.NotBefore
Sleep 20
New-AzRoleAssignment -RoleDefinitionName Reader -ServicePrincipalName $sp.AppId
Örnek, yeni hizmet sorumlusunun Microsoft Entra Kimliği'ne yayılması için biraz zaman tanıyacak şekilde 20 saniye boyunca uykuda kalır. Betiğiniz yeterince uzun beklemiyorsa şu hatayı görürsünüz: "{ID} sorumlusu {DIR-ID} dizininde yok." Bu hatayı çözmek için bir dakika bekleyin ve New-AzRoleAssignment komutunu yeniden çalıştırın.
ResourceGroupName parametresini kullanıp rol atamasının kapsamı olarak belirli bir kaynak grubunu belirtebilirsiniz. Ayrıca kapsam olarak belirli bir kaynağı belirtmek için ResourceType ve ResourceName parametrelerini kullanabilirsiniz.
Windows 10 veya Windows Server 2016'nız yoksa PKI Çözümlerinden New-SelfSignedCertificateEx cmdlet'ini indirin. İçindekileri ayıklayın ve ihtiyacınız olan cmdlet'i içeri aktarın.
# Only run if you could not use New-SelfSignedCertificate
Import-Module -Name c:\ExtractedModule\New-SelfSignedCertificateEx.ps1
Sertifikayı oluşturmak için betikte aşağıdaki iki satırı değiştirin.
New-SelfSignedCertificateEx -StoreLocation CurrentUser `
-Subject "CN=exampleapp" `
-KeySpec "Exchange" `
-FriendlyName "exampleapp"
$cert = Get-ChildItem -path Cert:\CurrentUser\my | where {$PSitem.Subject -eq 'CN=exampleapp' }
Otomatik PowerShell betiği aracılığıyla sertifika sağlama
Hizmet sorumlusu olarak her oturum açtığınızda, AD uygulamanız için dizinin kiracı kimliğini belirtin. Kiracı, Microsoft Entra Id'nin bir örneğidir.
$TenantId = (Get-AzSubscription -SubscriptionName "Contoso Default").TenantId
$ApplicationId = (Get-AzADApplication -DisplayNameStartWith exampleapp).AppId
$Thumbprint = (Get-ChildItem cert:\CurrentUser\My\ | Where-Object {$_.Subject -eq "CN=exampleappScriptCert" }).Thumbprint
Connect-AzAccount -ServicePrincipal `
-CertificateThumbprint $Thumbprint `
-ApplicationId $ApplicationId `
-TenantId $TenantId
Sertifika Yetkilisinin sertifikasıyla hizmet sorumlusu oluşturma
Aşağıdaki örnekte, hizmet sorumlusu oluşturmak için bir Sertifika Yetkilisinin verdiği sertifika kullanılır. Atamanın kapsamı belirtilen Azure aboneliğidir. Hizmet sorumlusunu Okuyucu rolüne ekler. Rol ataması sırasında hata oluştursa, atamayı yeniden dener.
Param (
[Parameter(Mandatory=$true)]
[String] $ApplicationDisplayName,
[Parameter(Mandatory=$true)]
[String] $SubscriptionId,
[Parameter(Mandatory=$true)]
[String] $CertPath,
[Parameter(Mandatory=$true)]
[String] $CertPlainPassword
)
Connect-AzAccount
Import-Module Az.Resources
Set-AzContext -Subscription $SubscriptionId
$CertPassword = ConvertTo-SecureString $CertPlainPassword -AsPlainText -Force
$PFXCert = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList @($CertPath, $CertPassword)
$KeyValue = [System.Convert]::ToBase64String($PFXCert.GetRawCertData())
$ServicePrincipal = New-AzADServicePrincipal -DisplayName $ApplicationDisplayName
New-AzADSpCredential -ObjectId $ServicePrincipal.Id -CertValue $KeyValue -StartDate $PFXCert.NotBefore -EndDate $PFXCert.NotAfter
Get-AzADServicePrincipal -ObjectId $ServicePrincipal.Id
$NewRole = $null
$Retries = 0;
While ($NewRole -eq $null -and $Retries -le 6)
{
# Sleep here for a few seconds to allow the service principal application to become active (should only take a couple of seconds normally)
Sleep 15
New-AzRoleAssignment -RoleDefinitionName Reader -ServicePrincipalName $ServicePrincipal.AppId | Write-Verbose -ErrorAction SilentlyContinue
$NewRole = Get-AzRoleAssignment -ObjectId $ServicePrincipal.Id -ErrorAction SilentlyContinue
$Retries++;
}
$NewRole
Otomatik PowerShell betiği aracılığıyla sertifika sağlama
Hizmet sorumlusu olarak her oturum açtığınızda, AD uygulamanız için dizinin kiracı kimliğini belirtin. Kiracı, Microsoft Entra Id'nin bir örneğidir.
Param (
[Parameter(Mandatory=$true)]
[String] $CertPath,
[Parameter(Mandatory=$true)]
[String] $CertPlainPassword,
[Parameter(Mandatory=$true)]
[String] $ApplicationId,
[Parameter(Mandatory=$true)]
[String] $TenantId
)
$CertPassword = ConvertTo-SecureString $CertPlainPassword -AsPlainText -Force
$PFXCert = New-Object `
-TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 `
-ArgumentList @($CertPath, $CertPassword)
$Thumbprint = $PFXCert.Thumbprint
Connect-AzAccount -ServicePrincipal `
-CertificateThumbprint $Thumbprint `
-ApplicationId $ApplicationId `
-TenantId $TenantId
Uygulama kimliği ve kiracı kimliği büyük/küçük harfe duyarlı değildir, dolayısıyla bunları doğrudan betiğinize ekleyebilirsiniz. Kiracı kimliğini almanız gerekiyorsa şunu kullanın:
(Get-AzSubscription -SubscriptionName "Contoso Default").TenantId
Uygulama kimliğini almanız gerekiyorsa şunu kullanın:
(Get-AzADApplication -DisplayNameStartWith {display-name}).AppId
Kimlik bilgilerini değiştirme
Bir AD uygulamasının kimlik bilgilerini, güvenlik güvenliğinin aşılmasına veya kimlik bilgilerinin sona ermesi nedeniyle değiştirmek için Remove-AzADAppCredential ve New-AzADAppCredential cmdlet'lerini kullanın.
Uygulamanın tüm kimlik bilgilerini kaldırmak için şunu kullanın:
Get-AzADApplication -DisplayName exampleapp | Remove-AzADAppCredential
Sertifika değeri eklemek için, bu makalede gösterildiği gibi otomatik olarak imzalanan bir sertifika oluşturun. Ardından şunu kullanın:
Get-AzADApplication -DisplayName exampleapp | New-AzADAppCredential `
-CertValue $keyValue `
-EndDate $cert.NotAfter `
-StartDate $cert.NotBefore
Hata Ayıklama
Hizmet sorumlusu oluştururken şu hataları alabilirsiniz:
"Authentication_Unauthorized" veya "Bağlamda abonelik bulunamadı." - Hesabınız bir uygulamayı kaydetmek için Microsoft Entra Id üzerinde gerekli izinlere sahip olmadığında bu hatayı görürsünüz. Genellikle bu hatayı yalnızca Microsoft Entra Id'nizdeki yönetici kullanıcılar uygulamaları kaydedebildiğinde ve hesabınız yönetici olmadığında görürsünüz. Yöneticinizden sizi bir yönetici rolüne atamasını veya kullanıcıların uygulamaları kaydetmesini sağlamasını isteyin.
Hesabınızın "'/subscriptions/{guid}' kapsamı üzerinden 'Microsoft.Authorization/roleAssignments/write' eylemi gerçekleştirme yetkisi yok." - Hesabınız bir kimliğe rol atamak için yeterli izinlere sahip olmadığında bu hatayı görürsünüz. Abonelik yöneticinizden sizi Kullanıcı Erişimi Yöneticisi rolüne atamasını isteyin.
Sonraki adımlar
- Parolayla hizmet sorumlusu ayarlamak için bkz . Azure PowerShell ile Azure hizmet sorumlusu oluşturma veya Azure CLI ile Azure hizmet sorumlusu oluşturma.
- Uygulamaların ve hizmet sorumlularının daha ayrıntılı açıklaması için bkz. Uygulama Nesneleri ve Hizmet Sorumlusu Nesneleri.
- Microsoft Entra kimlik doğrulaması hakkında daha fazla bilgi için bkz . Microsoft Entra Id için Kimlik Doğrulama Senaryoları.
- Microsoft Graph kullanarak uygulama kayıtlarıyla çalışma hakkında bilgi için Bkz. Uygulamalar API başvurusu.