Python Azure SDK: Как получить секреты из keyvault?

Мне нужно извлечь секреты из Keyvault. Это мой код до сих пор:

from azure.mgmt.keyvault import KeyVaultManagementClient
from azure.common.credentials import ServicePrincipalCredentials


subscription_id = 'x'
# See above for details on creating different types of AAD credentials
credentials = ServicePrincipalCredentials(
    client_id = 'x',
    secret = 'x',
    tenant = 'x'
)

kv_client = KeyVaultManagementClient(credentials, subscription_id)

for vault in kv_client.vaults.list():
    print(vault)

Но я получаю эту ошибку:

msrestazure.azure_exceptions.CloudError: Azure Ошибка: AuthorizationFailed Сообщение: клиент "x" с идентификатором объекта "x" не имеет полномочий для выполнения действия "Microsoft.Resources/subscription / resources / read" над областью действия / subscription /x ".

Теперь я могу получить доступ к одному и тому же ключу с теми же учетными данными, используя код C# / POwershell, так что с авторизацией все в порядке. Не уверен, почему он не работает с использованием SDK. Пожалуйста помоги.

5 ответов

Если вы ищете доступ через ServicePrincipalCredentials Например, вы можете просто использовать:

from azure.keyvault import KeyVaultClient, KeyVaultAuthentication
from azure.common.credentials import ServicePrincipalCredentials

credentials = None

def auth_callback(server, resource, scope):
    credentials = ServicePrincipalCredentials(
        client_id = '',
        secret = '',
        tenant = '',
        resource = "https://vault.azure.net"
    )
    token = credentials.token
    return token['token_type'], token['access_token']

client = KeyVaultClient(KeyVaultAuthentication(auth_callback))

secret_bundle = client.get_secret("https://vault_url", "secret_id", "")

print(secret_bundle.value)

Это предполагает, что вы не хотите передавать версию. Если вы это сделаете, вы можете заменить его последним параметром.

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

Я назначил роль " Участник" моему приложению AD в подписке, где предоставляется хранилище ключей, и настроил Политики доступа, чтобы разрешить разрешения GET & LIST для ключа и секрета для приложения AD.

Версии моих пакетов Azure Python, используемых в среде выполнения Python 3.6.2:

  • azure.common (1.1.8)
  • azure.mgmt.keyvault (0,40,0)
  • msrestazure (0.4.13)

Я рекомендую вам попробовать версию Python для среды выполнения и версии пакетов Azure Python, которая проверена на работоспособность.

Приложение:

Если вышеприведенная версия среды выполнения Python, а также пакеты Azure Python также не работают для вас, вам, вероятно, следует подумать о создании новой проблемы в Azure SDK для Python GitHub, поскольку она также работает с теми же учетными данными в Azure .NET SDK. как PowerShell.

Вы также можете получить секрет по имени секрета вместо ID:

secret_bundle = client.get_secret(<VAULT URL>, "<NAME>", "")

Уже есть несколько хороших ответов, но с тех пор Azure SDK выпустил новые пакеты для работы с Key Vault в Python, которые заменяют azure-keyvault:

azure-identity также является пакетом, который следует использовать с ними для проверки подлинности.

Документацию по работе с библиотекой секретов можно найти в репозитории azure-sdk-for-python GitHub , а вот пример получения секретов, как вы делали:

      from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

credential = DefaultAzureCredential()

secret_client = SecretClient(
    vault_url="https://my-key-vault.vault.azure.net/",
    credential=credential
)
secret = secret_client.get_secret("secret-name")

Вы можете предоставить те же учетные данные, которые вы использовали для ServicePrincipalCredentialsустановив переменные окружения, соответствующие client_id, secret, а также tenant:

      export AZURE_CLIENT_ID="client_id"
export AZURE_CLIENT_SECRET="secret"
export AZURE_TENANT_ID="tenant"

(Я работаю над Azure SDK на Python)

Можно использовать приведенный ниже класс из azure.identity, т.е. ClientSecretCredential, найдите приведенный ниже код, например: snippet

      from azure.identity import ClientSecretCredential
from azure.keyvault.secrets import SecretClient

TENANT= <TenantId-in-string>
CLIENT_ID = <ClientId-in-string>
CLIENT_SECRET= <ClientSecret-in-string>
credential = ClientSecretCredential(TENANT,CLIENT_ID,CLIENT_SECRET)
VAULT_URL= <AzureVault-url-in-string>
client = SecretClient(vault_url=VAULT_URL, credential=credential)

print(client)
example_secret = client.get_secret(<secret_name_in_string>)
print(example_secret.value)
Другие вопросы по тегам