Creare un'entità servizio di Azure con l'interfaccia della riga di comando di Azure

Gli strumenti automatici che usano i servizi di Azure devono sempre avere autorizzazioni limitate. Invece di consentire alle applicazioni l'accesso come utenti con privilegi completi, Azure offre le identità servizio.

Che cos'è un'entità servizio di Azure?

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 creare, ottenere informazioni su e reimpostare un'entità servizio di Azure con l'interfaccia della riga di comando di Azure.

1. Creare un'entità servizio

Creare un'entità servizio di Azure con il comando az ad sp create-for-rbac .

Le chiavi appId e tenant vengono visualizzate nell'output di az ad sp create-for-rbac e usate nell'autenticazione dell'entità servizio. Registrare i valori, che possono essere tuttavia recuperati in qualsiasi momento con az ad sp list.

Quando si crea un'entità servizio, si sceglie il tipo di autenticazione per l'accesso che verrà usata dall'entità. Esistono due tipi di autenticazione disponibili per le entità servizio di Azure: autenticazione basata su password e autenticazione basata su certificati.

Avviso

Quando si crea un'entità servizio di Azure usando il comando, l'output az ad sp create-for-rbac include le credenziali che è necessario proteggere. Assicurarsi di non includere tali credenziali nel codice oppure archiviarle nel controllo del codice sorgente. In alternativa, prendere in considerazione l'uso di identità gestite se disponibile per evitare la necessità di usare le credenziali.

Per ridurre il rischio di un'entità servizio compromessa, assegnare un ruolo più specifico e restringere gli ambiti a una risorsa o a un gruppo di risorse. Per altre informazioni, vedere Procedura per aggiungere un'assegnazione di ruolo.

Autenticazione basata su password

Con l'autenticazione basata su password viene creata una password casuale. Se non si specifica un --name valore di parametro, verrà creato un nome contenente un timestamp. È necessario specificare un valore --scopes come questo valore non ha un valore predefinito. Se si preferisce, è possibile impostare l'assegnazione di ruolo in un secondo momento usando az role assignment create.

# Create a service principal with required parameter
az ad sp create-for-rbac --scopes /subscriptions/mySubscriptionID

# Create a service principal for a resource group using a preferred name and role
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role reader \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

È anche possibile creare un'entità servizio usando le variabili.

let "randomIdentifier=$RANDOM*$RANDOM"  
servicePrincipalName="msdocs-sp-$randomIdentifier"
roleName="azureRoleName"
subscriptionID=$(az account show --query id -o tsv)
# Verify the ID of the active subscription
echo "Using subscription ID $subscriptionID"
resourceGroup="myResourceGroupName"

echo "Creating SP for RBAC with name $servicePrincipalName, with role $roleName and in scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup"
az ad sp create-for-rbac --name $servicePrincipalName --role $roleName --scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup

L'output per un'entità servizio con autenticazione della password include la chiave password. Assicurarsi di copiare questo valore : non è possibile recuperarlo. Se si perde la password, reimpostare le credenziali dell'entità servizio.

Autenticazione basata su certificati

Per l'autenticazione basata su certificati, usare il --cert parametro . Questo parametro richiede che sia presente un certificato esistente. Assicurarsi che tutti gli strumenti che usano questa entità servizio abbiano accesso alla chiave privata del certificato. I certificati devono essere in un formato ASCII come PEM, CER o DER. Passare il certificato come stringa oppure usare il formato @path per caricare il certificato da un file.

Nota

Quando si usa un file PEM, è necessario aggiungere un CERTIFICATO alla CHIAVE PRIVATA nel file.

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert "-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----"
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert @/path/to/cert.pem

Il --keyvault parametro può essere aggiunto per usare un certificato in Azure Key Vault. In questo caso, il valore --cert è il nome del certificato.

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert certificateName \
                         --keyvault vaultName

Per creare un certificato autofirmato per l'autenticazione, usare il --create-cert parametro:

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --create-cert

Output della console:

Creating a role assignment under the scopes of "/subscriptions/myId"
Please copy C:\myPath\myNewFile.pem to a safe place.
When you run 'az login', provide the file path in the --password parameter
{
  "appId": "myAppId",
  "displayName": "myDisplayName",
  "fileWithCertAndPrivateKey": "C:\\myPath\\myNewFile.pem",
  "name": "http://myName",
  "password": null,
  "tenant": "myTenantId"
}

Contenuto del nuovo file PEM:

-----BEGIN PRIVATE KEY-----
myPrivateKeyValue
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
myCertificateValue
-----END CERTIFICATE-----

Nota

Il comando az ad sp create-for-rbac --create-cert crea l'entità servizio e un file PEM. Il file PEM contiene una CHIAVE PRIVATA e un CERTIFICATO formattati correttamente.

Il --keyvault parametro può essere aggiunto per archiviare il certificato in Azure Key Vault. Quando si usa --keyvault, è necessario il --cert parametro .

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --create-cert \
                         --cert certificateName \
                         --keyvault vaultName

A meno che non si archivi il certificato in Key Vault, l'output include la chiave fileWithCertAndPrivateKey. Il valore di questa chiave indica la posizione di archiviazione del certificato generato. Assicurarsi di copiare il certificato in una posizione sicura, in caso contrario non sarà possibile accedere con questa entità servizio.

Se si perde l'accesso alla chiave privata del certificato, reimpostare le credenziali dell'entità servizio.

Recuperare il certificato da Key Vault

Per il certificato archiviato in Key Vault, recuperare il certificato con la chiave privata con az keyvault secret show e convertirlo in un file PEM. Nel Key Vault il nome del segreto del certificato è lo stesso del nome del certificato.

az keyvault secret download --file /path/to/cert.pfx --vault-name VaultName --name CertName --encoding base64
openssl pkcs12 -in cert.pfx -passin pass: -out cert.pem -nodes

2. Ottenere un'entità servizio esistente

È possibile recuperare un elenco delle entità servizio presenti in un tenant con az ad sp list. Per impostazione predefinita, questo comando restituisce le prime 100 entità servizio per il tenant. Per ottenere tutte le entità servizio di un tenant, usare il --all parametro . Ottenere questo elenco può richiedere molto tempo, quindi è consigliabile filtrare l'elenco con uno dei parametri seguenti:

  • --display-name richiede entità di servizio che hanno un prefisso corrispondente al nome specificato. Il nome visualizzato di un'entità servizio è il valore impostato con il parametro --name durante la creazione. Se --name non è stato impostato durante la creazione dell'entità servizio, il prefisso del nome è azure-cli-.
  • --spn filtra in base alla corrispondenza esatta del nome dell'entità servizio. Il nome dell'entità servizio inizia sempre con https://. Se il valore usato per --name non era un URI, questo valore è https:// seguito dal nome visualizzato.
  • --show-mine richiede solo entità servizio create dall'utente che ha eseguito l'accesso.
  • --filter accetta un filtro OData ed esegue il filtro sul lato server. Questo metodo è consigliato per filtrare il lato client con il parametro dell'interfaccia della riga di --query comando. Per informazioni sui filtri OData, vedere Sintassi delle espressioni OData per filtri e ordinamento.

Le informazioni restituite per gli oggetti dell'entità servizio sono dettagliate. Per ottenere solo le informazioni necessarie per l'accesso, usare la stringa di query [].{id:appId, tenant:appOwnerTenantId}. Ad esempio, per ottenere le informazioni di accesso per tutte le entità servizio create dall'utente attualmente connesso:

az ad sp list --show-mine --query "[].{id:appId, tenant:appOwnerTenantId}"

Importante

az ad sp list o az ad sp show consente di ottenere utente e tenant, ma non i segreti di autenticazione oppure il metodo di autenticazione. I segreti dei certificati presenti in Key Vault possono essere recuperati con az keyvault secret show, ma per impostazione predefinita non vengono archiviati altri segreti. Se si dimentica un metodo di autenticazione o un segreto, reimpostare le credenziali dell'entità servizio.

3. Gestire i ruoli dell'entità servizio

Per gestire le assegnazioni di ruolo, l'interfaccia della riga di comando di Azure offre i comandi seguenti:

Il ruolo Collaboratore ha autorizzazioni complete per operazioni di lettura e scrittura in un account 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 Controllo degli accessi in base al ruolo: ruoli predefiniti.

In questo esempio viene aggiunto il ruolo Lettore e viene rimosso il ruolo Collaboratore :

az role assignment create --assignee appID \
                          --role Reader \
                          --scope /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

az role assignment delete --assignee appID \
                          --role Contributor \
                          --scope /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

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 se assegnato in precedenza.

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

az role assignment list --assignee appID

4. Accedere usando un'entità servizio

Testare le credenziali e le autorizzazioni della nuova entità servizio eseguendo l'accesso. Per eseguire l'accesso con un'entità servizio, sono necessari appId, tenant e le credenziali.

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

az login --service-principal --username appID --password PASSWORD --tenant tenantID

Per accedere con un certificato, il certificato deve essere disponibile in locale come file PEM o DER in formato ASCII. Quando si usa un file PEM, è necessario aggiungere nel file sia il CERTIFICATO che la CHIAVE PRIVATA.

az login --service-principal --username appID --tenant tenantID --password /path/to/cert

Per altre informazioni sull'accesso con un'entità servizio, vedere Accedere tramite l'interfaccia della riga di comando di Azure.

5. Creare una risorsa usando l'entità servizio

La sezione seguente include un esempio relativo alla creazione di una risorsa per Archiviazione di Azure con un'entità servizio usando i comandi seguenti:

Per accedere con un'entità servizio, sono necessari i valori di appID, tenantID e password restituiti come risposta quando è stata creata l'entità servizio.

  1. Accedere come entità servizio.

    az login --service-principal --username appID --password PASSWORD --tenant tenantID
    
  2. Creare un gruppo di risorse per contenere tutte le risorse usate per lo stesso progetto di sviluppo, avvio rapido o esercitazione.

    az group create --location westus --name myResourceGroupName
    
  3. Creare un account di archiviazione.

    Per Archiviazione di Azure i valori validi per il parametro <KIND> sono:

    • BlobStorage
    • BlockBlobStorage
    • FileStorage
    • Archiviazione
    • StorageV2
    az storage account create --name myStorageAccountName --resource-group myResourceGroupName --kind <KIND> --sku F0 --location westus --yes
    
  4. Ottenere le chiavi di risorsa che si usano nel codice per eseguire l'autenticazione all'account di archiviazione di Azure.

    az storage account keys list --name myStorageAccountName --resource-group myResourceGroupName
    

6. Reimpostare le credenziali

Se si perdono le credenziali per un'entità servizio, usare az ad sp credential reset. Il comando di reimpostazione accetta gli stessi parametri di az ad sp create-for-rbac.

az ad sp credential reset --name myServicePrincipal_appID_or_name

7. Risoluzione dei problemi

Privilegi insufficienti

Se l'account non dispone dell'autorizzazione per creare un'entità servizio, az ad sp create-for-rbac restituirà un messaggio di errore contenente "Privilegi insufficienti per completare l'operazione". Contattare l'amministratore di Azure Active Directory per creare un'entità servizio.

Tenant non valido

Se è stato specificato un ID sottoscrizione non valido, viene visualizzato il messaggio di errore "La richiesta non ha una sottoscrizione o un provider di risorse a livello di tenant valido". Se si usano le variabili, usare il comando Bash echo per visualizzare il valore passato al comando di riferimento. Usare az account set per modificare la sottoscrizione o informazioni su Come gestire le sottoscrizioni di Azure con l'interfaccia della riga di comando di Azure.

Gruppo di risorse non trovato

Se è stato specificato un nome del gruppo di risorse non valido, viene visualizzato il messaggio di errore "Nome gruppo di risorse" non trovato. Se si usano le variabili, usare il comando Bash echo per visualizzare il valore passato ai comandi di sottoscrizione e riferimento. Usare az group list per visualizzare i gruppi di risorse per la sottoscrizione corrente o informazioni su Come gestire i gruppi di risorse di Azure con l'interfaccia della riga di comando di Azure.

Autorizzazione per eseguire l'azione

Se l'account non ha le autorizzazioni per assegnare un ruolo, verrà visualizzato un messaggio di errore che segnala che l'account non è autorizzato a eseguire l'azione 'Microsoft.Authorization/roleAssignments/write'. Per gestire i ruoli, contattare l'amministratore di Azure Active Directory.

Vedere anche