Azure functions Azure密钥库/存储/功能集成

Azure functions Azure密钥库/存储/功能集成,azure-functions,azure-storage,azure-keyvault,Azure Functions,Azure Storage,Azure Keyvault,我们正在使用Azure功能,这些功能要求访问至少一个Azure存储位置。Azure存储位置必须支持表,因此Azure AD Auth已失效。存储帐户的连接字符串以及凭据信息必须可供环境中的函数使用。良好的安全实践要求我们以一定的频率旋转密钥。我们目前正在密钥库中存储密钥,并希望继续这样做,而不是将密钥存储在Azure门户中 Azure AD身份验证在这里无效,因为它生成的令牌不能与表一起使用,这是正确的吗 理想的方法似乎是在Microsoft.Azure.Storage.CloudStorage

我们正在使用Azure功能,这些功能要求访问至少一个Azure存储位置。Azure存储位置必须支持表,因此Azure AD Auth已失效。存储帐户的连接字符串以及凭据信息必须可供环境中的函数使用。良好的安全实践要求我们以一定的频率旋转密钥。我们目前正在密钥库中存储密钥,并希望继续这样做,而不是将密钥存储在Azure门户中

Azure AD身份验证在这里无效,因为它生成的令牌不能与表一起使用,这是正确的吗

理想的方法似乎是在Microsoft.Azure.Storage.CloudStorageAccount中添加一个新设置

internal const string AccountKeyVaultLocationSettingString = "AccountKeyVaultLocation";
然后向ParseImpl添加逻辑,以便将表示秘密的KeyVault URL传递到该方法中,并从该方法查询密钥

另一个选项是覆盖Microsoft.Azure.WebJobs.Script.Scaling.StorageConnectionString(以及类似的连接字符串设置),以便查询KeyVault

是否可以将其添加到存储库中?什么是预计到达时间?您是否愿意对此做出贡献?

事实上,使用,您可以在没有版本号的情况下成功获取连接字符串。但是,正如您所说,webapp将加载appsettings一次,即使您的连接字符串在密钥库中旋转,它也不会更新:我们应该重新启动webapp以从KV加载最新的连接字符串版本

您可以使用这一集中式配置服务,无需重新启动webapp即可轻松从KV读取最新的连接字符串。但是,您应该关心Azure应用程序配置连接字符串的安全性,如果您需要经常旋转它,我们将返回

也许使用Azure函数MSI从KV获取连接字符串是我知道的最好的方法,请尝试以下代码:

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.KeyVault.Models;

namespace FunctionWithAppConfig
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            var azureServiceTokenProvider = new AzureServiceTokenProvider();
            string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net");

            KeyVaultClient kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
            SecretBundle sec = await kv.GetSecretAsync("<your key vault url without version >");
            var StorageConn = sec.Value;

            // connect to your storage ...

            return new OkObjectResult(StorageConn);

        }
    }
}
使用系统;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.Azure.WebJobs;
使用Microsoft.Azure.WebJobs.Extensions.Http;
使用Microsoft.AspNetCore.Http;
使用Microsoft.Extensions.Logging;
使用Microsoft.Azure.KeyVault;
使用Microsoft.Azure.Services.AppAuthentication;
使用Microsoft.Azure.KeyVault.Models;
命名空间函数WithAppConfig
{
公共静态类函数1
{
[功能名称(“功能1”)]
公共静态异步任务运行(
[HttpTrigger(AuthorizationLevel.Anonymous,“get”,“post”,Route=null)]HttpRequest请求,ILogger日志)
{
LogInformation(“C#HTTP触发器函数处理了一个请求。”);
var azureServiceTokenProvider=新azureServiceTokenProvider();
string accessToken=await azureServiceTokenProvider.GetAccessTokenAsync(“https://vault.azure.net");
KeyVaultClient kv=新的KeyVaultClient(新的KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
SecretBundle sec=wait kv.GetSecretAsync(“”);
var StorageConn=秒值;
//连接到您的存储。。。
返回新的OkObjectResult(StorageConn);
}
}
}

如果您只想在Azure函数中从Azure密钥库获取Azure存储连接字符串,那么使用Azure函数管理的标识直接从Azure密钥库获取如何?通过这种方式,您可以将注意力集中在您的逻辑上,而不会对该集成进行代码修改。有关详细信息,请参阅:Azure标识将是用于请求密钥的机制。问题在于如何配置Azure存储以知道如何在Vault中查找密钥。我单击了链接,发现它似乎与我所要查找的内容类似。问题是,它是一次进行查询,还是每次需要信息时都重新查询KeyVault。对于我的用例,它需要以一定的频率刷新KeyVault中的数据。更新:因为URL中需要版本,所以这没有用。关键是允许应用程序自动获得旋转的关键点。如果我们必须手动更改URL,这与手动更新密钥没有什么不同。您好@Daniel,如果您使用Azure automation旋转密钥,您也可以同时通过Azure automation更新Azure函数中的连接字符串URL,如果您需要,我可以为您提供一个示例。顺便说一句,在函数逻辑中使用key vault sdk从key vault获取连接字符串并连接到存储器如何?如其他评论中所述,这里的问题是我们不拥有拉取密钥的代码:它们被烘焙到WebJob/函数框架中。我特别要求扩展该框架以支持KeyVault机密。或者,如果解决了需要门户配置机密版本的已知问题,我们就可以继续前进。我将查看Azure应用程序配置,看看它是否能满足我们的需求。如果没有,如何将此升级为团队的功能请求?您好@Daniel,您可以从Azure user voice:发布您的请求,或从Azure portal:获取支持票证。希望对你有所帮助。丹尼尔,我能知道你现在怎么样了吗?您最终使用哪种解决方案?