使用 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 应用程序注册资源,则无法使用 applicationId
和 clientKey
。还有一种替代方法,您可以通过 clientId
和 clientSecret
如下所示,但在这里您也 需要申请注册 .
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 文档以获取更多信息。
我已经创建并发布(到 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 应用程序注册资源,则无法使用 applicationId
和 clientKey
。还有一种替代方法,您可以通过 clientId
和 clientSecret
如下所示,但在这里您也 需要申请注册 .
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 文档以获取更多信息。