Использование хранилища ключей Azure и Active Directory для извлечения секретов

#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-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)