Creare un'entità servizio di Azure con Azure PowerShell

Avviso

Il modulo AzureRM PowerShell è stato ufficialmente deprecato a partire dal 29 febbraio 2024. È consigliabile eseguire la migrazione da AzureRM al modulo Az PowerShell per garantire il supporto e gli aggiornamenti continui.

Anche se il modulo AzureRM può ancora funzionare, non è più gestito o supportato, posizionando qualsiasi uso continuo a discrezione e rischio dell'utente. Per indicazioni sulla transizione al modulo Az, vedere le risorse di migrazione.

Se si prevede di gestire l'app o il servizio con Azure PowerShell, è consigliabile eseguirlo in un'entità servizio Microsoft Entra di Azure anziché con le proprie credenziali. Questo articolo illustra la creazione di un'entità di sicurezza con Azure PowerShell.

Nota

È inoltre possibile creare un'entità servizio tramite il portale di Azure. Per informazioni dettagliate, vedere Usare il portale per creare un'applicazione Active Directory e un'entità servizio che accedono alle risorse.

Che cos'è un'"entità servizio"?

Un'entità servizio di Azure è un'identità di sicurezza usata da app, servizi e strumenti di automazione creati dall'utente per accedere a risorse di Azure specifiche. Può essere considerata come una "identità utente" (nome utente e password o certificato) con un ruolo specifico e autorizzazioni attentamente controllate. A differenza di un'identità utente generica, un'entità servizio dovrà eseguire solo operazioni specifiche. Se le viene concesso solo il livello minimo di autorizzazioni necessarie per eseguire le attività di gestione, un'entità servizio migliora la sicurezza.

Verificare il proprio livello di autorizzazione

In primo luogo, è necessario disporre di autorizzazioni sufficienti sia nell'ID Microsoft Entra che nella sottoscrizione di Azure. È necessario poter creare un'app in Active Directory e assegnare un ruolo all'entità servizio.

Il modo più semplice per verificare se l'account ha le autorizzazioni corrette è tramite il portale. Vedere l'articolo su come controllare le autorizzazioni necessarie nel portale.

Creare un'entità servizio per l'app

Dopo aver eseguito l'accesso all'account Azure, è possibile creare l'entità servizio. È necessario disporre di uno dei modi seguenti per identificare l'app distribuita:

  • Nome univoco dell'app distribuita, ad esempio "MyDemoWebApp" negli esempi seguenti, oppure
  • ID dell'applicazione, GUID univoco associato all'app, al servizio o all'oggetto distribuito

Ottenere informazioni sull'applicazione

Per ottenere informazioni sull'applicazione è possibile usare il cmdlet Get-AzureRmADApplication.

Get-AzureRmADApplication -DisplayNameStartWith MyDemoWebApp
DisplayName             : MyDemoWebApp
ObjectId                : 775f64cd-0ec8-4b9b-b69a-8b8946022d9f
IdentifierUris          : {http://MyDemoWebApp}
HomePage                : http://www.contoso.com
Type                    : Application
ApplicationId           : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
AvailableToOtherTenants : False
AppPermissions          :
ReplyUrls               : {}

Creare un'entità servizio per l'applicazione

Per creare l'entità servizio si usa il cmdlet New-AzureRmADServicePrincipal.

$servicePrincipal = New-AzureRmADServicePrincipal -ApplicationId 00c01aaa-1603-49fc-b6df-b78c4e5138b4
Secret                : System.Security.SecureString
ServicePrincipalNames : {00c01aaa-1603-49fc-b6df-b78c4e5138b4, http://MyDemoWebApp}
ApplicationId         : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
DisplayName           : MyDemoWebApp
Id                    : 698138e7-d7b6-4738-a866-b4e3081a69e4
AdfsId                :
Type                  : ServicePrincipal

A questo punto è possibile usare direttamente la proprietà $servicePrincipal.Secret in Connect-AzureRmAccount (vedere "Accedere con l'entità servizio" di seguito) oppure convertire SecureString in una stringa di testo normale per utilizzi successivi:

$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($servicePrincipal.Secret)
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR)

Accedere con l'entità servizio

È ora possibile eseguire l'accesso con la nuova entità servizio per l'app usando il valore di appId specificato e la password generata automaticamente. È anche necessario l'ID tenant per l'entità servizio. L'ID tenant viene visualizzato quando si accede ad Azure con le credenziali personali. Per accedere con un'entità servizio, usare i comandi seguenti:

$cred = New-Object System.Management.Automation.PSCredential ("00c01aaa-1603-49fc-b6df-b78c4e5138b4", $servicePrincipal.Secret)
Connect-AzureRmAccount -Credential $cred -ServicePrincipal -TenantId 00000000-0000-0000-0000-000000000000

Dopo che è stato completato l'accesso, verrà visualizzato un output simile al seguente:

Environment           : AzureCloud
Account               : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
TenantId              : 00000000-0000-0000-0000-000000000000
SubscriptionId        :
SubscriptionName      :
CurrentStorageAccount :

Complimenti. È possibile usare queste credenziali per eseguire l'app. Sarà poi necessario modificare le autorizzazioni dell'entità servizio.

Gestione dei ruoli

Nota

Il controllo di accesso in base al ruolo di Azure (Role-Based Access Control - RBAC) è un modello per la definizione e gestione dei ruoli per le entità utente e servizio. I ruoli dispongono di set di autorizzazioni associate a essi, che determinano le risorse che un'entità può leggere scrivere o gestire e a cui può accedere. Per altre informazioni sui ruoli e sul controllo degli accessi in base al ruolo, vedere Controllo degli accessi in base al ruoli: ruoli predefiniti.

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

Il ruolo predefinito per un'entità servizio è quello Collaboratore. Potrebbe non essere la scelta migliore in base allo scope delle interazioni dell'app con i servizi di Azure, date le ampie autorizzazioni. Il ruolo Lettore è più restrittivo e può essere una buona scelta per le app di sola lettura. È possibile visualizzare i dettagli delle autorizzazioni specifiche del ruolo o creare autorizzazioni personalizzate tramite il portale di Azure.

In questo esempio si aggiunge il ruoloLettore all'esempio precedente e si elimina quello Collaboratore:

New-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4 -RoleDefinitionName Reader
RoleAssignmentId   : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG/providers/Microsoft.Authorization/roleAssignments/818892f2-d075-46a1-a3a2-3a4e1a12fcd5
Scope              : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG
DisplayName        : MyDemoWebApp
SignInName         :
RoleDefinitionName : Reader
RoleDefinitionId   : b24988ac-6180-42a0-ab88-20f7382dd24c
ObjectId           : 698138e7-d7b6-4738-a866-b4e3081a69e4
ObjectType         : ServicePrincipal
Remove-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4 -RoleDefinitionName Contributor

Per visualizzare i ruoli correnti assegnati:

Get-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4
RoleAssignmentId   : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG/providers/Microsoft.Authorization/roleAssignments/0906bbd8-9982-4c03-8dae-aeaae8b13f9e
Scope              : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG
DisplayName        : MyDemoWebApp
SignInName         :
RoleDefinitionName : Reader
RoleDefinitionId   : acdd72a7-3385-48ef-bd42-f606fba81ae7
ObjectId           : 698138e7-d7b6-4738-a866-b4e3081a69e4
ObjectType         : ServicePrincipal

Altri cmdlet di Azure PowerShell per la gestione dei ruoli:

Modificare le credenziali dell'entità di sicurezza

È buona norma verificare le autorizzazioni e aggiornare le password a intervalli regolari. È anche consigliabile gestire e modificare le credenziali di sicurezza quando si modifica un'app. Ad esempio, si può modificare la password dell'entità servizio creando una nuova password ed eliminando la precedente.

Aggiungere una nuova password per l'entità servizio

New-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
Secret    : System.Security.SecureString
StartDate : 11/16/2018 12:38:23 AM
EndDate   : 11/16/2019 12:38:23 AM
KeyId     : 6f801c3e-6fcd-42b9-be8e-320b17ba1d36
Type      : Password

Ottenere un elenco di credenziali per l'entità servizio

Get-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
StartDate           EndDate             KeyId                                Type
---------           -------             -----                                ----
3/8/2017 5:58:24 PM 3/8/2018 5:58:24 PM 6f801c3e-6fcd-42b9-be8e-320b17ba1d36 Password
5/5/2016 4:55:27 PM 5/5/2017 4:55:27 PM ca9d4846-4972-4c70-b6f5-a4effa60b9bc Password

Rimuovere la vecchia password dall'entità servizio

Remove-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp -KeyId ca9d4846-4972-4c70-b6f5-a4effa60b9bc
Confirm
Are you sure you want to remove credential with keyId '6f801c3e-6fcd-42b9-be8e-320b17ba1d36' for
service principal objectId '698138e7-d7b6-4738-a866-b4e3081a69e4'.
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

Verificare l'elenco di credenziali per l'entità servizio

Get-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
StartDate           EndDate             KeyId                                Type
---------           -------             -----                                ----
3/8/2017 5:58:24 PM 3/8/2018 5:58:24 PM 6f801c3e-6fcd-42b9-be8e-320b17ba1d36 Password

Ottenere informazioni sull'entità servizio

$svcprincipal = Get-AzureRmADServicePrincipal -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4
$svcprincipal | Select-Object -Property *
ServicePrincipalNames : {http://MyDemoWebApp, 00c01aaa-1603-49fc-b6df-b78c4e5138b4}
ApplicationId         : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
DisplayName           : MyDemoWebApp
Id                    : 698138e7-d7b6-4738-a866-b4e3081a69e4
Type                  : ServicePrincipal