Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os desenvolvedores geralmente precisam executar e testar seus aplicativos localmente ao criar aplicativos de nuvem. Mesmo durante o desenvolvimento local, o aplicativo deve se autenticar em todos os serviços do Azure com os quais interage. Este artigo explica como configurar identidades de entidades de serviço dedicadas especificamente para uso durante o desenvolvimento local.
As entidades de serviço de aplicativo dedicadas para desenvolvimento local seguem o princípio do privilégio mínimo. Eles concedem acesso somente aos recursos do Azure de que o aplicativo precisa durante o desenvolvimento. Esse acesso limitado reduz o risco de atingir involuntariamente outros recursos. Ele também ajuda a evitar bugs relacionados à permissão ao migrar para a produção, em que permissões mais amplas podem causar problemas.
Ao registrar aplicativos para desenvolvimento local no Azure:
- Crie registros de aplicativo separados para cada desenvolvedor: essa abordagem fornece a cada desenvolvedor sua própria entidade de serviço, evitando a necessidade de compartilhar credenciais e habilitando um controle de acesso mais granular.
- Crie registros de aplicativo separados para cada aplicativo: essa abordagem garante que cada aplicativo tenha apenas as permissões necessárias, reduzindo a superfície de ataque potencial.
Para habilitar a autenticação durante o desenvolvimento local, defina variáveis de ambiente com as credenciais da entidade de serviço de aplicativo. O SDK do Azure para Python detecta essas variáveis e as usa para autenticar solicitações nos serviços do Azure.
Registrar o aplicativo no Azure
Os objetos de principal de serviço de aplicativo são criados quando você registra um aplicativo no Azure. Esse registro pode ser executado usando o portal do Azure ou a CLI do Azure. O processo de registro cria um registro de aplicativo no Microsoft Entra ID e gera um objeto principal de serviço para o aplicativo. O objeto do principal de serviço é usado para autenticar o aplicativo aos serviços do Azure.
O processo de registro do aplicativo também gera um segredo do cliente (senha) para o aplicativo. Esse segredo é usado para autenticar o aplicativo nos serviços do Azure. O segredo do cliente nunca é armazenado no controle do código-fonte, mas sim em um .env arquivo no diretório do aplicativo. Em runtime, o aplicativo lê o .env arquivo e define variáveis de ambiente que o SDK do Azure para Python usa para autenticar o aplicativo.
As etapas a seguir mostram como registrar um aplicativo no Azure e criar uma entidade de serviço para o aplicativo. As etapas são mostradas para a CLI do Azure e o portal 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.
Primeiro, use o comando az ad sp create-for-rbac para criar uma nova entidade de serviço para o aplicativo. O comando também cria o registro do aplicativo para o aplicativo ao mesmo tempo.
SERVICE_PRINCIPAL_NAME=<service-principal-name>
az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME
A saída desse comando é semelhante à seguinte. Anote esses valores ou mantenha essa janela aberta, já que você precisará desses valores nas próximas etapas e não poderá exibir o valor da senha (segredo do cliente) novamente. No entanto, você pode adicionar uma nova senha mais tarde, sem invalidar a entidade de serviço ou as senhas existentes, se necessário.
{
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "<service-principal-name>",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
Em seguida, você precisa obter o appID valor e armazená-lo em uma variável. Esse valor é usado para definir variáveis de ambiente em seu ambiente de desenvolvimento local para que o SDK do Azure para Python possa se autenticar no Azure usando a entidade de serviço.
APP_ID=$(az ad sp list \
--all \
--query "[?displayName=='$SERVICE_PRINCIPAL_NAME'].appId | [0]" \
--output tsv)
Criar um grupo de segurança do Microsoft Entra para desenvolvimento local
Como vários desenvolvedores geralmente trabalham no mesmo aplicativo, é melhor gerenciar permissões por meio de um grupo de segurança do Microsoft Entra. Crie um grupo de segurança que contenha as funções de que o aplicativo precisa para desenvolvimento local, em vez de atribuir funções à entidade de serviço de cada desenvolvedor individualmente. O uso de um grupo de segurança 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, um novo principal de serviço de aplicativo será criado para o desenvolvedor e adicionado ao grupo, garantindo que o desenvolvedor tenha as permissões corretas para trabalhar no aplicativo.
O comando az ad group create é usado para criar grupos de segurança no ID do Microsoft Entra. 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.
GROUP_DISPLAY_NAME="<group-name>"
GROUP_MAIL_NICKNAME="<group-mail-nickname>"
GROUP_DESCRIPTION="<group-description>"
az ad group create \
--display-name $GROUP_DISPLAY_NAME \
--mail-nickname $GROUP_MAIL_NICKNAME \
--description $GROUP_DESCRIPTION
Para adicionar membros ao grupo, você precisará da ID do objeto da entidade de serviço do aplicativo, que é diferente da ID do aplicativo. Use az ad sp list 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, conforme mostrado. O --query parâmetro limita as colunas apenas às que você está interessado.
SP_OBJECT_ID=$(az ad sp list \
--filter "startswith(displayName,'$GROUP_DISPLAY_NAME')" \
--query "[0].id" \
--output tsv)
O comando az ad group member add pode ser usado para adicionar membros a grupos.
az ad group member add \
--group $GROUP_DISPLAY_NAME \
--member-id $SP_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.
Atribuir funções ao aplicativo
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 são atribuídas ao grupo do Microsoft Entra criado na etapa 2. 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.
Use o az role assignment create comando para atribuir uma função a um usuário, grupo ou entidade de serviço de aplicativo. Você pode especificar um grupo com o ID de objeto. Você pode especificar uma entidade de serviço de aplicativo com seu appId.
RESOURCE_GROUP_NAME=<resource-group-name>
SUBSCRIPTION_ID=$(az account show --query id --output tsv)
ROLE_NAME=<role-name>
az role assignment create \
--assignee "$APP_ID" \
--scope "./subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME" \
--role "$ROLE_NAME"
![!OBSERVAÇÃO] Para impedir que o Git Bash trate /subscriptions/... como um caminho de arquivo, adicione no início ./ à string do parâmetro
scopee use aspas duplas em toda a string.
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 a entidade de serviço do aplicativo com o appId de 00001111-aaaa-2222-bbbb-3333cccc4444 tenha acesso de leitura, gravação e exclusão aos contêineres de blob do Azure Storage e aos dados em todas as contas de armazenamento no grupo de recursos msdocs-python-sdk-auth-example na assinatura com ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e, você deve atribuir a entidade de serviço do aplicativo à função de Colaborador de Dados de Blob de Armazenamento usando o seguinte comando.
az role assignment create --assignee 00001111-aaaa-2222-bbbb-3333cccc4444 \
--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.
Definir variáveis de ambiente de desenvolvimento local
O DefaultAzureCredential objeto procura as informações do principal de serviço em um conjunto de variáveis de ambiente em tempo de execução. Como a maioria dos desenvolvedores trabalha em vários aplicativos, use um pacote como python-dotenv para acessar o ambiente de um arquivo .env armazenado no diretório do aplicativo durante o desenvolvimento. Essa configuração define o escopo das variáveis de ambiente para que somente esse aplicativo possa usá-las para autenticar no Azure.
O arquivo .env nunca é verificado no controle do código-fonte, pois contém a chave secreta do aplicativo para o Azure. O arquivo .gitignore padrão para Python exclui automaticamente o arquivo .env do check-in.
Para usar o pacote python-dotenv, primeiro instale o pacote em seu aplicativo.
pip install python-dotenv
Em seguida, crie um arquivo .env no diretório raiz do aplicativo. Defina os valores da variável de ambiente com os valores obtidos do processo de registro do aplicativo da seguinte maneira:
-
AZURE_CLIENT_ID→ O valor da ID do aplicativo. -
AZURE_TENANT_ID→ O valor da ID do locatário. -
AZURE_CLIENT_SECRET→ A senha/credencial gerada para o aplicativo.
AZURE_CLIENT_ID=00001111-aaaa-2222-bbbb-3333cccc4444
AZURE_TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee
AZURE_CLIENT_SECRET=Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6
Por fim, no código de inicialização do aplicativo, use a biblioteca python-dotenv para ler as variáveis de ambiente do arquivo .env na inicialização.
from dotenv import load_dotenv
if ( os.environ['ENVIRONMENT'] == 'development'):
print("Loading environment variables from .env file")
load_dotenv(".env")
Implementar DefaultAzureCredential em 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 detecta que as variáveis de ambiente AZURE_CLIENT_ID, AZURE_TENANT_ID e AZURE_CLIENT_SECRET estão definidas e lê essas variáveis para obter as informações do principal de serviço de aplicativo com as quais se conectar ao 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:
- Importar a classe
DefaultAzureCredentialdo móduloazure.identity. - Crie um objeto
DefaultAzureCredential. - Passar o objeto
DefaultAzureCredentialpara o construtor do objeto do cliente do SDK do Azure.
Um exemplo disso é 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)