Partilhar via


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.

Nota

Os aplicativos executados no Serviço 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 Kubernetes em tal relação, DefaultAzureCredential autenticará o aplicativo no Azure usando a identidade gerenciada. A autenticação por meio de uma identidade de trabalho é abordada em Usar a Identidade de Carga de Trabalho do Microsoft Entra com o Azure Kubernetes Service. 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 Kubernetes do Azure (AKS).

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": "aaaaaaaa-bbbb-cccc-1111-222222222222",
  "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
  "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 gerida pode ser atribuída a funções num recurso, num grupo de recursos ou no âmbito de uma 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, usa o que tenhas copiado na etapa 1 principalId.

az role assignment create --assignee <managedIdentityprincipalId> \
    --scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> \
    --role "<roleName>" 

Para obter os nomes das funções a que um principal de serviço pode ser atribuído, 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 gerida com o ID aaaaaaaa-bbbb-cccc-1111-222222222222 tenha acesso de leitura, escrita e exclusão a contêineres de blobs de Armazenamento do Azure e dados em todas as contas de armazenamento no grupo de recursos msdocs-python-sdk-auth-example na subscrição com ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e, atribuiria o principal do serviço da aplicação à função de Colaborador de Dados de Blob de Armazenamento com 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 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 de ambiente AZURE_CLIENT_ID, AZURE_TENANT_ID, e ou AZURE_CLIENT_SECRET ou AZURE_CLIENT_CERTIFICATE_PATH e (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 gerida atribuída pelo utilizador especificando o seu ID de cliente no parâmetro managed_identity_client_id.
  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 DefaultAzureCredential.

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 geralvá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 na sua estação de trabalho durante o desenvolvimento local, DefaultAzureCredential usará um principal de serviço da aplicação, conforme determinado pelas configurações do ambiente, ou credenciais de ferramenta de desenvolvedor para autenticar nos 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.