Autenticar aplicativos hospedados no Azure para recursos do Azure com o SDK do Azure para Python
Quando você hospeda um aplicativo no Azure usando serviços como Serviço de Aplicativo do Azure, Máquinas Virtuais do Azure ou Instâncias de Contêiner do Azure, a abordagem recomendada para autenticar um aplicativo nos recursos do Azure é com identidade gerenciada.
Uma identidade gerenciada fornece uma identidade para seu aplicativo de modo que ela possa se conectar a outros recursos do Azure sem a necessidade de usar uma chave secreta ou outro segredo do aplicativo. Internamente, o Azure sabe a identidade do seu aplicativo e a quais recursos ele tem permissão para se conectar. O Azure usa essas informações para obter automaticamente tokens do Microsoft Entra para o aplicativo para permitir que ele se conecte a outros recursos do Azure, tudo sem que você precise gerenciar segredos do aplicativo.
Observação
Os aplicativos em execução no Serviço de Kubernetes do Azure (AKS) podem usar uma identidade de carga de trabalho para autenticar com recursos do Azure. No AKS, uma identidade de carga de trabalho representa uma relação de confiança entre uma identidade gerenciada e uma conta de serviço do Kubernetes. Se um aplicativo implantado no AKS estiver configurado com uma conta de serviço do Kubernetes nessa relação, DefaultAzureCredential
autenticará o aplicativo no Azure usando a identidade gerenciada. A autenticação usando uma identidade de carga de trabalho é discutida em Usar a ID de carga de trabalho do Microsoft Entra com o Serviço de Kubernetes do Azure. Para obter etapas sobre como configurar a identidade da carga de trabalho, consulte Implantar e configurar a identidade da carga de trabalho em um cluster do Serviço de Kubernetes do Azure (AKS).
Tipos de identidade gerenciada
Há dois tipos de identidades gerenciadas:
- Identidades gerenciadas atribuídas pelo sistema – Esse tipo de identidade gerenciada é fornecido e vinculado diretamente a um recurso do Azure. Ao habilitar a identidade gerenciada em um recurso do Azure, você obtém uma identidade gerenciada atribuída pelo sistema para esse recurso. Uma identidade gerenciada atribuída pelo sistema está vinculada ao ciclo de vida do recurso do Azure ao qual está associado. Quando o recurso é excluído, o Azure exclui automaticamente a identidade para você. Como tudo o que você precisa fazer é habilitar a identidade gerenciada para o recurso do Azure que hospeda seu código, essa abordagem é o tipo mais fácil de usar
- Identidades gerenciadas atribuídas pelo usuário - Também é possível criar uma identidade gerenciada como um recurso autônomo do Azure. Essa abordagem é usada com mais frequência quando sua solução tem várias cargas de trabalho executadas em vários recursos do Azure que precisam compartilhar a mesma identidade e as mesmas permissões. Por exemplo, se sua solução tiver componentes executados em várias instâncias do Serviço de Aplicativo e da máquina virtual que precisam de acesso ao mesmo conjunto de recursos do Azure, uma identidade gerenciada atribuída pelo usuário usada nesses recursos fará sentido.
Este artigo aborda as etapas para habilitar e usar uma identidade gerenciada atribuída pelo sistema para um aplicativo. Se você precisar usar uma identidade gerenciada atribuída pelo usuário, consulte o artigo Gerenciar identidades gerenciadas atribuídas pelo usuário para ver como criar uma identidade gerenciada atribuída pelo usuário.
1 – Habilitar a identidade gerenciada no recurso do Azure que hospeda o aplicativo
A primeira etapa é habilitar a identidade gerenciada no recurso do Azure que hospeda seu aplicativo. Por exemplo, se você estiver hospedando um aplicativo Django usando o Serviço de Aplicativo do Azure, precisará habilitar a identidade gerenciada para o aplicativo Web do Serviço de Aplicativo que está hospedando seu aplicativo. Se você estiver usando uma máquina virtual para hospedar seu aplicativo, habilite sua VM para usar a identidade gerenciada.
Você pode habilitar a identidade gerenciada a ser usada para um recurso do Azure usando o portal do Azure ou a CLI do Azure.
É possível executar os comandos da CLI do Azure no Azure Cloud Shell ou em uma estação de trabalho com a CLI do Azure instalada.
Os comandos da CLI do Azure usados para habilitar a identidade gerenciada para um recurso do Azure são do formulário az <command-group> identity --resource-group <resource-group-name> --name <resource-name>
. Comandos específicos para serviços populares do Azure são mostrados abaixo.
az webapp identity assign --resource-group <resource-group-name> -name <web-app-name>
A saída terá a aparência a seguir.
{
"principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "SystemAssigned",
"userAssignedIdentities": null
}
O valor principalId
é a ID exclusiva da identidade gerenciada. Mantenha uma cópia dessa saída, pois você precisará desses valores na próxima etapa.
2 – Atribuir funções à identidade gerenciada
Em seguida, você precisa determinar de quais funções (permissões) seu aplicativo precisa e atribuir a identidade gerenciada a essas funções no Azure. Uma identidade gerenciada pode ser atribuída a funções em um escopo de recurso, grupo de recursos ou assinatura. Este exemplo mostra como atribuir funções no escopo do grupo de recursos, uma vez que a maioria dos aplicativos agrupa todos os seus recursos do Azure em um único grupo de recursos.
Uma identidade gerenciada recebe uma função no Azure usando o comando az role assignment create. Para o destinatário, use o principalId
que você copiou na etapa 1.
az role assignment create --assignee <managedIdentityprincipalId> \
--scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> \
--role "<roleName>"
Para obter os nomes de função aos quais uma entidade de serviço pode ser atribuída, use o comando az role definition list.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Por exemplo, para permitir que a identidade gerenciada com o ID de aaaaaaaa-bbbb-cccc-1111-222222222222
leitura, gravação e exclusão acesse os contêineres do Azure Storage Blob e os dados em todas as contas de armazenamento no grupo de recursos msdocs-python-sdk-auth-example na assinatura com ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, você deve atribuir a entidade de serviço do aplicativo à função de Colaborador de dados de blob de armazenamento usando o seguinte comando.
az role assignment create --assignee aaaaaaaa-bbbb-cccc-1111-222222222222 \
--scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-sdk-auth-example \
--role "Storage Blob Data Contributor"
Para obter informações sobre como atribuir permissões no nível de recurso ou assinatura usando a CLI do Azure, consulte o artigo Atribuir funções do Azure usando a CLI do Azure.
3 – Implementar DefaultAzureCredential no seu aplicativo
Quando o código está em execução no Azure e a identidade gerenciada foi habilitada no recurso do Azure que hospeda seu aplicativo, o DefaultAzureCredential
determina as credenciais a serem usadas na seguinte ordem:
- Verifique o ambiente em busca de uma entidade de serviço, conforme definido pelas variáveis de ambiente
AZURE_CLIENT_ID
,AZURE_TENANT_ID
eAZURE_CLIENT_SECRET
ouAZURE_CLIENT_CERTIFICATE_PATH
eAZURE_CLIENT_CERTIFICATE_PASSWORD
(opcional). - Verifique os parâmetros de palavra-chave para uma identidade gerenciada atribuída pelo usuário. Você pode passar uma identidade gerenciada atribuída pelo usuário especificando o ID do cliente no parâmetro
managed_identity_client_id
. - Verifique a variável de ambiente
AZURE_CLIENT_ID
para o ID do cliente de uma identidade gerenciada atribuída pelo usuário. - Use a identidade gerenciada atribuída pelo sistema para o recurso do Azure, se ela estiver habilitada.
Você pode excluir identidades gerenciadas da credencial definindo o parâmetro de palavra-chave exclude_managed_identity_credential
True
.
Neste artigo, estamos usando a identidade gerenciada atribuída pelo sistema para um aplicativo Web do Serviço de Aplicativo do Azure, portanto, não precisamos configurar uma identidade gerenciada no ambiente ou passá-la como um parâmetro. As etapas a seguir mostram como usar o DefaultAzureCredential
.
Primeiro, adicione o pacote azure.identity
ao seu aplicativo.
pip install azure-identity
Em seguida, para qualquer código Python que crie um objeto cliente do SDK do Azure em seu aplicativo, você deverá:
- Importar a classe
DefaultAzureCredential
do móduloazure.identity
. - Crie um objeto
DefaultAzureCredential
. - Passar o objeto
DefaultAzureCredential
para o construtor do objeto do cliente do SDK do Azure.
Um exemplo dessas etapas é mostrado no segmento de código a seguir.
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
# Acquire a credential object
token_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url="https://<my_account_name>.blob.core.windows.net",
credential=token_credential)
Conforme discutido no artigo Visão geral da autenticação do SDK do Azure para Python, DefaultAzureCredential
dá suporte a vários métodos de autenticação e determina o método de autenticação que está sendo usado em tempo de execução. O benefício dessa abordagem é que que seu aplicativo pode usar diferentes métodos de autenticação em ambientes diferentes sem implementar código específico do ambiente. Quando o código anterior for executado em sua estação de trabalho durante o desenvolvimento local, DefaultAzureCredential
usará uma entidade de serviço de aplicativo, conforme determinado pelas configurações do ambiente, ou credenciais da ferramenta de desenvolvedor para autenticar com outros recursos do Azure. Assim, o mesmo código pode ser usado para autenticar seu aplicativo nos recursos do Azure durante o desenvolvimento local e quando implantado no Azure.