Проверка подлинности в ресурсах 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": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
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 00001111-aaaa-2222-bbbb-3333cccc4444
чтения, записи и удаления доступа к контейнерам больших двоичных объектов и данным служба хранилища Azure во всех учетных записях хранения в группе ресурсов msdocs-python-sdk-sdk-auth-example в подписке с идентификаторомaaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, вы назначите субъекту-службе приложения роль участника данных BLOB-объектов хранилища с помощью следующей команды.
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"
Сведения о назначении разрешений на уровне ресурса или подписки с помощью Azure CLI см. в статье "Назначение ролей Azure с помощью Azure CLI".
3. Настройка переменных среды для приложения
Необходимо задать AZURE_CLIENT_ID
AZURE_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 в приложении, вам потребуется:
DefaultAzureCredential
Импортируйте класс изazure.identity
модуля.- Создание объекта
DefaultAzureCredential
. - Передайте объект конструктору
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_ID
AZURE_TENANT_ID
среды и AZURE_CLIENT_SECRET
сведения субъекта-службы приложения для подключения к Azure.