Azure App Config KeyVault 引用有何意义?

What is the point of Azure App Config KeyVault references?

在 Azure 中,您可以设置 App Config 和 KeyVault。 KeyVault 的要点是存储比您的 App Config 更敏感的数据,并且能够分别控制对配置和保管库的访问。

那么在应用程序配置中使用 keyvault 引用有什么好处?

您基本上允许任何有权访问应用程序配置的人访问您的密钥保管库中的某些值,并且正在绕过保管库通常提供的额外安全层。
如果配置中未引用这些相同的值,则需要对金库进行授权才能访问这些相同的值。

我真的不明白 keyvault 引用给你带来了什么好处。

Jan de Vries 的这篇博客文章对它们进行了更详细的解释:https://jan-v.nl/post/2021/using-key-vault-with-azure-app-configuration/

您问题的相关部分:

As it happens, the code for accessing App Configuration doesn’t give your application permission to retrieve secrets from Key Vault.

应用程序从 Key Vault 中检索它们,而不是从应用程序配置中检索它们。 App Config 仅保留引用,不包含实际值。

官方docs也提一下:

Your application uses the App Configuration client provider to retrieve Key Vault references, just as it does for any other keys stored in App Configuration. In this case, the values stored in App Configuration are URIs that reference the values in the Key Vault. They are not Key Vault values or credentials. Because the client provider recognizes the keys as Key Vault references, it uses Key Vault to retrieve their values.

Your application is responsible for authenticating properly to both App Configuration and Key Vault. The two services don't communicate directly.

我想有多种使用 KeyVault 的方法,但我倾向于使用它的方式如下。

我的应用程序将有一组机密,我使用 Secrets Manager 在本地存储这些机密,您可以为您的应用程序添加机密:

dotnet user-secrets set "Movies:ServiceApiKey" "12345"

然后您的应用程序可以使用 _moviesApiKey = Configuration["Movies:ServiceApiKey"]; 读取此设置,正如您将在上面的 link 中看到的那样。显然,您无法在代码中看到此 value,但您的应用程序可以从 Secrets Manager.

中读取它

如果您确实忘记了这些值,可以使用以下命令检索它们:

dotnet user-secrets list

KeyVault 将作为您在 Azure 中的 Secrets Manager。因此,您的应用程序需要具有访问 KeyVault 的权限,在我的例子中,我将 Vault name 存储在 appsettings.json ,并且在引导过程中,我在 生产模式 中包括 KeyVault 配置 if 运行 即在 Azure 服务器上而不是本地。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
      WebHost.CreateDefaultBuilder(args)
        .ConfigureLogging(logging =>
        {
          logging.ClearProviders();
          logging.AddConsole();
          logging.AddAzureWebAppDiagnostics();
        })
        .ConfigureAppConfiguration((context, config) =>
        {
          if (context.HostingEnvironment.IsProduction())
          {
            IConfigurationRoot builtConfig = config.Build();
            ConfigurationBuilder keyVaultConfigBuilder = new ConfigurationBuilder();
            keyVaultConfigBuilder.AddAzureKeyVault(builtConfig["VaultName"]);
            IConfigurationRoot keyVaultConfig = keyVaultConfigBuilder.Build();
            config.AddConfiguration(keyVaultConfig);
          }

        })
        .UseStartup<Startup>();

注意,检查 context.HostingEnvironment.IsProduction()。在应用程序设置中,我有:

"VaultName": "https://yourkvname.vault.azure.net/"

因此,应用程序对 KeyVault 的唯一引用是名称,这应该是安全的,因为只有应用程序才能访问 keys/secrets。

需要注意的一件事是,您需要确保名称与您的本地机密和 KeyVault 中的机密相匹配。就我而言,我在 Windows 平台上 运行,因此我需要使用双破折号 (--) 代替冒号 (:) 对名称进行小的更改,所以.. .

Movies:ServiceApiKey

变成

Movies--ServiceApiKey

在 Azure 中工作时,将机密存储在 Key Vault 中是个好主意。为了让它变得更好,还有 Key Vault Reference 表示法。此功能可确保除非有人授予权限,否则任何人都无法读取机密。

说到机密,绝不能将它们直接存储在功能应用程序的应用程序设置中(顺便说一句,应用程序服务也是如此)。为什么不 ?因为任何有权访问 Azure 门户中的 Function App 的人都可以获得机密。正确的方法是使用 Azure Key Vault,它是用于安全存储和访问机密的 Azure 组件。一旦你的秘密在密钥保管库中,你必须授予密钥保管库访问你的功能应用程序的身份,然后你可以直接在你的应用程序设置中引用你需要的秘密。这些称为 Key Vault 引用,因为应用程序设置不直接包含机密的值,而是包含对存储在 Key Vault 中的机密的引用。当 运行 时,您的函数将自动访问秘密及其作为环境变量的值,就好像它是正常的应用程序设置一样。

Key Vault 引用适用于应用服务和函数应用,并且对于将其机密存储在设置中的现有应用程序特别有用,因为使用 Azure Key Vault 引用保护机密不需要任何代码更改。

参考:https://www.techwatching.dev/posts/azure-functions-custom-configuration

https://www.sharepointeurope.com/using-key-vault-references-with-azure-app-configuration/