Condividi tramite


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 Microsoft Entra ID.

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à di accedere ad Azure Key Vault
  • 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.

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 Microsoft Entra senza dover gestire le credenziali nel codice del contenitore. Per i servizi che non supportano l'autenticazione di AD, è possibile archiviare i segreti in un insieme di credenziali delle chiavi di Azure e usare l'identità gestita per accedere a Key Vault e 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 identità gestite quando un gruppo di contenitori è in esecuzione. 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 di 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 i tipi di identità gestita per le risorse di Azure, vedere la panoramica.

Usare un'identità gestita

Per usare un'identità gestita, è necessario che all'identità venga 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.

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 Azure Key Vault

Gli esempi in questo articolo usano un'identità gestita in Istanze di Azure Container per accedere a un segreto di Azure Key Vault.

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

Per creare un insieme di credenziali delle chiavi usare il comando az keyvault create. 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 ad Azure Key Vault

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 oppure 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
SP_ID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

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

Concedere all'identità assegnata dall'utente di accedere all'insieme di credenziali delle chiavi

Eseguire il comando az keyvault set-policy seguente per impostare un criterio 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 $SP_ID \
    --secret-permissions get

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

Eseguire il comando az container create seguente per creare un'istanza di contenitore basata sull'immagine azure-cli di Microsoft. Questo esempio presenta un gruppo con contenitore singolo che è possibile usare per eseguire l'interfaccia della riga di comando di Azure in modo interattivo per accedere agli 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 un'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. Questo esempio usa lo stesso gruppo di risorse usato per creare l'insieme di credenziali delle chiavi, tuttavia è possibile specificarne uno diverso.

az container create \
  --resource-group myResourceGroup \
  --name mycontainer \
  --image mcr.microsoft.com/azure-cli \
  --assign-identity $RESOURCE_ID \
  --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 Microsoft Entra ID:

[...]
"identity": {
    "principalId": "null",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "type": "UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/danlep1018/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {
        "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
        "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222"
      }
    }
  },
[...]

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

A questo punto è possibile usare l'identità gestita all'interno dell'istanza di contenitore in esecuzione per accedere all'insieme di credenziali delle chiavi. Avviare innanzitutto 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 per usare Microsoft Entra ID per l'autenticazione all'insieme di credenziali delle chiavi, eseguire il comando seguente:

client_id="00001111-aaaa-2222-bbbb-3333cccc4444"
curl "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net&client_id=$client_id" -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')

A questo punto è possibile usare il token di accesso per autenticarsi all'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=7.4 -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 ad Azure Key Vault

Abilitare un'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 azure-cli di Microsoft. Questo esempio presenta un gruppo con contenitore singolo che è possibile usare per eseguire l'interfaccia della riga di comando di Azure in modo interattivo per accedere agli altri servizi di Azure.

Il parametro --assign-identity senza valori aggiuntivi abilita un'identità gestita assegnata dal sistema nel gruppo. L'identità ha lo scope del 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
RG_ID=$(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 $RG_ID \
  --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 Microsoft Entra ID viene creata un'identità assegnata dal sistema:

[...]
"identity": {
    "principalId": "bbbbbbbb-cccc-dddd-2222-333333333333",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
},
[...]

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

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

Concedere al gruppo di contenitori di accedere all'insieme di credenziali delle chiavi

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

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

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

A questo punto è possibile usare l'identità gestita per accedere all'insieme di credenziali delle chiavi all'interno dell'istanza di contenitore in esecuzione. Avviare innanzitutto 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 prima cosa, accedere 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

Il valore del segreto viene recuperato:

"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 un apiVersion minimo di 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": {
            }
        }
    }
...

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 un apiVersion minimo di 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':{}}

Identità gestita nei contenitori windows

Identità gestita nei gruppi di contenitori Windows funziona in modo diverso rispetto ai gruppi di contenitori Linux. Per i contenitori windows, il server di metadati (169.254.169.254) non è disponibile per ottenere il token ID di Microsoft Entra. I clienti possono seguire un modello diverso per ottenere il token di accesso nei contenitori di Windows. Il modello prevede l'invio di una richiesta di token al IDENTITY_ENDPOINT insieme a informazioni aggiuntive, ad esempio l'ID entità e il segreto, come illustrato di seguito. Le IDENTITY_ENDPOINT e le IDENTITY_HEADER vengono inserite come variabile ambientale nel contenitore.

curl -G -v %IDENTITY_ENDPOINT% --data-urlencode resource=https://vault.azure.net --data-urlencode principalId=<principal id> -H secret:%IDENTITY_HEADER%

Uno script di PowerShell di esempio

identityEndpoint = $env:IDENTITY_ENDPOINT
$identityHeader = $env:IDENTITY_HEADER
$resource = "https://vault.azure.net"
$principalId = "b2ee9347-623c-4794-85af-2d5261356f67"
 
Invoke-RestMethod -Uri "$identityEndpoint" `
    -Method Get `
    -Headers @{secret = $identityHeader} `
    -Body @{resource = $resource; principalId = $principalId} `
    -ContentType "application/x-www-form-urlencoded"

Il modulo Az Login e altre librerie client che dipendono dal server di metadati (169.254.169.254) non funzioneranno in un contenitore di Windows. Inoltre, i contenitori Windows nella rete virtuale non saranno in grado di connettersi all'endpoint; di conseguenza, non è possibile generare un token di identità gestito in un contenitore di rete virtuale Windows.

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à di accedere ad Azure Key Vault
  • Usare l'identità gestita per accedere a un insieme di credenziali delle chiavi da un contenitore in esecuzione