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 o 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.

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 de identidade gerenciada mais fácil de usar.
  • Identidades gerenciadas atribuídas pelo usuário - Você também pode 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 de máquina virtual que precisam acessar o 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": "99999999-9999-9999-9999-999999999999",
  "tenantId": "33333333-3333-3333-3333-333333333333",
  "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, já que a maioria dos aplicativos agrupa todos os 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 cessioná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 a ID de leitura, gravação e exclusão tenha acesso a contêineres e dados de blob do Armazenamento do Azure em todas as contas de armazenamento no grupo de recursos msdocs-python-sdk-auth-example na assinatura com ID 11111111-1111-1111-1111-111111111111, você atribuiria a entidade de 99999999-9999-9999-9999-999999999999 serviço do aplicativo à função Colaborador de Dados de Blob de Armazenamento usando o comando a seguir.

az role assignment create --assignee 99999999-9999-9999-9999-999999999999 \
    --scope /subscriptions/11111111-1111-1111-1111-111111111111/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, confira o artigo Atribuir funções do Azure usando a CLI do Azure.

3 – Implementar DefaultAzureCredential no seu aplicativo

Quando seu código está sendo executado 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:

  1. Verifique o ambiente para uma entidade de serviço, conforme definido pelas variáveis AZURE_CLIENT_IDde ambiente , AZURE_TENANT_IDe AZURE_CLIENT_SECRET ou ou e AZURE_CLIENT_CERTIFICATE_PATH (opcionalmente) AZURE_CLIENT_CERTIFICATE_PASSWORD.
  2. 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 sua ID de cliente no managed_identity_client_id parâmetro.
  3. Verifique a AZURE_CLIENT_ID variável de ambiente para a ID do cliente de uma identidade gerenciada atribuída pelo usuário.
  4. Use a identidade gerenciada atribuída pelo sistema para o recurso do Azure se ele estiver habilitado.

Você pode excluir identidades gerenciadas da credencial definindo o exclude_managed_identity_credential parâmetro Truede palavra-chave .

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 DefaultAzureCredentialo .

Primeiro, adicione o azure.identity pacote 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ê desejará:

  1. Importe a DefaultAzureCredential classe do azure.identity módulo.
  2. Crie um objeto DefaultAzureCredential.
  3. Passe o DefaultAzureCredential objeto para o construtor de objeto 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 de 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 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 do 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.