Azure Key Vault /存储/功能集成

时间:2019-10-29 02:46:30

标签: azure-functions azure-storage azure-keyvault

我们正在使用Azure功能,该功能需要访问至少1个Azure存储位置。 Azure存储位置必须支持表,因此没有Azure AD身份验证。具有凭据信息的存储帐户的连接字符串对于环境中的功能必须可用。良好的安全惯例要求我们以一定的频率旋转密钥。我们目前正在将密钥存储在Key Vault中,并且希望继续这样做,而不是将密钥存储在Azure门户中。

我们是否纠正了Azure AD身份验证在这里无效的问题,因为它产生的令牌不能与表一起使用,而函数需要这样做?

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

internal const string AccountKeyVaultLocationSettingString = "AccountKeyVaultLocation";

然后向ParseImpl添加逻辑,以便可以将表示机密的KeyVault URL传递到此方法中,并从那里查询密钥。

另一种选择是覆盖Microsoft.Azure.WebJobs.Script.Scaling.StorageConnectionString(和类似的连接字符串设置),以便它将查询KeyVault。

可以将其添加到存储库吗?什么是ETA?您欢迎为此做出贡献吗?

1 个答案:

答案 0 :(得分:0)

实际上,使用this way,可以成功获取连接字符串,而无需版本号。但是,正如您所说,即使您的连接字符串在Key Vault中旋转,webapp也只会加载一次应用设置,并且不会更新:我们应该重新启动webapp以从KV加载最新的连接字符串版本。

您可以使用Azure app configuration(这是一个集中式配置服务),并且可以从KV轻松读取最新的连接字符串,而无需重新启动Webapp。但是,您应该注意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);

        }
    }
}