Como utilizar identidades geridas com o Azure Container Instances

Use identidades gerenciadas para recursos do Azure para executar código em Instâncias de Contêiner do Azure que interage 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 na ID do Microsoft Entra.

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

  • Habilitar uma identidade atribuída pelo usuário ou pelo sistema em um grupo de contêineres
  • Conceder acesso de identidade a um cofre de chaves do Azure
  • Usar a identidade gerenciada para acessar um cofre de chaves a partir 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. Estes exemplos são interativos. No entanto, na prática, suas imagens de contêiner executariam 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 ofereça suporte à autenticação do Microsoft Entra sem gerenciar credenciais no código do contêiner. Para serviços que não dão suporte à autenticação do AD, você pode armazenar segredos em um cofre de chaves do Azure e usar a identidade gerenciada para acessar o cofre de chaves para recuperar credenciais. Para obter mais informações sobre como usar uma identidade gerenciada, consulte O que são identidades gerenciadas para recursos do Azure?

Habilitar uma identidade gerenciada

Ao criar 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 com que o grupo de contêineres seja reiniciado. Para definir as identidades em um grupo de contêineres novo ou existente, use a CLI do Azure, um modelo do Gerenciador de Recursos, um arquivo YAML ou outra ferramenta do Azure.

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

Utilizar uma identidade gerida

Para usar uma identidade gerenciada, a identidade deve ter acesso a um ou mais recursos de serviço do Azure (como 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 é semelhante ao uso de uma identidade em uma VM do Azure. Consulte as diretrizes da VM para usar um token, o Azure PowerShell ou a CLI do Azure ou os SDKs do Azure.

Pré-requisitos

  • Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, consulte Guia de início rápido para Bash no Azure Cloud Shell.

  • Se preferir executar comandos de referência da CLI localmente, instale a CLI do Azure. Se estiver a utilizar o Windows ou macOS, considere executar a CLI do Azure num contentor Docker. Para obter mais informações, consulte Como executar a CLI do Azure em um contêiner do Docker.

    • Se estiver a utilizar uma instalação local, inicie sessão no CLI do Azure ao utilizar o comando az login. Para concluir o processo de autenticação, siga os passos apresentados no seu terminal. Para outras opções de entrada, consulte Entrar com a CLI do Azure.

    • Quando solicitado, instale a extensão da CLI do Azure na primeira utilização. Para obter mais informações sobre as extensões, veja Utilizar extensões com o CLI do Azure.

    • Execute o comando az version para localizar a versão e as bibliotecas dependentes instaladas. Para atualizar para a versão mais recente, execute o comando az upgrade.

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

Criar um cofre de chaves do Azure

Os exemplos neste artigo usam uma identidade gerenciada em Instâncias de Contêiner do Azure para acessar um segredo do cofre de chaves do Azure.

Primeiro, crie um grupo de recursos com o nome myResourceGroup na localização eualeste através do comando seguinte az group create:

az group create --name myResourceGroup --location eastus

Use o comando az keyvault create para criar um cofre de chaves. Certifique-se de especificar um nome exclusivo do cofre de chaves.

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

Armazene um exemplo de segredo 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 pelo sistema nas Instâncias de Contêiner do Azure.

Exemplo 1: Usar uma identidade atribuída pelo usuário para acessar o cofre de chaves do Azure

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 o ID da entidade de serviço e o ID do recurso da identidade 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 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 atribuída pelo usuário obtenha segredos do cofre de chaves:

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

Habilitar a 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 da azure-cli 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 base é usado. Para obter um exemplo de como usar a CLI do Azure no contêiner, consulte Habilitar identidade atribuída ao sistema em um grupo de contêineres.

O --assign-identity parâmetro passa sua identidade gerenciada atribuída pelo usuário para o grupo. O comando de longa execução 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"

Dentro de alguns segundos, deverá receber uma resposta da CLI do Azure que indica que a implementação foi concluída. Verifique seu status com o comando az container show .

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

A identity seção na saída é semelhante à seguinte, mostrando que a identidade está definida no grupo de contêineres. O principalID abaixo 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 dentro da 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

Resultado:

{"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 a ser usada em comandos subsequentes para autenticação, 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. Certifique-se de substituir o nome do cofre de chaves no URL (https://mykeyvault.vault.azure.net/...):

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

A resposta é semelhante à seguinte, mostrando o segredo. Em seu código, você analisaria 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 ao sistema para acessar o cofre de chaves do Azure

Habilitar a identidade atribuída ao 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 da azure-cli 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 --assign-identity parâmetro sem valor adicional permite uma identidade gerenciada atribuída pelo sistema no grupo. A identidade tem como escopo o grupo de recursos do grupo de contêineres. O comando de longa execução 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"

Dentro de alguns segundos, deverá receber uma resposta da CLI do Azure que indica que a implementação foi concluída. Verifique seu status com o comando az container show .

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

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

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

Defina uma variável para o valor de (o ID da entidade de serviço) da principalId identidade, para usar em etapas posteriores.

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

Conceder acesso ao 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 obtenha segredos do cofre de chaves:

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

Usar a identidade do grupo de contêineres para obter segredos 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, entre 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 identidade gerenciada usando o modelo do Gerenciador de Recursos

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

Identidade atribuída pelo utilizador

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 identidade gerenciada usando o arquivo YAML

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

Identidade atribuída pelo utilizador

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':{}}

Próximos passos

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

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