Autenticar aplicativos Python nos serviços do Azure durante o desenvolvimento local usando contas de desenvolvedor

Quando os desenvolvedores criam aplicativos na nuvem, eles normalmente depuram e testam aplicativos em sua estação de trabalho local. Quando um aplicativo é executado na estação de trabalho de um desenvolvedor durante o desenvolvimento local, ele ainda deve se autenticar em todos os serviços do Azure usados pelo aplicativo. Este artigo aborda como usar as credenciais do Azure de um desenvolvedor para autenticar o aplicativo no Azure durante o desenvolvimento local.

Um diagrama mostrando como um aplicativo Python durante o desenvolvimento local usa as credenciais de desenvolvedores para se conectar ao Azure obtendo essas credenciais de ferramentas de desenvolvimento instaladas localmente.

Para que um aplicativo se autentique no Azure durante o desenvolvimento local usando as credenciais do Azure do desenvolvedor, um desenvolvedor deve estar conectado ao Azure a partir da CLI do Azure, do Azure PowerShell ou da CLI do Desenvolvedor do Azure. O SDK do Azure para Python é capaz de detetar que o desenvolvedor está conectado a partir de uma dessas ferramentas e, em seguida, obter as credenciais necessárias do cache de credenciais para autenticar o aplicativo no Azure como o usuário conectado.

Essa abordagem é mais fácil de configurar para uma equipe de desenvolvimento, pois aproveita as contas existentes do Azure dos desenvolvedores. No entanto, a conta de um desenvolvedor provavelmente terá mais permissões do que as exigidas pelo aplicativo, excedendo assim as permissões com as quais o aplicativo será executado em produção. Como alternativa, você pode criar entidades de serviço de aplicativo para usar durante o desenvolvimento local, que podem ter escopo para ter apenas o acesso necessário para o aplicativo.

1 - Criar grupo de segurança Microsoft Entra para desenvolvimento local

Como quase sempre há vários desenvolvedores que trabalham em um aplicativo, é recomendável primeiro criar um grupo de segurança do Microsoft Entra para encapsular as funções (permissões) de que o aplicativo precisa no desenvolvimento local. Esta abordagem oferece as seguintes vantagens.

  • Todos os desenvolvedores têm a garantia de ter as mesmas funções atribuídas, uma vez que as funções são atribuídas no nível do grupo.
  • Se uma nova função for necessária para o aplicativo, ela só precisará ser adicionada ao grupo Microsoft Entra para o aplicativo.
  • Se um novo desenvolvedor se juntar à equipe, ele simplesmente deve ser adicionado ao grupo correto do Microsoft Entra para obter as permissões corretas para trabalhar no aplicativo.

Se você tiver um grupo de segurança do Microsoft Entra existente para sua equipe de desenvolvimento, poderá usar esse grupo. Caso contrário, conclua as etapas a seguir para criar um grupo de segurança do Microsoft Entra.

O comando az ad group create é usado para criar grupos no Microsoft Entra ID. Os parâmetros --display-name e --main-nickname são necessários. O nome dado ao grupo deve ser baseado no nome do aplicativo. Também é útil incluir uma frase como 'local-dev' no nome do grupo para indicar o propósito do grupo.

az ad group create \
    --display-name MyDisplay \
    --mail-nickname MyDisplay  \
    --description "<group-description>"

Copie o id valor da propriedade na saída do comando. Este é o ID do objeto para o grupo. Você precisa dele em etapas posteriores. Você também pode usar o comando az ad group show para recuperar essa propriedade.

Para adicionar membros ao grupo, você precisa da ID do objeto do usuário do Azure. Use a lista de usuários az ad para listar as entidades de serviço disponíveis. O --filter comando parameter aceita filtros de estilo OData e pode ser usado para filtrar a lista no nome de exibição do usuário, conforme mostrado. O --query parâmetro limita a saída a colunas de interesse.

az ad user list \
    --filter "startswith(displayName, 'Bob')" \
    --query "[].{objectId:id, displayName:displayName}" \
    --output table

O comando az ad group member add pode ser usado para adicionar membros a grupos.

az ad group member add \
    --group <group-name> \
    --member-id <object-id>

Nota

Por padrão, a criação de grupos de segurança do Microsoft Entra é limitada a determinadas funções privilegiadas em um diretório. Se não conseguir criar um grupo, contacte um administrador do seu diretório. Se não conseguir adicionar membros a um grupo existente, contacte o proprietário do grupo ou um administrador de diretório. Para saber mais, consulte Gerenciar grupos do Microsoft Entra e associação a grupos.

2 - Atribuir funções ao grupo Microsoft Entra

Em seguida, você precisa determinar quais funções (permissões) seu aplicativo precisa em quais recursos e atribuir essas funções ao seu aplicativo. Neste exemplo, as funções serão atribuídas ao grupo Microsoft Entra criado na etapa 1. As funções podem ser atribuídas 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.

Um usuário, grupo ou entidade de serviço de aplicativo recebe uma função no Azure usando o comando az role assignment create . Você pode especificar um grupo com sua ID de objeto.

az role assignment create --assignee {objectId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

Para obter os nomes de função que podem ser atribuídos, 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 os membros de um grupo com uma ID de objeto de leitura, gravação e exclusão acessem contêineres e 00000000-0000-0000-0000-000000000000 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 função de Colaborador de Dados de Blob de Armazenamento ao grupo usando o comando a seguir.

az role assignment create --assignee 00000000-0000-0000-0000-000000000000 \
    --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 - Entre no Azure usando a CLI do Azure, o Azure PowerShell, a CLI do Azure Developer ou em um navegador

Abra um terminal na estação de trabalho do desenvolvedor e entre no Azure a partir da CLI do Azure.

az login

4 - Implementar DefaultAzureCredential em seu aplicativo

Para autenticar objetos de cliente do SDK do Azure no Azure, seu aplicativo deve usar a DefaultAzureCredentialazure.identity classe do pacote. Nesse cenário, DefaultAzureCredential verificará sequencialmente se o desenvolvedor entrou no Azure usando a CLI do Azure, o Azure PowerShell ou a CLI do desenvolvedor do Azure. Se o desenvolvedor estiver conectado ao Azure usando qualquer uma dessas ferramentas, as credenciais usadas para entrar na ferramenta serão usadas pelo aplicativo para autenticar no Azure.

Comece adicionando o pacote azure.identity 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)