#python #azure #azure-active-directory #azure-keyvault #azure-sdk
#python #azure #azure-active-directory #azure-keyvault #azure-sdk
Вопрос:
Для базы кода Python я хотел бы, чтобы разработчики получали доступ к секретам приложений с помощью Azure Key Vault, исходя из того, что при развертывании приложение также должно иметь возможность подключаться. Следовательно, я думаю об Active Directory.
Однако я не могу найти в Интернете никаких примеров, которые показывают это с помощью Python SDK. Первоначально я бы подумал о получении пользователя CLI:
from azure.common.credentials import get_azure_cli_credentials
credentials, subscription_id, tenant_id = get_azure_cli_credentials(with_tenant=True)
а затем используйте этот полученный набор учетных данных для доступа к хранилищу ключей:
from azure.keyvault import KeyVaultClient
vault_url = "https://########.vault.azure.net/"
secret_name = "########"
secret_version = "########"
client = KeyVaultClient(credentials)
secret = client.get_secret(vault_url, secret_name, secret_version)
print(secret)
Однако я получаю сообщение об ошибке, которое:
azure.keyvault.v7_0.models.key_vault_error_py3.KeyVaultErrorException: Operation returned an invalid status code 'Unauthorized'
Я могу подтвердить это credentials
, subscription_id
и tenant_id
они верны, и что с помощью CLI я могу успешно получить секретное содержимое. Так что это должна быть какая-то специфичная для Python SDK вещь.
Есть идеи?
Ответ №1:
Похоже, это ошибка в Python SDK.
https://github.com/Azure/azure-sdk-for-python/issues/5096
Вы можете использовать свое собственное имя пользователя и пароль AD с классом UserPassCredentials. Это не зарегистрированный пользователь, но, вероятно, он настолько близок, насколько вы можете себе представить.
НАПРИМЕР:
from azure.common.credentials import UserPassCredentials
credentials = UserPassCredentials('username','password')
client = KeyVaultClient(credentials)
secret = client.get_secret(vault_url, secret_name, secret_version)
print(secret)
Ответ №2:
Я попробовал то же самое и получил другую ошибку («… аудитория недопустима …»), пока я не изменил ваш первый вызов функции, добавив параметр ресурса:
credentials, subscription_id, tenant_id =
get_azure_cli_credentials(resource='https://vault.azure.net', with_tenant=True)
Благодаря этому изменению я смог получить доступ к секретам, используя тот же код, который вы показываете.
Ответ №3:
Как насчет этого фрагмента кода? Сравнивая ваш код с примером, я не вижу, где вы устанавливаете client_id или клиента.
Комментарии:
1. Этот фрагмент используется
ServicePrincipalCredentials
для авторизации, которую я надеялся обойти, используя, что разработчик уже вошел в систему с учетными данными Azure. Следовательно, учетные данные загружаются из командной строки Azure сget_azure_cli_credentials
помощью .
Ответ №4:
Вам нужно будет настроить политику доступа к хранилищу ключей, чтобы разрешить аутентифицированному пользователю доступ к секретным данным. Это можно сделать на портале. Имейте в виду, что хранилище ключей имеет верхний предел в 16 определений доступа, поэтому вы, вероятно, захотите предоставить доступ к группе и добавить своих пользователей в эту группу.
Комментарии:
1. Это уже установлено. У пользователя есть доступ. А также, как я уже говорил, если я пройду через Azure CLI, я смогу успешно получить секреты, но пройдя через Python SDK (с учетными данными CLI) Я не могу.
Ответ №5:
Как указал @8forty, добавление resource='https://vault.azure.net'
параметра к вашему get_azure_cli_credentials
вызову решит проблему.
Однако существуют новые пакеты для работы с хранилищем ключей в Python, которые заменяют azure-keyvault
:
- azure-keyvault-сертификаты (Руководство по миграции)
- azure-keyvault-keys (Руководство по миграции)
- azure-keyvault-secrets (Руководство по миграции)
azure-identity также является пакетом, который следует использовать с ними для аутентификации.
Если вы хотите аутентифицировать своего клиента Key Vault с помощью учетных данных зарегистрированного пользователя командной строки, вы можете использовать AzureCliCredential
класс:
from azure.identity import AzureCliCredential
from azure.keyvault.secrets import SecretClient
credential = AzureCliCredential()
vault_url = "https://{vault-name}.vault.azure.net"
secret_name = "secret-name"
client = SecretClient(vault_url, credential)
secret = client.get_secret(secret_name)
print(secret.value)
(Я работаю над Azure SDK на Python)