Защита закрытого ключа, используемого функцией Azure - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть функция Azure, которая копирует файлы из местоположения SFTP в BLOB-объект Azure. Закрытый ключ / ключ SSH, необходимый для установления соединения с SFTP, теперь является частью настроек приложения json - поскольку решение все еще ограничено фазой PoC / разработки.

Прежде чем я подготовлю это для производства, я должен защитить вышеупомянутый закрытый ключ.

Является ли хранилище ключей Azure оптимальным вариантом для хранения закрытого ключа. И предоставить функции Azure динамический доступ к этому ключу через AD?

Или существует альтернативный подход с точки зрения Azure PaaS?

1 Ответ

0 голосов
/ 06 ноября 2018

Лично я не получал доступ к секретам из хранилища ключей Azure из функции Azure. Я обнаружил, что хранение секретов / ключей в настройках приложения Function Function до сих пор меня устраивало.

Однако, вы можете найти это полезным: Извлечение секретов хранилища ключей Azure с использованием функций Azure и идентификатора управляемой службы После выполнения шагов, описанных на этой странице, для правильной настройки хранилища, вы получите доступ из функции следующим образом:

using System.Net;
using System.Configuration;
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.KeyVault.Models;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Newtonsoft.Json;
using System.Text;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    SecretRequest secretRequest = await req.Content.ReadAsAsync<SecretRequest>();

    if(string.IsNullOrEmpty(secretRequest.Secret))
        return req.CreateResponse(HttpStatusCode.BadRequest, "Request does not contain a valid Secret."); 

    log.Info($"GetKeyVaultSecret request received for secret {secretRequest.Secret}");        

    var serviceTokenProvider = new AzureServiceTokenProvider();

    var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(serviceTokenProvider.KeyVaultTokenCallback));            

    var secretUri = SecretUri(secretRequest.Secret);
    log.Info($"Key Vault URI {secretUri} generated");
    SecretBundle secretValue; 
    try
    {
      secretValue = await keyVaultClient.GetSecretAsync(secretUri);
    }
    catch(KeyVaultErrorException kex)
    {
        return req.CreateResponse(HttpStatusCode.NotFound, $"{kex.Message}");
    }
    log.Info("Secret Value retrieved from KeyVault.");

    var secretResponse = new SecretResponse {Secret = secretRequest.Secret, Value = secretValue.Value};

    return new HttpResponseMessage(HttpStatusCode.OK) {
        Content = new StringContent(JsonConvert.SerializeObject(secretResponse), Encoding.UTF8, "application/json")};


}

public class SecretRequest
{
    public string Secret {get;set;}
}

public class SecretResponse
{
    public string Secret {get; set;}
    public string Value {get; set;}
}

public static string SecretUri(string secret)
{
   return $"{ConfigurationManager.AppSettings["KeyVaultUri"]}/Secrets/{secret}";
}
...