Configurare Azure Service Principal: Guida per l’accesso non assistito

Quando hai bisogno di automatizzare compiti in Azure con script e strumenti, prendi in considerazione l’utilizzo di account di servizio o principali servizio di Azure? Non è raro che alcuni creino un nuovo account di servizio, gli assegnino tutti i ruoli di amministratore desiderati ed escludano l’autenticazione multifattore.

I know what you’re thinking – “that is a horrible idea”. Of course, it is! And for sure, your IT Sec will give you a lot of grief if you did all that.

Ma qual è l’alternativa? Come puoi utilizzare una credenziale privilegiata con un ambito limitato che non deve essere esclusa dall’autenticazione multifattore? Sei fortunato perché è proprio di questo che tratterà questo articolo.

In questo articolo, scoprirai cosa è un Principale servizio di Azure. Imparerai come creare principali servizio con diversi tipi di credenziali, come password, chiavi segrete e certificati.

Esistono molti strumenti per creare Principali servizio di Azure. Questi includono l’utilizzo del Portale di Azure, del Centro di amministrazione di Azure Active Directory, di Azure AD PowerShell, di Azure CLI e di Azure PowerShell. Lo strumento su cui si concentrerà questo articolo è Azure PowerShell.

Ancora interessato? Continua a leggere e iniziamo!

Requisiti

Poiché questo è un articolo di apprendimento pratico, ecco alcuni prerequisiti in modo che tu possa seguire.

Azure Service Principal vs. Service Account

Gli strumenti e gli script di automazione spesso richiedono accesso amministrativo o privilegiato. Ad esempio, la creazione di account di archiviazione o l’avvio e l’arresto di macchine virtuali in base a un programma. E la maggior parte degli amministratori probabilmente utilizza un account utente completamente privilegiato (chiamato account di servizio) per impostare i requisiti di autenticazione per gli script.

A service account is essentially a privileged user account used to authenticate using a username and password. And, if used with automation, a service account is most likely excluded from any conditional access policies or multi-factor authentication.

D’altra parte, un Azure service principal può essere configurato per utilizzare un nome utente e una password o un certificato per l’autenticazione. Pensalo come un’identità utente senza un utente, ma piuttosto come un’identità per un’applicazione.

Un Azure service principal può essere assegnato solo con l’accesso necessario, ad esempio a una singola risorsa Azure specifica. Ad esempio, puoi creare un Azure service principal che ha accesso basato sui ruoli a un’intera sottoscrizione o solo a una singola macchina virtuale Azure.

Considerazioni principali per la creazione di Azure Service Principals

Prima di creare un Azure service principal, è necessario conoscere i dettagli di base che è necessario pianificare. Questi dettagli possono sembrare semplici, ma renderanno la creazione di un Azure service principal efficiente e facile possibile.

Il nome visualizzato. Tutto inizia con un nome e un Azure service principal deve avere un nome. Non ci sono regole fisse, ma la tua organizzazione potrebbe avere una convenzione di denominazione prescritta.

  • Il tipo di credenziale da utilizzare. Puoi scegliere di creare un Azure service principal che utilizzerà una password o un certificato per l’autenticazione. Questo non significa che puoi sceglierne solo uno, puoi usarli entrambi.

Per i service principal, il nome utente e la password sono più appropriatamente indicati come ID applicazione e chiave segreta.

  • Il periodo di validità della/e credenziale/i. Sia che si stia assegnando una password o una credenziale di certificato, è necessario definire una data di inizio e di fine per la sua validità. La durata di validità di una credenziale dipende generalmente da quanto spesso si è disposti a ruotare/rinnovare certificati e password.
  • L’ambito di accesso. Stai creando un Azure service principal che avrà accesso a una sottoscrizione, a un gruppo di risorse o a risorse selezionate?
  • Il ruolo. Ci sono diversi ruoli disponibili, come Contributor, Reader e Owner, per citarne alcuni. È necessario definire quale ruolo sia “sufficiente” per il service principal.

Creazione di un Azure Service Principal con una chiave segreta assegnata automaticamente

Il cuore della creazione di un nuovo service principal in Azure è il cmdlet New-AzAdServicePrincipal. In questo esempio, verrà creato un nuovo service principal con questi valori:

DisplayName: AzVM_Reader

Scope: AzVM1 (Macchina virtuale)

Ruolo: Reader

Password: <assegnato automaticamente>

Validità delle credenziali: 1 anno

Ottieni l’ID del target scope (macchina virtuale)

Come puoi vedere, lo scope di questo nuovo service principal è solo per la macchina virtuale chiamata AzVM1. Tuttavia, il parametro -Scope non accetta solo il nome, ma l’intero ID della risorsa. Quindi, in questo esempio, la prima cosa da fare è ottenere l’ID della macchina virtuale AzVM1. Per farlo, utilizza il codice di seguito riportato.

Get-AzVM | Format-Table Name, ID

Quando esegui il codice sopra riportato in PowerShell, dovresti vedere l’elenco dei nomi e degli ID delle macchine virtuali, simile alla schermata riportata di seguito.

Get the list of VM names and IDs

Creazione dell’Azure Service Principal con chiave segreta

Ora che hai l’ID del target scope, che è l’ID della macchina virtuale AzVM1, puoi utilizzare il comando riportato di seguito per creare il nuovo service principal che ha il ruolo reader. Le proprietà del nuovo service principal verranno memorizzate nella variabile $sp.

$sp = New-AzAdServicePrincipal `
	-DisplayName AzVM_Reader `
	-Scope '/subscriptions/5e252811-b376-4136-b8ae-d3b8abe2c9c3/resourceGroups/ATA/providers/Microsoft.Compute/virtualMachines/AzVM1'
	-Role 'Reader'

Come risultato del comando sopra riportato, il service principal è stato creato con questi valori riportati di seguito.

The properties of the new service principal

Decrittazione della chiave segreta

Ora hai l’ApplicationID e il Segreto, che sono il nome utente e la password del servizio principale. Tuttavia, il valore del Segreto viene mostrato come System.Security.SecureString. Per conoscere il segreto, utilizza il comando seguente per convertire il segreto in testo normale.

# Converti la password criptata in testo normale
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto(
    [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR(
        $sp.Secret
    )
)

Il comando precedente converte il valore della stringa sicura $sp.Secret in testo normale. Vedi l’immagine di seguito come riferimento.

Secure string password value converted to plain text

Verifica dell’assegnazione del ruolo del servizio principale di Azure

Come puoi sapere se ha funzionato? Puoi verificare la lista di controllo degli accessi della risorsa utilizzando il portale di Azure. Ad esempio, nell’immagine di seguito, puoi vedere che il servizio principale AzVM_Reader ha ora l’accesso Reader alla macchina virtuale AzVM1.

Azure resource access control

Inoltre, puoi utilizzare il comando Get-AzRoleAssignment -ObjectID $sp.id per ottenere le assegnazioni di ruolo del servizio principale di Azure. Vedi la schermata di seguito come esempio.

Get the role assignment(s) of the service principal

Creazione di un servizio principale di Azure con password

Se desideri avere un controllo maggiore sulla password o sulla chiave segreta assegnata al tuo servizio principale di Azure, utilizza il parametro -PasswordCredential durante la creazione del servizio principale. Questo è particolarmente utile se la password deve soddisfare un requisito di complessità.

In questo esempio, il nuovo servizio principale di Azure verrà creato con i seguenti valori:

DisplayName: ATA_RG_Contributor

Ambito: ATA (Gruppo di risorse)

Ruolo: Contributore

Password: Lunghezza di 20 caratteri con 6 caratteri non alfanumerici

Validità delle credenziali: 5 anni

Ottieni l’ID dello Scope di destinazione (Gruppo di risorse)

Lo scope di questo nuovo servizio principale copre l’intero gruppo di risorse chiamato ATA. La prima cosa da fare è ottenere l’ID del gruppo di risorse ATA. Per farlo, utilizza il codice sottostante, ma assicurati di cambiare il valore del parametro -Name con il nome del tuo gruppo di risorse.

# Ottieni il valore ResourceId del gruppo di risorse
$Scope = (Get-AzResourceGroup -Name ATA).ResourceId
$Scope

In seguito, dovresti vedere l’ResourceID del gruppo di risorse che è ora memorizzato nella variabile $Scope.

Getting the Resource Group ID

Generazione della stringa di password

Il passaggio successivo consiste nella generazione della password che rispetta la complessità Lunghezza di 20 caratteri con 6 caratteri non alfanumerici. Per farlo, puoi utilizzare il metodo statico .NET GeneratePassword().

# Genera una password casuale utilizzando il metodo statico GeneratePassword()
Add-Type -AssemblyName 'System.Web'
$password = [System.Web.Security.Membership]::GeneratePassword(20, 6)
$password

Nel codice sopra riportato GeneratePassword(20, 6), il primo valore indica la lunghezza della password e il secondo valore indica il numero di caratteri non alfanumerici da includere. Il risultato è mostrato nella schermata sottostante.

Randomly generated password using the .NET GeneratePassword() static method

Creazione dell’oggetto di credenziali della password

Ora che hai la stringa della password, il passo successivo è creare l’oggetto Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential. Questo oggetto conterrà la stringa della password memorizzata nella variabile $password e il periodo di validità di 5 anni. Copia il codice sottostante ed eseguilo nella tua sessione Azure PowerShell.

# Crea l'oggetto Password Credential
[Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential]`
    $PasswordCredential = @{
    StartDate = Get-Date;
    EndDate   = (Get-Date).AddYears(5);
    Password  = $password
}
$PasswordCredential

Eseguendo il codice sopra in PowerShell, l’oggetto delle credenziali verrà memorizzato nella variabile $PasswordCredential. Il risultato atteso sarà simile a quello mostrato di seguito.

Creating the new password credential object in Azure PowerShell

Creazione del Service Principal con Password

Ora hai i valori dei parametri richiesti pronti per creare il service principal di Azure. Il codice sottostante creerà il service principal con il nome visualizzato di ATA_RG_Contributor utilizzando la password memorizzata nella variabile $PasswordCredential.

# Crea il Service Principal con una Password Credential
$sp = New-AzAdServicePrincipal `
    -DisplayName 'ATA_RG_Contributor' `
    -PasswordCredential $PasswordCredential
$sp

Dopo aver eseguito il codice, il nuovo service principal dovrebbe essere creato e le proprietà verranno memorizzate nella variabile $sp. Vedi l’esempio di risultato di seguito.

The new Azure service principal is created

Assegnazione del Ruolo e Ambito

Il service principal di Azure è stato creato nella sezione precedente, ma senza Ruolo e Ambito. Questo perché i parametri -Role e -Scope non possono essere utilizzati insieme al parametro -PasswordCredential. Ciò significa che è necessario un ulteriore passaggio per assegnare il ruolo e l’ambito al service principal.

Il codice qui sotto utilizza il cmdlet New-AzRoleAssignment per assegnare lo scope e il ruolo del service principal di Azure.

# Assegna il ruolo alla risorsa di destinazione
New-AzRoleAssignment -$azSubscription = Get-AzSubscription -SubscriptionName VSE3
$Scope = "/subscriptions/$($azSubscription.ID)"
$TenantID = $azSubscription.TenantID$sp.ApplicationId `
    -Scope $Scope `
    -RoleDefinitionName 'Contributor'

Lo screenshot qui sotto mostra il risultato atteso dopo che il ruolo e lo scope sono stati assegnati al service principal di Azure.

Assigning role and scope using Azure Powershell

Assicurarsi sempre di salvare la password del service principal perché non è possibile recuperarla se non è stata salvata o se è stata dimenticata.

Connettersi ad Azure con una password di Service Principal

Ora per mettere in uso il service principal. Invece di accedere ad Azure PowerShell utilizzando un account utente, il codice qui sotto utilizza invece le credenziali del service principal.

# Ottieni il servizio principale con il displayname ATA_RG_Contributor
$sp = Get-AzADServicePrincipal -DisplayName ATA_RG_Contributor

# Ottieni l'ID del tenant
$TenantID = (Get-AzContext).Tenant.ID

# Ottieni il nome del primo servizio principale
$user = $sp.ServicePrincipalNames[0]

# Converti la password in una stringa sicura
$secPassword = $password | ConvertTo-SecureString -AsPlainText -Force

# Crea l'oggetto PSCredential
$credential = [PSCredential]::New($user,$secPassword)

# Connetti ad Azure
Connect-AzAccount -ServicePrincipal -Credential $credential -Tenant $TenantID
# Ottieni il servizio principale con il displayname ATA_RG_Contributor
$sp = Get-AzADServicePrincipal -DisplayName ATA_RG_Contributor

# Ottieni l'ID del tenant
$TenantID = (Get-AzContext).Tenant.ID

# Ottieni il nome del primo servizio principale
$user = $sp.ServicePrincipalNames[0]

# Converti la password in una stringa sicura
$secPassword = $password | ConvertTo-SecureString -AsPlainText -Force

# Crea l'oggetto PSCredential
$credential = [PSCredential]::New($user,$secPassword)

# Connetti ad Azure
Connect-AzAccount -ServicePrincipal -Credential $credential -Tenant $TenantID# Ottieni il servizio principale con il displayname ATA_RG_Contributor
$sp = Get-AzADServicePrincipal -DisplayName ATA_RG_Contributor

# Ottieni l'ID del tenant
$TenantID = (Get-AzContext).Tenant.ID

# Ottieni il nome del primo servizio principale
$user = $sp.ServicePrincipalNames[0]

# Converti la password in una stringa sicura
$secPassword = $password | ConvertTo-SecureString -AsPlainText -Force

# Crea l'oggetto PSCredential
$credential = [PSCredential]::New($user,$secPassword)

# Connetti ad Azure
Connect-AzAccount -ServicePrincipal -Credential $credential -Tenant $TenantID

Dopo aver eseguito il codice sopra, dovresti aver effettuato l’accesso ad Azure PowerShell utilizzando il servizio principale ATA_RG_Contributor e le credenziali della password.

Connect to Azure using a Service Principal with Password Credential

Creazione di un servizio principale di Azure con certificato

Oltre alle credenziali della password, un servizio principale di Azure può avere anche una credenziale basata su certificato. Il certificato associato può essere emesso da un’autorità di certificazione o essere autogenerato.

In questo esempio, il nuovo servizio principale di Azure verrà creato con i seguenti valori:

DisplayName: VSE3_SUB_OWNER

Scope: VSE3 (Sottoscrizione)

Ruolo: Proprietario

Validità del certificato: 2 anni

Ottieni l’ID del Target Scope (Sottoscrizione)

Il campo di azione di questo nuovo servizio principale copre la sottoscrizione di Azure denominata VSE3. La prima cosa da fare è ottenere l’ID della sottoscrizione VSE3. Per farlo, utilizza il codice seguente, ma assicurati di modificare il valore del parametro -SubscriptionName con il nome del tuo gruppo di risorse.

# Ottieni l'ID del campo di azione della sottoscrizione e l'ID dell'entità
$azSubscription = Get-AzSubscription -SubscriptionName VSE3
$Scope = "/subscriptions/$($azSubscription.ID)"
$TenantID = $azSubscription.TenantID

Successivamente, specifica il nome del nuovo servizio principale di Azure e del certificato autogenerato da creare.

# Il nome del nuovo servizio principale di Azure e del certificato autogenerato
$DisplayName = 'VSE3_SUB_OWNER'

Creazione del certificato autogenerato

Il codice seguente crea la password auto-firmata nel deposito di certificati personali con il nome CN=VSE3_SUB_OWNER. La validità del certificato è impostata su due anni. Le proprietà del certificato sono salvate nella variabile $cert.

# Genera un certificato auto-firmato
$cert = New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" `
    -Subject "CN=$($DisplayName)" `
    -KeySpec KeyExchange `
    -NotBefore ((Get-Date).AddDays(-1)) `
    -NotAfter ((Get-Date).AddYears(2))
$cert

Nella schermata sottostante viene mostrato che il certificato è stato creato.

The self-signed certificate is created in the personal certificate store

Se desideri visualizzare il nuovo certificato in una vista più familiare (GUI), puoi trovarlo nella console dei certificati (certmgr.mmc). Fai riferimento all’immagine sottostante che mostra il certificato.

Viewing the self-signed certificate

Successivamente, ottieni il valore codificato in Base64 del certificato auto-firmato e salvato nella variabile $keyValue.

# Ottieni il valore base64 del certificato auto-firmato
$keyValue = [System.Convert]::ToBase64String($cert.GetRawCertData())

Creazione del Service Principal con Certificato

Ora che il certificato è stato creato, il passo successivo è creare il nuovo service principal di Azure. Il codice sottostante creerà il service principal di Azure che utilizzerà il certificato auto-firmato come credenziale. Il periodo di validità delle credenziali coincide con il periodo di validità del certificato.

$sp = New-AzADServicePrincipal -DisplayName $DisplayName `
    -CertValue $keyValue `
    -EndDate $cert.NotAfter `
    -StartDate $cert.NotBefore
$sp

Otterrai un output simile, come mostrato nell’immagine sottostante.

The new Azure service principal with a certificate is created

Assegnazione del Ruolo e Ambito

Il service principal di Azure è stato creato, ma non è ancora stato assegnato alcun Ruolo e Ambito. Ciò significa che è necessario un ulteriore passaggio per assegnare il ruolo e l’ambito al service principal.

Il codice qui sotto utilizza il cmdlet New-AzRoleAssignment per assegnare il ruolo di proprietario alla sottoscrizione VSE3 del principale del servizio.

# Assegna ruolo e ambito
New-AzRoleAssignment -ApplicationId $sp.ApplicationId `
    -Scope $Scope `
    -RoleDefinitionName 'Owner'

Quando viene eseguito il codice, lo screenshot sottostante mostra la conferma che l’assegnazione del ruolo è stata effettuata.

The service principal’s owner role is added to the subscription

Connessione ad Azure con un certificato di principale del servizio

Ora hai creato il principale del servizio con una credenziale basata su certificato. Ciò significa che puoi usarlo per connetterti ad Azure senza utilizzare una password. Invece, userai il certificato disponibile nel tuo computer come metodo di autenticazione.

In questo esempio, il nome visualizzato del principale del servizio è VSE3_SUB_OWNER, e il nome del certificato è CN=VSE3_SUB_OWNER. Il codice qui sotto otterrà l’impronta digitale del certificato dallo store del certificato personale e la utilizzerà come credenziale di accesso.

# Ottieni il certificato con soggetto CN=VSE3_SUB_OWNER
$cert = Get-ChildItem Cert:\CurrentUser\My\ | Where-Object { $_.Subject -eq 'CN=VSE3_SUB_OWNER' }

# Connettiti ad Azure
Connect-AzAccount -ServicePrincipal -CertificateThumbprint $cert.ThumbPrint -ApplicationID $sp.ApplicationID -Tenant $TenantID

Lo screenshot sottostante mostra che utilizzando il codice sopra, l’accesso ad Azure PowerShell è stato effettuato con successo utilizzando solo ApplicationID, Tenant e Certificate ThumbPrint.

Connecting to Azure using a Service Principal and Certificate

Conclusioni

Azure Service Principals è il principale di sicurezza che deve essere preso in considerazione quando si creano credenziali per attività di automazione e strumenti che accedono alle risorse di Azure. L’ambito e il ruolo da applicare possono essere scelti per fornire le autorizzazioni di accesso “solo il necessario”.

In questo articolo, hai imparato come creare Azure Service Principals utilizzando solo PowerShell. Gli Azure Service Principals possono avere una password, una chiave segreta o credenziali basate su certificato. Ogni tipo di credenziale ha i suoi vantaggi e scenari di utilizzo applicabili.

I service principals con una password o una chiave segreta sono più portatili ma sono considerati meno sicuri perché la credenziale può essere condivisa come testo normale. D’altra parte, le credenziali basate su certificato sono l’opzione più sicura ma richiedono un po’ più di sforzo per mantenerle.

Le tecniche apprese in questo articolo coprono solo le basi per iniziare ad utilizzare gli Azure service principals nella tua automazione. Ci sono molti altri modi per configurare gli Azure service principals come aggiungere, rimuovere e reimpostare le credenziali. Spetta a te scoprirli man mano che procedi.

Grazie per aver letto!

Ulteriori risorse di apprendimento

Ecco alcune risorse che potrebbero esserti utili per accompagnare questo articolo.

Source:
https://adamtheautomator.com/azure-service-principal/