Проверка подлинности в ресурсах Azure из приложений Python, размещенных в локальной среде

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

Для каждой среды необходимо создать другую регистрацию приложения, в которой размещено приложение. Это позволяет настроить разрешения конкретного ресурса среды для каждого субъекта-службы и убедиться, что приложение, развернутое в одной среде, не разговаривает с ресурсами Azure, которые являются частью другой среды.

1. Регистрация приложения в Azure

Приложение можно зарегистрировать в Azure с помощью портал Azure или Azure CLI.

az ad sp create-for-rbac --name <app-name>

Выходные данные команды будут похожи на следующие. Запишите эти значения или оставьте это окно открытым, так как вам потребуется эти значения в следующих шагах и не сможете снова просмотреть значение пароля (секрет клиента).

{
  "appId": "00000000-0000-0000-0000-000000000000",
  "displayName": "msdocs-python-sdk-auth-prod",
  "password": "abcdefghijklmnopqrstuvwxyz",
  "tenant": "33333333-3333-3333-3333-333333333333"
}

2. Назначение ролей субъекту-службе приложений

Затем необходимо определить, какие роли (разрешения) приложения требуются для ресурсов и назначить эти роли приложению. Роли можно назначить в ресурсе, группе ресурсов или подписке область. В этом примере показано, как назначать роли для субъекта-службы в группе ресурсов область так как большинство приложений группировать все ресурсы Azure в одну группу ресурсов.

Субъект-служба назначает роль в Azure с помощью команды az role assignment create .

az role assignment create --assignee {appId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

Чтобы получить имена ролей, которым может быть назначен субъект-служба, используйте команду az role definition list .

az role definition list \
    --query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
    --output table

Например, чтобы разрешить субъект-службу с идентификатором ресурсов appId 00000000-0000-0000-0000-000000000000 для чтения, записи и удаления доступа к контейнерам BLOB-объектов служба хранилища Azure и данным во всех учетных записях хранения в группе ресурсов msdocs-python-sdk-auth в подписке с идентификатором11111111-1111-1111-1111-111111111111, вы назначите субъекту-службе приложения участнику данных служба хранилища BLOB-объектов. роль с помощью следующей команды.

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"

Сведения о назначении разрешений на уровне ресурса или подписки с помощью Azure CLI см. в статье "Назначение ролей Azure с помощью Azure CLI".

3. Настройка переменных среды для приложения

Необходимо задать AZURE_CLIENT_IDAZURE_TENANT_IDпеременные среды и AZURE_CLIENT_SECRET переменные среды для процесса, запускающего приложение Python, чтобы сделать учетные данные субъекта-службы приложения доступными для приложения во время выполнения. Объект DefaultAzureCredential ищет сведения субъекта-службы в этих переменных среды.

При использовании Gunicorn для запуска веб-приложений Python в среде сервера UNIX переменные среды для приложения можно указать с помощью EnvironmentFile директивы в gunicorn.server файле, как показано ниже.

[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

Файл, указанный в директиве EnvironmentFile , должен содержать список переменных среды со значениями, как показано ниже.

AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>

4. Реализация DefaultAzureCredential в приложении

Для проверки подлинности клиентских объектов Пакета SDK Azure в Azure приложение должно использовать DefaultAzureCredential класс из azure.identity пакета.

Начните с добавления пакета azure.identity в приложение.

pip install azure-identity

Затем для любого кода Python, создающего клиентский объект Azure SDK в приложении, вам потребуется:

  1. DefaultAzureCredential Импортируйте класс из azure.identity модуля.
  2. Создание объекта DefaultAzureCredential.
  3. Передайте объект конструктору DefaultAzureCredential клиентского объекта пакета SDK Azure.

Пример этого показан в следующем сегменте кода.

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)

Когда приведенный выше код создает экземпляр DefaultAzureCredential объекта, DefaultAzureCredential считывает переменные AZURE_CLIENT_IDAZURE_TENANT_IDсреды и AZURE_CLIENT_SECRET сведения субъекта-службы приложения для подключения к Azure.