来自KeyVault的Azure功能BlobTrigger连接

时间:2018-04-29 15:28:48

标签: azure-functions azure-keyvault

摘要:我可以使用KeyVault将连接字符串功能提供给Blob存储绑定吗?

我最近将所有连接字符串和机密从Azure功能应用设置中移出并移入KeyVault。这包括我引用的各种存储帐户的连接字符串。我现在正在开发Azure Blob存储绑定,但似乎(per the docs)所有引用连接字符串的方法都解析为应用程序级别设置。

我喜欢不必在两个不同的地方拥有这个秘密。有没有办法指定存储帐户连接字符串ala KeyVault?

3 个答案:

答案 0 :(得分:2)

我可能处在不同的切线上,但是我相信我同意@ThatCreole的看法,这很痛苦。集中配置和从已部署的代码中删除机密不仅仅与在CI / CD管道中替换它的位置有关。如果文件系统受到威胁,则访问配置文件可进一步破坏基础架构。使用Azure,我们可以使用托管服务身份,该身份在运行系统和Azure活动目录的基础硬件上创建信任关系。这样就无需在任何时候将任何机密存储在配置中,包括访问Key Vault的机密。 Azure功能可以利用此功能,但这仅在应用程序的启动/运行时有所帮助。仍然需要触发器才能触发该功能,甚至到达该点,这会导致少量的曝光表面。

我唯一能做的就是为触发器创建一个RBAC,它的权限集非常有限。将其添加为函数中的触发器,然后让该函数在启动时通过密钥库加载扩展权限RBAC。这是一个不幸的解决方法,但是我看不到另一种方法来保持我们系统的安全性。

答案 1 :(得分:0)

如果您问是否可以执行以下操作:

[FunctionName("ResizeImage")]
public static void Run(
   [BlobTrigger("sample-images/{name}", Connection = "StorageConnectionAppSetting")] Stream image, 
   [Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageSmall)
{
   ....
}

然后存储StorageConnectionAppSetting以便它指向KeyVault实例(并且不容易访问连接字符串),那么我担心它目前无法实现。

当然可以像这样手动获取连接字符串:

var azureServiceTokenProvider = new AzureServiceTokenProvider();
var kvClient = new KeyVaultClient(new  KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback), client);                
string blobConectionString = (await 
kvClient.GetSecretAsync("some"secret")).Value;

然后“手动”连接到Blob(因此不会使用绑定),但我想这对你来说可能不行。

其他问题是 - 在KV中存储连接字符串的原因是什么?那是因为你担心有人会在存储在功能应用程序的应用程序设置中时查看它吗?或者是因为您不想将其存储在CI / CD管道中?

答案 2 :(得分:0)

我创建了一个nuget程序包,该程序包将Azure KeyVault集成到Azure函数中,并支持连接字符串等。实际上,由于Azure函数v2内部使用Microsoft.Extensions.Configuration,因此实际上已经可以实现。我们可以利用它并通过Azure Key Vault扩展配置。因此,您需要创建一个WebJobsStartup类,从WebjobsBuuilder服务提供者那里获取IConfiguration,并另外使用Azure KeyVault重新创建它。

static IWebJobsBuilder AddAzureKeyVault(this IWebJobsBuilder builder, 
    Func<ConfigurationBuilder, IKeyVaultClient> configure)
{
    var configurationBuilder = new ConfigurationBuilder();
    var descriptor = builder.Services.FirstOrDefault(d => d.ServiceType == typeof(IConfiguration));
    if (descriptor?.ImplementationInstance is IConfigurationRoot configuration)
    {
        configurationBuilder.AddConfiguration(configuration);
    }

    configurationBuilder.AddAzureKeyVault(....);

    var config = configurationBuilder.Build();
    builder.Services.Replace(ServiceDescriptor.Singleton(typeof(IConfiguration), config));
    return builder;
}

您可以在https://github.com/BorisWilhelms/azure-function-keyvault上找到其来源。