Autorização nas bibliotecas SDK do Azure para Python

A autorização no Azure determina que ações os utilizadores ou serviços autenticados podem realizar nos recursos. Este artigo explora como implementar autorização usando o SDK do Azure para Python, abrangendo modelos, implementação, resolução de problemas e boas práticas. Para uma configuração detalhada de autenticação, consulte Autenticar aplicações Python no Azure.

Introdução

A autenticação (AuthN) verifica a identidade de um utilizador ou serviço, enquanto a autorização (AuthZ) define o que podem fazer. No Azure, a autorização garante acesso seguro aos recursos, crítico para proteger aplicações e dados. Os programadores podem implementar autorizações robustas com o SDK do Azure para Python para controlar o acesso em vários fluxos de trabalho, desde a gestão de recursos até ao acesso a dados específicos do serviço.

Modelos de autorização do Azure

O Azure fornece múltiplos mecanismos de autorização para gerir o acesso. Compreender estes modelos é essencial para um controlo eficaz de acessos.

Azure Controlo de Acesso Baseado em Funções

O Azure Role-Based Controlo de Acesso (RBAC) atribui papéis a identidades em ambitos como subscrições ou grupos de recursos. Os papéis incorporados incluem Proprietário, Contribuidor e Leitor, enquanto papéis personalizados permitem permissões personalizadas. Quando atribuis um papel num determinado âmbito, a identidade (como um utilizador ou serviço) recebe permissões para todos os recursos dentro desse âmbito e para os seus subescopos. Por exemplo, atribuir o papel de Contribuinte ao nível da subscrição permite a gestão de todos os recursos dessa subscrição. Veja Compreenda o âmbito do Azure RBAC.

Mecanismos específicos de serviço

Alguns serviços Azure oferecem métodos de autorização únicos:

  • Armazenamento do Azure: Utiliza Assinaturas de Acesso Partilhadas (SAS) e Listas de Controlo de Acesso (ACLs) para acesso aos dados. Consulte Notas de Autorização Específicas ao Serviço para Armazenamento do Azure.
  • Azure Key Vault: Recomenda RBAC em vez de políticas de acesso legadas. Consulte Notas de Autorização Específicas do Serviço sobre Azure Key Vault.
  • Microsoft Graph: Utiliza escopos OAuth 2.0 e permissões de aplicação. Veja Notas de Autorização Específicas do Serviço para Microsoft Graph.

Utilize a autorização no SDK do Azure para Python

O SDK do Azure para Python fornece suporte incorporado para gerir autenticação e autorização através do azure-identity pacote. A DefaultAzureCredential classe suporta vários mecanismos de autenticação, como identidades geridas e princípios de serviço, adaptando-se a diferentes ambientes.

Exemplo: Listar grupos de recursos

Este exemplo mostra como o SDK do Azure para Python usa uma credencial (via DefaultAzureCredential) para autenticar, e como a autorização determina se a identidade consegue listar com sucesso grupos de recursos. Se a identidade não tiver o papel de Leitor ou superior no âmbito da subscrição ou do grupo de recursos, esta chamada retorna um erro 403 Forbidden.

from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient

credential = DefaultAzureCredential()
client = ResourceManagementClient(credential, "<subscription-id>")
resource_groups = client.resource_groups.list()
for rg in resource_groups:
    print(rg.name)

Substitua <subscription-id> pelo seu ID de subscrição Azure, que normalmente está na forma de 00000000-0000-0000-0000-000000000000.

Microsoft Graph com escopos

Para aceder ao Microsoft Graph, utilize o Microsoft Graph SDK oficial para Python, que suporta permissões tanto delegadas como de aplicação.

Este exemplo demonstra como o SDK utiliza uma credencial para solicitar um token de acesso com o âmbito https://graph.microsoft.com/.default de autorização necessário e aceder aos recursos Microsoft Graph. A identidade deve ser autorizada no ID Microsoft Entra com permissões de aplicação apropriadas (como User.Read.All) para recuperar dados do utilizador; caso contrário, o pedido falha com um 403 Proibido.

Importante

Certifique-se de que a sua aplicação ou identidade tem as User.Read.All permissões necessárias concedidas no Microsoft Entra ID.

from azure.identity import DefaultAzureCredential
from msgraph.core import GraphClient

credential = DefaultAzureCredential()
client = GraphClient(credential=credential, scopes=["https://graph.microsoft.com/.default"])

response = client.get("/users")
users = response.json().get("value", [])
for user in users:
    print(user["displayName"])

Saiba mais sobre este SDK no tutorial oficial Build Python apps with Microsoft Graph .

Diagnosticar erros de autorização

Problemas de autorização causam frequentemente erros HTTP 403 Forbidden, que indicam permissões insuficientes. Para diagnosticar estes problemas:

  • Verifique mensagens de erro: Consulte a resposta para detalhes sobre permissões em falta.

  • Ativar registos: Utilize o registo em Python para inspecionar pedidos e respostas.

    import logging
    logging.basicConfig(level=logging.DEBUG)
    
  • Verificar acesso: Use o CLI do Azure ou o portal do Azure para verificar atribuições de funções.

    az role assignment list --assignee <principal-id> --scope <scope>
    

    Substitua <principal-id> pelo ID do objeto do utilizador, da entidade de serviço ou da identidade gerida. Substitua <scope> por um âmbito de recurso Azure, como um ID de subscrição, um nome de grupo de recursos ou um recurso. Consulte Trabalhar com âmbitos.

Trabalho com telescópios

Muitas vezes, é necessário fornecer um âmbito, como no seguinte exemplo:

az role assignment list \
    --assignee <principal-id> \
    --scope <scope>

Aqui estão alguns formatos comuns de mira:

Nível de âmbito Valor de Exemplo
Subscription /subscriptions/<subscription-id>
Grupo de Recursos /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>
Nome do recurso /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/<provider-namespace>/<resource-type>/<resource-name>

Por exemplo, listar todas as atribuições de funções para uma identidade gerida ao nível do grupo de recursos:

az role assignment list \
  --assignee 12345678-90ab-cdef-1234-567890abcdef \
  --scope /subscriptions/<subscription-id>/resourceGroups/my-resource-group

Ou ao nível da assinatura:

az role assignment list \
  --assignee 12345678-90ab-cdef-1234-567890abcdef \
  --scope /subscriptions/<subscription-id>

Para recuperar o ID do objeto (<principal-id>) de um utilizador ou identidade gerida, utilize:

az ad user show --id <user-email> --query id
az identity show --name <identity-name> --resource-group <rg-name> --query principalId

Gerir o acesso

Gerir o acesso através da atribuição de funções utilizando:

  • Portal Azure: Adicionar funções através do menu de serviços de controlo de acesso (IAM).

  • CLI do Azure:

    az role assignment create --assignee <principal-id> --role <role-name> --scope <scope>
    

    Substitua <principal-id> pelo ID do objeto do utilizador, da entidade de serviço ou da identidade gerida. Substitua <scope> por um âmbito de recurso Azure, como um ID de subscrição, um nome de grupo de recursos ou um nome de recurso. Consulte Trabalhar com âmbitos.

  • Modelos ARM: Usar para gestão declarativa.

Para identidades geridas, atribui papéis à identidade associada a recursos como máquinas virtuais. Use a funcionalidade Check Access do portal do Azure ou a CLI do Azure para verificar permissões efetivas.

Notas de autorização específicas de serviço

Na secção Mecanismos específicos de serviço, aprendeu que alguns serviços do Azure oferecem métodos de autorização únicos. Esta secção fornece mais detalhes para cada um dos três serviços Azure mencionados.

Armazenamento do Azure

  • RBAC: Gere as operações do plano de controlo.
  • SAS e ACLs: Controla o acesso ao plano de dados, com autenticação Microsoft Entra também suportada.

Exemplo: Aceder a blobs com o Microsoft Entra ID

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

credential = DefaultAzureCredential()
client = BlobServiceClient(account_url="https://<account-name>.blob.core.windows.net", credential=credential)
containers = client.list_containers()
for container in containers:
    print(container.name)

Substitua <account-name> pelo nome da sua conta Armazenamento do Azure.

Azure Key Vault

Use RBAC em vez de políticas de acesso legadas para maior consistência. As políticas de acesso ainda são suportadas, mas não são preferidas.

Exemplo: Recuperar um segredo

from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

credential = DefaultAzureCredential()
client = SecretClient(vault_url="https://<vault-name>.vault.azure.net", credential=credential)
secret = client.get_secret("my-secret")
print(secret.value)

Substitui <vault-name> pelo nome do teu recurso Key Vault.

Microsoft Graph

Utiliza escopos OAuth 2.0 para permissões delegadas e permissões de aplicação para aplicações daemon. Especifique os escopos como mostrado no exemplo anterior.

Melhores práticas

  • Privilégio mínimo: Atribuir apenas permissões necessárias, como Leitor em vez de Contribuidor.
  • Prefiro RBAC: especialmente para Key Vault, para controlo de acesso unificado.
  • Use Identidades Geridas: Evite gerir credenciais no código.
  • Limitar permissões Graph: Solicitar escopos específicos para minimizar riscos.

Próximos passos