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
Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, confira Início Rápido para Bash no Azure Cloud Shell.
Se preferir executar os comandos de referência da CLI localmente, instale a CLI do Azure. Para execuções no Windows ou no macOS, considere executar a CLI do Azure em um contêiner do Docker. Para obter mais informações, confira Como executar a CLI do Azure em um contêiner do Docker.
Se estiver usando uma instalação local, entre com a CLI do Azure usando o comando az login. Para concluir o processo de autenticação, siga as etapas exibidas no terminal. Para ver outras opções de entrada, confira Conectar-se com a CLI do Azure.
Quando solicitado, instale a extensão da CLI do Azure no primeiro uso. Para obter mais informações sobre extensões, confira Usar extensões com a CLI do Azure.
Execute az version para localizar a versão e as bibliotecas dependentes que estão instaladas. Para fazer a atualização para a versão mais recente, execute az upgrade.
- 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
Aprenda sobre identidades gerenciadas dos recursos do Azure.
Confira um exemplo de SDK do Azure para Go de como usar uma identidade gerenciada para acessar um cofre de chaves de Instâncias de Contêiner do Azure.