【问题标题】:Azure Key Vault / Storage / Function integrationAzure Key Vault / 存储 / 功能集成
【发布时间】:2020-02-24 07:17:31
【问题描述】:

我们正在使用 Azure Functions,这需要访问至少 1 个 Azure 存储位置。 Azure 存储位置必须支持表,因此 Azure AD Auth 已失效。存储帐户的连接字符串以及凭据信息必须对环境中的函数可用。良好的安全实践要求我们以某种频率轮换密钥。我们目前将密钥存储在 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?您会欢迎对此做出贡献吗?

【问题讨论】:

  • 如果你只是想在 Azure 函数中从 Azure Key Vault 获取 Azure 存储连接字符串,那么使用 Azure 函数托管标识直接从 Azure Key Vault 获取如何?通过这种方式,您可以专注于您的逻辑,不会对这种集成进行任何代码修改。详情请见:azure.microsoft.com/en-us/blog/…
  • Azure 身份将是用于请求密钥的机制。问题在于如何配置 Azure 存储以知道在 Vault 中查找密钥。
  • 我点击了链接,发现它似乎与我所追求的相似。问题是,它是进行一次查询,还是每次需要信息时都重新查询 KeyVault。对于我的用例,它需要以某种频率刷新 KeyVault 中的数据。
  • 更新:由于 URL 中需要版本,因此这没有用。关键是允许应用程序自动获取旋转键。如果我们必须手动更改 URL,这与手动更新 Key 没有区别。
  • 嗨@Daniel,如果您使用Azure自动化来轮换您的密钥,您也可以同时通过Azure自动化更新您的Azure函数中的连接字符串url,如果您需要我可以提供你带个样品。顺便说一句,如何在功能逻辑中使用密钥库 sdk 从密钥库获取连接字符串,然后连接到存储?

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


【解决方案1】:

事实上,使用this way,您可以成功获取您的连接字符串,无需版本号。但是,正如您所说,webapp 将加载 appsettings 一次,即使您的连接字符串在 Key Vault 中旋转,它也不会更新:我们应该重新启动 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);

        }
    }
}

【讨论】:

  • 正如在其他 cmets 中提到的,这里的问题是我们不拥有拉取密钥的代码:它们被烘焙到 WebJob/Function 框架中。我特别要求扩展框架以支持 KeyVault 机密。或者,如果需要门户配置机密版本的已知问题得到解决,我们也许可以继续前进。我将查看 Azure 应用程序配置,看看它是否能满足我们的需求。如果没有,如何将其升级为团队的功能请求?
  • 您好@Daniel,您可以通过 Azure 用户语音发布您的请求:feedback.azure.com/forums/355860-azure-functions,或从 Azure 门户提出支持请求:docs.microsoft.com/en-us/azure/azure-supportability/…。希望对你有帮助
  • 嗨@Daniel,我可以知道现在怎么样了吗?您最终使用哪种解决方案?
猜你喜欢
  • 2017-09-12
  • 2021-02-18
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2021-05-17
  • 2021-01-18
  • 2019-07-28
  • 1970-01-01
相关资源
最近更新 更多