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

问题描述 投票:4回答:5

我想知道是否可以初始化队列触发器甚至blob触发从azure Vault读取的连接字符串。

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

我正在试图弄清楚如何在java中使用它。

谢谢,德里克

azure azure-functions azure-keyvault
5个回答
8
投票

此功能在此处进行跟踪和处理:

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

前回答07/10/2018此解决方案不适用于使用消费计划的触发器。

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

我从Visual Studio创建了Azure Functions v2(.NET Standard)。

它用:

  • NETStandard.Library v2.0.3
  • Microsoft.NET.Sdk.Functions v1.0.22
  • Azure.Vebyobs vz.0.0
  • Microsoft.Ajure.WebEbs.Extension.Storage Watch.0.0

因为Azure Functions v2使用ASP.NET核心,所以我能够引用此链接来配置我的功能应用程序以使用Azure Key Vault:

Azure Key Vault configuration provider in ASP.NET Core

  1. 我添加了这个nuget包: Microsoft.Extensions.Configuration.AzureKeyVault

我已将我的应用配置为使用此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}");
    }
}

queueNamelocal.settings.json文件中定义(应用程序设置刀片一旦部署):

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

queueConnectionString在我的keyvault中配置:

Azure Key Vault - Secrets


3
投票

从Key Vault获取应用程序设置Key Vault引用功能使您的应用程序可以像使用App Settings一样工作,这意味着不需要更改代码。您可以从Key Vault参考文档中获取所有详细信息,但我将在此概述基础知识。

此功能需要系统为您的应用分配托管标识。在这篇文章的后面我将谈论用户指定的身份,但我们现在将这些预览分开。

然后,您需要在密钥保管库上配置访问策略,为您的应用程序提供密钥的GET权限。了解如何配置访问策略。

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

@ Microsoft.KeyVault(SecretUri = secret_uri_with_version)

其中secret_uri_with_version是密钥保管库中秘密的完整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


1
投票

这只是几天前发布的预览版。

此功能需要系统为您的应用分配托管标识。在这篇文章的后面我将谈论用户指定的身份,但我们现在将这些预览分开。

然后,您需要在密钥保管库上配置访问策略,为您的应用程序提供密钥的GET权限。了解如何配置访问策略。

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

@ Microsoft.KeyVault(SecretUri = secret_uri_with_version)

其中secret_uri_with_version是密钥保管库中秘密的完整URI。例如,这将是:https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931

Using Keyvault integration within the function runtime


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”)来读取应用程序设置中的值。

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


0
投票

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

“我有2个用户分配的身份,1个拥有KeyVault的权限,另一个没有。你怎么能指定正确的用户分配用于检索秘密的身份?我猜这是不可能的,用户分配的身份不是虽然它们列在你的答案中,但仍然支持。 - Matt Sanders“

当您想要使用Azure管理身份服务时,您的应用程序必须在Azure AD中注册,例如,假设有多个用户访问您的Web应用程序,并且在您的Web应用程序中,您试图访问vVault的秘密,在这种情况下,vault不关心使用你的应用程序的用户,它关心的是应用程序,

请参考下图,

enter image description here

我作为显示图片,只有Azure功能作为标识添加到保险库,其他应用程序不是,

所以使用Azure功能的人都可以访问保险库的秘密,根据这个例子,只有A和B可以访问保密信息,

© www.soinside.com 2019 - 2024. All rights reserved.