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.

Dekont

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 portalı kullanmaktır. Bkz. Gerekli izinleri denetleme.

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.

Dekont

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