Bonsoir! @dz_ Je suis Kazumi Ohira.
Lorsque j'ai essayé d'utiliser Azure Key Vault à l'aide du SDK Azure pour Python, j'ai eu du mal avec l'authentification RBAC (Role Based Access Control), j'étais donc en colère et j'ai géré la situation.
Après avoir examiné les informations d'identification Azure, j'ai constaté qu'il pouvait être géré par un fichier json au format suivant.
Par exemple, pour émettre un nouveau certificat RBAC et générer ces informations au format JSON ci-dessus, [Azure CLI 2.0] ci-dessous (https://docs.microsoft.com/en-us/cli/azure/install) Les commandes -azure-cli "Install the Azure CLI 2.0 | Microsoft Docs") sont disponibles.
Émettre des informations d'authentification RBAC avec CLI (option de sortie JSON pour SDK)
$ az login
$ az ad sp create-for-rbac --sdk-auth > auth-sample.json
Exemple JSON pour SDK (cité dans le document ci-dessus)
{
"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/"
}
De plus, si vous définissez le chemin de ce fichier JOSN dans la variable d'environnement ʻAZURE_AUTH_LOCATION`, le SDK le lira automatiquement.
Et, comme vous pouvez le voir dans le lien ci-dessus, dans la plupart des cas, vous pouvez facilement générer un client en utilisant ʻazure.common.client_factory.get_client_from_auth_file`.
Get_client_from_auth_file
ne peut pas être utilisé avec KeyVaultClient
...Je vois!
Je pensais que le client Azure Key Vault KeyVaultClient
pouvait être facilement généré par la méthode ci-dessus, alors je l'ai essayé ... Je ne peux pas (´ ・ ω ・`)
azure-version de keyvault
$ pip show azure-keyvault
Name: azure-keyvault
Version: 0.3.5
...
Un exemple qui ne fonctionnait pas avec KeyVault Client
from azure.common.client_factory import get_client_from_auth_file
from azure.keyvault import KeyVaultClient
client = get_client_from_auth_file(KeyVaultClient)
Erreur lorsque le client KeyVault ne fonctionne pas
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'
KeyVaultClient
!J'ai jeté un coup d'œil au code source du SDK, et finalement arrivé à ce matériel, j'ai pu suivre cette voie! Yay! ヾ (o´∀`o) ノ
Comme c'est un gros problème, j'ai écrit un exemple de code qui utilise le chemin de ʻAZURE_AUTH_LOCATION` en référence à ce qui précède.
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']
#Obtenez un client
client = KeyVaultClient(KeyVaultAuthentication(auth_callback))
#Obtenez un secret
vault_base_url = 'https://<Nom du coffre-fort de clés>.vault.azure.net/'
secret_name = '<Nom secret>'
secret_version = '' #Si vous ne spécifiez pas la version
secret = client.get_secret(vault_base_url, secret_name, secret_version)
En ce qui concerne l'acquisition de secrets, je me suis référé aux documents suivants.
Je recommande ça! Yay! ヾ (o´∀`o) ノ
Donc, j'ai été beaucoup ballotté, mais je ne peux pas arrêter l'ingénieur car le SDK peut être résolu en lisant le code source en open source, et je suis heureux quand je le comprends (o ゝ ω ・ o) ノ))
Recommended Posts