如何自动从Key Vault映射Azure Functions机密

时间:2018-10-04 21:18:42

标签: azure azure-functions azure-keyvault

我想知道是否有可能初始化队列触发器甚至是从天蓝色文件库读取的连接字符串的blob触发器。

现在,我们必须通过刀片属性通过环境设置来设置这些数据连接。但是,我只想使用服务主体来获取天蓝色密钥库的令牌,以获取所有这些连接字符串。

我试图弄清楚如何在Java中运行它。

谢谢, 德里克

5 个答案:

答案 0 :(得分:8)

此功能已跟踪并在此处进行:

编辑28/11/2018:当前正在预览

原答案2018年7月10日 此解决方案不适用于使用消费计划的触发器。

同时,我对您的问题进行了一些研究,如果您使用Azure Function v2,则可以从密钥库中读取配置。

我已经从Visual Studio创建了Azure Functions v2(.NET标准)。

它使用:

  • NETStandard.Library v2.0.3
  • Microsoft.NET.Sdk.Functions v1.0.22
  • Microsoft.Azure.WebJobs v3.0.0
  • Microsoft.Azure.WebJobs.Extensions.Storage v3.0.0

由于Azure Functions v2使用ASP.NET核心,因此我可以引用此链接来配置我的Functions应用程序以使用Azure Key Vault:

Azure Key Vault configuration provider in ASP.NET Core

  1. 我添加了这个nuget包:

我已将我的应用程序配置为使用此nuget包:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Linq;

[assembly: WebJobsStartup(typeof(FunctionApp1.WebJobsExtensionStartup), "A Web Jobs Extension Sample")]
namespace FunctionApp1
{
    public class WebJobsExtensionStartup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            // Gets the default configuration
            var serviceConfig = builder.Services.FirstOrDefault(s => s.ServiceType.Equals(typeof(IConfiguration)));
            var rootConfig = (IConfiguration)serviceConfig.ImplementationInstance;

            // Creates a new config based on the default one and adds the keyvault configuration builder
            var keyvaultName = rootConfig["keyVaultName"];
            var config = new ConfigurationBuilder()
                .AddConfiguration(rootConfig).AddAzureKeyVault($"https://{keyvaultName}.vault.azure.net/").Build();

            // Replace the existing config
            builder.Services.AddSingleton<IConfiguration>(config);
        }
    }
}

我的Azure函数使用MSI:

Azure Functions - Managed Service Identity

我已授予我的密钥库中功能应用程序的“读取/列出机密”权限:

我有一个小的队列触发功能:

public static class Function2
{
    [FunctionName("Function2")]
    public static void Run([QueueTrigger("%queueName%", Connection = "queueConnectionString")]string myQueueItem, ILogger log)
    {
        log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    }
}

queueName是在local.settings.json文件中定义的(应用设置刀片一经部署):

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "keyVaultName": "thomastestkv",
    "queueName": "myqueue"
  }
}

在我的密钥库中配置了queueConnectionString

Azure Key Vault - Secrets

答案 1 :(得分:2)

从Key Vault购买应用程序设置 Key Vault引用功能使它可以使您的应用程序像以前一样使用“应用程序设置”来工作,这意味着不需要更改代码。您可以从我们的Key Vault参考文档中获取所有详细信息,但是我将在此处概述其基础。

此功能需要系统为您的应用分配系统管理的身份。在本文的稍后部分,我将讨论用户分配的身份,但是我们暂时将这些预览分开。

然后,您需要在Key Vault中配置访问策略,该策略为您的应用程序提供了GET(获取)机密的权限。了解如何配置访问策略。

最后,将任何应用程序设置的值设置为以下格式的引用:

@ Microsoft.KeyVault(SecretUri = secret_uri_with_version)

其中secret_uri_with_version是Key Vault中密钥的完整URI。例如,它类似于:https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931

enter image description here

就是这样!无需更改您的代码!

对于此初始预览,您需要显式设置一个秘密版本,因为我们还没有内置的轮播处理功能。这是我们希望尽快提供的东西。

用户分配的托管身份(公开预览) 我们对托管身份的现有支持称为系统分配。这个想法是,身份是由平台为特定应用程序创建的,并且与应用程序的生命周期相关联。如果删除该应用程序,则会立即从Azure Active Directory中删除该身份。

今天,我们正在预览用户分配的身份,这些身份是作为自己的Azure资源创建的,然后分配给给定的应用程序。用户分配的身份也可以分配给多个应用程序,并且一个应用程序可以具有多个用户分配的身份。

enter image description here

more details check this

答案 2 :(得分:1)

这是几天前发布的预览

  

此功能需要系统为您的应用分配系统管理的身份。在本文的稍后部分,我将讨论用户分配的身份,但是我们暂时将这些预览分开。

     

然后,您需要在Key Vault中配置访问策略,该策略为您的应用程序提供了GET(获取)机密的权限。了解如何配置访问策略。

     

最后,将任何应用程序设置的值设置为以下格式的引用:

     

@ Microsoft.KeyVault(SecretUri = secret_uri_with_version)

     

其中secret_uri_with_version是Key Vault中密钥的完整URI。例如,它类似于:https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931

Using Keyvault integration within the function runtime

答案 3 :(得分:0)

我只是在下面的两个参考文献中用Java实现了它。

  1. https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references

  2. https://medium.com/statuscode/getting-key-vault-secrets-in-azure-functions-37620fd20a0b

在Java中,请使用System.getenv(“ SECRET_KEY”)从您的应用设置中读取值。

如果您需要进一步的帮助,很乐意为您提供帮助。

答案 4 :(得分:0)

我已经在上面给出了答案,这个答案是针对@Matt Sanders的评论, 我只想解释一下MSI在Azure环境中如何工作,

我有2个用户分配的身份,其中1个具有对KeyVault的权限,另一个没有。您如何指定正确的用户分配的身份以用于检索机密?我猜这是不可能的和用户分配的身份即使在您的答案中列出也不受支持。– Matt Sanders

当您要使用Azure Manage Identity Service时,您的应用程序必须在Azure AD中注册,例如,假设有多个用户访问您的Web应用程序,并且在您的Web应用程序中,您试图访问vVault的机密,在那种情况下,Vault并不关心使用您的应用程序的用户,而是关心应用程序,

请参考下图,

enter image description here

我如图所示,只有Azure功能作为身份添加到了保管库,其他应用程序则没有,

因此,使用Azure功能的任何人都可以访问Vault的机密,根据此示例,只有A和B可以访问机密,