代码之家  ›  专栏  ›  技术社区  ›  GilliVilla

保护Azure函数使用的私钥

  •  1
  • GilliVilla  · 技术社区  · 6 年前

    我有一个Azure函数,它将文件从SFTP位置复制到Azure Blob。 建立到SFTP的连接所需的私钥/SSH密钥现在是app settings json的一部分,因为解决方案仍然局限于PoC/开发阶段。

    Azure密钥库是我存储私钥的最佳候选库吗。并通过AD提供对该密钥的Azure功能动态访问?

    1 回复  |  直到 6 年前
        1
  •  1
  •   flyte    6 年前

    但是,您可能会发现这很有用: Retrieve Azure Key Vault Secrets using Azure Functions and Managed Service Identity

    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}";
    }