Guten Abend! @dz_ Ich bin Kazumi Ohira.
Als ich versuchte, Azure Key Vault mit dem Azure SDK für Python zu verwenden, hatte ich Probleme mit der RBAC-Authentifizierung (Role Based Access Control). Daher war ich wütend und beschäftigte mich mit der Situation.
Nachdem ich die Azure-Anmeldeinformationen berücksichtigt hatte, stellte ich fest, dass sie von einer JSON-Datei im folgenden Format verarbeitet werden können.
Um beispielsweise ein neues RBAC-Zertifikat auszustellen und diese Informationen im obigen JSON-Format auszugeben, [Azure CLI 2.0] unten (https://docs.microsoft.com/en-us/cli/azure/install) -azure-cli "Installieren der Azure CLI 2.0 | Microsoft Docs") Befehle sind verfügbar.
RBAC-Authentifizierungsinformationen mit CLI ausgeben (JSON-Ausgabeoption für SDK)
$ az login
$ az ad sp create-for-rbac --sdk-auth > auth-sample.json
JSON-Beispiel für SDK (zitiert aus dem obigen Dokument)
{
"clientId": "ad735158-65ca-11e7-ba4d-ecb1d756380e",
"clientSecret": "b70bb224-65ca-11e7-810c-ecb1d756380e",
"subscriptionId": "bfc42d3a-65ca-11e7-95cf-ecb1d756380e",
"tenantId": "c81da1d8-65ca-11e7-b1d1-ecb1d756380e",
"activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
"resourceManagerEndpointUrl": "https://management.azure.com/",
"activeDirectoryGraphResourceId": "https://graph.windows.net/",
"sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
"galleryEndpointUrl": "https://gallery.azure.com/",
"managementEndpointUrl": "https://management.core.windows.net/"
}
Wenn Sie den Pfad dieser JOSN-Datei in der Umgebungsvariablen "AZURE_AUTH_LOCATION" festlegen, liest das SDK ihn automatisch.
Und wie Sie dem obigen Link entnehmen können, können Sie in den meisten Fällen einfach einen Client mit "azure.common.client_factory.get_client_from_auth_file" generieren.
Get_client_from_auth_file
kann nicht mit KeyVaultClient
verwendet werden ...Aha!
Ich dachte, dass der Azure Key Vault-Client "KeyVaultClient" mit der oben beschriebenen Methode einfach generiert werden kann, also habe ich es versucht ... Ich kann nicht (´ ・ ω ・ `)
azure-Keyvault-Version
$ pip show azure-keyvault
Name: azure-keyvault
Version: 0.3.5
...
Ein Beispiel, das mit KeyVault Client nicht funktioniert hat
from azure.common.client_factory import get_client_from_auth_file
from azure.keyvault import KeyVaultClient
client = get_client_from_auth_file(KeyVaultClient)
Fehler, wenn der KeyVault-Client nicht funktioniert
Traceback (most recent call last):
File "sample.py", line 26, in <module>
client = get_client_from_auth_file(KeyVaultClient)
File "/usr/local/lib/python2.7/dist-packages/azure/common/client_factory.py", line 192, in get_client_fr
om_auth_file
return get_client_from_json_dict(client_class, config_dict, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/azure/common/client_factory.py", line 132, in get_client_fr
om_json_dict
return _instantiate_client(client_class, **parameters)
File "/usr/local/lib/python2.7/dist-packages/azure/common/client_factory.py", line 31, in _instantiate_c
lient
return client_class(**kwargs)
TypeError: __init__() got an unexpected keyword argument 'base_url'
Ich warf einen Blick auf den Quellcode des SDK und kam schließlich zu diesem Material. Ich konnte diesen Weg gehen! Yay! ヾ (o´∀`o) ノ
Da es eine große Sache ist, habe ich einen Beispielcode geschrieben, der den Pfad von "AZURE_AUTH_LOCATION" unter Bezugnahme auf das Obige verwendet.
sample.py
#!/usr/bin/env python
import json
import os
from azure.keyvault import KeyVaultClient, KeyVaultAuthentication
from azure.common.credentials import ServicePrincipalCredentials
def auth_callback(server, resource, scope):
with open(os.environ.get('AZURE_AUTH_LOCATION')) as auth_file:
auth = json.load(auth_file)
credentials = ServicePrincipalCredentials(
client_id=auth['clientId'],
secret=auth['clientSecret'],
tenant=auth['tenantId'],
resource=resource
)
token = credentials.token
return token['token_type'], token['access_token']
#Holen Sie sich einen Kunden
client = KeyVaultClient(KeyVaultAuthentication(auth_callback))
#Holen Sie sich ein Geheimnis
vault_base_url = 'https://<Name des Schlüsselgewölbes>.vault.azure.net/'
secret_name = '<Geheimer Name>'
secret_version = '' #Wenn Sie die Version nicht angeben
secret = client.get_secret(vault_base_url, secret_name, secret_version)
In Bezug auf den Erwerb von Geheimnissen habe ich auf die folgenden Dokumente verwiesen.
Ich empfehle das! Yay! ヾ (o´∀`o) ノ
Ich wurde viel geworfen, aber ich kann den Ingenieur nicht aufhalten, weil das SDK durch Lesen des Quellcodes in Open Source gelöst werden kann, und ich bin froh, wenn ich es verstehe (o ゝ ω ・ o) ノ))
Recommended Posts