Come usare identità gestite con Istanze di Azure Container

Usare identità gestite per le risorse di Azure per eseguire codice in Istanze di Azure Container che interagisce con altri servizi di Azure, senza dover gestire segreti o credenziali nel codice. La funzionalità offre una distribuzione di Istanze di Azure Container con un'identità gestita automaticamente in Azure Active Directory.

In questo articolo sono fornite altre informazioni sulle identità gestite in Istanze di Azure Container e viene illustrato come:

  • Abilitare un'identità assegnata dall'utente o un'identità assegnata dal sistema in un gruppo di contenitori
  • Concedere all'identità l'accesso a un insieme di credenziali delle chiavi di Azure
  • Usare l'identità gestita per accedere a un insieme di credenziali delle chiavi da un contenitore in esecuzione

Adattare gli esempi per abilitare e usare le identità in Istanze di Azure Container per accedere ad altri servizi di Azure. Questi esempi sono interattivi. Tuttavia, in pratica le immagini del contenitore dovrebbero eseguire codice per accedere ai servizi di Azure.

Importante

Questa funzionalità è attualmente in anteprima. Le anteprime vengono rese disponibili per l'utente a condizione che si accettino le condizioni d'uso aggiuntive. Alcuni aspetti di questa funzionalità potrebbero subire modifiche prima della disponibilità a livello generale. Attualmente, le identità gestite in Istanze di Azure Container, sono supportate solo con i contenitori Linux e non ancora con i contenitori windows.

Perché usare un'identità gestita?

Con un'identità gestita in un contenitore in esecuzione è possibile eseguire l'autenticazione a qualsiasi servizio che supporti l'autenticazione di Azure AD senza dover gestire le credenziali nel codice del contenitore. Per i servizi che non supportano l'autenticazione di Active Directory, è possibile archiviare i segreti in un insieme di credenziali delle chiavi di Azure e usare l'identità gestita per accedere all'insieme di credenziali delle chiavi per recuperare le credenziali. Per altre informazioni sull'uso di un'identità gestita, vedere Informazioni sulle identità gestite per le risorse di Azure.

Abilitare un'identità gestita

Quando si crea un gruppo di contenitori, abilitare una o più identità gestite impostando una proprietà ContainerGroupIdentity. È anche possibile abilitare o aggiornare le identità gestite dopo l'esecuzione di un gruppo di contenitori. Entrambe le azioni causano il riavvio del gruppo di contenitori. Per impostare le identità in un gruppo di contenitori nuovo o esistente, usare l'interfaccia della riga di comando di Azure, un modello Resource Manager, un file YAML o un altro strumento di Azure.

Istanze di Azure Container supporta entrambi i tipi di identità di Azure gestite: assegnata dall'utente e assegnata dal sistema. In un gruppo di contenitori è possibile abilitare un'identità assegnata dal sistema, una o più identità assegnate dall'utente o entrambi i tipi di identità. Se non si ha familiarità con le identità gestite per le risorse di Azure, vedere la panoramica.

Usare un'identità gestita

Per usare un'identità gestita, all'identità deve essere concesso l'accesso a una o più risorse del servizio di Azure, ad esempio un'app Web, un insieme di credenziali delle chiavi o un account di archiviazione, nella sottoscrizione. L'uso di un'identità gestita in un contenitore in esecuzione è simile all'uso di un'identità in una macchina virtuale di Azure. Per usare un token, Azure PowerShell o l'interfaccia della riga di comando di Azure o gli SDK di Azure, vedere le indicazioni sulle macchine virtuali.

Limitazioni

  • Attualmente non è possibile usare un'identità gestita in un gruppo di contenitori distribuito in una rete virtuale.
  • Non è possibile usare un'identità gestita per eseguire il pull di un'Registro Azure Container quando si crea un gruppo di contenitori. L'identità è disponibile solo all'interno di un contenitore in esecuzione.

Prerequisiti

  • Questo articolo richiede la versione 2.0.49 o successiva dell'interfaccia della riga di comando di Azure. Se si usa Azure Cloud Shell, la versione più recente è già installata.

Creare un insieme di credenziali delle chiavi di Azure

Gli esempi in questo articolo usano un'identità gestita in Istanze di Azure Container per accedere a un segreto dell'insieme di credenziali delle chiavi di Azure.

Per iniziare, creare un gruppo di risorse denominato myResourceGroup nell'area eastus con il comando az group create seguente:

az group create --name myResourceGroup --location eastus

Usare il comando az keyvault create per creare un insieme di credenziali delle chiavi. Assicurarsi di specificare un nome univoco per l'insieme di credenziali delle chiavi.

az keyvault create \
  --name mykeyvault \
  --resource-group myResourceGroup \ 
  --location eastus

Archiviare un segreto di esempio nell'insieme di credenziali delle chiavi usando il comando az keyvault secret set:

az keyvault secret set \
  --name SampleSecret \
  --value "Hello Container Instances" \
  --description ACIsecret --vault-name mykeyvault

Continuare con gli esempi seguenti per accedere all'insieme di credenziali delle chiavi usando un'identità gestita assegnata dall'utente o assegnata dal sistema in Istanze di Azure Container.

Esempio 1: Usare un'identità assegnata dall'utente per accedere all'insieme di credenziali delle chiavi di Azure

Creare un'identità

Innanzitutto creare un'identità nella sottoscrizione usando il comando az identity create. È possibile usare lo stesso gruppo di risorse usato per creare l'insieme di credenziali delle chiavi o usarne uno diverso.

az identity create \
  --resource-group myResourceGroup \
  --name myACIId

Per usare l'identità nei passaggi seguenti, usare il comando az identity show per archiviare l'ID dell'entità servizio e l'ID risorsa dell'identità nelle variabili.

# Get service principal ID of the user-assigned identity
spID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

# Get resource ID of the user-assigned identity
resourceID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query id --output tsv)

Concedere l'accesso dell'identità assegnata dall'utente all'insieme di credenziali delle chiavi

Eseguire il comando az keyvault set-policy seguente per impostare criteri di accesso nell'insieme di credenziali delle chiavi. L'esempio seguente consente all'identità assegnata dall'utente di ottenere segreti dall'insieme di credenziali delle chiavi:

 az keyvault set-policy \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --object-id $spID \
    --secret-permissions get

Abilitare l'identità assegnata dall'utente in un gruppo di contenitori

Eseguire il comando az container create seguente per creare un'istanza del contenitore in base all'immagine di azure-cli Microsoft. Questo esempio fornisce un gruppo a contenitore singolo che è possibile usare in modo interattivo per eseguire l'interfaccia della riga di comando di Azure per accedere ad altri servizi di Azure. In questa sezione viene usato solo il sistema operativo di base. Per un esempio di uso dell'interfaccia della riga di comando di Azure nel contenitore, vedere Abilitare l'identità assegnata dal sistema in un gruppo di contenitori.

Il parametro --assign-identity passa al gruppo l'identità gestita assegnata dall'utente. Il comando con esecuzione prolungata mantiene in esecuzione il contenitore. In questo esempio viene usato lo stesso gruppo di risorse usato per creare l'insieme di credenziali delle chiavi, ma è possibile specificarne uno diverso.

az container create \
  --resource-group myResourceGroup \
  --name mycontainer \
  --image mcr.microsoft.com/azure-cli \
  --assign-identity $resourceID \
  --command-line "tail -f /dev/null"

Entro pochi secondi si dovrebbe ricevere una risposta dall'interfaccia della riga di comando di Azure che indica che è stata completata la distribuzione. Controllarne lo stato con il comando az container show.

az container show \
  --resource-group myResourceGroup \
  --name mycontainer

La sezione identity dell'output è simile alla seguente e mostra che l'identità è impostata nel gruppo di contenitori. principalID sotto userAssignedIdentities è l'entità servizio dell'identità creata in Azure Active Directory:

[...]
"identity": {
    "principalId": "null",
    "tenantId": "xxxxxxxx-f292-4e60-9122-xxxxxxxxxxxx",
    "type": "UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/xxxxxxxx-0903-4b79-a55a-xxxxxxxxxxxx/resourcegroups/danlep1018/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {
        "clientId": "xxxxxxxx-5523-45fc-9f49-xxxxxxxxxxxx",
        "principalId": "xxxxxxxx-f25b-4895-b828-xxxxxxxxxxxx"
      }
    }
  },
[...]

Usare l'identità assegnata dall'utente per ottenere il segreto dall'insieme di credenziali delle chiavi

È ora possibile usare l'identità gestita all'interno dell'istanza del contenitore in esecuzione per accedere all'insieme di credenziali delle chiavi. Avviare prima una shell bash nel contenitore:

az container exec \
  --resource-group myResourceGroup \
  --name mycontainer \
  --exec-command "/bin/bash"

Eseguire i comandi seguenti nella shell bash nel contenitore. Per ottenere un token di accesso da usare Azure Active Directory per l'autenticazione nell'insieme di credenziali delle chiavi, eseguire il comando seguente:

curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -H Metadata:true -s

Output:

{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSIsImtpZCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSJ9......xxxxxxxxxxxxxxxxx","refresh_token":"","expires_in":"28799","expires_on":"1539927532","not_before":"1539898432","resource":"https://vault.azure.net/","token_type":"Bearer"}

Per archiviare il token di accesso in una variabile da usare nei comandi successivi per l'autenticazione, eseguire il comando seguente:

token=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -H Metadata:true | jq -r '.access_token')

Usare ora il token di accesso per eseguire l'autenticazione nell'insieme di credenziali delle chiavi e leggere un segreto. Assicurarsi di sostituire il nome dell'insieme di credenziali delle chiavi nell'URL (https: / /mykeyvault.vault.azure.net/...):

curl https://mykeyvault.vault.azure.net/secrets/SampleSecret/?api-version=2016-10-01 -H "Authorization: Bearer $token"

La risposta avrà un aspetto simile a quanto riportato di seguito e mostrerà il segreto. Nel codice occorrerebbe analizzare questo output per ottenere il segreto. Quindi, usare il segreto in un'operazione successiva per accedere a un'altra risorsa di Azure.

{"value":"Hello Container Instances","contentType":"ACIsecret","id":"https://mykeyvault.vault.azure.net/secrets/SampleSecret/xxxxxxxxxxxxxxxxxxxx","attributes":{"enabled":true,"created":1539965967,"updated":1539965967,"recoveryLevel":"Purgeable"},"tags":{"file-encoding":"utf-8"}}

Esempio 2: Usare un'identità assegnata dal sistema per accedere all'insieme di credenziali delle chiavi di Azure

Abilitare l'identità assegnata dal sistema in un gruppo di contenitori

Eseguire il comando az container create seguente per creare un'istanza di contenitore basata sull'immagine di azure-cli Microsoft. Questo esempio fornisce un gruppo a contenitore singolo che è possibile usare in modo interattivo per eseguire l'interfaccia della riga di comando di Azure per accedere ad altri servizi di Azure.

Il parametro --assign-identity senza valori aggiuntivi abilita un'identità gestita assegnata dal sistema nel gruppo. L'ambito dell'identità è il gruppo di risorse del gruppo di contenitori. Il comando con esecuzione prolungata mantiene in esecuzione il contenitore. Questo esempio usa lo stesso gruppo di risorse usato per creare l'insieme di credenziali delle chiavi, che si trova nell'ambito dell'identità.

# Get the resource ID of the resource group
rgID=$(az group show --name myResourceGroup --query id --output tsv)

# Create container group with system-managed identity
az container create \
  --resource-group myResourceGroup \
  --name mycontainer \
  --image mcr.microsoft.com/azure-cli \
  --assign-identity --scope $rgID \
  --command-line "tail -f /dev/null"

Entro pochi secondi si dovrebbe ricevere una risposta dall'interfaccia della riga di comando di Azure che indica che è stata completata la distribuzione. Controllarne lo stato con il comando az container show.

az container show \
  --resource-group myResourceGroup \
  --name mycontainer

La sezione identity nell'output ha un aspetto simile a quanto riportato di seguito e mostra che in Azure Active Directory viene creata un'identità assegnata dal sistema:

[...]
"identity": {
    "principalId": "xxxxxxxx-528d-7083-b74c-xxxxxxxxxxxx",
    "tenantId": "xxxxxxxx-f292-4e60-9122-xxxxxxxxxxxx",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
},
[...]

Impostare una variabile sul valore di principalId (l'ID dell'entità servizio) dell'identità per usarla nei passaggi successivi.

spID=$(az container show \
  --resource-group myResourceGroup \
  --name mycontainer \
  --query identity.principalId --out tsv)

Concedere al gruppo di contenitori l'accesso all'insieme di credenziali delle chiavi

Eseguire il comando az keyvault set-policy seguente per impostare criteri di accesso nell'insieme di credenziali delle chiavi. L'esempio seguente consente all'identità gestita dal sistema di ottenere segreti dall'insieme di credenziali delle chiavi:

 az keyvault set-policy \
   --name mykeyvault \
   --resource-group myResourceGroup \
   --object-id $spID \
   --secret-permissions get

Usare l'identità del gruppo di contenitori per ottenere il segreto dall'insieme di credenziali delle chiavi

È ora possibile usare l'identità gestita per accedere all'insieme di credenziali delle chiavi all'interno dell'istanza di contenitore in esecuzione. Avviare prima una shell Bash nel contenitore:

az container exec \
  --resource-group myResourceGroup \
  --name mycontainer \
  --exec-command "/bin/bash"

Eseguire i comandi seguenti nella shell bash nel contenitore. Accedere prima di tutto all'interfaccia della riga di comando di Azure usando l'identità gestita:

az login --identity

Dal contenitore in esecuzione recuperare il segreto dall'insieme di credenziali delle chiavi:

az keyvault secret show \
  --name SampleSecret \
  --vault-name mykeyvault --query value

Viene recuperato il valore del segreto:

"Hello Container Instances"

Abilitare l'identità gestita con un modello di Resource Manager

Per abilitare un'identità gestita in un gruppo di contenitori usando un modello di Resource Manager, impostare la proprietà identity dell'oggetto Microsoft.ContainerInstance/containerGroups con un oggetto ContainerGroupIdentity. I frammenti di codice seguenti mostrano la proprietà identity configurata per scenari diversi. Vedere il riferimento al modello di Resource Manager. Specificare almeno apiVersion 2018-10-01 .

Identità assegnata dall'utente

Un'identità assegnata dall'utente è un ID risorsa nel formato seguente:

"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}"

È possibile abilitare una o più identità assegnate dall'utente.

"identity": {
    "type": "UserAssigned",
    "userAssignedIdentities": {
        "myResourceID1": {
            }
        }
    }

Identità assegnata dal sistema

"identity": {
    "type": "SystemAssigned"
    }

Identità assegnate dal sistema e dall'utente

In un gruppo di contenitori è possibile abilitare sia un'identità assegnata dal sistema che una o più identità assegnate dall'utente.

"identity": {
    "type": "System Assigned, UserAssigned",
    "userAssignedIdentities": {
        "myResourceID1": {
            }
        }
    }
...

Abilitare l'identità gestita usando un file YAML

Per abilitare un'identità gestita in un gruppo di contenitori distribuiti usando un file YAML, includere il codice YAML seguente. Specificare almeno apiVersion 2018-10-01 .

Identità assegnata dall'utente

Un'identità assegnata dall'utente è un ID risorsa nel formato seguente

'/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'

È possibile abilitare una o più identità assegnate dall'utente.

identity:
  type: UserAssigned
  userAssignedIdentities:
    {'myResourceID1':{}}

Identità assegnata dal sistema

identity:
  type: SystemAssigned

Identità assegnate dal sistema e dall'utente

In un gruppo di contenitori è possibile abilitare sia un'identità assegnata dal sistema che una o più identità assegnate dall'utente.

identity:
  type: SystemAssigned, UserAssigned
  userAssignedIdentities:
   {'myResourceID1':{}}

Passaggi successivi

In questo articolo sono state fornite altre informazioni sulle identità gestite in Istanze di Azure Container ed è stato illustrato come:

  • Abilitare un'identità assegnata dall'utente o un'identità assegnata dal sistema in un gruppo di contenitori
  • Concedere all'identità l'accesso a un insieme di credenziali delle chiavi di Azure
  • Usare l'identità gestita per accedere a un insieme di credenziali delle chiavi da un contenitore in esecuzione