web-dev-qa-db-fra.com

Comment accéder à Azure Keyvault à partir du conteneur Docker exécuté localement?

J'ai une image Docker contenant une application ASP.NET Core qui utilise le coffre-fort Azure Key pour accéder à des choses comme les chaînes de connexion. Lorsque j'exécute l'image localement, j'obtiens cette erreur:

Unhandled Exception: Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: Parameters: Connection String: [No connection string specified], Resource: https://vault.Azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried the following 3 methods to get an access token, but none of them worked.
Parameters: Connection String: [No connection string specified], Resource: https://vault.Azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried to get token using Managed Service Identity. Unable to connect to the Managed Service Identity (MSI) endpoint. Please check that you are running on an Azure resource that has MSI setup.
Parameters: Connection String: [No connection string specified], Resource: https://vault.Azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried to get token using Visual Studio. Access token could not be acquired. Environment variable LOCALAPPDATA not set.
Parameters: Connection String: [No connection string specified], Resource: https://vault.Azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. /bin/bash: az: No such file or directory

D'après ce que je comprends, il essaie d'abord d'obtenir le jeton d'accès en tant qu'identité de service géré. Comme il ne s'exécute pas dans le cloud Azure, il ne peut pas le faire et essaie de l'obtenir via le service connecté Visual Studio. Comme cela ne sera pas sur l'image de docker, il essaie d'utiliser la CLI Azure, mais cela n'est pas installé sur l'image de docker.

J'ai donc besoin d'installer la CLI Azure dans l'image docker. Comment cela se fait, étant donné que l'image de base du Dockerfile est FROM Microsoft/dotnet:2.1-aspnetcore-runtime?

Cette image de base est-elle une image Alpine OS, dois-je donc envisager d'installer Azure CLI avec Alpine?

En supposant que j'ai Azure CLI installé, existe-t-il un moyen d'accéder à Key Vault sans stocker aucune information d'identification dans le code source Dockerfile ou les transmettre au conteneur via du texte brut?

Plus généralement, quelle est la meilleure approche ici.

17
zola25

Solution (pas pour une utilisation en production)

Une solution possible à votre problème est de générer un principal de service ( [~ # ~] sp [~ # ~] ) et d'accorder à ce principal de service l'accès à le coffre de clés (via RBAC ou IAM). Documentation Microsoft sur la création d'un [~ # ~] sp [~ # ~]

Utilisation des informations d'identification de [~ # ~] sp [~ # ~] comme client-id et client-secret ( exemple aléatoire ) vous pouvez ensuite vous connecter au coffre-fort et récupérer les secrets.

Préoccupations

  • avec cette approche, vous introduirez des secrets dans le code (probablement la raison exacte pour laquelle vous utilisez le coffre de clés). Je suppose que l'image du docker local est uniquement destinée au développement. Par conséquent, je recommanderais de créer un Keyvault uniquement pour le développement (et d'y accéder en utilisant [~ # ~] sp [~ # ~] ) tout en utilisant un Kevault distinct pour la production où l'un des schémas d'authentification établis sans secret est utilisé.
  • Vous devez vous assurer que le coffre de clés autorise l'accès depuis l'extérieur du cloud Azure (voir les stratégies d'accès sur portal.Azure.com)
4
fox918

En effet, votre conteneur Docker s'exécute en tant qu'utilisateur root et l'utilisateur enregistré dans le coffre de clés est un autre utilisateur ([email protected])

0
Abhi