使用 Azure Function App 和 Azure Key Vault 的 Always Encrypted Column

Always Encrypted Column with Azure Function App & Azure Key Vault

我已经创建并发布(到 Azure)一个有效且相当简单的 Azure 函数应用程序(HTTP 触发器),它在身份验证后插入从 API 对 Azure SQL 数据库的调用中检索到的数据通过用户身份(如果在本地测试)或托管身份(当 运行 在 VM 上时)。

一切正常,但是,我现在需要加密我使用 SSMS 完成的 SQL table 列之一。据我了解,下一步是验证提供商以通过 Azure Key Vault 访问 CMK(我正在关注 this Microsoft guide)。

我想知道在下面的代码中如何 InitializeAzureKeyVaultProvider 不使用 Azure 应用程序注册资源中的 applicationId 和 clientKey,但具有用户或托管身份角色。或者,如果有任何其他方法 get/use applicationId 和 clientKey 没有 creating/using Azure App 注册资源。

是否有更新/更简单的方法来访问始终加密列 sql 查询的 Azure Key Vault?

static void InitializeAzureKeyVaultProvider() {
            _clientCredential = new ClientCredential(applicationId, clientKey);

            SqlColumnEncryptionAzureKeyVaultProvider azureKeyVaultProvider = new SqlColumnEncryptionAzureKeyVaultProvider(GetToken);

            Dictionary<string, SqlColumnEncryptionKeyStoreProvider> providers = new Dictionary<string, SqlColumnEncryptionKeyStoreProvider>();

            providers.Add(SqlColumnEncryptionAzureKeyVaultProvider.ProviderName, azureKeyVaultProvider);
            SqlConnection.RegisterColumnEncryptionKeyStoreProviders(providers);
        }
}

这是我一直在尝试的另一种方法,但是,在安装和使用 Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider 后,我收到以下代码示例后的错误:

        private static bool EncryptionProviderInitialized = false;

        private static void InitializeAzureKeyVaultProvider()
        {
            if (!EncryptionProviderInitialized)
            {
                SqlColumnEncryptionAzureKeyVaultProvider akvProvider = null;
#if DEBUG
                if (Debugger.IsAttached)
                {
                    Console.WriteLine("Debugger attached - configuring KeyVaultProvider via VisualStudioCredential");
                    akvProvider = new SqlColumnEncryptionAzureKeyVaultProvider(new VisualStudioCredential());
                }
                if (akvProvider == null)
#endif
                    akvProvider = new SqlColumnEncryptionAzureKeyVaultProvider(new ManagedIdentityCredential());
                SqlConnection.RegisterColumnEncryptionKeyStoreProviders(customProviders: new Dictionary<string, SqlColumnEncryptionKeyStoreProvider>(capacity: 1, comparer: StringComparer.OrdinalIgnoreCase)
                    {
                        { SqlColumnEncryptionAzureKeyVaultProvider.ProviderName, akvProvider}
                    });
                EncryptionProviderInitialized = true;
            }
        }
ERROR:
[2021-10-08T01:36:24.209Z] Executed 'EncryptedSQLMigration' (Failed, Id=1323dcbb-e671-4ed4-8a7c-6259447326c5, Duration=537ms)
[2021-10-08T01:36:24.209Z] System.Private.CoreLib: Exception while executing function: EncryptedSQLMigration. FreshFirstApproach: Method not found: 'Microsoft.Extensions.Primitives.StringValues Microsoft.AspNetCore.Http.IQueryCollection.get_Item(System.String)'.

最初,我遇到了同样的错误,但是,Microsoft.Extensions.Logging.Abstractions - 从我的主要功能中删除 ILogger 只是为了继续前进,因为我也无法解决该问题,我现在得到这个 Microsoft.Extensions 异常。

非常感谢任何帮助我实现将 Always Encrypted Columns 与 Azure Function App 和 Azure Key Vault 结合使用的目标!

非常感谢。

如果不创建或使用 Azure 应用程序注册资源,则无法使用 applicationIdclientKey。还有一种替代方法,您可以通过 clientIdclientSecret 如下所示,但在这里您也 需要申请注册 .

static void InitializeAzureKeyVaultProvider()
{
    string clientId = ConfigurationManager.AppSettings["AuthClientId"];
    string clientSecret = ConfigurationManager.AppSettings["AuthClientSecret"];
    _clientCredential = new ClientCredential(clientId, clientSecret);
    ....
    ....
}

至于用户或托管身份,如果您选中此项document,您将不会在支持托管资源的服务列表中找到 Azure Key Vault。

因此,应该为 Azure Function 而不是 Azure Key Vault 创建托管服务标识。查看此 Retrieve Azure Key Vault Secrets using Azure Functions and Managed Service Identity 文档以获取更多信息。