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-keyvault-certificates (руководство по миграции)
- azure-keyvault-keys (руководство по миграции)
- azure-keyvault-secrets (руководство по миграции)
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)