Accedere ad Azure PowerShell in modo non interattivo per scenari di automazione

Un'entità servizio in Azure è un account non interattivo che fornisce un'identità usata da applicazioni, servizi e strumenti di automazione per accedere a risorse di Azure specifiche. L'autenticazione con un'entità servizio è il modo migliore per scrivere script sicuri, poiché agisce come un'identità di sicurezza con autorizzazioni assegnate che regolano le azioni che possono essere eseguite e le risorse a cui si può accedere. Le entità servizio consentono di automatizzare in modo sicuro le attività di gestione senza usare account utente personali, favorendo un accesso più sicuro e gestibile alle risorse di Azure. Analogamente ad altri account utente, le autorizzazioni vengono gestite con Microsoft Entra. Concedendo a un'entità servizio solo le autorizzazioni necessarie, viene garantita la sicurezza degli script di automazione.

Prerequisiti

Accedere con un'identità gestita

Le identità gestite sono un tipo speciale di entità servizio che fornisce servizi di Azure tramite un'identità gestita automaticamente. L'uso di questo tipo di identità non richiede l'archiviazione di credenziali nella configurazione o nel codice per l'autenticazione a qualsiasi servizio di Azure che supporta le identità gestite.

Sono disponibili due tipi di identità gestite:

  • Identità gestita assegnata dal sistema
  • Identità gestita assegnata dall'utente

Le identità gestite offrono un modo sicuro per comunicare con altri servizi di Azure senza che gli sviluppatori debbano gestire le credenziali. Contribuiscono anche ad attenuare il rischio di perdite di credenziali.

Di seguito viene illustrata la modalità di funzionamento delle identità gestite in scenari reali:

  • Azure gestisce automaticamente la creazione e l'eliminazione delle credenziali usate dall'identità gestita.
  • Un servizio di Azure abilitato tramite un'identità gestita può accedere in modo sicuro ad altri servizi, ad esempio Azure Key Vault, database SQL di Azure, Archiviazione BLOB di Azure e così via, usando i token di Microsoft Entra.
  • Tale identità viene gestita direttamente in Azure senza dover effettuare un provisioning aggiuntivo.

Le identità gestite semplificano il modello di sicurezza evitando la necessità di archiviare e gestire le credenziali e svolgono un ruolo fondamentale nelle operazioni cloud sicure riducendo il rischio associato alla gestione dei segreti.

Identità gestita assegnata dal sistema

Azure crea automaticamente un'identità gestita assegnata dal sistema per un'istanza del servizio di Azure, ad esempio una macchina virtuale di Azure, un servizio app o Funzioni di Azure. Se l'istanza del servizio viene eliminata, Azure pulisce automaticamente le credenziali e l'identità associate al servizio.

Nell'esempio seguente, la connessione viene effettuata tramite un'identità gestita assegnata dal sistema dell'ambiente host. Se tale procedura viene eseguita in una macchina virtuale con un'identità gestita assegnata, consente al codice di accedere tramite l'identità assegnata.

 Connect-AzAccount -Identity

Identità gestita assegnata dall'utente

Un'identità gestita assegnata dall'utente viene creata e gestita in Microsoft Entra. Può essere assegnata a una o più istanze di un servizio di Azure. Il ciclo di vita di un'identità assegnata dall'utente viene gestito separatamente dalle istanze del servizio a cui è assegnata.

Quando si usa un'identità gestita assegnata dall'utente, è necessario specificare i parametri AccountId e Identity, come illustrato nell'esempio seguente.

 Connect-AzAccount -Identity -AccountId <user-assigned-identity-clientId-or-resourceId>

I comandi seguenti eseguono la connessione tramite l'identità gestita di myUserAssignedIdentity. Questo aggiunge l'identità assegnata dall'utente alla macchina virtuale e quindi si connette tramite il ClientId dell'identità assegnata dall'utente.

$identity = Get-AzUserAssignedIdentity -ResourceGroupName myResourceGroup -Name myUserAssignedIdentity
Get-AzVM -ResourceGroupName contoso -Name testvm | Update-AzVM -IdentityType UserAssigned -IdentityId $identity.Id
Connect-AzAccount -Identity -AccountId $identity.ClientId # Run on the virtual machine
Account                              SubscriptionName TenantId                             Environment
-------                              ---------------- --------                             -----------
00000000-0000-0000-0000-000000000000 My Subscription  00000000-0000-0000-0000-000000000000 AzureCloud

Per altre informazioni, vedere Configurare le identità gestite per le risorse di Azure in una macchina virtuale di Azure.

Accedere con un'entità servizio

Per accedere con un'entità servizio, usare il parametro ServicePrincipal del cmdlet Connect-AzAccount. È inoltre necessario disporre delle informazioni seguenti per l'entità servizio:

  • AppId
  • Credenziali di accesso o accesso al certificato usato per creare l'entità servizio
  • ID tenant

La modalità di accesso con un'entità servizio varia a seconda che sia stata configurata per l'autenticazione basata su password o basata su certificato.

Autenticazione basata su certificati

Per informazioni su come creare un'entità servizio per Azure PowerShell, vedere Creare un'entità servizio di Azure con Azure PowerShell.

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

Connect-AzAccount -ApplicationId $appId -Tenant $tenantId -CertificateThumbprint <thumbprint>

Quando si usa un'entità servizio anziché un'applicazione registrata, specificare il parametro ServicePrincipal e fornire l'AppId dell'entità servizio come valore per il parametro ApplicationId.

Connect-AzAccount -ServicePrincipal -ApplicationId $servicePrincipalId -Tenant $tenantId -CertificateThumbprint <thumbprint>

In Windows PowerShell 5.1 è possibile gestire e controllare l'archivio certificati con il modulo PKI. Per PowerShell 7.x e versioni successive, il processo è diverso. Negli script seguenti viene illustrato come importare un certificato esistente nell'archivio certificati accessibile a PowerShell.

Importare un certificato in PowerShell Core 7.x e versioni successive

# Import a PFX
$storeName = [System.Security.Cryptography.X509Certificates.StoreName]::My
$storeLocation = [System.Security.Cryptography.X509Certificates.StoreLocation]::CurrentUser
$store = [System.Security.Cryptography.X509Certificates.X509Store]::new($storeName, $storeLocation)
$certPath = <path to certificate>
$credentials = Get-Credential -Message "Provide PFX private key password"
$flag = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable
$certificate = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($certPath, $credentials.Password, $flag)
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
$store.Add($Certificate)
$store.Close()

Importare un certificato in Windows PowerShell 5.1

# Import a PFX
$credentials = Get-Credential -Message 'Provide PFX private key password'
Import-PfxCertificate -FilePath <path to certificate> -Password $credentials.Password -CertStoreLocation cert:\CurrentUser\My

Autenticazione basata su password

Creare un'entità servizio da usare con gli esempi di questa sezione. Per altre informazioni sulla creazione di entità servizio, vedere Creare un'entità servizio di Azure con Azure PowerShell.

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName

Attenzione

Il segreto dell'entità servizio specificato viene archiviato nel file AzureRmContext.json del profilo utente ($env:USERPROFILE\.Azure). Assicurarsi che questa directory disponga di protezioni appropriate.

Per ottenere le credenziali dell'entità servizio come oggetto, usare il cmdlet Get-Credential. Questo cmdlet richiede un nome utente e una password. Usare il valore di AppId dell'entità servizio come nome utente e convertire il relativo secret in testo normale per la password.

# Retrieve the plain text password for use with Get-Credential in the next command.
$sp.PasswordCredentials.SecretText

$pscredential = Get-Credential -UserName $sp.AppId
Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId

Per gli scenari di automazione, è necessario creare le credenziali dal AppId e dal SecretText dell'entità servizio:

$SecureStringPwd = $sp.PasswordCredentials.SecretText | ConvertTo-SecureString -AsPlainText -Force
$pscredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $sp.AppId, $SecureStringPwd
Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId

Usare le procedure di archiviazione delle password appropriate durante l'automazione delle connessioni dell'entità servizio.

Vedi anche