Autenticar recursos do Azure a partir de aplicativos Python hospedados localmente
Os aplicativos hospedados fora do Azure (por exemplo, no local ou em um data center de terceiros) devem usar uma entidade de serviço de aplicativo para autenticar no Azure ao acessar recursos do Azure. Os objetos da entidade de serviço de aplicativo são criados com um processo de registro de aplicativo no Azure. Quando uma entidade de serviço de aplicativo for criada, uma ID do cliente e um segredo do cliente serão gerados para seu aplicativo. A ID do cliente, o segredo do cliente e a ID do locatário são armazenados em variáveis de ambiente para que possam ser usados pelo SDK do Azure para Python para autenticar seu aplicativo no Azure em tempo de execução.
Um registro de aplicativo diferente deve ser criado para cada ambiente em que o aplicativo está hospedado. Isso permite que permissões de recursos específicos do ambiente sejam configuradas para cada entidade de serviço e garante que um aplicativo implantado em um ambiente não converse com recursos do Azure que fazem parte de outro ambiente.
1 – Registrar o aplicativo no Azure
Um aplicativo pode ser registrado no Azure usando o portal do Azure ou a CLI do Azure.
az ad sp create-for-rbac --name <app-name>
A saída do comando deve ser semelhante à seguinte. Anote esses valores ou mantenha essa janela aberta, pois você precisará desses valores nas próximas etapas e não poderá exibir o valor de senha (segredo do cliente) novamente.
{
"appId": "00000000-0000-0000-0000-000000000000",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "abcdefghijklmnopqrstuvwxyz",
"tenant": "33333333-3333-3333-3333-333333333333"
}
2 – Atribuir funções à entidade de serviço de 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. As funções podem ser atribuídas a uma função em um recurso, grupo de recursos ou escopo de assinatura. Este exemplo mostra como atribuir funções para a entidade de serviço no escopo do grupo de recursos, já que a maioria dos aplicativos agrupa todos os recursos do Azure em um único grupo de recursos.
Uma entidade de serviço recebe uma função no Azure usando o comando az role assignment create.
az role assignment create --assignee {appId} \
--scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
--role "{roleName}"
Para obter os nomes de função aos quais uma entidade de serviço pode ser atribuída, 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 com o appId de leitura, gravação e exclusão tenha acesso a 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 assinatura com ID 11111111-1111-1111-1111-111111111111
, você atribuiria a entidade de 00000000-0000-0000-0000-000000000000
serviço do aplicativo à função Colaborador de Dados do Blob de Armazenamento 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, confira o artigo Atribuir funções do Azure usando a CLI do Azure.
3 – Configurar variáveis de ambiente para o aplicativo
Você deve definir as AZURE_CLIENT_ID
variáveis , AZURE_TENANT_ID
e AZURE_CLIENT_SECRET
de ambiente para o processo que executa seu aplicativo Python para disponibilizar as credenciais da entidade de serviço de aplicativo para seu aplicativo em tempo de execução. O DefaultAzureCredential
objeto procura as informações da entidade de serviço nessas variáveis de ambiente.
Ao usar o Gunicorn para executar aplicativos Web Python em um ambiente de servidor UNIX, as variáveis de ambiente para um aplicativo podem ser especificadas usando a EnvironmentFile
gunicorn.server
diretiva no arquivo, conforme mostrado abaixo.
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=www-user
Group=www-data
WorkingDirectory=/path/to/python-app
EnvironmentFile=/path/to/python-app/py-env/app-environment-variables
ExecStart=/path/to/python-app/py-env/gunicorn --config config.py wsgi:app
[Install]
WantedBy=multi-user.target
O arquivo especificado na EnvironmentFile
diretiva deve conter uma lista de variáveis de ambiente com seus valores, conforme mostrado abaixo.
AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>
4 – Implementar DefaultAzureCredential no aplicativo
Para autenticar objetos de cliente do SDK do Azure no Azure, seu aplicativo deve usar a DefaultAzureCredential
azure.identity
classe do pacote.
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ê desejará:
- Importe a
DefaultAzureCredential
classe doazure.identity
módulo. - Crie um objeto
DefaultAzureCredential
. - Passe o
DefaultAzureCredential
objeto para o construtor de objeto cliente do SDK do Azure.
Um exemplo disso é mostrado na ilustração 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)
Quando o código acima instancia o DefaultAzureCredential
objeto, DefaultAzureCredential
lê as variáveis AZURE_TENANT_ID
de ambiente e AZURE_CLIENT_ID
AZURE_CLIENT_SECRET
as informações da entidade de serviço do aplicativo com as quais se conectar ao Azure.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de