Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Ao criar aplicativos na nuvem, os desenvolvedores geralmente precisam executar e testar seus aplicativos localmente. Mesmo durante o desenvolvimento local, o aplicativo deve autenticar-se em todos os serviços do Azure com os quais interage. Este artigo explica como configurar identidades de entidade de serviço dedicadas especificamente para uso durante o desenvolvimento local.
Entidades de serviço de aplicativo dedicadas para desenvolvimento local dão suporte ao princípio de menor privilégio, limitando o acesso apenas aos recursos do Azure exigidos pelo aplicativo durante o desenvolvimento. O uso de uma entidade de serviço de aplicativo dedicada reduz o risco de acesso não intencional a outros recursos e ajuda a evitar bugs relacionados a permissões durante a transição para a produção, onde permissões mais amplas podem levar a problemas.
Ao registrar aplicativos para desenvolvimento local no Azure, é recomendado:
- Crie registros de aplicativos separados para cada desenvolvedor: isso fornece a cada desenvolvedor sua própria entidade de serviço, evitando a necessidade de compartilhar credenciais e permitindo um controle de acesso mais granular.
- Crie registros de aplicativos separados para cada aplicativo: isso 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 do aplicativo. O SDK do Azure para Python deteta essas variáveis e as usa para autenticar solicitações para serviços do Azure.
1 - Registar a aplicação no Azure
Os objetos principais do 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 (anteriormente Azure Ative Directory) e gera um objeto principal de serviço para o aplicativo. O objeto principal de serviço é usado para autenticar o aplicativo nos 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. O .env
arquivo é lido pelo aplicativo em tempo de execução para definir 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.
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.
Primeiro, use o comando az ad sp create-for-rbac para criar um novo principal de serviço para o aplicativo. O comando também cria o registo da aplicação ao mesmo tempo.
SERVICE_PRINCIPAL_NAME=<service-principal-name>
az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME
A saída deste comando é semelhante à seguinte. Anote esses valores ou mantenha essa janela aberta, pois você precisará desses valores nas próximas etapas e não poderá visualizar 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)
2 - Criar um grupo de segurança Microsoft Entra para desenvolvimento local
Como normalmente há vários desenvolvedores que trabalham em um aplicativo, é recomendável criar um grupo de segurança do Microsoft Entra para encapsular as funções (permissões) de que o aplicativo precisa no desenvolvimento local, em vez de atribuir as funções a objetos de entidade de serviço individuais. Isto 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 programador se juntar à equipa, um novo principal de serviço de aplicação é criado para o programador e adicionado ao grupo, assegurando que o programador tenha as permissões adequadas para trabalhar na aplicação.
O comando az ad group create é usado para criar grupos de segurança 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.
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ê precisa da ID do objeto da entidade de serviço do aplicativo, que é diferente da ID do aplicativo. Utilize o az ad sp list 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 conforme mostrado. O --query
parâmetro limita as colunas apenas às de interesse.
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
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 Gerir grupos do Microsoft Entra e associação a grupos.
3 - Atribuir funções à aplicação
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 são atribuídas ao grupo Microsoft Entra criado na etapa 2. 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 utilizador, grupo ou principal de serviço de aplicativo é atribuído a um papel no Azure usando o comando az role assignment create. Você pode especificar um grupo com sua ID de objeto. Você pode especificar um principal de serviço de aplicativo com o 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"
![!NOTA] Para impedir que o Git Bash trate /subscriptions/... como um caminho de arquivo, adicione ./ à string do parâmetro
scope
e use aspas duplas ao redor de 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 o principal de serviço de aplicação com o appId de 00001111-aaaa-2222-bbbb-3333cccc4444
tenha acesso de leitura, gravação e exclusão aos contêineres e dados de blob do Armazenamento do Azure em todas as contas de armazenamento no grupo de recursos msdocs-python-sdk-auth-example na subscrição com o ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, você atribuiria o principal de serviço de aplicação ao papel de Colaborador de Dados de Blob do Armazenamento usando o comando a seguir.
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.
4 - Definir variáveis de ambiente de desenvolvimento local
O DefaultAzureCredential
objeto procurará as informações do principal do serviço num conjunto de variáveis de ambiente em tempo de execução. Como a maioria dos desenvolvedores trabalha em vários aplicativos, é recomendável usar um pacote como python-dotenv para acessar o ambiente a partir de um .env
arquivo armazenado no diretório do aplicativo durante o desenvolvimento. Isso define o escopo das variáveis de ambiente usadas para autenticar o aplicativo no Azure de modo que elas só possam ser usadas por esse aplicativo.
O .env
arquivo nunca é verificado no controle do código-fonte, pois contém a chave secreta do aplicativo para o Azure. O ficheiro .gitignore padrão para Python exclui automaticamente o ficheiro .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 .env
arquivo no diretório raiz do aplicativo. Defina os valores das variáveis 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 de 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
Finalmente, no código de inicialização do seu aplicativo, use a python-dotenv
biblioteca para ler as variáveis de ambiente do .env
arquivo na inicialização.
from dotenv import load_dotenv
if ( os.environ['ENVIRONMENT'] == 'development'):
print("Loading environment variables from .env file")
load_dotenv(".env")
5 - Implementar DefaultAzureCredential em seu aplicativo
Para autenticar objetos cliente do Azure SDK no Azure, a sua aplicação deve usar a classe DefaultAzureCredential
azure.identity
do pacote. Nesse cenário, DefaultAzureCredential
detetará se as variáveis de ambiente AZURE_CLIENT_ID
, AZURE_TENANT_ID
e AZURE_CLIENT_SECRET
estão definidas e lerá essas variáveis para obter as informações do principal de serviço da aplicação, 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 de cliente do SDK do Azure em seu aplicativo, você deseja:
- Importe a
DefaultAzureCredential
classe doazure.identity
módulo. - Crie um
DefaultAzureCredential
objeto. - Passe o
DefaultAzureCredential
objeto para o construtor de objeto de 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)