2017-09-21 1 views
4

J'essaie de créer un script en utilisant le cli Azure. J'ai créé quelques applications de fonction et voudrais ajouter une clef d'hôte ou au moins récupérer celle par défaut qui est créée automatiquement. Le cli azur n'a aucun support pour cela.Récupérer les clés de l'hôte à partir d'une application de fonction azure

Il semble y avoir une API (la documentation pour elle semble être éparse) sur la fonction elle-même qui me permet d'obtenir les clés, mais vous avez besoin d'une clé pour l'utiliser, donc pas d'aide là-bas.

https://github.com/Azure/azure-webjobs-sdk-script/wiki/Key-management-API

Par exemple: https://example-functions.azurewebsites.net/admin/host/keys?code=somecodeyoualreadyknow

J'ai vu d'autres exemples qui utilisent le scm webapps api pour télécharger le fichier JSON qui contient les clés mais je ne suis pas sûr de savoir comment authentifier avec cette API. J'ai un service principal (userid, mot de passe, tenantid) et j'espérais ne pas devoir ajouter un autre schéma d'authentification à mon script.

Répondre

3

Voici les étapes.

  1. En supposant que vous ayez déjà vos informations d'identification de déploiement Kudu. (Il semble que vous sachiez déjà comment faire.Vous pouvez l'obtenir via un appel ARM de votre service, etc)
  2. De kudu creds de déploiement, vous pouvez obtenir un JWT qui vous permet d'appeler l'API de touches de fonction. De l'API Functions, vous pouvez obtenir toutes vos clés (y compris votre maître).

Voici un script Powershell qui montre les appels exacts à aller de creds de déploiement Kudu à la fonction clé Master:

# You need to start with these: 
$site = "YourSiteName" 
$username='YourDeploymentUserName' 
$password='YourDeploymentPassword' 

# Now... 
$apiBaseUrl = "https://$($site).scm.azurewebsites.net/api" 
$siteBaseUrl = "https://$($site).azurewebsites.net" 

# For authenticating to Kudu 
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password))) 


# Call Kudu /api/functions/admin/token to get a JWT that can be used with the Functions Key API 
$jwt = Invoke-RestMethod -Uri "$apiBaseUrl/functions/admin/token" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method GET 

# Call Functions Key API to get the master key 
$x = Invoke-RestMethod -Uri "$siteBaseUrl/admin/host/systemkeys/_master" -Headers @{Authorization=("Bearer {0}" -f $jwt)} -Method GET 

$masterKey = $x.value 
+0

Salut, j'ai le service des informations d'identification principales, mais si je comprends bien, ils ne sont pas les mêmes. Je ne sais pas comment obtenir des informations d'identification "kudo" avec mes informations d'identification de principal de service. – Sam

1

Je ne sais pas comment obtenir les informations d'identification de « Kudu » avec mon directeur de service pouvoirs

Si le code C# est acceptable, nous pourrions utiliser Microsoft.Azure.Management.ResourceManager.Fluent et Microsoft.Azure.Management.Fluent pour le faire facilement. Ce qui suit est la démo que comment obtenir des informations d'identification kudu et exécuter l'API de gestion des clés. Je le tester localement, il fonctionne correctement de mon côté.

string clientId = "client id"; 
string secret = "secret key"; 
string tenant = "tenant id"; 
var functionName ="functionName"; 
var webFunctionAppName = "functionApp name"; 
string resourceGroup = "resource group name"; 
var credentials = new AzureCredentials(new ServicePrincipalLoginInformation { ClientId = clientId, ClientSecret = secret}, tenant, AzureEnvironment.AzureGlobalCloud); 
var azure = Azure 
      .Configure() 
      .Authenticate(credentials) 
      .WithDefaultSubscription(); 

var webFunctionApp = azure.AppServices.FunctionApps.GetByResourceGroup(resourceGroup, webFunctionAppName); 
var ftpUsername = webFunctionApp.GetPublishingProfile().FtpUsername; 
var username = ftpUsername.Split('\\').ToList()[1]; 
var password = webFunctionApp.GetPublishingProfile().FtpPassword; 
var base64Auth = Convert.ToBase64String(Encoding.Default.GetBytes($"{username}:{password}")); 
var apiUrl = new Uri($"https://{webFunctionAppName}.scm.azurewebsites.net/api"); 
var siteUrl = new Uri($"https://{webFunctionAppName}.azurewebsites.net"); 
string JWT; 
using (var client = new HttpClient()) 
    { 
    client.DefaultRequestHeaders.Add("Authorization", $"Basic {base64Auth}"); 

    var result = client.GetAsync($"{apiUrl}/functions/admin/token").Result; 
    JWT = result.Content.ReadAsStringAsync().Result.Trim('"'); //get JWT for call funtion key 
    } 
using (var client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + JWT); 
    var key = client.GetAsync($"{siteUrl}/admin/functions/{functionName}/keys").Result.Content.ReadAsStringAsync().Result; 
    } 

enter image description here

0

Merci aussi bien pour vos réponses. En utilisant votre réponse Mike S et en fouillant autour du code source fluide de csharp (merci Tom Sun) J'ai fini avec ça. Bien sûr, il faut beaucoup de jetons! Les informations d'identification sont-je commencer par ce que vous obtiendriez retour de az ad sp create-for-rbac -n $name --role contributor

$credentials = (ConvertFrom-Json $env:AzureCliLogin) 

$tenant = $credentials.tenant 
$clientId = $credentials.appId 
$clientSecret = $credentials.password 
$subscriptionId = "<subscription id>" 

$body = @{ 
    "grant_type"="client_credentials"; 
    "client_id"=$clientId; 
    "client_secret"=$clientSecret; 
    "resource"="https://management.azure.com/" 
} 

$authInfo = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenant/oauth2/token" -Body $body -Method Post -Headers @{"Content-Type"="application/x-www-form-urlencoded"} 

$publishData = Invoke-RestMethod -Uri "https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.Web/sites/$name/publishxml?api-version=2016-08-01" -Method Post -Headers @{"Authorization"="Bearer $($authInfo.access_token)"} 

$userName = $publishData.publishData.publishProfile[0].userName 
$password = $publishData.publishData.publishProfile[0].userPWD 

$apiBaseUrl = "https://$name.scm.azurewebsites.net/api" 
$siteBaseUrl = "https://$name.azurewebsites.net" 

# For authenticating to Kudu 
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))  

# Call Kudu /api/functions/admin/token to get a JWT that can be used with the Functions Key API 
$jwt = Invoke-RestMethod -Uri "$apiBaseUrl/functions/admin/token" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method GET 

# Call Functions Key API to get the master key 
$x = Invoke-RestMethod -Uri "$siteBaseUrl/admin/host/systemkeys/_master" -Headers @{Authorization=("Bearer {0}" -f $jwt)} -Method GET 

$masterKey = $x.value