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

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

Um diagrama que mostra como um aplicativo Python durante o desenvolvimento local usa as credenciais dos 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 da CLI do Azure, do Azure PowerShell ou da CLI do Desenvolvedor do Azure. O SDK do Azure para Python consegue detectar que o desenvolvedor está conectado 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 o exigido pelo aplicativo, o que excede 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 o escopo para terem apenas o acesso necessário pelo aplicativo.

1 – Criar grupo de segurança do 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.

  • Cada desenvolvedor deve ter as mesmas funções atribuídas, já 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 do Microsoft Entra para o aplicativo.
  • Se um novo desenvolvedor ingressar na equipe, ele simplesmente deverá ser adicionado ao grupo correto do Microsoft Entra para obter as permissões corretas para trabalhar no aplicativo.

Se houver um grupo de segurança existente do Microsoft Entra para sua equipe de desenvolvimento, você 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 obrigatórios. O nome fornecido ao grupo deve ter como base o nome do aplicativo. Também é interessante incluir uma frase como “desenvolvimento local” no nome do grupo para indicar a finalidade do grupo.

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

Copie o valor da propriedade id na saída do comando. Esse é o ID do objeto do 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 do ID do objeto do usuário do Azure. Use a lista de usuários do az ad para listar as entidades de serviço disponíveis. O comando de parâmetro --filter aceita filtros de estilo OData e pode ser usado para filtrar a lista no nome de exibição do usuário, conforme mostrado. O parâmetro --query limita a saída às 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>

Observação

Por padrão, a criação de grupos de segurança do Microsoft Entra é limitada a determinadas funções com privilégio em um diretório. Se não for possível criar um grupo, entre em contato com um administrador do seu diretório. Se você não puder adicionar membros a um grupo existente, entre em contato com o proprietário do grupo ou com um administrador de diretório. Para saber mais, consulte Gerenciar grupos do Microsoft Entra e associação de grupo.

2 – Atribuir funções ao grupo Microsoft Entra

Em seguida, você precisa determinar as funções (permissões) de que 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 do Microsoft Entra criado na etapa 1. As funções podem ser atribuídas a um recurso, grupo de recursos ou escopo de 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 entidade de serviço de usuário, grupo ou aplicativo recebe uma função no Azure usando o comando az role assignment create. Você pode especificar um grupo com o 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 membros de um grupo com um ID de objeto de 00000000-0000-0000-0000-000000000000 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 11111111-1111-1111-1111-111111111111, você deve atribuir a função de Colaborador de dados de blob de armazenamento ao grupo usando o seguinte comando.

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 – Entrar no Azure usando a CLI do Azure, o Azure PowerShell, a CLI do Desenvolvedor do Azure ou em um navegador

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

az login

4 – Implementar DefaultAzureCredential no seu aplicativo

Para autenticar objetos clientes do SDK do Azure no Azure, seu aplicativo deve usar a classe DefaultAzureCredential do pacote azure.identity. 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 com 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 cliente do SDK do Azure em seu aplicativo, você deverá:

  1. Importar a classe DefaultAzureCredential do módulo azure.identity.
  2. Crie um objeto DefaultAzureCredential.
  3. 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)