Condividi tramite


Usare Azure PowerShell per creare un'entità servizio con un certificato

Quando si ha un'app o uno script che deve accedere alle risorse, è possibile configurare un'identità per l'app ed eseguirne l'autenticazione con credenziali specifiche. Questa identità è nota come entità del servizio. Questo approccio consente di:

  • Assegnare all'identità dell'app autorizzazioni diverse rispetto a quelle dell'utente. Tali autorizzazioni sono in genere limitate alle specifiche operazioni che devono essere eseguite dall'app.
  • Usare un certificato per l'autenticazione quando esegui uno script non presidiato.

Importante

Anziché creare un principale del servizio, considera l'uso delle identità gestite per le risorse di Azure per l'identità dell'applicazione. Se il codice viene eseguito in un servizio che supporta le identità gestite e accede alle risorse che supportano l'autenticazione Microsoft Entra, le identità gestite sono l'opzione migliore. Per altre informazioni sulle identità gestite per le risorse di Azure, inclusi i servizi attualmente supportati, vedere Informazioni sulle identità gestite per le risorse di Azure.

Questo articolo illustra come creare un'entità servizio che esegue l'autenticazione con un certificato. Per configurare un'entità del servizio con password, vedi creare un'entità del servizio di Azure con Azure PowerShell.

Per questo articolo è necessaria la versione più recente di PowerShell.

Nota

È consigliabile usare il modulo Azure Az PowerShell per interagire con Azure. Per iniziare, vedere Installare Azure PowerShell. Per informazioni su come eseguire la migrazione al modulo AZ PowerShell, vedere Eseguire la migrazione di Azure PowerShell da AzureRM ad Az.

Autorizzazioni necessarie

Per completare questo articolo, è necessario avere autorizzazioni sufficienti sia in Microsoft Entra ID che nella sottoscrizione di Azure. In particolare, è necessario poter creare un'app in Microsoft Entra ID e assegnare il principale del servizio a un ruolo.

Il modo più semplice per verificare se l'account dispone delle autorizzazioni appropriate è l’interfaccia di amministrazione di Microsoft Entra.

Assegnare l'applicazione a un ruolo

Per accedere alle risorse della propria sottoscrizione è necessario assegnare l'applicazione a un ruolo. Decidere quale ruolo offre le autorizzazioni appropriate per l'applicazione. Per informazioni sui ruoli disponibili, vedere Ruoli predefiniti di Azure.

È possibile impostare l'ambito al livello della sottoscrizione, del gruppo di risorse o della risorsa. Le autorizzazioni vengono ereditate a livelli inferiori dell'ambito. Se ad esempio si aggiunge un'applicazione al ruolo Lettore per un gruppo di risorse, l'applicazione può leggere il gruppo di risorse e le risorse in esso contenute. Per consentire all'applicazione di eseguire azioni quali istanze di riavvio, avvio e arresto, selezionare il ruolo Collaboratore.

Creare un'entità servizio con certificato autofirmato

L'esempio seguente illustra uno scenario semplice. Viene usato New-AzAD​Service​Principal per creare un'entità servizio con un certificato autofirmato e viene usato New-AzRoleAssignment per assegnare il ruolo Lettore all'entità servizio. L'assegnazione del ruolo viene limitata alla sottoscrizione di Azure attualmente selezionata. Per selezionare un'altra sottoscrizione, usare Set-AzContext.

Nota

Il cmdlet New-SelfSignedCertificate e il modulo PKI non sono attualmente supportati in PowerShell Core.

$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

L'esempio si ferma per 20 secondi per consentire al nuovo principal di servizio di propagarsi in Microsoft Entra ID. Se lo script non aspetta abbastanza a lungo, verrà visualizzato un errore simile al seguente: "Il principale {ID} non esiste nella directory {DIR-ID}". Per risolvere questo errore, attendere un momento e poi eseguire di nuovo il comando New-AzRoleAssignment.

È possibile definire l'ambito di assegnazione di ruolo a un gruppo di risorse specifico tramite il parametro ResourceGroupName. È possibile definire l'ambito per una risorsa specifica usando anche i parametri ResourceType e ResourceName.

Se si non si dispone di Windows 10 o Windows Server 2016, scaricare il cmdlet New-SelfSignedCertificateEx da soluzioni PKI. Estrarre i contenuti e importare il cmdlet necessario.

# Only run if you could not use New-SelfSignedCertificate
Import-Module -Name c:\ExtractedModule\New-SelfSignedCertificateEx.ps1

Nello script sostituire le due righe seguenti per generare il certificato.

New-SelfSignedCertificateEx -StoreLocation CurrentUser `
  -Subject "CN=exampleapp" `
  -KeySpec "Exchange" `
  -FriendlyName "exampleapp"
$cert = Get-ChildItem -path Cert:\CurrentUser\my | where {$PSitem.Subject -eq 'CN=exampleapp' }

Fornire il certificato tramite uno script di PowerShell automatizzato

Ogni volta che si accede come servizio principale, fornire l'ID tenant della directory dell'app AD. Un tenant è un'istanza di Microsoft Entra ID.

$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

Creare un'entità servizio principale con un certificato dall'Autorità di Certificazione

L'esempio seguente usa un certificato emesso da un'autorità di certificazione per creare un principale del servizio. L'assegnazione è limitata alla specifica sottoscrizione Azure. Aggiunge il principale del servizio al ruolo Lettore. Se si verifica un errore durante l'assegnazione del ruolo, l'assegnazione viene ritentata.

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

Fornire il certificato tramite uno script di PowerShell automatizzato

Ogni volta che si accede come servizio principale, fornire l'ID tenant della directory dell'app AD. Un tenant è un'istanza di Microsoft Entra ID.

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

Poiché l'ID applicazione e l'ID tenant non sono sensibili, è possibile incorporarli direttamente nello script. Se è necessario recuperare l'ID tenant, usare:

(Get-AzSubscription -SubscriptionName "Contoso Default").TenantId

Se è necessario recuperare l'ID applicazione, usare:

(Get-AzADApplication -DisplayNameStartWith {display-name}).AppId

Modificare le credenziali

Per modificare le credenziali per un'app AD, a causa di una violazione della sicurezza o della scadenza delle credenziali, usare i cmdlet Remove-AzADAppCredential e New-AzADAppCredential.

Per rimuovere tutte le credenziali per un'applicazione, usare:

Get-AzADApplication -DisplayName exampleapp | Remove-AzADAppCredential

Per aggiungere un valore del certificato, creare un certificato autofirmato come illustrato in questo articolo. Successivamente, usare:

Get-AzADApplication -DisplayName exampleapp | New-AzADAppCredential `
  -CertValue $keyValue `
  -EndDate $cert.NotAfter `
  -StartDate $cert.NotBefore

Correzione errori di programma

Durante la creazione di un'entità servizio principale, è possibile che si presentino i seguenti errori:

  • "Authentication_Unauthorized" o "Nessuna sottoscrizione trovata nel contesto". : questo errore viene visualizzato quando l'account non dispone delle autorizzazioni necessarie su Microsoft Entra ID per registrare un'app. L'errore si verifica in genere quando solo gli utenti amministratori di Microsoft Entra ID possono registrare le app e l'account in uso non è un account amministratore. Chiedere all'amministratore di essere assegnati a un ruolo di amministratore oppure di consentire agli utenti di registrare le app.

  • L'account "non è autorizzato a eseguire l'azione 'Microsoft.Authorization/roleAssignments/write' nell'ambito '/subscriptions/{guid}'." - Questo errore viene visualizzato quando l'account non dispone di autorizzazioni sufficienti per assegnare un ruolo a un'identità. Chiedi al tuo amministratore della sottoscrizione di aggiungerti al ruolo di Amministratore accessi utente.

Passaggi successivi