Авторизация в библиотеках пакета SDK Azure для Python

Авторизация в Azure определяет, какие действия могут выполнять пользователи или службы, прошедшие проверку подлинности, в ресурсах. В этой статье описывается, как реализовать авторизацию с помощью пакета SDK Azure для Python, охватывающих модели, реализацию, устранение неполадок и рекомендации. Подробные сведения о настройке проверки подлинности см. в статье "Проверка подлинности приложений Python в Azure".

Введение

Проверка подлинности (AuthN) проверяет удостоверение пользователя или службы, а авторизация (AuthZ) определяет, что они могут сделать. В Azure авторизация обеспечивает безопасный доступ к ресурсам, критически важный для защиты приложений и данных. Разработчики могут реализовать надежную авторизацию с помощью пакета SDK Azure для Python для управления доступом в различных рабочих процессах, от управления ресурсами до доступа к данным конкретной службы.

Модели авторизации Azure

Azure предоставляет несколько механизмов авторизации для управления доступом. Понимание этих моделей важно для эффективного управления доступом.

Управление доступом на основе ролей в Azure

Azure управление доступом на основе ролей (RBAC) назначает роли идентификациям в таких областях, как подписки или группы ресурсов. Предопределенные роли включают владельца, соавтора и читателя, а пользовательские роли разрешают настраиваемые разрешения. При назначении роли в определенной области, идентификатор (например, пользователь или служба) получает права доступа ко всем ресурсам этой области и её дочерних областей. Например, назначение роли участника на уровне подписки позволяет управлять всеми ресурсами в этой подписке. Ознакомьтесь с областью действия Azure RBAC.

Механизмы для конкретной службы

Некоторые службы Azure предлагают уникальные методы авторизации:

  • Служба хранилища Azure: использует подписанные URL-адреса (SAS) и списки управления доступом (ACL) для доступа к данным. См заметки об авторизации для определённых служб для служба хранилища Azure.
  • Azure Key Vault. Рекомендуется использовать RBAC для устаревших политик доступа. См. заметки об авторизации, относящиеся к конкретным сервисам для Azure Key Vault.
  • Microsoft Graph: использует права доступа OAuth 2.0 и разрешения приложения. См. специальные примечания по авторизации для Microsoft Graph.

Использование авторизации в пакете SDK Azure для Python

Пакет SDK Azure для Python обеспечивает встроенную поддержку обработки проверки подлинности и авторизации с помощью azure-identity пакета. Класс DefaultAzureCredential поддерживает различные механизмы проверки подлинности, такие как управляемые идентификации и служебные принципы, адаптируясь к различным средам.

Пример. Перечисление групп ресурсов

В этом примере показано, как пакет SDK Azure для Python использует учетные данные (через DefaultAzureCredential) для проверки подлинности и как авторизация определяет, может ли удостоверение успешно перечислять группы ресурсов. Если учетная запись не имеет роли Читателя или более высокой роли в рамках подписки или группы ресурсов, этот вызов вызывает ошибку "403 Запрещено".

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)

Замените <subscription-id> идентификатором подписки Azure, который обычно находится в форме 00000000-0000-0000-0000-000000000000.

Microsoft Graph с областями

Чтобы получить доступ к Microsoft Graph, используйте официальный пакет SDK Microsoft Graph для Python, который поддерживает как делегированные, так и разрешения приложения.

В этом примере показано, как SDK использует учетные данные для запроса токена доступа с требуемой областью авторизации https://graph.microsoft.com/.default и получения доступа к ресурсам Microsoft Graph. Удостоверение должно быть авторизовано в идентификаторе Microsoft Entra с соответствующими разрешениями приложения (например User.Read.All, для получения данных пользователя; в противном случае запрос завершается ошибкой 403 Запрещено).

Это важно

Убедитесь, что ваше приложение или удостоверение имеет User.Read.All или другие требуемые разрешения, предоставленные в 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"])

Дополнительные сведения об этом пакете SDK см. в официальном руководстве по созданию приложений Python с помощью Microsoft Graph .

Диагностика ошибок авторизации

Проблемы с авторизацией часто вызывают ошибки HTTP 403 "Запрещено", которые указывают на недостаточно разрешений. Чтобы диагностировать эти проблемы, выполните следующие действия.

  • Проверьте сообщения об ошибках: просмотрите ответ на сведения о отсутствующих разрешениях.

  • Включение ведения журнала: используйте Python ведение журнала для проверки запросов и ответов.

    import logging
    logging.basicConfig(level=logging.DEBUG)
    
  • Проверка доступа. Используйте Azure CLI или портал Azure для проверки назначений ролей.

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

    Замените <principal-id> объектным идентификатором пользователя, служебного принципала или управляемого удостоверения. Замените <scope> областью ресурсов Azure, например идентификатор подписки, имя группы ресурсов или ресурс. См. статью "Работа с областями".

Работа с областями

Часто необходимо указать область, например в следующем примере:

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

Ниже приведены некоторые распространенные форматы области применения:

Уровень области Пример значения
Subscription /subscriptions/<subscription-id>
Группа ресурсов /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>
Имя ресурса /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/<provider-namespace>/<resource-type>/<resource-name>

Например, чтобы перечислить все назначения ролей для управляемого удостоверения на уровне группы ресурсов:

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

Или на уровне подписки:

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

Чтобы получить идентификатор объекта (<principal-id>) пользователя или управляемого удостоверения, используйте следующую команду:

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

Управление доступом

Управляйте доступом, используя назначения ролей:

  • Портал Azure: добавьте роли через меню службы Управление доступом (IAM).

  • Azure CLI:

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

    Замените <principal-id> объектным идентификатором пользователя, служебного принципала или управляемого удостоверения. Замените <scope> областью ресурсов Azure, например идентификатор подписки, имя группы ресурсов или имя ресурса. См. статью "Работа с областями".

  • Шаблоны ARM: используйте для декларативного управления.

Для управляемой идентификации наделите роли идентификациям, связанным с ресурсами, такими как виртуальные машины. Используйте функцию проверки доступа на портале Azure или Azure CLI, чтобы проверить действующие разрешения.

Заметки о авторизации для конкретной службы

В разделе "Механизмы, относящиеся к службе", вы узнали, что некоторые службы Azure предлагают уникальные методы авторизации. В этом разделе приведены дополнительные сведения для каждого из трех упомянутых служб Azure.

служба хранилища Azure

  • RBAC: управляет операциями плоскости управления.
  • SAS и списки управления доступом (ACL): поддержка доступа к каналу передачи данных с поддержкой проверки подлинности Microsoft Entra.

Пример. Доступ к BLOB-объектам с помощью идентификатора Microsoft Entra

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)

Замените <account-name> имя учетной записи хранения Azure.

Azure Key Vault

Используйте RBAC вместо устаревших политик доступа для согласованности. Политики доступа по-прежнему поддерживаются, но не предпочтительны.

Пример. Получение секрета

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)

Замените <vault-name> на имя вашего ресурса Key Vault.

Microsoft Graph

Использует области OAuth 2.0 для делегированных разрешений и разрешений приложений для приложений управляющей программы. Укажите области применения, как показано в предыдущем примере.

Лучшие практики

  • Принцип наименьших привилегий: назначайте только необходимые права, например роль Reader вместо Contributor.
  • Предпочитайте RBAC: особенно для Key Vault для единого управления доступом.
  • Используйте управляемые удостоверения: избегайте управления учетными данными в коде.
  • Ограничение разрешений Graph: запрос конкретных областей, чтобы свести к минимуму риски.

Дальнейшие шаги