Autenticando aplicativos hospedados no Azure em 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 para que ele possa se conectar a outros recursos do Azure sem a necessidade de usar uma chave secreta ou outro segredo de aplicativo. Internamente, o Azure conhece a identidade do seu aplicativo e a quais recursos ele pode 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 nenhum segredo do aplicativo.

Tipos de identidade gerenciados

Existem dois tipos de identidades geridas:

  • Identidades gerenciadas atribuídas ao 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 ao sistema para esse recurso. Uma identidade gerenciada atribuída ao sistema está vinculada ao ciclo de vida do recurso do Azure ao qual está associada. 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 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 ao 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 - Habilite 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, permitirá que sua VM use a identidade gerenciada.

Você pode habilitar a identidade gerenciada para ser usada para um recurso do Azure usando o portal do Azure ou a CLI do Azure.

Os comandos da CLI do Azure podem ser executados 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 formato az <command-group> identity --resource-group <resource-group-name> --name <resource-name>. Os 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 será semelhante à seguinte.

{
  "principalId": "99999999-9999-9999-9999-999999999999",
  "tenantId": "33333333-3333-3333-3333-333333333333",
  "type": "SystemAssigned",
  "userAssignedIdentities": null
}

O principalId valor é 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 quais funções (permissões) seu aplicativo precisa e atribuir a identidade gerenciada a essas funções no Azure. Uma identidade gerenciada pode receber funções em um recurso, grupo de recursos ou escopo de assinatura. Este exemplo mostra como atribuir funções no escopo do grupo de recursos, já 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 cessionário, use o que você copiou principalId 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 a identidade gerenciada com a ID de leitura, gravação e exclusão de acesso a contêineres e dados de blob de 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 de aplicativo à função de 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, consulte o artigo Atribuir funções do Azure usando a CLI do Azure.

3 - Implementar DefaultAzureCredential em 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 ou AZURE_CLIENT_SECRET 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 managed_identity_client_id cliente no parâmetro.
  3. Verifique a AZURE_CLIENT_ID variável de ambiente para o 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 ao 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 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 de cliente do SDK do Azure em seu aplicativo, você deseja:

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