Dela via


Använda hanterade identiteter med Azure Container Instances

Använd hanterade identiteter för Azure-resurser för att köra kod i Azure Container Instances som interagerar med andra Azure-tjänster – utan att ha några hemligheter eller autentiseringsuppgifter i koden. Funktionen tillhandahåller en Azure Container Instances-distribution med en automatiskt hanterad identitet i Microsoft Entra-ID.

I den här artikeln lär du dig mer om hanterade identiteter i Azure Container Instances och:

  • Aktivera en användartilldelad eller systemtilldelad identitet i en containergrupp
  • Ge identiteten åtkomst till ett Azure-nyckelvalv
  • Använda den hanterade identiteten för att komma åt ett nyckelvalv från en container som körs

Anpassa exemplen för att aktivera och använda identiteter i Azure Container Instances för att få åtkomst till andra Azure-tjänster. De här exemplen är interaktiva. I praktiken skulle dock dina containeravbildningar köra kod för att komma åt Azure-tjänster.

Varför ska jag använda en hanterad identitet?

Använd en hanterad identitet i en container som körs för att autentisera till alla tjänster som stöder Microsoft Entra-autentisering utan att hantera autentiseringsuppgifter i containerkoden. För tjänster som inte stöder AD-autentisering kan du lagra hemligheter i ett Azure-nyckelvalv och använda den hanterade identiteten för att få åtkomst till nyckelvalvet för att hämta autentiseringsuppgifter. Mer information om hur du använder en hanterad identitet finns i Vad är hanterade identiteter för Azure-resurser?

Aktivera en hanterad identitet

När du skapar en containergrupp aktiverar du en eller flera hanterade identiteter genom att ange en ContainerGroupIdentity-egenskap . Du kan också aktivera eller uppdatera hanterade identiteter när en containergrupp har körts – antingen startas containergruppen om. Om du vill ange identiteterna för en ny eller befintlig containergrupp använder du Azure CLI, en Resource Manager-mall, en YAML-fil eller ett annat Azure-verktyg.

Azure Container Instances stöder båda typerna av hanterade Azure-identiteter: användartilldelade och systemtilldelade. I en containergrupp kan du aktivera en systemtilldelad identitet, en eller flera användartilldelade identiteter eller båda typerna av identiteter. Om du inte känner till hanterade identiteter för Azure-resurser kan du läsa översikten.

Använda en hanterad identitet

Om du vill använda en hanterad identitet måste identiteten beviljas åtkomst till en eller flera Azure-tjänstresurser (till exempel en webbapp, ett nyckelvalv eller ett lagringskonto) i prenumerationen. Att använda en hanterad identitet i en container som körs liknar att använda en identitet på en virtuell Azure-dator (VM). Se vägledningen för virtuella datorer för att använda en token, Azure PowerShell eller Azure CLI eller Azure SDK:er.

Förutsättningar

  • Den här artikeln kräver version 2.0.49 eller senare av Azure CLI. Om du använder Azure Cloud Shell är den senaste versionen redan installerad.

Skapa ett Azure-nyckelvalv

Exemplen i den här artikeln använder en hanterad identitet i Azure Container Instances för att få åtkomst till en Azure-nyckelvalvshemlighet.

Skapa först en resursgrupp med namnet myResourceGroup på platsen eastus med följande az group create-kommando:

az group create --name myResourceGroup --location eastus

Använd kommandot az keyvault create för att skapa ett nyckelvalv. Se till att ange ett unikt nyckelvalvnamn.

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

Lagra en exempelhemlighet i nyckelvalvet med kommandot az keyvault secret set :

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

Fortsätt med följande exempel för att komma åt nyckelvalvet med antingen en användartilldelad eller systemtilldelad hanterad identitet i Azure Container Instances.

Exempel 1: Använda en användartilldelad identitet för att få åtkomst till Azure Key Vault

Skapa en identitet

Skapa först en identitet i din prenumeration med kommandot az identity create . Du kan använda samma resursgrupp som används för att skapa nyckelvalvet eller använda en annan.

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

Om du vill använda identiteten i följande steg använder du kommandot az identity show för att lagra identitetens tjänsthuvudnamns-ID och resurs-ID i variabler.

# 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)

Bevilja användartilldelad identitet åtkomst till nyckelvalvet

Kör följande az keyvault set-policy-kommando för att ange en åtkomstprincip i nyckelvalvet. I följande exempel kan den användartilldelade identiteten hämta hemligheter från nyckelvalvet:

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

Aktivera användartilldelad identitet i en containergrupp

Kör följande az container create-kommando för att skapa en containerinstans baserat på Microsofts azure-cli avbildning. Det här exemplet innehåller en grupp med en container som du kan använda interaktivt för att köra Azure CLI för att få åtkomst till andra Azure-tjänster. I det här avsnittet används endast basoperativsystemet. Ett exempel på hur du använder Azure CLI i containern finns i Aktivera systemtilldelad identitet i en containergrupp.

Parametern --assign-identity skickar din användartilldelade hanterade identitet till gruppen. Det långvariga kommandot håller containern igång. I det här exemplet används samma resursgrupp som används för att skapa nyckelvalvet, men du kan ange en annan.

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

Inom några sekunder bör du få ett svar från Azure CLI som anger att distributionen har slutförts. Kontrollera dess status med kommandot az container show .

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

Avsnittet identity i utdata ser ut ungefär så här, som visar att identiteten har angetts i containergruppen. Under principalID userAssignedIdentities är tjänstens huvudnamn för den identitet som du skapade i 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"
      }
    }
  },
[...]

Använda användartilldelad identitet för att hämta hemlighet från nyckelvalvet

Nu kan du använda den hanterade identiteten i containerinstansen som körs för att få åtkomst till nyckelvalvet. Starta först ett bash-gränssnitt i containern:

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

Kör följande kommandon i bash-gränssnittet i containern. Kör följande kommando för att hämta en åtkomsttoken för att använda Microsoft Entra-ID för att autentisera till nyckelvalvet:

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

Utdata:

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

Om du vill lagra åtkomsttoken i en variabel som ska användas i efterföljande kommandon för att autentisera kör du följande kommando:

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')

Använd nu åtkomsttoken för att autentisera till nyckelvalvet och läsa en hemlighet. Se till att ersätta namnet på ditt nyckelvalv i URL:en (https://mykeyvault.vault.azure.net/...):

curl https://mykeyvault.vault.azure.net/secrets/SampleSecret/?api-version=7.4 -H "Authorization: Bearer $TOKEN"

Svaret ser ut ungefär så här och visar hemligheten. I koden parsar du utdata för att hämta hemligheten. Använd sedan hemligheten i en efterföljande åtgärd för att komma åt en annan Azure-resurs.

{"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"}}

Exempel 2: Använd en systemtilldelad identitet för att få åtkomst till Azure Key Vault

Aktivera systemtilldelad identitet i en containergrupp

Kör följande az container create-kommando för att skapa en containerinstans baserat på Microsofts azure-cli avbildning. Det här exemplet innehåller en grupp med en container som du kan använda interaktivt för att köra Azure CLI för att få åtkomst till andra Azure-tjänster.

Parametern --assign-identity utan ytterligare värde möjliggör en systemtilldelad hanterad identitet i gruppen. Identiteten är begränsad till resursgruppen för containergruppen. Det långvariga kommandot håller containern igång. I det här exemplet används samma resursgrupp som används för att skapa nyckelvalvet, som ingår i identitetens omfång.

# 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"

Inom några sekunder bör du få ett svar från Azure CLI som anger att distributionen har slutförts. Kontrollera dess status med kommandot az container show .

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

Avsnittet identity i utdata ser ut ungefär så här och visar att en systemtilldelad identitet skapas i Microsoft Entra-ID:

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

Ange en variabel till värdet principalId för (tjänstens huvudnamns-ID) för identiteten som ska användas i senare steg.

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

Bevilja containergruppåtkomst till nyckelvalvet

Kör följande az keyvault set-policy-kommando för att ange en åtkomstprincip i nyckelvalvet. I följande exempel kan den systemhanterade identiteten hämta hemligheter från nyckelvalvet:

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

Använda containergruppsidentitet för att hämta hemligheten från nyckelvalvet

Nu kan du använda den hanterade identiteten för att komma åt nyckelvalvet i containerinstansen som körs. Starta först ett bash-gränssnitt i containern:

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

Kör följande kommandon i bash-gränssnittet i containern. Logga först in på Azure CLI med hjälp av den hanterade identiteten:

az login --identity

Hämta hemligheten från nyckelvalvet från containern som körs:

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

Värdet för hemligheten hämtas:

"Hello Container Instances"

Aktivera hanterad identitet med hjälp av Resource Manager-mall

Om du vill aktivera en hanterad identitet i en containergrupp med hjälp av en Resource Manager-mall anger du identity objektets Microsoft.ContainerInstance/containerGroups egenskap med ett ContainerGroupIdentity objekt. Följande kodfragment visar egenskapen identity som konfigurerats för olika scenarier. Se Resource Manager-mallreferensen. Ange minst apiVersion 2018-10-01.

Användartilldelad identitet

En användartilldelad identitet är ett resurs-ID i formuläret:

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

Du kan aktivera en eller flera användartilldelade identiteter.

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

Systemtilldelad identitet

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

System- och användartilldelade identiteter

I en containergrupp kan du aktivera både en systemtilldelad identitet och en eller flera användartilldelade identiteter.

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

Aktivera hanterad identitet med YAML-fil

Om du vill aktivera en hanterad identitet i en containergrupp som distribuerats med hjälp av en YAML-fil inkluderar du följande YAML. Ange minst apiVersion 2018-10-01.

Användartilldelad identitet

En användartilldelad identitet är ett resurs-ID för formuläret

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

Du kan aktivera en eller flera användartilldelade identiteter.

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

Systemtilldelad identitet

identity:
  type: SystemAssigned

System- och användartilldelade identiteter

I en containergrupp kan du aktivera både en systemtilldelad identitet och en eller flera användartilldelade identiteter.

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

Hanterad identitet i Windows-containrar

Hanterad identitet i Windows-containergrupper fungerar annorlunda än Linux-containergrupper. För Windows-containrar är metadataservern (169.254.169.254) inte tillgänglig för att hämta Microsoft Entra ID-token. Kunder kan följa ett annat mönster för att hämta åtkomsttoken i Windows-containrar. Mönstret omfattar att skicka tokenbegäran till IDENTITY_ENDPOINT tillsammans med ytterligare information, till exempel huvud-ID och hemlighet enligt nedan. IDENTITY_ENDPOINT och IDENTITY_HEADER matas in som miljövariabel i containern.

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

Ett powershell-exempelskript

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"

Az Login-modulen och andra klientbibliotek som är beroende av metadataservern (169.254.169.254) fungerar inte i en Windows-container. Dessutom kommer Windows-containrar i vNet inte att kunna ansluta till slutpunkten. Därför kan en hanterad identitetstoken inte genereras i en virtuell Windows-nätverkscontainer.

Nästa steg

I den här artikeln har du lärt dig om hanterade identiteter i Azure Container Instances och hur du:

  • Aktivera en användartilldelad eller systemtilldelad identitet i en containergrupp
  • Ge identiteten åtkomst till ett Azure-nyckelvalv
  • Använda den hanterade identiteten för att komma åt ett nyckelvalv från en container som körs