Creare un'entità servizio di Azure con Azure PowerShell

Gli strumenti automatici che usano i servizi di Azure devono sempre avere autorizzazioni limitate. Anziché avere applicazioni che accedono come utente con privilegi completi, Azure fornisce entità servizio.

Un'entità servizio di Azure è un'identità creata per l'uso con applicazioni, servizi in hosting e strumenti automatici per l'accesso alle risorse di Azure. Questo accesso è limitato dai ruoli assegnati all'entità servizio e consente quindi di definire quali risorse siano accessibili e a quale livello. Per motivi di sicurezza è sempre consigliabile usare le identità servizio per gli strumenti automatici, invece di consentire loro di accedere con un'identità utente.

Questo articolo illustra i passaggi per la creazione, l'acquisizione di informazioni correlate e il ripristino di un'entità servizio con Azure PowerShell.

Creare un'entità servizio

Avviso

Quando si crea un'entità servizio con il comando New-AzADServicePrincipal, l'output include credenziali che è necessario proteggere. In alternativa, è consigliabile usare identità gestite per evitare la necessità di usare le credenziali.

Per impostazione predefinita, New-AzADServicePrincipal assegna il ruolo di Collaboratore all'entità servizio nell'ambito della sottoscrizione. Per ridurre il rischio di un'entità servizio compromessa, assegnare un ruolo più specifico e limitare l'ambito a una risorsa o a un gruppo di risorse. Per altre informazioni, vedere Procedura per aggiungere un'assegnazione di ruolo.

Creare un'entità servizio con il cmdlet New-AzADServicePrincipal. Quando si crea un'entità servizio, si sceglie il tipo di autenticazione per l'accesso che verrà usata dall'entità.

Nota

Se l'account non dispone dell'autorizzazione per creare un'entità servizio, New-AzADServicePrincipal restituirà un messaggio di errore contenente "Privilegi insufficienti per completare l'operazione". Contattare l'amministratore di Microsoft Entra per creare un'entità servizio.

Esistono due tipi di autenticazione disponibili per le entità servizio: autenticazione basata su password e autenticazione basata su certificati.

Autenticazione basata su password

Senza altri parametri di autenticazione, viene usata l'autenticazione basata su password e viene creata automaticamente una password casuale. Se si intende implementare l'autenticazione basata su password, si consiglia questo metodo.

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName

L'oggetto restituito contiene il membro Secret, ovvero un oggetto SecureString contenente la password generata. Assicurarsi di conservare questo valore in un posto sicuro per eseguire l'autenticazione con l'entità servizio. Il valore non verrà visualizzato nell'output della console. Se si perde la password, reimpostare le credenziali dell'entità servizio.

Il codice seguente consentirà di esportare il segreto:

$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret)
$UnsecureSecret = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

Per le password definite dall'utente, l'argomento -PasswordCredential accetta oggetti Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential. Questi oggetti devono avere valori validi di StartDate e EndDate e accettano Password in testo non crittografato. Quando si crea una password, assicurarsi di seguire le regole e le restrizioni della password di Microsoft Entra. Non usare password vulnerabili o già usate in precedenza.

Import-Module Az.Resources # Imports the PSADPasswordCredential object
$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential -Property @{ StartDate=Get-Date; EndDate=Get-Date -Year 2024; Password=<Choose a strong password>}
$sp = New-AzAdServicePrincipal -DisplayName ServicePrincipalName -PasswordCredential $credentials

L'oggetto restituito da New-AzADServicePrincipal contiene i membri Id e DisplayName, che possono essere entrambi usati per l'accesso con l'entità servizio.

Importante

L'accesso con un'entità servizio richiede l'ID del tenant in cui è stata creata. Per ottenere il tenant attivo quando è stata creata l'entità servizio, eseguire il comando seguente immediatamente dopo averla creata:

(Get-AzContext).Tenant.Id

Autenticazione basata su certificati

Le entità servizio che usano l'autenticazione basata su certificato vengono create con il parametro -CertValue. Questo parametro accetta una stringa ASCII con codifica Base64 del certificato pubblico, rappresentato da un file PEM oppure da un file CRT o CER con codifica di testo. Le codifiche binarie del certificato pubblico non sono supportate. Queste istruzioni presuppongono che sia già disponibile un certificato.

$cert = <public certificate as base64-encoded string>
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName -CertValue $cert

È anche possibile usare il parametro -KeyCredential, che accetta oggetti PSADKeyCredential. Questi oggetti devono avere valori validi di StartDate e EndDate. Inoltre, il membro CertValue deve essere impostato su una stringa ASCII con codifica Base64 del certificato pubblico.

$cert = <public certificate as base64-encoded string>
$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADKeyCredential -Property @{ StartDate=Get-Date; EndDate=Get-Date -Year 2024; KeyId=New-Guid; CertValue=$cert}
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName -KeyCredential $credentials

L'oggetto restituito da New-AzADServicePrincipal contiene i membri Id e DisplayName, che possono essere entrambi usati per l'accesso con l'entità servizio. I client che accedono con l'entità servizio devono anche accedere alla chiave privata del certificato.

Importante

L'accesso con un'entità servizio richiede l'ID del tenant in cui è stata creata. Per ottenere il tenant attivo quando è stata creata l'entità servizio, eseguire il comando seguente immediatamente dopo averla creata:

(Get-AzContext).Tenant.Id

Ottenere un'entità servizio esistente

L'elenco delle entità servizio per il tenant attualmente attivo può essere recuperato con Get-AzADServicePrincipal. Per impostazione predefinita, questo comando restituisce tutte le entità servizio di un tenant, quindi per le organizzazioni più grandi la restituzione di risultati può richiedere tempi lunghi. In alternativa, è consigliabile usare gli argomenti di filtro facoltativi sul lato server:

  • -DisplayNameBeginsWith richiede entità di servizio che abbiano un prefisso corrispondente al valore specificato. Il nome visualizzato di un'entità servizio è il valore impostato con -DisplayName durante la creazione.
  • -DisplayName richiede una corrispondenza esatta del nome di un'entità servizio.

Gestire i ruoli delle entità servizio

Azure PowerShell include i cmdlet seguenti per gestire le assegnazioni dei ruoli:

Il ruolo predefinito per un'entità servizio è quello Collaboratore. Questo ruolo ha autorizzazioni complete per la lettura e la scrittura in un account di Azure. Il ruolo Lettore è più restrittivo e offre l'accesso in sola lettura. Per altre informazioni sul controllo degli accessi in base al ruolo e i ruoli, vedere Ruoli predefiniti per il controllo degli accessi in base al ruolo.

Questo esempio aggiunge il ruolo Lettore e rimuove il ruolo Collaboratore:

New-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName "Reader"
Remove-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName "Contributor"

Importante

I cmdlet per l'assegnazione dei ruoli non accettano l'ID oggetto entità servizio. Accettano l'ID applicazione associato, generato al momento della creazione. Per ottenere l'ID applicazione per un'entità servizio, usare Get-AzADServicePrincipal.

Nota

Se l'account non dispone dell'autorizzazione per assegnare un ruolo, viene visualizzato un messaggio di errore che indica che l'account "non dispone dell'autorizzazione per eseguire l'azione "Microsoft.Authorization/roleAssignments/write". Contattare l'amministratore di Microsoft Entra per gestire i ruoli.

L'aggiunta di un ruolo non limita le autorizzazioni assegnate in precedenza. Quando si limitano le autorizzazioni di un'entità servizio, il ruolo Collaboratore deve essere rimosso.

È possibile verificare le modifiche visualizzando l'elenco dei ruoli assegnati:

Get-AzRoleAssignment -ServicePrincipalName ServicePrincipalName

Accedere con un'entità servizio

Testare le credenziali e le autorizzazioni della nuova entità servizio eseguendo l'accesso. Per accedere con un'entità servizio, è necessario il valore di applicationId associato e il tenant in cui è stata creata.

Per accedere con un'entità servizio usando una password:

# Use the application ID as the username, and the secret as password
$credentials = Get-Credential
Connect-AzAccount -ServicePrincipal -Credential $credentials -Tenant <tenant ID> 

Per l'autenticazione basata su certificato, è necessario che Azure PowerShell sia in grado di recuperare informazioni da un archivio certificati locale in base a un'identificazione personale del certificato.

Connect-AzAccount -ServicePrincipal -Tenant <tenant ID> -CertificateThumbprint <thumbprint>

Per le istruzioni su come importare un certificato in un archivio certificati accessibile a PowerShell, vedere Accedere con Azure PowerShell

Reimpostare le credenziali

Se si dimenticano le credenziali per un'entità di servizio, usare New-AzADSpCredential per aggiungerne una nuova. Questo cmdlet accetta gli stessi argomenti e tipi di credenziali di New-AzADServicePrincipal. Senza argomenti di credenziali, viene creato un nuovo oggetto PasswordCredential con una password casuale.

Importante

Prima di assegnare nuove credenziali, è consigliabile rimuovere quelle esistenti per evitare che vengano usate per l'accesso. A questo scopo, usare il cmdlet Remove-AzADSpCredential:

Remove-AzADSpCredential -DisplayName ServicePrincipalName
$newCredential = New-AzADSpCredential -ServicePrincipalName ServicePrincipalName