Como usar identidades gerenciadas com Instâncias de Contêiner do Azure

Use identidades gerenciadas para recursos do Azure para executar o código em Instâncias de Contêiner do Azure que interagem com outros serviços do Azure - sem manter segredos ou credenciais no código. O recurso fornece uma implantação de Instâncias de Contêiner do Azure com uma identidade gerenciada automaticamente no Microsoft Entra ID.

Neste artigo, você aprenderá mais sobre identidades gerenciadas nas Instâncias de Contêiner do Azure e:

  • Habilitar uma identidade atribuída pelo usuário ou atribuída pelo sistema em um grupo de contêineres
  • Conceder à identidade o acesso ao Azure Key Vault
  • Usar a identidade gerenciada para acessar um cofre de chaves de um contêiner em execução

Adapte os exemplos para habilitar e usar identidades em Instâncias de Contêiner do Azure para acessar outros serviços do Azure. Esses exemplos são interativos. No entanto, na prática as imagens de contêiner executariam o código para acessar os serviços do Azure.

Por que usar uma identidade gerenciada?

Use uma identidade gerenciada em um contêiner em execução para autenticar em qualquer serviço que dê suporte à autenticação do Microsoft Entra, sem gerenciar as credenciais no seu código de contêiner. Para serviços que não dão suporte à autenticação do AD, você pode armazenar segredos no Azure Key Vault e usar a identidade gerenciada para acessar o cofre de chaves para recuperar as credenciais. Para saber mais sobre como usar uma identidade gerenciada, consulte O que são identidades gerenciadas para recursos do Azure?

Habilitar uma identidade gerenciada

Quando você cria um grupo de contêineres, habilite uma ou mais identidades gerenciadas definindo uma propriedade ContainerGroupIdentity. Você também pode habilitar ou atualizar identidades gerenciadas depois que um grupo de contêineres estiver em execução; qualquer ação faz o grupo de contêineres reiniciar. Para definir as identidades em um grupo de contêineres novos ou existentes, use a CLI do Azure, um modelo do Resource Manager, um arquivo YAML ou outra ferramenta do Azure.

As instâncias de contêiner do Azure dão suporte a ambos os tipos de identidades gerenciada do Azure: atribuída pelo usuário e atribuída pelo sistema. Em um grupo de contêineres, você pode habilitar uma identidade atribuída pelo sistema, uma ou mais identidades atribuídas pelo usuário ou ambos os tipos de identidades. Se você não estiver familiarizado com as identidades gerenciadas para recursos do Azure, confira a visão geral.

Usar uma identidade gerenciada

Para usar uma identidade gerenciada, a identidade deve receber acesso a um ou mais recursos de serviço do Azure (por exemplo, um aplicativo Web, um cofre de chaves ou uma conta de armazenamento) na assinatura. Usar uma identidade gerenciada em um contêiner em execução é semelhando a usar uma identidade em uma máquina virtual (VM) do Azure. Consulte as diretrizes de VM para usar um token, Azure PowerShell ou CLI do Azure ou os SDKs do Azure.

Pré-requisitos

  • Este artigo exige a versão 2.0.49 ou posterior da CLI do Azure. Se você está usando o Azure Cloud Shell, a versão mais recente já está instalada.

Criar um Azure Key Vault

Os exemplos neste artigo usam uma identidade gerenciada nas Instâncias de Contêiner do Azure para acessar um segredo do Azure Key Vault.

Primeiramente, crie um grupo de recursos denominado myResourceGroup no local eastus com o seguinte comando az group create:

az group create --name myResourceGroup --location eastus

Use o comando az keyvault create para criar um cofre de chaves. Especifique um nome exclusivo de cofre de chaves.

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

Armazene um segredo de exemplo no cofre de chaves usando o comando az keyvault secret set:

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

Continue com os exemplos a seguir para acessar o cofre de chaves usando uma identidade gerenciada atribuída pelo usuário ou atribuída pelo sistema nas Instâncias de Contêiner do Azure.

Exemplo 1: usar uma identidade atribuída pelo usuário para acessar o Azure Key Vault

Criar uma identidade

Primeiro, crie uma identidade em sua assinatura usando o comando az identity create. Você pode usar o mesmo grupo de recursos usado para criar o cofre de chaves ou usar um diferente.

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

Para usar a identidade nas etapas a seguir, use o comando az identity show para armazenar a ID da entidade de serviço da identidade e a ID de recurso em variáveis.

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

Conceder acesso de identidade atribuída pelo usuário para o cofre de chaves

Execute o seguinte comando az keyvault set-policy para definir uma política de acesso no cofre de chaves. O exemplo a seguir permite que a identidade atribuída pelo usuário receba segredos do cofre de chaves:

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

Habilitar identidade atribuída pelo usuário em um grupo de contêineres

Execute o seguinte comando az container create para criar uma instância de contêiner com base na imagem azure-cli da Microsoft. Este exemplo fornece um grupo de contêiner único que você pode usar interativamente para executar a CLI do Azure para acessar outros serviços do Azure. Nesta seção, apenas o sistema operacional de base é usado. Para obter um exemplo de como usar a CLI do Azure no contêiner, confira Habilitar identidade atribuída pelo sistema em um grupo de contêineres.

O parâmetro --assign-identity passa sua identidade atribuída pelo usuário gerenciado para o grupo. O comando de execução demorada mantém o contêiner em execução. Este exemplo usa o mesmo grupo de recursos usado para criar o cofre de chaves, mas você pode especificar um diferente.

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

Em poucos segundos, você obterá uma resposta da CLI do Azure indicando que a implantação terminou. Verifique o status dele usando o comando az container show.

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

A seção identity na saída é semelhante ao seguinte, mostrando que a identidade está definida no grupo de contêineres. O principalID do userAssignedIdentities é a entidade de serviço da identidade que você criou no Microsoft Entra ID:

[...]
"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"
      }
    }
  },
[...]

Usar a identidade atribuída pelo usuário para obter segredo do cofre de chaves

Agora você pode usar a identidade gerenciada na instância de contêiner em execução para acessar o cofre de chaves. Primeiro inicie um shell bash no contêiner:

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

Execute os seguintes comandos no shell bash no contêiner. Para obter um token de acesso para usar o Microsoft Entra ID para autenticar no cofre de chaves, execute o seguinte comando:

client_id="xxxxxxxx-5523-45fc-9f49-xxxxxxxxxxxx"
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

Saída:

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

Para armazenar o token de acesso em uma variável para usar em comandos subsequentes para autenticar, execute o seguinte comando:

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

Agora, use o token de acesso para autenticar no cofre de chaves e ler um segredo. Substitua o nome de seu cofre de chaves na URL (https://mykeyvault.vault.azure.net/...):

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

A resposta se assemelha à seguinte, mostrando o segredo. No código, analise essa saída para obter o segredo. Em seguida, use o segredo em uma operação subsequente para acessar outro recurso do 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"}}

Exemplo 2: usar uma identidade atribuída pelo sistema para acessar o Azure Key Vault

Habilitar identidade atribuída pelo sistema em um grupo de contêineres

Execute o seguinte comando az container create para criar uma instância de contêiner com base na imagem azure-cli da Microsoft. Este exemplo fornece um grupo de contêiner único que você pode usar interativamente para executar a CLI do Azure para acessar outros serviços do Azure.

O parâmetro --assign-identity sem valor adicional permite uma identidade gerenciada atribuída pelo sistema no grupo. O escopo da identidade é o grupo de recursos do grupo de contêineres. O comando de execução demorada mantém o contêiner em execução. Este exemplo usa o mesmo grupo de recursos usado para criar o cofre de chaves, que está no escopo da identidade.

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

Em poucos segundos, você obterá uma resposta da CLI do Azure indicando que a implantação terminou. Verifique o status dele usando o comando az container show.

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

A seção identity na saída é semelhante à seguinte, mostrando que uma identidade atribuída pelo sistema é criada no Microsoft Entra:

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

Definir uma variável como o valor de principalId (a ID de entidade de serviço) da identidade, para ser usada em etapas posteriores.

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

Conceder acesso do grupo de contêineres ao cofre de chaves

Execute o seguinte comando az keyvault set-policy para definir uma política de acesso no cofre de chaves. O exemplo a seguir permite que a identidade gerenciada pelo sistema receba segredos do cofre de chaves:

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

Usar a identidade de grupo de contêineres para obter segredo do cofre de chaves

Agora você pode usar a identidade gerenciada para acessar o cofre de chaves dentro da instância de contêiner em execução. Primeiro inicie um shell bash no contêiner:

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

Execute os seguintes comandos no shell bash no contêiner. Primeiro faça logon na CLI do Azure usando a identidade gerenciada:

az login --identity

No contêiner em execução, recupere o segredo do cofre de chaves:

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

O valor do segredo é recuperado:

"Hello Container Instances"

Habilitar a identidade gerenciada usando o modelo do Resource Manager

Para habilitar uma identidade gerenciada em um grupo de contêiner usando um modelo do Resource Manager, defina a propriedade identity do objeto Microsoft.ContainerInstance/containerGroups com um objeto ContainerGroupIdentity. Os snippets a seguir mostram a propriedade identity configurada para cenários diferentes. Defina a referência de modelo do Resource Manager. Especifique no mínimo apiVersion de 2018-10-01.

Identidade atribuída pelo usuário

Uma identidade atribuída pelo usuário é uma ID de recurso do formulário:

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

Você pode habilitar uma ou mais identidades atribuídas pelo usuário.

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

Identidade atribuída pelo sistema

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

Identidades atribuídas pelo sistema e pelo usuário

Em um grupo de contêineres, você pode habilitar uma identidade atribuída pelo sistema e uma ou mais identidades atribuídas pelo usuário.

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

Habilitar a identidade gerenciada usando o arquivo YAML

Para habilitar uma identidade gerenciada em um grupo de contêineres implantados usando um arquivo YAML, inclua o YAML a seguir. Especifique no mínimo apiVersion de 2018-10-01.

Identidade atribuída pelo usuário

Uma identidade atribuída pelo usuário é uma ID de recurso do formulário

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

Você pode habilitar uma ou mais identidades atribuídas pelo usuário.

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

Identidade atribuída pelo sistema

identity:
  type: SystemAssigned

Identidades atribuídas pelo sistema e pelo usuário

Em um grupo de contêineres, você pode habilitar uma identidade atribuída pelo sistema e uma ou mais identidades atribuídas pelo usuário.

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

Identidade Gerenciada nos contêineres do Windows

A Identidade Gerenciada nos grupos de contêineres do Windows funciona de forma diferente dos grupos de contêineres do Linux. Quanto aos contêineres do Windows, o servidor de metadados (169.254.169.254) não está disponível para obter o token do Microsoft Entra ID. Os clientes podem seguir um padrão diferente para obterem o token de acesso nos contêineres do Windows. O padrão envolve o envio de solicitação do token para o IDENTITY_ENDPOINT juntamente com informações adicionais, como a ID de entidade de segurança e de segredo, conforme mostrado abaixo. O IDENTITY_ENDPOINT e o IDENTITY_HEADER são injetados como variável ambiental no seu contêiner.

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

Um exemplo de script do PowerShell

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"

O módulo Az Login e outras bibliotecas de cliente que dependem do servidor de metadados (169.254.169.254) não funcionarão em um Contêiner do Windows. Além disso, os contêineres do Windows na vNet não poderão se conectar ao ponto de extremidade; portanto, um token de identidade gerenciada não pode ser gerado em um contêiner de rede virtual do Windows.

Próximas etapas

Neste artigo, você aprendeu sobre identidades gerenciadas nas Instâncias de Contêiner do Azure e como:

  • Habilitar uma identidade atribuída pelo usuário ou atribuída pelo sistema em um grupo de contêineres
  • Conceder à identidade o acesso ao Azure Key Vault
  • Usar a identidade gerenciada para acessar um cofre de chaves de um contêiner em execução